LV. 14
GP 881

【路人喵教學】用Forge製作模組!【公開XMeowMod原始碼】

樓主 冰霜o奶茶 h0103661
GP137 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。


*本教學適用於 正式版 1.6.4 & Java 7

章節導覽:
一、設定
       【1-1】下載所需要的檔案(#1)
       【1-2】安裝 MCP 和 Forge(#1)
       【1-3】設定 workspace(#1)
       【1-4】設定 Mod 基礎(#1)
二、第一個物件
       【2-1】第一個道具(#1)(01/30 20:11更新)
       【2-2】第一個方塊(#1)(01/30 20:11更新)
       【2-3】名子(#1)
       【2-4】合成與熔煉(#1)
       【2-5】燃料(#1)
三、釋出Mod
       【3-1】CommonProxy和ClientProxy(#13)
四、系統
       【4-2】礦物通用(#13)
五、更多道具
       【5-2】裝備類與EnumArmorMaterial(#16)(07/10 19:07更新)
       【5-3】弓與弓箭
       【5-4】打火石和剪刀
六、更多方塊
       【6-1】方塊多材質
       【6-2】柵欄
       【6-3】門
       【6-4】農作物
七、世界
       【7-1】生成你的礦物(#37)
       【7-2】生成你的花
       【7-3】讓草會掉落你Mod裡的物品
       【7-4】讓骨粉灑在地上時會長出你Mod裡的花草
       【7-5】讓自然生成的寶箱會有你Mod裡的物品
       【7-6】讓生物會掉落你Mod裡的物品
 
其他、網友提供
       【方塊&世界】指定方塊破壞道具/不同的生成代碼(#63)(感謝 a2569875 分享
       世界】建立一個生態系(#64)(感謝 a2569875 分享
       世界&生物】為生態系增加生物(#65)(感謝 a2569875 分享
       【方塊】自訂方塊掉落物品(#98)(感謝 andy890201 分享
       【方塊】多材質(#99)(感謝 andy890201 分享
       【道具】食物(#101)(感謝 andy890201 分享
       【方塊】讓方塊只能被某一等級的工具破壞(#119)(感謝 andy890201 分享
 
其他、原始碼
       【ModLoader】XMeowMod 更豐富的生存 Alpha http://adf.ly/R4OWu
       【Forge】XMeowMod 更豐富的生存 最終版本原始碼 載點 直連

一、設定
       【1-1】下載所需要的檔案:
 
我們製作一個Forge Mod需要什麼呢?
【一】Java SE Development Kit(JDK) - 下載並安裝
【二】Eclipse - 下載並安裝
【三】Forge Source - 下載並等待步驟(這次要下載的是"Source"不是"Universal"哦!
 
好了,【1-1】結束。

一、設定
       【1-2】安裝 MCP 和 Forge:
 
首先,把 ForgeSource 裡的 forge 資料夾放到到你喜歡的資料夾(推薦使用MC版本名稱),
點開那個 forge 資料夾,有個"install",點下去直到它跑完。
 
【1-2】結束。

一、設定
       【1-3】設定 workspace:
 
打開 Eclipse,工作環境選 MCP 資料夾底下的 eclipse 資料夾
等它讀取好 workspace(右下角讀條)後,
你應該可以在左邊看到若干個資料夾,
我們主要都是使用和工作在"src"裡面,
現在,對src點擊右鍵,點擊New => Package
Name那邊要打什麼呢?
對於新手,我建議這個:「你的名子.Mod名子.common」,
當建立好之後,再建立一個「你的名子.Mod名子.client」,
為了之後的方塊和道具,我們再建立兩個資料夾:
你的名子.Mod名子.common.block」、「你的名子.Mod名子.common.item」。
 
完成!【1-3】結束。

一、設定
       【1-4】設定 Mod 基礎
 
右鍵點擊「你的名子.Mod名子.common」,
選擇New => Class,名子就打上你的Mod名子
然後填上這個:(//後面為註解)
package 你的名子.Mod名子.common;
//這是你這個Class的位置
 
@Mod(modid = "Mod名子", name = "Mod名子", version = "你的Mod版本")
//這是設定你Mod的資訊
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
//clientSideRequired是指在伺服器遊玩這個Mod時需不需要在客戶端安裝這個Mod
//serverSideRequired是指在客戶端遊玩這個Mod時需不需要在伺服端安裝這個Mod
 
public class 這個Class名子 {
 
@Instance("Mod名子")
public static 這個Class名子 instance;
//以後會用到
 
@SidedProxy(clientSide="你的名子.Mod名子.client.ClientProxy",serverSide="你的名子.Mod名子.common.CommonProxy")
//設定代理

public static CommonProxy proxy;
//以後會用到
 
@PreInit
public void preInit(FMLPreInitializationEvent event) {
 
}
//在運行Mod前做的,傳說中Config檔設定區
 
@Init
public void init(FMLInitializationEvent event) {
 
}
//在運行Mod時做的,主要編輯區
 
@PostInit
public void postInit(FMLPostInitializationEvent event) {
 
}
//在運行Mod後做的
 
}
如果底下劃了紅線,滑鼠移到上面等待小泡泡跳出,
並選擇 import xxxxxx,
這是用來讓這個class讀取別的class檔案。
 
這個檔案,我們就稱做 Main (主頁)吧!

【1-4】結束。

二、第一個物件
       【2-1】第一個道具
 
OK~開始來我們的第一個玩具。
首先,在 Main 新增以下的代碼:
public static CommonProxy proxy;
//灰色部分都是給你看位置用的,不用寫入
 
public static Item FirstItem;
//註冊一個叫做 FirstItem 的道具,這個名子是用做編輯用的代碼而非顯示的名子。
 
@PreInit
public void preInit(FMLPreInitializationEvent event) {}
如此一來,我們就註冊好了第一個道具,
但它還沒有任何作用,就連遊戲中都看不到,
現在,我們需要在「你的名子.Mod名子.common.item」底下新增一個class,
取名為:「ItemFirstItem
並參照以下代碼:
package 你的名子.Mod名子.common.item;
 
public class ItemFirstItem extends Item{
//代表這個class是Item的擴展,會套用到Item的代碼

public ItemFirstItem(int id){
//int指的是數字,id是代碼,代表填在這裡的數字將會以id來當作代碼
super(id);
//Item需求,登記物品id
this.setCreativeTab(CreativeTabs.tabFood);
//意思是把這個東西放在創造選單的食物類,有以下可以選擇:
//tabBlock 方塊, tabDecorations 裝飾, tabRedstone 紅石, tabTransport 交通工具, tabMisc 其他
//tabFood 食物, tabTools 工具, tabCombat 戰鬥, tabBrewing 釀造, tabMaterials 材料
}

@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister){
itemIcon = par1IconRegister.registerIcon("Mod名子:ItemFirstItem");
//這是用來設定你物件的圖片,格式為"Mod名子:物品材質名子"
//材質請放至在assets/Mod名子/textures/items底下(01/30 20:11更新)
}
}
好了,物品的class設定好了,剩餘最後一個步驟
打開你的 Main 並新增以下:
@Init
public void init(FMLInitializationEvent event) {
 
FirstItem= new ItemFirstItem(10000).setUnlocalizedName("FirstItem");
//物品代碼= 物品的class(id這個代碼,這裡指物品ID).setUnlocalizedName("物品代碼");
)
好了,這樣就完成了第一個道具囉!
 
【2-1】結束。

二、第一個物件
       【2-2】第一個方塊:(07/07 22:30更新)
 
恭喜~我們要來做第一個方塊了!
在 Main 新增以下的代碼:
public static CommonProxy proxy;
 
public static Block FirstBlock;
//註冊一個叫做 FirstBlock 的方塊,這個名子是用做編輯用的代碼而非顯示的名子。
 
@PreInit
public void preInit(FMLPreInitializationEvent event) {}
現在在「你的名子.Mod名子.common.block」底下新增一個class,
取名為:「BlockFirstBlock
並參照以下代碼:
package 你的名子.Mod名子.common.block;
 
public class BlockFirstBlock extends Block{
//代表這個class是Block的擴展,會套用到Block的代碼

public BlockFirstBlock(int id){
//同【2-1】
super(id, Material.rock);
//前者為Block需求,登記物品id
//後者為設定方塊性質,rock為石頭,可選類型參照net.minecraft.block.material.Material這個class
this.setCreativeTab(CreativeTabs.tabFood);
//意思是把這個東西放在創造選單的食物類,可選類型參照【2-1】
this.setHardness(5.0F);//硬度(07/07 22:30更新)
this.setResistance(5.0F);//防爆能力(07/07 22:30更新)
this.setLightValue(0.5F);//亮度(07/07 22:30更新)
}

@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister){
blockIcon = par1IconRegister.registerIcon("Mod名子:BlockFirstBlock");
//這是用來設定你物件的圖片,格式為"Mod名子:物品材質名子"
//材質請放至在assets/Mod名子/textures/blocks底下(01/30 20:11更新)
}
}
同樣地,打開你的 Main 並新增以下:
@Init
public void init(FMLInitializationEvent event) {
 
FirstBlock= new BlockFirstBlock(4000).setUnlocalizedName("FirstBlock");
//方塊代碼= 物品的class(id這個代碼,這裡指方塊ID).setUnlocalizedName("方塊代碼");
GameRegistry.registerBlock(FirstBlock);
//讓遊戲讀取這個方塊,一個麻煩的東西
 
)
好了,第一個方塊完成!
 
【2-2】結束。

二、第一個物件
       【2-3】名子
 
很簡單的,打開你的 Main 並新增以下:
@Init
public void init(FMLInitializationEvent event) {
 
LanguageRegistry.instance().addName(FirstItem, "第一個道具");
LanguageRegistry.instance().addName(FirstBlock, "第一個方塊");
//格式為(代碼, "名子")
 
}
 
【2-3】結束。

二、第一個物件
       【2-4】合成與熔煉
 
斯O有兩種,合成也有兩種:
【一】固定式合成:一定要照格式才有東西(ex:箱子)
@Init
public void init(FMLInitializationEvent event) {
 
GameRegistry.addRecipe(new ItemStack(FirstBlock,1),//代碼,數量
"BAB",
"BAB",//簡單明瞭的合成區
"BAB",
Character.valueOf('A'),Item.ingotIron,//意思是上面合成區的A代表Item裡的鐵錠
Character.valueOf('B'),FirstItem//意思是上面合成區的B代表FirstItem
);
 
}
【二】非固定式合成:隨便排只要東西都有在就有東西(ex:蘑菇湯)
@Init
public void init(FMLInitializationEvent event) {
 
GameRegistry.addShapelessRecipe(new ItemStack(FirstBlock,3),//代碼,數量
FirstItem, FirstItem, FirstItem);//代表合成台上只要有3個FirstItem就能合成出來
 
}
熔煉:
@Init
public void init(FMLInitializationEvent event) {
 
GameRegistry.addSmelting(FirstItem.itemID, new ItemStack(FirstBlock), 1.0F);
//放入物(如果是道具用itemID,如果是方塊用blockID),燒出物,獲得的經驗值
 
}
 
【2-4】結束。

二、第一個物件
       【2-5】燃料
 
新增燃料就比較複雜了,
首先,在「你的名子.Mod名子.common」底下新增一個Class,
就稱為「FuelHandler」吧!
並輸入以下代碼:
package 你的名子.Mod名子.common;
 
public class FuelHandler implements IFuelHandler {
//指這個class使用IFuelHandler這個class(該說使用還是...)
 
@Override
public int getBurnTime(ItemStack fuel) {//指ItemStack在這裡稱做fuel?
int burntime = fuel.itemID;//指burntime這個數字是代表fuel這個物件的ID
 
if(burntime == Mod名子.FirstItem.itemID){//指使用Mod名子這個class中的FirstItem道具
return 300;//每20是1秒,每15秒燒好一個東西
}else
 
if(burntime == Mod名子.FirstBlock.blockID){//指使用Mod名子這個class中的FirstBlock方塊
return 600;//同上
}else
 
{
return 0;
}
}
}
一大串結束了,現在只要在 Main 新增以下:
@Init
public void init(FMLInitializationEvent event) {
 
GameRegistry.registerFuelHandler(new FuelHandler());//讓遊戲讀取到FuelHandler的資料
 
}
 
【2-5】結束。

路人喵 自製模組:
多達 600 個新物件及若干個系統豐富你的MineCraft!
 
 
 
 
137
-
板務人員:

1320 筆精華,前天 更新
一個月內新增 3
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】