MinecraftのMODを作りたい~鉱石ブロック作成編~

鉱石ブロックを作る!

このMODの目標は、武器としての刀を作れるようにしたいことです。

 

なので、その刀の材料となる玉鋼の大元となるものを鉱石として作成したいと思います。

 

はたして、存在するのかわかりませんが玉鋼鉱石なるものを新たな要素として作成する!!


今回の使用するクラスなどなど

// 各種アイテムなどを登録する処理を定義するクラス

・RegistyHandler.java

 

// 作成する鉱石の登録と描画を行う

・KatanaModBlocks.java

 

// ブロックの定義と設定を行う

・BlockTamahaganeOre.java

 

// 鉱石としての細かい定義と設定を行う

・TamahaganeOre.java


KatanaModBlocks.java

package katanaMod.init;

import katanaMod.init.blocks.TamahaganeOre;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.registry.ForgeRegistries;

public class KatanaModBlocks {

        public static Block TAMAHAGANE_ORE;

        // ブロックのインスタンスを生成
        public static void init() {
                TAMAHAGANE_ORE = new TamahaganeOre("tamahagane_ore", 2.0F, 4.0F, 2);
        }

        // ブロックを登録
        public static void register() {
                registerBlock(TAMAHAGANE_ORE);
        }

        public static void registerBlock(Block block) {
                ForgeRegistries.BLOCKS.register(block);
                block.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
                ItemBlock item = new ItemBlock(block);
                item.setRegistryName(block.getRegistryName());
                ForgeRegistries.ITEMS.register(item);
        }

        // ブロックのモデルを登録
        public static void registerRenders() {
                registerRender(TAMAHAGANE_ORE);
        }

        // ブロックのモデルを読み込む
        public static void registerRender(Block block) {
                ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(block), 0, new
                                ModelResourceLocation(block.getRegistryName(), "inventory"));
        }
}

ここでは詰まったところがありました。

 

ブロックの読み込みを行うregisterRenderメソッドで、マインクラフトの世界にアイテムを追加するための処理があります。

 

正:ModelLoader.setCustomModelResourceLocation()

 

上記の部分を最初は以下のようにしていました。

 

誤:Minecraft.getMinecraft()

 

しかし、どうやらこれはv1.11 までだと動作するのですが、v1.12 だと動作しないということが調べてわかりました。

 

また、もう一つ詰まったところがありました。

 

正:ForgeRegistries.BLOCKS.register(block);

 

としてあるところを最初は以下のようにしていました。

 

誤:GameRegistry.register(block);

 

しかし、こうすると「メソッドregister(K)は型GameRegistryで不可視です」とエラーが出てしまっていました。


TamahaganeOre.java

package katanaMod.init.blocks;

import net.minecraft.block.material.Material;

public class TamahaganeOre extends BlockTamahaganeOre {

        public TamahaganeOre(String name, float hardness, float resistance, int harvestLevel) {
                super(name, hardness, resistance);
                setHarvestLevel("pickaxe", harvestLevel);
        }

        public TamahaganeOre(Material materialIn) {
                super(materialIn);
        }
}

ここでのTamahaganeOre(String name, float hardness, float resistance, int harvestLevel)は、

 

KatanaModBlocks.java で呼び出している部分です。

 

name は鉱石の名前

 

hardness は採掘するときのブロックの硬さ

 

resistance は爆発耐性

 

harvestLevel はどのランク(木・石・鉄・金・ダイヤ)以上の道具で採取できるか

 

以上のようにブロックの定義を設定しています。

 

setHarvestLevel("pickaxe", harvestLevel); は、ピッケルの道具でないと採取できないということになる。


BlockTamahaganeOre.java

package katanaMod.init.blocks;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;

public class BlockTamahaganeOre extends Block {

        public BlockTamahaganeOre(String name, float hardness, float resistance) {
                super(Material.ROCK);
                setUnlocalizedName(name);
                setRegistryName(name);
                setHardness(hardness);
                setResistance(resistance);
                setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
        }

        public BlockTamahaganeOre(Material materialIn) {
                super(materialIn);
        }
}


RegistyHandler.java

package katanaMod.handlers;

import katanaMod.init.KatanaModBlocks;

public class RegistyHandler {

        public static void Client() {
                KatanaModBlocks.registerRenders();

        }

        public static void Common() {
                KatanaModBlocks.init();
                KatanaModBlocks.register();
        }

}


ブロックのテクスチャを決めるリソースファイル

アイテムとしての、ブロックとしての見た目を決めるためのリソースファイル

 

// ブロックの形状を定義するファイル

・/forge-2555-mdk/src/main/resources/assets/katanamod/blockstates/tamahagane_ore.json

 

// 鉱石としての定義を追加

・/forge-2555-mdk/src/main/resources/assets/katanamod/models/block/tamahagane_ore.json

 

// アイテムとしての定義を追加

・/forge-2555-mdk/src/main/resources/assets/katanamod/models/item/tamahagane_ore.json

 

// ブロックの見た目を決める画像

・/forge-2555-mdk/src/main/resources/assets/katanamod/textures/blocks/tamahagane_ore.png

 

// 鉱石用の名前の定義を追記(英語と日本語)

・/forge-2555-mdk/src/main/resources/assets/katanamod/lang/en_us.lang

・/forge-2555-mdk/src/main/resources/assets/katanamod/lang/ja_JP.lang

 


/forge-2555-mdk/src/main/resources/assets/katanamod/blockstates/tamahagane_ore.json

{
    "variants": {
        "normal": { "model": "katanamod:tamahagane_ore" }
    }
}

/forge-2555-mdk/src/main/resources/assets/katanamod/models/block/tamahagane_ore.json

{
    "parent": "block/cube_all",
    "textures": {
        "all": "katanamod:blocks/tamahagane_ore"
    }
}

/forge-2555-mdk/src/main/resources/assets/katanamod/models/item/tamahagane_ore.json

{
    "parent": "katanamod:block/tamahagane_ore"
}

/forge-2555-mdk/src/main/resources/assets/katanamod/textures/blocks/tamahagane_ore.png

/forge-2555-mdk/src/main/resources/assets/katanamod/lang/en_us.lang

tile.tamahagane_ore.name=Tamahagane Ore

/forge-2555-mdk/src/main/resources/assets/katanamod/lang/ja_JP.lang

tile.tamahagane_ore.name=玉鋼鉱石


さっそくMinecraftを起動!!

う~ん...インベントリに追加はされているけれどテクスチャが反映されていない...

 

ワールドに設置をすれば作成したpng画像通りの玉鋼鉱石が設置されるので全てを間違えているわけではなさそうです。

 

あと、日本語表記でしているのに玉鋼鉱石ではなくTamahagane Oreになっているのも気になります。

 

この記事の公開を成功してからか、それとも公開してしまって成功した結果を次の記事にしてしまうか。

 

悩みどころです。

 

 

以下は参考にしたサイトです。

 

Forge MDK を使って独自の鉱石を作成する