main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

Minecraft MODでオリジナルの「ブロック」を追加してみよう!(Mac編)

Forge MDK 1.12.2 の環境での説明になります。

環境構築などについては下記のページを参考にしてください。

www.main-function.com

新しいブロックを作ろう

f:id:takezoh_1127:20181101234054p:plain

"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が追加されていることを確認します。

f:id:takezoh_1127:20181101233016p:plain

[R]キーを押してフィールドに配置もできます。

f:id:takezoh_1127:20181101233034p:plain

これで新規のBlockを追加することができました。