zoukankan      html  css  js  c++  java
  • 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:最详细的官方我的世界百科

  • 相关阅读:
    Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs
    入围 WF 后训练记
    算法竞赛历程
    2021 多校 杭电 第十场
    2021 多校 杭电 第九场
    2021 多校 牛客 第十场
    2021 多校 牛客 第九场
    2021 多校 杭电 第八场
    2021 多校 杭电 第六场
    2021 多校 杭电 第七场
  • 原文地址:https://www.cnblogs.com/dream0-0/p/13175593.html
Copyright © 2011-2022 走看看