提示
若您并没有拥有 Minecraft 账号,请自行退出,否则在完成之后你可能将会违反 Minecraft EULA,该教程仅适用于拥有 Minecraft 账号的人。
反编译
工具
修改 MCP
首先将下载好的 MCP 4.3 单独解压到一个目录中,然后打开 runtime 目录中的 commands.py 文件转到 496 行,将 md5srvlist 的值修改为 {},再将502 和 503 行注释掉,修改完成后保存:
导入依赖
然后用任意启动器使用 正版登录 在官方启动器目录启动一次原版 Minecraft Beta 1.7.3:
然后将 版本目录中的 b1.7.3.jar 复制到 mcp 目录中的 jars/bin 目录中,并改名为 minecraft.jar,bin 目录需要自行创建,然后再将 libraries 目录中的以下几个文件复制到 mcp 的对应位置中:
org\lwjgl\lwjgl\lwjgl\2.9.0\lwjgl-2.9.0.jar | jars\bin\lwjgl.jar |
org\lwjgl\lwjgl\lwjgl_util\2.9.0\lwjgl_util-2.9.0.jar | jars\bin\lwjgl_util.jar |
net\java\jinput\jinput\2.0.5\jinput-2.0.5.jar | jars\bin\jinput.jar |
net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar | jars\bin\natives\jinput-platform-2.0.5-natives-windows.jar |
然后再将 bin 目录中的文件复制到 mcp 的 lib 目录中以防万一。
反编译
然后打开 mcp 目录中的 decompile.bat 文件等待反编译完成即可,预计 1 - 3 分钟左右:
打包运行
首先使用 IDE 打开 mcp 目录中的 eclipse\Client 项目,这里以 IDEA IDE 为例,然后打开项目结构,将 SDK 和 语言级别设置为 Jdk 6:
导入 eclipse\Client 目录中的 .project 模块文件,然后删除所有内容根,并添加内容根为 mcp 目录中的 src 目录,然后新建 resources 资源目录,模块依赖仅保留 jdk1.8,然后导入 mcp 目录中的 lib 目录为库,并将其导入模块:
然后再将 mcp 目录中的除了 net 和 META-INF 目录的所有文件复制进 resources 目录中。
打包
然后创建空的工件,类型 JAR,将 "Client"编译输出添加进去:
然后构建工件即可得到打包好的 Minecraft beta 1.7.3 客户端。
运行
首先使用任意启动器生成一个启动命令行在游戏目录中,然后去掉命令行末尾的 pause ,然后在 IDEA 中添加一个 Shell 脚本配置来执行脚本文件,并设置在执行前构建工件,脚本内容填写以下内容:
cmd /c copy /y <out_jar> <game_dir>\b1.7.3.jar
取消在中终端运行选项:
然后再创建一个 Batch 配置,设置在执行前运行刚刚创建的 Shell 脚本配置,脚本填写启动命令行的绝对路径。
最后运行测试即可。
修改游戏窗口标题及简易功能实现
修改游戏窗口标题
首先打开 Minecraft 类,然后找到处于第 1549 行的 frame 变量,然后将其中的 "Minecraft" 改为你想要的标题即可。
简易功能实现
首先打开 Minecraft 类并创建一个布尔值变量,然后打开 EntityPlayerSP 类,然后在 onLivingUpdate 类中判断 I 键是否被按下,如果符合便判断刚刚创建的变量,如果为假则修改 Timer 为原本的 2.5 倍,并设置刚刚创建的变量为真,否则修改为原速,记得要将 timer 变量的修饰符改为 public:
if(Keyboard.isKeyDown(Keyboard.KEY_I)){
mc.timer = new Timer(mc.timed?20f:20f*2.5f);
mc.timed = !mc.timed;
}
public Timer timer;
public boolean timed = false;
最后运行测试即可。
完整代码
Minecraft.java
public Timer timer;
public boolean timed = false;
public static void startMainThread(String s, String s1, String s2) {
[...]
Frame frame = new Frame("ExampleBetaClient | 1.0");
[...]
}
EntityPlayerSP.java
public void onLivingUpdate()
{
if(Keyboard.isKeyDown(Keyboard.KEY_I)){
mc.timer = new Timer(mc.timed?20f:20f*2.5f);
mc.timed = !mc.timed;
}
[...]
}