Emperor-reborn: 基于 MCP 重写的 Minecraft 1.8 模块化客户端
这是我基于 MCP(Mod Coder Pack)做的一个 Minecraft 1.8 客户端。起因很简单:我一直对游戏客户端内部怎么跑的这件事感兴趣,而 1.8 又是 PvP 圈子的经典战场,拿一份泄露的客户端源码来拆、来读、来重写,是我觉得最快理解这套东西的方式。所以 Emperor-reborn 说白了就是我在别人泄露源码的地基上,自己重新捏出来的一个模块化 utility client,目标服是原版、Hypixel,以及网易 HYT 这类国服。
我怎么搭它的
核心我按框架来拆,而不是一堆散功能。模块都放在 dev.emperor.module.modules 下,按类别分:战斗(KillAura、AutoClicker、各家 anticheat 的 Velocity 变体、BowAimbot、BackTrack)、移动(Fly、Speed、Strafe、Timer、NoSlow)、玩家(NoFall、Blink、ChestStealer、FastEat)、渲染(ESP 系列、ClickGui、HUD、Chams、XRay)、世界(Scaffold、AutoPearl、Eagle)以及杂项(PingSpoof、Disabler、AntiBot)。
真正让我上头的是底下那层框架:一个带类别的 module manager,一套 Bool / Number / Mode / Color / Text 的 value 系统给每个模块挂参数,一个带优先级的事件总线(@EventTarget),再加命令系统,默认前缀是 .,内置 bind、toggle、config、help 这些。配置走 ConfigManager,启动时 loadAllConfig() 自动读回来。多版本兼容我直接把 ViaVersion / ViaBackwards / ViaRewind 内嵌进去(ViaMCP),这样一个 1.8 的壳能连更高版本的服。国服那套逻辑和 UI 单独放在 dev.emperor.hyt。渲染这块我也折腾了自定义 shader、字体和动画,在 utils/render、utils/novoshader 里。
技术栈和踩的坑
语言是 Java(JDK 17),平台就是 MCP 下的 MC 1.8。构建这里我要老实说:它没有 Maven 也没有 Gradle,纯 IntelliJ 工程 + 本地 lib/ 里的 jar 手动引。lib/minecraft 放 LWJGL、netty、authlib 这些运行时,lib/client 放 Via 全家桶、ASM 9.3、fastjson、Lombok。入口是 Start.java,里面拼一串启动参数丢给 net.minecraft.client.main.Main:
Main.main(concat(new String[] {
"--version", "mcp", "--accessToken", "0",
"--assetsDir", "assets", "--assetIndex", "1.8",
"--userProperties", "{}"
}, args));
坑主要在跑起来这一步:decompile 出来的 MC 源码加 OptiFine 混在一起,assets 和 natives 得自己准备好,仓库里没有开箱即用的运行脚本,所以想复现得自己补环境。想读代码的话,从 Start.java 进,再到 dev.emperor.Client(所有 manager 在这里初始化),然后往 module、event、config 里钻,基本就顺了。
现在的状态
这项目我已经归档了,当练手和结构参考留着,不保证能编译能跑。回头看,它对我更多是一次“把游戏客户端从头拆一遍”的完整练习,那套模块 + 事件 + 配置的骨架,后面我做别的东西时还挺受用。