制作一個方塊跟制作物品一樣也就兩個步驟:
1.創建一個方塊,并添加材質
2.實例化并注冊這個方塊
# 創建方塊
在包`src/main/java/com/wzhrdx/XenoAge`下新建類`block.BlockSilverOre`并繼承 Block 類:
~~~java
package com.wzhrdx.XenoAge.block;
import com.wzhrdx.XenoAge.XenoAge;
import com.wzhrdx.XenoAge.creativetab.TabXenoAge;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
public class BlockSilverOre extends Block {
public BlockSilverOre(){
super(Material.ROCK);
this.setTranslationKey(XenoAge.MODID + ".silverore");
this.setRegistryName("silver_ore");
this.setCreativeTab(TabXenoAge.TAB_XENO_AGE);
this.setHardness(1.5F);
this.setHarvestLevel("pickaxe",2);
}
}
~~~
* [ ] > super構造函數,用于方塊顏色如ROCK,
設置成 ROCK 之后地圖上顯示的方塊顏色就是石頭的灰色`Material.AIR`
`Material.GRASS`
`Material.GROUND`
`Material.WOOD`
`Material.ROCK`
更多對著`Material.ROCK`按CTRL+鼠標左鍵
* [ ] > `setBlockUnbreakable`方法用于設定方塊的硬度為-1,即不能損壞。 `setHardness`方法用于設定方塊的硬度,如黑曜石是50,鐵塊5,金塊3,圓石2,石頭1.5,南瓜1,泥土0.5,甘蔗0,基巖-1。
`setHarvestLevel`方法用于設定方塊的可挖掘等級,如鉆石鎬是3,鐵2,石1,木金0。
`setLightLevel`方法用于設定方塊的光照,其周圍的光照為設定值x15,如巖漿1.0,對應15,紅石火把0.5,對應7.5。
`setLightOpacity`方法用于設定方塊的透光率,數值越大透光率越低,如樹葉和蜘蛛網是1,水和冰3。
`setResistance`方法用于設定方塊的爆炸抗性,如木頭的抗性為4,石頭為10,黑曜石為2000,基巖為6000000。
`setStepSound`方法用于設定走在方塊上的響聲。
`setTickRandomly`方法用于設定方塊是否會接受隨機Tick(如農作物)。
*****
# 注冊方塊
在包`src/main/java/com/wzhrdx/XenoAge`下新建類`block.BlockRegistryHandler`
~~~java
package com.wzhrdx.XenoAge.block;
import net.minecraft.block.Block;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.registries.IForgeRegistry;
@Mod.EventBusSubscriber
public class BlockRegistryHandler {
public static final BlockSilverOre BLOCK_SILVER_ORE = new BlockSilverOre();
@SubscribeEvent
public static void onRegistry(RegistryEvent.Register<Block> event) {
IForgeRegistry<Block> registry = event.getRegistry();
registry.register(BLOCK_SILVER_ORE);
}
}
~~~
修改`src/main/java/com/wzhrdx/XenoAge/item/ItemRegistryHandler.java`
在`public static Item SILVER_NUGGET = new ItemSilverNugget();`下方添加
~~~java
public static final ItemBlock ITEM_SILVER_ORE = withRegistryName(new ItemBlock(BlockRegistryHandler.BLOCK_SILVER_ORE));
public static ItemBlock withRegistryName(ItemBlock item){
item.setRegistryName(item.getBlock().getRegistryName());
return item;
}
~~~
# 注冊材質
繼續修改`src/main/java/com/wzhrdx/XenoAge/item/ItemRegistryHandler.java`
,
添加如下代碼
~~~java
registerModel(SILVER_NUGGET);
registerModel(ITEM_SILVER_ORE); //新添加內容
~~~
# 添加材質
創建包`src/main/resources/assets/xenoage/blockstates`然后創建`silver_ore.json`
`src/main/resources/assets/xenoage/blockstates/silver_ore.json`
~~~json
{
"variants": {
"normal": {
"model": "xenoage:silver_ore"
}
}
}
~~~
創建`src/main/resources/assets/xenoage/models/block/silver_ore.json`
~~~json
{
"parent": "block/cube",
"textures": {
"particle": "xenoage:blocks/silver_ore",
"down": "xenoage:blocks/silver_ore",
"up": "xenoage:blocks/silver_ore",
"north": "xenoage:blocks/silver_ore",
"south": "xenoage:blocks/silver_ore",
"west": "xenoage:blocks/silver_ore",
"east": "xenoage:blocks/silver_ore"
}
}
~~~
創建`src/main/resources/assets/xenoage/models/item/silver_ore.json`
~~~json
{
"parent": "xenoage:block/silver_ore"
}
~~~
創建`src/main/resources/assets/xenoage/textures/blocks`
放入材質`silver_ore.png` 
*****
# 本章全部代碼
`src/main/java/com/wzhrdx/XenoAge/item/ItemRegistryHandler.java`
~~~java
package com.wzhrdx.XenoAge.item;
import com.wzhrdx.XenoAge.block.BlockRegistryHandler;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.registries.IForgeRegistry;
@Mod.EventBusSubscriber
public class ItemRegistryHandler {
public static Item SILVER_NUGGET = new ItemSilverNugget();
public static final ItemBlock ITEM_SILVER_ORE = withRegistryName(new ItemBlock(BlockRegistryHandler.BLOCK_SILVER_ORE));
public static ItemBlock withRegistryName(ItemBlock item){
item.setRegistryName(item.getBlock().getRegistryName());
return item;
}
@SubscribeEvent
public static void onRegistry(RegistryEvent.Register<Item> event){
IForgeRegistry<Item> registry = event.getRegistry();
registry.register(SILVER_NUGGET);
registry.register(ITEM_SILVER_ORE);
}
@SideOnly(Side.CLIENT)
private static void registerModel (Item item){
ModelResourceLocation modelResourceLocation = new ModelResourceLocation(item.getRegistryName(),"inventory");
ModelLoader.setCustomModelResourceLocation(item,0, modelResourceLocation);
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public static void onModelRegistry(ModelRegistryEvent event){
registerModel(SILVER_NUGGET);
registerModel(ITEM_SILVER_ORE);
}
}
~~~
# 練習
<details>
<summary>答案</summary>
<pre><blockcode>
</blockcode></pre>
</details>