• 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创建的项目中srcmain esources目录下的pack.mcmeta文件内有说明,然而我没有注意,导致一个命名错误困扰了我一天。

      网易的教程里有对pack.mcmeta文件内容的说明:教程/制作资源包 _ 《我的世界》中文Minecraft Wiki:最详细的官方我的世界百科

  • 相关阅读:
    enum
    高可用复用类
    int 和 Integer 的区别
    MysqlMd5加密
    软件测试例子
    Wordcount
    大气登录页面
    生成二维码的JAVA
    多态的理解
    打印低头思故乡 java
  • 原文地址:https://www.cnblogs.com/dream0-0/p/13175593.html
Copyright © 2020-2023  润新知