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