Forge MDK 1.12.2 の環境での説明になります。
環境構築などについては下記のページを参考にしてください。
新しいブロックを作ろう
"testmod"のPackageにクラスを追加します。
右クリック(もしくはメニューバーのFile)、New、Classで作成ダイアログが開きます。
今回はクラス名を "MyBlock" とします。
空のクラスが作成されました。
package testmod; public class MyBlock { }
ここにBlockの実装を追記していきます。
まずは以下のように入力してください。
package testmod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; public class MyBlock extends Block { public MyBlock(String name, Material materialIn) { super(materialIn); setUnlocalizedName(name); setRegistryName(name); } }
簡単に説明をしていきます。
新しくBlockを作成するためにMinecraftのBlockクラスを継承する必要があります。
クラスをインポートして、Blockクラスを継承します。
// ↓Blockクラスをインポートする import net.minecraft.block.Block; // ↓extends BlockでBlockクラスを継承する public class MyBlock extends Block {
次にMyBlockのコンストラクタを書きます。
// ↓Materialクラスをインポートする import net.minecraft.block.material.Material; : // コンストラクタ public MyBlock(String name, Material materialIn) { super(materialIn); setUnlocalizedName(name); setRegistryName(name); }
ブロックの名前とマテリアルを引数で渡します。
Materialクラスを使用するのでインポートが必要です。
親クラスのコンストラクタを super(materialIn) で呼びます。
名前をセットしておきます。
これで新たに作成するBlockクラスが作成できました。
作ったブロックを登録しよう
次に新しく作ったBlockクラスを登録する処理を書きます。
先程と同様に "testmod" のPackageに "ModBlocks" というクラスを追加します。
以下のソースを書きます。
package testmod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @Mod.EventBusSubscriber(modid=TestMod.MODID) public class ModBlocks { public static Block myBlock = null; public static void init() { myBlock = new MyBlock("myBlock",Material.ROCK).setCreativeTab(CreativeTabs.BUILDING_BLOCKS); } @SubscribeEvent public static void registerBlocks(RegistryEvent.Register<Block> event) { event.getRegistry().registerAll(myBlock); } @SubscribeEvent public static void registerItemBlocks(RegistryEvent.Register<Item> event) { event.getRegistry().register(new ItemBlock(myBlock).setRegistryName(myBlock.getRegistryName())); } }
init()でMyBlockクラスのインスタンスを生成します。
引数に名前"myBlock"とマテリアル"ROCK"を渡して生成します。
Block登録時に呼ばれるイベント関数でBlockの登録を行います。
最後にModBlocksの初期化関数をTestModの初期化時に呼ぶようにします。
@Mod(modid=TestMod.MODID, version=TestMod.VERSION) public class TestMod { public static final String MODID = "testmod"; public static final String VERSION = "1.0"; @EventHandler public void preInit(FMLPreInitializationEvent event) { // ↓ここを追加 ModBlocks.init(); } @EventHandler public void init(FMLInitializationEvent event) { } }
動かして確認してみよう
早速実行してみましょう。
起動したら[E]キーを押して持ち物画面を開きます。
建築ブロックのタブの一番下にスクロールします。
表示がおかしいですが新規に作成したBlockが追加されていることを確認します。
[R]キーを押してフィールドに配置もできます。
これで新規のBlockを追加することができました。