初心者modderの備忘録

マイクラのmodを作りたくて、初めて見たのですが難しくて忘れそうなので自分用の備忘録も兼ねてブログにしようと思います

2日目 ブロックの追加

アイテムの次はブロックの追加をやっていきたいと思います。
パッケージは前回とおなじものを使用していきます。

まず新しいブロックを登録するためのクラスを作成します。
testmodのパッケージ内にBlockTomatoというクラスを作りました。
中身を書いていきます。

BlockTomato.java

package testmod;

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

public class BlockTomato extends Block{

	public BlockTomato() {
		super(Material.IRON);
		this.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
		this.setUnlocalizedName("block_tomato");
		this.setRegistryName("block_tomato");
	}
}

続いてtestmodの中身を編集して、このブロックの登録を行います。

package testmod;

import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.ForgeRegistries;

@Mod(modid = testmod.MOD_ID, name = testmod.MOD_NAME, version = testmod.MOD_VERSION)
public class testmod {
    public static final String MOD_ID = "testmod";
    public static final String MOD_NAME = "testmod";
    public static final String MOD_VERSION = "1.0.0";
    
    public static final Item Tomato = new ItemTomato();
    public static final Block Tomato_Block = new BlockTomato();
    
    @Mod.EventHandler
	public void preInit(FMLPreInitializationEvent event) {
    	ForgeRegistries.ITEMS.register(Tomato);
    	ForgeRegistries.ITEMS.register(new ItemBlock(Tomato_Block).setRegistryName("testmod", "block_tomato"));
    	
    	ForgeRegistries.BLOCKS.register(Tomato_Block);
    
    	if(event.getSide().isClient()) {
    		ModelLoader.setCustomModelResourceLocation(Tomato, 0, new ModelResourceLocation(new ResourceLocation("testmod", "tomato"), "inventory"));
    		ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(Tomato_Block), 0, new ModelResourceLocation(new ResourceLocation("testmod", "block_tomato"), "inventory"));
    	}
    }
}

25行目、27行目、31行目がそれぞれ新しく追加した内容ですね。

25行目ではブロックをアイテムとして登録しています。ブロックを登録するときは同時にアイテムとしても登録しなければならないようです。
27行目では単純にブロックの登録を行いました。
31行目はアイテムブロックのモデル登録を行いました。



次にモデルやテクスチャーの設定を行うためにjsonファイルを作成するのですが、ブロックの時はblock_tomato.jsonという同じ名前のjsonファイルを3つ異なる場所に作成します。

1つ目は、assets.testmod.blockstatesの中に作ります。


assets.testmod.blockstates.block_tomato.json

{
  "forge_marker": 1,
  "defaults": {
    "textures": {
      "particle": "testmod:blocks/block_tomato"
    },
    "model": "testmod:block_tomato",
    "uvlock": false
  },
  "variants": {
    "normal": [{

    }],
    "inventory": [{

    }]
  }
}


2つ目は、assets.testmod.models.blockの中に作ります。


assets.testmod.models.block.block_tomato.json

{
  "parent": "block/cube_all",
  "textures": {
    "all": "testmod:blocks/block_tomato"
  }
}


3つ目は、assets.testmod.models.itemの中に作ります。
assets.testmod.models.item.block_tomato.json

{
  "parent": "testmod:block/block_tomato"
}

続いて、テクスチャーの設定です。
今回はこのようなテクスチャーを用意しました。
block_tomato.png
f:id:json_fileman:20181230015924p:plain


assets.testmod.texturesの中にblocksというパッケージを作成して、その中にblock_tomato.pngをドラック&ドロップでコピーします。

最後に名前の設定です。
前回と同様のファイルを使用して、書き足していきます。
en_us.lang

item.tomato.name=tomato
tile.block_tomato.name=Tomato Block


ja_jp.lang

item.tomato.name=トマト
tile.block_tomato.name=トマトブロック

ブロックの場合は最初がtileとなるみたいです。


ここまで書いて実行してマイクラを起動します。

f:id:json_fileman:20181230020723p:plain

うまく起動しました。
ちゃんとブロックになってますし、名前もちゃんと表示されています。

次回は、このブロックをもう少しカスタマイズしようと思います。


最終的なjavaファイルをアップロードしておきます。

testmod.java
BlockTomato.java