教程正在向1.7更新...

基礎篇第一篇已經更新了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主類的話,那麼它什麼用也沒有.
gradlewN1
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了.

gradlewN2

gradlewN3

關於各種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

然後便打開界面模式了.

gradlewN4

界面模式有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任務時遇到了錯誤的話,可以嘗試按照如下步驟來解決:

  1. 資源文件中不能有包含非Ascii碼的文件/文件夾名,換句話說,文件/文件夾名中不要帶中文,我覺得可能是Gradle的打包有bug(沒人氣的小項目就是這麼尿...),會把用ANSI編碼寫名字的文件打包錯...
  2. 還沒解決?運行一下clean任務.
  3. 還沒解決?用文本編輯器打開build.gradle,在最下面加入:
    reobf { deobfFile = new net.minecraftforge.gradle.delayed.DelayedFile(project, "build/tmp/deobfBinJar/deobfed.jar") }
  4. 還沒解決?執行"cleancache --refresh-dependencies".
  5. 還沒解決?留言吧!
    雖然我也不一定能解決...

成功構建後,構建完畢的jar位於build/libs目錄下.

關於Gradle的就只有這些了...想了解更多的話,就看Gradle的手冊然後學習Groovy與DSL吧...

再順便提一下關於ForgeGradle的3種開發環境配置方式,我上論壇發了個帖子,巨巨是這樣回答我的:
setupDevWorkspace只準備開發環境而不生成MC源碼
setupDecompWorkspace即準備開發環境也生成MC源碼
setupCIWorkspace是供諸如Jenkins之類的持續集成系統使用的(苣蒻表示不會用Jenkins...)