MineCraft Forge开发mod踩坑记录

  玩MineCraft的时候突发奇想,自己写个mod玩一玩。然后就开始了漫长的搜索mod开发文档和教程之路,配个环境配了一天,之后更是踩了好多好多坑。所以写个博客记录一下踩过的这些坑。

刚刚发现先用MCreator创建一个mod雏形,然后用idea自己改代码可以少踩好多坑,而且对于理解客户端与服务器端通信也有所帮助。

0.相关文档

  我的世界开发者中文指南-Forge模组开发

  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:最详细的官方我的世界百科

posted @ 2020-06-22 10:33  星辰°  阅读(2002)  评论(0编辑  收藏  举报