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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM