基礎篇小結:來看源碼吧~鞏固之前的知識,順便看看創建方塊物品之類基本操作的具體做法

經過了前5章的學習,你現在已經可以開始着手製作自己的mod了(所以快加入我的鬥羅大坑呸大陸計劃中來啊)

但那些畢竟大都是理論上的東西,可能還有些童鞋不太清楚一個具體的mod長啥樣,現在咱就來看看:

首先是工程結構樹狀圖:



嘿嘿,我估計直接就有孩子激動了:樓主,尼瑪終於肯上真正的圖了~~~

是的,畢竟這一節就是爲了直觀嘛。不過童鞋,不是我對自己的語文功底自信,而是你確實需要學會讀文,圖雖直觀方便,但畢竟不如文字準確。我並不想寫一個教小學生一步一步跟着走的教程,我要寫的是能讓你理解Forge,掌握mod製作的方法並能真正加入到mod製作中來,加入我的鬥羅大坑計劃的文檔!

好,廢話不多說,圖中圈起來的地方是重點,第一個圈圈住了src,源碼的意思,是我們製作mod時主要操作的部分。第二個圈,圈住了src/main下的兩個文件夾,java是放Java代碼的,resources是存放資源的。所以你要記住,如果我說的是Java源碼,那麼你就應該去java裏面找,當然實際上是java/com.zhengxiaoyao0716.douromod/下面,如果是貼圖、模型等資源,就在resources下面找,實際上除了mcmod.info,都在assets.douromod/下面。


對照之前的內容,你會明白,@Mod標識了DouroMod這個class是一個mod的主類。


Proxy還記得不?代理器。下面三個方法preInit();、init();、postInit();是我註冊到Forge執行流程中的三個方法,方法名你隨便,但參數是關鍵,三個參數對應了會在遊戲開始時被Forge依次執行的三個事件,要用@EventHandlew註冊它們,你可以Ctrl + clickL,看看Forge源碼中對你應該在哪個事件中做什麼事的建議。當然還有別的一些事件,你可以去源碼裏自己翻翻。三個方法裏面,在proxy對象上調用了CommonProxy或ClientProxy的方法,具體是調用到了哪個由運行的端決定。proxy的方法名就更不重要了,你隨便起隨便用,我這樣無非是偷懶。唯一需要注意的就是ClientProxy必須繼承CommonProxy,有Java基礎的都明白爲什麼吧。


我記得我沒教過大家怎麼創建Block、Item,但其實只要你明白了我之前那幾篇文章,並且有Java基礎,這簡直so easy。創建一個Block就是創建一個Block類的實例,然後你在這個實例上set上你的數據就ok,Item同理。對了,把實例作爲主類的一個公開域來寫,主要是方便各處的調用。


吶,我是建了一個繼承自Block的類,用這個類來初始化我的ironEssenceOre實例,在構造器裏面完成對這個實例的數據的設定。其實單這麼看,意義不大,你完全可以在直接實例化Block賦給你的ironEssenceOre。但這樣是有好處的,其一是避免了主類的冗長,其二是方便重寫Block類的一些方法。創建簡單的Block固然可以直接通過設定實例的數據實現,但一些複雜的功能是需要重寫父類的方法的。最後簡單描述一下圖中幾個方法及參數的意義吧,其實你完全可以自己去查源代碼來看,一定要記住,Forge的文檔非常少,你很難找到一份完美的介紹清楚每一個方法與參數的javadoc,所以多自己去揣摩。

  • 圖中super了父類的構造器,傳入的參數是石頭的材質。你可以Ctrl+鼠標左鍵,看看Material裏面都有哪些預設的材質,你也可以自己定義。至於材質是什麼,抱歉,MC裏沒有很準確的定義,它類似於模型,但涵蓋了很多屬性,我只能告訴你,空氣air與岩石rock肯定是不同的材質,雪ice和火fire肯定也是不同的對吧。具體有什麼區別呢?Ctrl+clickL,自己看看源碼怎麼寫就明白了。

  • setUnlocalizedName();,這個方法我前文已經提到過了,字面意思上看,它爲這個實例設定了未本地化的名字。什麼叫未本地化呢?就是說,這個名字實在語言文件中條目缺失的情況下默認顯示的。語言文件就是放在assets/douromod/lang/下面的en_US.lang、zh_CN.lang等等配置文件,前者是默認的英文,後者是中文。其內容類似這樣:

    tile.ironEssenceOre.name=鐵母礦
    
    item.ironEssence.name=鐵母
    item.sleeveBow.name=袖箭

    注意=兩邊不要有多餘的空格,這是配置文件,不是Java。UnlocalizedName實際上會被加上前後綴構成一個新的字符串鍵,遊戲中根據這個鍵在lang尋找要顯示的名字的字符串值。

  • setHardness();是設置挖掘的硬度,經過我的測試,3.0f大概相當於鐵礦。這裏建議你看看源碼,會發現它和blockResistance,抗炸能力是有約束關係的,所以我沒有再setResistance();,如果你要設置方塊的抗炸能力也請注意這個問題。由此也可見看源碼的重要。setHarvestLevel();是設置開採要求的等級,第一個參數是可被開採的工具的類型名字,這裏設定爲pickaxe(鎬),第二個參數是工具的質地等級,具體請Ctrl+clickL。

這就是爲什麼我不喜歡講怎麼創建方塊之類的,明明很簡單的事情卻要用很大的篇章才能講清。基本上除了語言文件這點,其它的會Java就能自己搞定。繼續向下:


這是CommonProxy的內容,我前面說過,它負責服務端。只看我標紅線的行,其它的不在本次討論範圍內。

  • 第一行,調用了剛剛的IronEssenceOre類的構造器,來實例化主類的ironEssenceOre實例。

  • 第二行,註冊了這個方塊,註冊方法原形public static Block registerBlock(Block block, String name);,第二個參數雖然名爲name,但你實際要填寫的應該是modId:blockId,這個name實際是方塊的id,方塊在遊戲中真正顯示的名字是由setUnlocalizedName();指定的。別忘了在方塊id前的"modid:"否則別人證明知道這個方塊屬於你的mod呢。

  • 第三行,可以看到在註冊了方塊後,我們有給它添加了一個Smelting冶煉,並且,添加冶煉方法寫在了init();裏,它是在preInit();之後調用的。第一個參數是要冶煉的方塊,第二個是一個ItemStack(物品棧)實例,用要生成的方塊/物品作爲參數創建它。爲什麼這麼做呢?因爲你冶煉完成實際得到的並不是一個物體,而是物品欄裏的一個它的ItemStack對象。最後一個參數是玩家所應得的經驗,這個值在原版MC設定的冶煉中大都非常小,燒一塊金子大概是1.0f。

  • 第四行是爲一個註冊過的物品添加了一份合成表。簡單物品的創建與Block差不多,當然物品沒有材質,也就不需要super父類,物品也沒有開採硬度之類的,總之你在實例後面打個點看看不就知道有哪些沒哪些了。物品在語言文件lang中的鍵是item.[你在setUnlocalizedName();裏設定的名字].name。添加合成表也很簡單,第一個參數是玩家應該獲得的物品,與冶煉產物一樣都實際上是這個物品的ItemStack,第二個參數有點奇葩,Object[],基礎對象數組。這個數組的寫法規則是這樣的:先放1~3個字符串,每個字符串1~3個字符,比如"aaa", " b ", " b ",注意後面連個字符串中的b前後有空格。然後,一個字符一個物品的放幾組,字符要對應前面的字符串內的,比如'a', Items.xxx, 'b', Item.yyy,注意是字符,單引號。這是什麼意思呢?原來,MC會把前面那些字符串裏的字符,依次替換成後面的字符後緊跟的物品。也就是說,其實就是用字符代表物品,擺出你設計的合成表,再在後面說明一下,a是什麼,b是什麼。


這是ClientProxy裏面的init方法片段。可以看到,在這裏面完成了物品、方塊的註冊及模型的添加(準確的說是設定,之前討論過這個add實際上做的是set)。具體請參照前文,這裏沒啥可說的。

最後,再上一張main文件夾下面的Java、resources展開的結構圖,你可以對照前文找找哪些文件都應該在哪兒

是的,還有我的Github:https://github.com/zhengxiaoyao0716/DouroMod

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章