MineCraft Forge开发mod踩坑记录
玩MineCraft的时候突发奇想,自己写个mod玩一玩。然后就开始了漫长的搜索mod开发文档和教程之路,配个环境配了一天,之后更是踩了好多好多坑。所以写个博客记录一下踩过的这些坑。
刚刚发现先用MCreator创建一个mod雏形,然后用idea自己改代码可以少踩好多坑,而且对于理解客户端与服务器端通信也有所帮助。
0.相关文档
Minecraft 1.12.2 Mod开发笔记——新的GUI(待完成)/HUD - 0.0~~ - 博客园
1.项目构建为jar包时不支持中文
在build.gradle里添加如下代码,使gradle在构建时支持中文注释。
// let the gradle support Chinese when building tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
2.分辨率问题
我笔记本是15.6英寸屏幕、win10系统,分辨率是1920*1080,缩放与布局设置的是125%。写完mod的“游戏主界面显示背包剩余箭量”这一功能,进行测试的时候发现屏幕分辨率获取错误,实际分辨率和获取到的显示分辨率不一致,这就导致本来该定位显示在右下角的数量跑到了显示范围之外,换句话说就是超出屏幕显示范围。踩坑踩了一天多才终于爬了上来。
之前获取分辨率代码如下,这样获取用的时候只有将界面尺寸设置为小才能正常显示,但是“小”又小到看不清。
Minecraft mc = Minecraft.getMinecraft(); //和mc.getFramebuffer().framebufferWidth获取到的宽度一致 int width = mc.displayWidth; //和mc.getFramebuffer().framebufferHeight获取到的高度一致 int height = mc.displayHeight;
正确用法如下。
@SubscribeEvent public void onRender(RenderGameOverlayEvent event) { if (event.getType() == RenderGameOverlayEvent.ElementType.ALL) { return; } int screenWidth = event.getResolution().getScaledWidth(); int screenHeight = event.getResolution().getScaledHeight(); // 这里调用自定义的HUD函数 // 不加这一行生存模式血量护甲这些会变乱码 mc.renderEngine.bindTexture(Gui.ICONS); }
3.设置界面
编写的mod需要一个设置界面来对mod内容进行设置。好多教程内都是先自定义一个继承GuiScreen的MyGui类,再在主类里添加按键监听事件,然后在监听事件内调用Minecraft.getMinecraft().player.displayGui(new MyGui(Minecraft.getMinecraft().currentScreen));来显示自己定义的那个Gui。
问题是我写的Gui不仅丑,而且功能也有点问题,万幸Forge自带一个Mod设置,只需要定义一个类实现IModGuiFactory接口,然后在这个类的createConfigGui方法中返回一个继承GuiConfig类的自定义类的对象就可以了。
然而最大的问题来了,由于我不知道这个Mod设置界面怎么调用,我花了足足一天的事件来尝试如何让它生效,包括在主类内注册,在监听事件内调用那个继承GuiConfig的类,结果是要么不能用,要么就是游戏闪退。最后从GitHub上下开源Mod,查看代码才发现只需要在主类的注解上加一个变量就OK了。
@Mod( modid = SimpleHUD.MODID, name = SimpleHUD.NAME, version = SimpleHUD.VERSION, clientSideOnly = true, guiFactory = "stars.simplehud.config.SimpleHUDGUIFactory" )
才看到文档里也有说明如何进行设置,教程文档:26. Forge 配置文件系统 · Harbinger
4.名称本地化
参考教程视频:Minecraft Mod编写1.12.2教程 Part5 本地化_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
虽然我练手的那个mod没有创建什么新方块,但是设置界面里的选项需要进行汉化,否则显示的会是配置文件内定义的变量名。这个汉化困扰了我很长时间,找了许多教程,代码也没有问题,最后发现居然是语言文件的命名有问题!
MC从1.11开始,语言文件名称必须全部小写,例如zh_cn.lang,在1.11之前名称必须是前边小写后边大写的格式,例如zh_CN.lang。
MCreator创建的项目中src\main\resources目录下的pack.mcmeta文件内有说明,然而我没有注意,导致一个命名错误困扰了我一天。
网易的教程里有对pack.mcmeta文件内容的说明:教程/制作资源包 _ 《我的世界》中文Minecraft Wiki:最详细的官方我的世界百科