
这是什么
Mac 这边的 Minecraft 里跑着一个 Fabric 模组;CrossOver 里的游戏则加载一个小的 Windows DLL,顶掉 dinput8.dll。两边通过 /tmp 里的文件共享内存,因为 Wine 把 Mac 的文件系统显示成 Z: 盘并映射共享页,于是原生的 macOS 进程和 Windows 进程能互传画面与伤害。玩家归 Minecraft 管,它每帧把自己的相机发过去,桥用它覆盖游戏的相机,游戏就按 Steve 站的位置绘制自己的世界。Minecraft 正常渲染,把画面和深度缓冲拷进共享内存,桥再把这些像素画进游戏那一帧里,逐像素对着游戏的深度缓冲做遮挡测试,所以方块会藏在墙后面,并且被游戏自己的画面重新打光。地形反向流动:对着游戏碰撞体打出去的射线,变回 Minecraft 里看不见的方块,Steve 能站在上面、也能往上盖。怪物以看不见的实体形式出现,带着游戏给的碰撞箱与血量,打中之后走游戏自己的函数结算伤害。游戏原本的角色被藏在 Steve 脚下当作替身,怪物照旧锁定并攻击它,那些攻击再传回 Minecraft 变成伤害。按 F8 一个键,键盘鼠标交还给游戏去开菜单。
谁做的一个人,GitHub 上的用户名是 justbustin,有 13 个公开仓库、21 个关注者。仓库 21 星、5 个 fork,从没发过 release,所以想用只能自己克隆下来,对着自己那份游戏把桥编译出来。
它是怎么搭起来的
组成 · 5游戏已经会做的事,这里一件都不重写。玩家、背包、方块与怪物行为归 Minecraft;世界、碰撞、怪物与存档归游戏本身,并且只要求它把合并后的画面画出来。桥就是那道缝:Minecraft 发来相机姿态,以及一帧带深度缓冲的画面,游戏按那个姿态绘制自己的世界,它最终呈现的那一帧再被逐像素做深度测试、混入 Minecraft 的像素,并用游戏自己的画面重新打光。反方向,游戏的碰撞体回应射线批次,变回看不见的方块;它的怪物被发布成实体;Minecraft 打中时调用游戏自己的伤害函数。游戏原本的角色留在世界里,藏在 Steve 脚下,于是所有原本就连在玩家身上的机制都照常运作。
- elden-ring/
- 《艾尔登法环》一侧:一个 Windows DLL、Fabric 模组、一个不带 Easy Anti-Cheat 的离线启动器,以及安装、运行、热重载与调试脚本。
- monster-hunter-world/
- 《怪物猎人:世界》的同构版本。它从 Steam 正常启动,通过 bottle 里的 DLL 覆盖加载桥。
- mc-bridge/
- Fabric 一侧:握着玩家、渲染 Minecraft,并通过共享内存协议与 DLL 通信。
- 桥的协议头
- 两半共用同一个头文件,画面、相机、地形、怪物与伤害这些消息不会在 C++ 与 Java 之间各自漂移。
- docs/
- 完整讲清内部如何运作,包括把它移植到第三款游戏要做什么,以及一个让 macOS 14 跑起 D3DMetal 的补丁。
取舍,以及另一种做法
把桥做成
dinput8.dll加载 替代 注入一个已经在运行的游戏游戏自己在启动时加载它,再由它加载真正的桥;于是游戏开着的时候就能重新编译、替换。
把 Minecraft 合成进游戏那一帧 替代 两个窗口并排跑
游戏是按 Minecraft 的相机绘制的,所以 Minecraft 的方块能被游戏的墙挡住,也能被游戏自己的画面重新打光,而不是浮在前面的一块矩形。
把游戏的碰撞采样成看不见的方块 替代 把游戏的几何导入 Minecraft
射线命中给出一个能走、能盖的表面,同时不必复制游戏世界的任何东西——这也正是仓库里没有游戏素材的原因。
把游戏原本的角色藏在 Steve 脚下 替代 把它从世界里拿掉
怪物照旧锁定并攻击它,于是它们的攻击能变成 Minecraft 里的伤害,而不用逐种怪物去改行为。
启动时校验每一个游戏地址 替代 假定安装的版本对得上
版本不匹配时只会关掉一个功能,而不是调用错误的函数。README 之所以敢写「每个游戏只支持一个版本」,靠的就是这一步。
依据justbustin/minecraft-crossover-bridge 的 README.md、docs/how-it-works.md 与仓库历史,2026-10-04 读取。
制作过程
4 个阶段- 01
整个实现是一次提交落地的
仓库里 295 个文件,横跨两个游戏的桥以及它们的安装与调试脚本。全部落在 2026-10-01 00:56 的一个提交里,当天之后的三个提交都只改 README。README 开头就告诉读者拿它做什么:把仓库发给 agent,然后说「make me something like this」。接着它写明创意来源与代码性质:原始创意归 @tobynjacobs,而这个实现在作者自己的说法里是 「vibecoded on my own」。全文没有点名任何一个工具,所以这条记录的「用到的工具」一栏是空的,而不是填一个猜的。
- 02
它出身的那个浪潮,以及为什么这一个可以核
创意来自 2026 年 9 月下旬的一批视频:用 AI 把一款游戏塞进另一款里——Minecraft 进《艾尔登法环》、Mario 64 进《艾尔登法环》、塔科夫枪械进《上古卷轴 5》、Skate 3 的动作进《现代战争 2》。Kotaku 把这批东西称作「a new plague of vibe-coded gaming mashups」和「empty promises that have magically earned thousands of likes and millions of views」——对一支点不进去的视频来说,这话并不过分。这个仓库是同一个主张,但后面有东西:295 个文件的 C++ 与 Java,任何人都能读,游戏版本和安装步骤都写明了。它不附带任何游戏文件与素材,只用一些短字节特征在运行时辨认游戏的代码。
- 03
两半必须对得上
每个游戏各有一份相同的骨架:一个用 mingw-w64 交叉编译的 Windows DLL,一个面向 Minecraft 1.21.1 的 Fabric 模组,外加把桥装进 bottle、启动 Minecraft、热重载 DLL、收集调试输出的脚本。两半只通过共享内存通信,这也是 DLL 能在游戏还开着的时候重新编译并替换的原因。《怪物猎人:世界》支持到 15.23.00(build 421810,其最后一个 PC 补丁),《艾尔登法环》支持 App Ver. 1.17.1。
- 04
站在别人的逆向工程上
桥调用的是每个游戏自己的函数,所以需要偏移量,致谢里写明了出处:SharpPluginLoader 提供《怪物猎人:世界》的弹丸生成参数,HunterPie 提供它的伤害数字函数与区域偏移,fromsoftware-rs 提供《艾尔登法环》的任务组索引。hook 用的是内置的 MinHook,Minecraft 一侧是 Fabric。桥用到的每一个地址在启动时都会与预期字节比对,所以版本变动只会让依赖它的那个功能自己关掉,而不会写坏游戏。
他会告诉你什么
- 《艾尔登法环》只能离线玩。启动器不带 Easy Anti-Cheat 启动它——所有《艾尔登法环》模组都只能这样,而装过模组的游戏绝不能再连线上。
- 《怪物猎人:世界》一旦装过,之后每次启动都会加载这个桥,而桥会改动怪物血量,所以装着的时候请单人游玩。
install_mhw_bridge.sh --remove可以卸掉。 - 每个游戏只支持一个版本。地址对不上的功能会自己关掉,所以游戏更新之后能用的东西可能悄悄变少。
- README 明确说要备份存档,并且声明本项目和 Mojang、卡普空、FromSoftware、万代南梦宫、CodeWeavers、Apple 都没有关系。
- 跑起来需要 Apple Silicon 的 Mac、一份付费的 CrossOver 授权,以及两款游戏之一的副本。所以这不是大多数人一个下午能试的东西——它是可核的,而不是顺手的。
相关档案
全部档案 →第 139 号
DSCODE
一个建在 DeepSeek Harness 上的 macOS 终端编码 agent:自带一份钉住的 harness profile、把上游终端整包接管并在构建时打补丁,再补上宿主没有的会话层:会话之间可以互相发消息、Ultra 子代理、由独立模型复核的批准、定时运行。
第 137 号
Agents Universe
一套开源智能体平台,让同一个项目里的人共用一份上下文。项目选中时智能体把全部知识读进上下文,干活过程中再把学到的东西写回同一批文件;知识是磁盘上的 Markdown,数据库只做索引,没有嵌入模型,也没有向量检索。
第 138 号
Forbric
一个 Minecraft 模组加载器,让 Fabric、Forge 与 NeoForge 的模组跑在同一个游戏里。