基礎篇第一篇已經更新了1.7下的Forge安裝方法,但舊版的安裝方法依舊保留在一個ToggleBox里,此外我也不建議開發者立即轉向1.7開發(當然,已有Mod的升級是不能停的~),因為...眾所周知,MCP組的組長Searge拋下他的好基友ProfMobius"帶着小姨子捲走捐款跑了"(大霧,其實是被Mojang招安了),於是MC反混淆的任務就沒有人接手了,新版MC代碼中滿是func_xxx,field_xxx,完全無法直視...
故此,現在(1月11日)只有第一篇教程更新到了1.7,其餘教程仍停留在1.6時代.1.6到1.7的變動我會寫在這裡.
目錄結構的變動:
現在Mod源碼要放在[forge目錄]\src\main\java下,資源文件(比如紋理)要放在[forge目錄]\src\main\resources下.
註解的變動:
@ForgeSubscribe
現在更名為@SubscribeEvent
@NetworkMod
現在這個註解被取消了,它的功能被這些東西所替代:
clientSideRequired和serverSideRequired:現在FML支持自定義的Mod需求檢測函數,這個函數必須是一個位於Mod主類的公共靜態(public static)方法,返回值為boolean,參數為Map<String,String>和Side.參數中的Map為遠端發來的Mod列表及其版本,如下圖所示,Side為遠端類型.SERVER代表遠端為服務器,本地為客戶端,CLIENT代表遠端為客戶端,本地為服務器.比如當你的檢測函數被調用時,如果收到的Side是SERVER的話,說明你現在的代碼是運行在客戶端下.返回值代表是否滿足需要,返回false的話即不滿足聯機條件.(有趣的是,即使是在單人遊戲下,檢測函數也會被調用兩遍,因為眾所周知,MC的單人遊戲其實是偽多人遊戲~)
如果有多個檢測函數的話,結果將依賴字節碼的結構,只有在字節碼中位於最後一個的檢測函數才會被調用.在大多數編譯器中,字節碼結構基本和你的源代碼結構相對應.但建議不要依賴這個特性.
如果檢測函數不在Mod主類的話,那麼它什麼用也沒有.
channels:現在通過NetworkRegistry的newChannel方法來手動註冊封包通道和處理句柄,詳細內容看注釋吧,難道一次注釋寫的比版權聲明詳細呢...更詳細的使用我會在別處寫.
versionBounds:由Mod需求檢測函數實現.
packetHandler和tinyPacketHandler:在newChannel時指定.
connectionHandler:應該也是在newChannel時指定吧...不了解這個.
clientPacketHandlerSpec和serverPacketHandlerSpec:似乎沒有發現對應的...
物品與磚塊的變動:
現在Minecraft擁有了原生的命名空間系統(\散花/),不過FML很早就實現了自己的命名空間系統了...不是嗎,所以如果你不急着使用這個新特性的話,那就繼續使用GameRegistry的磚塊/物品註冊吧.
現在磚塊和物品不需要ID了,它們只需要一個名字,ID會由遊戲自動分配,現在你依然可以手動指定,但將來會徹底取消手動分配ID.
Block類的構造函數不再對外部可見了,即你不能再new Block()了.
Block類的大部分方法和字段仍未反混淆...
Item類的構造函數不再需要參數.
Item需要被GameRegistry的registerItem註冊後才能起作用.
GameRegistry的registerBlock和registerItem必須在預初始化階段(FMLPreInitialization)進行!
LanguageRegistry已經不建議使用了,事實上現在它有Bug...使用它錄入的文本進遊戲後需要重選一遍語言才能生效.現在直接在資源文件目錄下的assets.[mod名].lang中加入一個UTF8格式的en_US.lang文件,然後在裡面寫上文本.磚塊的格式為tile.[磚塊的unlocalizedName].name=[磚塊名],物品的格式為item.[物品的unlocalizedName].name=[物品名]
IconRegister更名為IIconRegister了.
關於各種func_xxx和field_xxx的含義,你可以在這個帖子http://www.minecraftforge.net/forum/index.php?topic=15275.0中查詢到其中一部分,或者諮詢MCP組的MCPBot http://mcpold.ocean-labs.de/index.php/MCPBot
其他一些變動
Potion類的setIconIndex的訪問級變成protected了.
想向玩家屏幕上顯示文本可沒有addChatMessage這種簡單的東西了,你需要func_145747_a.
還有很多,但懶得寫了 > <
最後再順便說一下Gradle(本來打算單獨寫一篇文章...後來感覺東西太jb少了,乾脆就和這篇合一塊了)
因為MCP組團滅了,現在FML使用Gradle作為構建工具,Gradle的優點之前已經說了,功能比Ant豐富,操作比Maven簡單,還能使用Maven的中央版本庫來下載所需的代碼庫.但缺點嘛...人氣太低,在此之前我甚至都沒聽說過Gradle...好吧這個算缺點嗎...
之前我們一直都是用控制台操作Gradle,現在我們切換到界面模式下,先打開命令窗口,執行:
gradlew.bat --gui
然後便打開界面模式了.
界面模式有4個分頁,分別是Task Tree(任務列表),Favorites(收藏的指令),Command Line(執行指令)和Setup(Gradle配置).默認界面在Command Line頁,它可以執行任意指令,指令的格式是:
[附加選項] [要執行的任務]
這兩部分可以互相顛倒,像我們在基礎篇中執行的eclipse指令,它其實就是一個無附加選項的"執行eclipse任務".--gui則是要求打開一個圖形界面,不要求執行任務(但實際上這裡是個特例,它會自動執行tasks任務,即刷新並顯示所有可用的任務)
想要發布Mod的話,執行build任務就可以了,但在此之前我們要修改一下配置,要求編譯時使用UTF-8編碼,用文本編輯器打開build.gradle,在最下面加入:
tasks.withType(Compile) { options.encoding = 'UTF-8' }
這樣就能在編譯時使用UTF-8編碼了,同時你還可以修改archivesBaseName,version和group這幾項來修改構建完後打包好的jar的名字.
如果你在執行build任務時遇到了錯誤的話,可以嘗試按照如下步驟來解決:
- 資源文件中不能有包含非Ascii碼的文件/文件夾名,換句話說,文件/文件夾名中不要帶中文,我覺得可能是Gradle的打包有bug(沒人氣的小項目就是這麼尿...),會把用ANSI編碼寫名字的文件打包錯...
- 還沒解決?運行一下clean任務.
- 還沒解決?用文本編輯器打開build.gradle,在最下面加入:
reobf { deobfFile = new net.minecraftforge.gradle.delayed.DelayedFile(project, "build/tmp/deobfBinJar/deobfed.jar") } - 還沒解決?執行"cleancache --refresh-dependencies".
- 還沒解決?留言吧!
雖然我也不一定能解決...
成功構建後,構建完畢的jar位於build/libs目錄下.
關於Gradle的就只有這些了...想了解更多的話,就看Gradle的手冊然後學習Groovy與DSL吧...
再順便提一下關於ForgeGradle的3種開發環境配置方式,我上論壇發了個帖子,巨巨是這樣回答我的:
setupDevWorkspace只準備開發環境而不生成MC源碼
setupDecompWorkspace即準備開發環境也生成MC源碼
setupCIWorkspace是供諸如Jenkins之類的持續集成系統使用的(苣蒻表示不會用Jenkins...)
表示完全沒看懂關於Block註冊的那部分...
那句testblock= new BlockStone();是什麼意思...創建一個石材質的Block么...
創建一種新的磚塊,BlockStone是遊戲默認的石頭磚塊.過去可以直接new Block,現在Block成抽象類不能實例化了...(掩面)
請問菊苣除了中文MCbbs之外還知道哪裡專說MOD製作的嗎,E文也無妨,1.7以上就更好惹
唔...Wiki和論壇的Gradle區如何...
話說我看了好一大圈之後才看明白,官方製作團隊在為1.8全面優化源代碼啊0 0
1.8出來之後估計原來的MOD製作工具都不能用了【大概
話說我沒理解錯吧_(:з」∠)_求解疑
很久沒有關注MC的狀況了...看了一下1.8的已知變動,似乎變化最大的是GUI部分(至於附魔和交易...似乎改那裡的mod不多),其他的應該沒有太大變化.
這種漫長痛苦的底層變動等熬到官方的ModAPI推出時應該就能結束了...祝他們能成功吧
build任務怎麼執行...........
請問MinecraftForge.getBlockHarvestLevel改成什麼了
* Where:
Build file 'H:\minecraft\forge-1.7.10-10.13.4.1558-src-McUI\build.gradle' line: 65
* What went wrong:
A problem occurred evaluating root project 'forge-1.7.10-10.13.4.1558-src-McUI'.
> Could not find property 'Compile' on root project 'forge-1.7.10-10.13.4.1558-src-McUI'.
---------
好吧找到解決方法了
那裡應該是
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}