Mod制作日記 - 簡単なブロックを追加する
目次 (折りたたみ可)
ModIdやメインクラスのjavaファイル名などの各自で異なる部分はいちいち説明しないのでご注意を。
ブロックのクラス
左のPackage Explorerから「src/main/java > com.masec.newmod」を右クリック、「New > Package」を押します。
Name:の「com.masec.newmod」の右に「.block」を書き足して「Finish」

作った「com.masec.new_mod.block」を右クリックして「New > Class」を押します。
クラス名はアイテム名と揃えます。今回はTestIngotBlockにしました。

クラスのコード
作られたファイルを編集して、一旦ここまで作ります。
package com.masec.newmod.block;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
public class TestIngotBlock extends Block {
public TestIngotBlock() {
super(Properties.of(Material.METAL));
}
}
package com.masec.newmod.block;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
public class TestIngotBlock extends Block {
public TestIngotBlock() {
super(Properties.of(Material.METAL));
}
}
桃色でマーカーしたところはブロックの素材を指定する部分です。以下から選んでください。
よくわからない項目は変数名を適当に訳しています。
変数 | 概要 |
|---|---|
| AIR | 空気 |
| STRUCTURAL_AIR | 構造的な空気 |
| PORTAL | ポータル |
| CLOTH_DECORATION | 布のデコレーション |
| PLANT | 植物 |
| WATER_PLANT | 水棲植物 |
| REPLACEABLE_PLANT | 置き換えられる植物 |
| REPLACEABLE_FIREPROOF_PLANT | 置き換えられる防火植物 |
| REPLACEABLE_WATER_PLANT | 置き換えられる水棲植物 |
| WATER | 水 |
| BUBBLE_COLUMN | 気泡 |
| LAVA | マグマ |
| TOP_SNOW | 雪 |
| FIRE | 炎 |
| DECORATION | 装飾 |
| WEB | クモの巣 |
| BUILDABLE_GLASS | 建築可能なガラス |
| CLAY | 粘土 |
| DIRT | 土 |
| GRASS | 草ブロック |
| ICE_SOLID | 氷塊 |
| SAND | 砂 |
| SPONGE | スポンジ |
| SHULKER_SHELL | シュルカーの殻 |
| WOOD | 木 |
| NETHER_WOOD | ネザーの木 |
| BAMBOO_SAPLING | タケノコ |
| BAMBOO | 竹 |
| WOOL | ウール |
| EXPLOSIVE | 爆発物 |
| LEAVES | 葉 |
| GLASS | ガラス |
| ICE | 氷 |
| CACTUS | サボテン |
| STONE | 石 |
| METAL | 金属 |
| SNOW | 雪ブロック |
| HEAVY_METAL | 重い金属 |
| BARRIER | バリアブロック |
| PISTON | ピストン |
| CORAL | サンゴ |
| VEGETABLE | 野菜 |
| EGG | (カメの)卵 |
| CAKE | ケーキ |
ブロックの性質
以下のようにsuper()の閉じカッコの前で改行して、一行に一つずつブロックの性質を書き加えていきます。
package com.masec.newmod.block;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraftforge.common.ToolType;
public class TestIngotBlock extends Block {
public TestIngotBlock() {
super(Properties.of(Material.METAL)
.strength(5.0f, 5.0f)
.harvestTool(ToolType.PICKAXE)
.harvestLevel(3)
.sound(SoundType.METAL));
}
}
.strength(float, float)
採掘にかかる秒数、爆発耐性を指定します。
.harvestTool(ToolType)
採掘の適性ツールを指定します。 ToolType.AXE、 ToolType.HOE、 ToolType.PICKAXE、 ToolType.SHOVEL から選びます。
.harvestLevel(Int)
アイテムドロップの適性ツールを指定します。0が木、1が石、2が鉄、3がダイヤ、4がネザライトです。
.sound(SoundType)
破壊などのサウンドを指定します。以下から選んでください。
詳細
| 変数 | 概要 |
|---|---|
| WOOD | 木 |
| GRAVEL | 砂利 |
| GRASS | 草 |
| LILY_PAD | ハスの葉 |
| STONE | 石 |
| METAL | 金属 |
| GLASS | ガラス |
| WOOL | 羊毛 |
| SAND | 砂 |
| SNOW | 雪 |
| LADDER | ハシゴ |
| ANVIL | 金床 |
| SLIME_BLOCK | スライムブロック |
| HONEY_BLOCK | ハチミツブロック |
| WET_GRASS | 水棲植物 |
| CORAL_BLOCK | サンゴ |
| BAMBOO | 竹 |
| BAMBOO_SAPLING | タケノコ |
| SCAFFOLDING | 足場ブロック |
| SWEET_BERRY_BUSH | スイートベリーの茂み |
| CROP | 作物 |
| HARD_CROP | 固い作物(ビートルート) |
| VINE | ツタ |
| NETHER_WART | ネザーウォート |
| LANTERN | ランタン |
| STEM | ネザーの木 |
| NYLIUM | ナイリウム |
| FUNGUS | ネザーのキノコ |
| ROOTS | ネザーの草 |
| SHROOMLIGHT | シュルームライト |
| WEEPING_VINES | 歪んだツタ |
| TWISTING_VINES | 深紅のツタ |
| SOUL_SAND | ソウルサンド |
| SOUL_SOIL | ソウルソイル |
| BASALT | 玄武岩 |
| WART_BLOCK | ウォートブロック |
| NETHERRACK | ネザーラック |
| NETHER_BRICKS | ネザーレンガ |
| NETHER_SPROUTS | ネザースプラウト |
| NETHER_ORE | ネザーの鉱石(クォーツ) |
| BONE_BLOCK | 骨ブロック |
| NETHERITE_BLOCK | ネザライトブロック |
| ANCIENT_DEBRIS | 古代のがれき |
| LODESTONE | ロードストーン |
| CHAIN | チェーン |
| NETHER_GOLD_ORE | ネザー金鉱石 |
| GILDED_BLACKSTONE | 金入りブラックストーン |
その他のコンポーネント
詳細
.noCollission()
当たり判定をなくす
.noOcclusion()
オクルージョンを無効にする
.friction(float)
摩擦を指定する
.speedFactor(float)
上を歩いた時の速度を指定する
.jumpFactor(float)
上に乗ったときのジャンプ力を指定する
.lightLevel(int)
光源レベルを指定する
.instabreak()
草花のように一瞬で壊せるようにする
.randomTicks()
ランダムティックの影響を受けるようにする
.dynamicShape()
.noDrops()
壊しても何もドロップしないようにする
ブロックを登録
アイテムのパッケージを追加したときと同様に、 「com.masec.newmod.init」を右クリックしてクラスを新規作成します。クラス名はBlockInitです。
クラスのコード
これもまた、作られたファイルを編集してこうなります。
package com.masec.newmod.init;
import com.masec.newmod.NewMod;
import com.masec.newmod.block.TestIngotBlock;
import net.minecraft.block.Block;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
public class BlockInit {
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, NewMod.MOD_ID);
public static final RegistryObject<Block> TEST_INGOT_BLOCK =BLOCKS.register("test_ingot_block", () -> new TestIngotBlock());
}
package com.masec.newmod.init;
import com.masec.newmod.NewMod;
import com.masec.newmod.block.TestIngotBlock;
import net.minecraft.block.Block;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
public class BlockInit {
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, NewMod.MOD_ID);
public static final RegistryObject<Block> TEST_INGOT_BLOCK =BLOCKS.register("test_ingot_block", () -> new TestIngotBlock());
}
桃色でマーカーしたところはこのファイルで初めて定義しています。雰囲気を合わせて自分のものに置き換えてください(大文字とか) "test_ingot_block"のほうはコマンドなどで使われる、アイテムのidとなります。
ブロックのアイテム
アイテムとしてのブロックを追加しないと、/setblockだけできて/giveできないということになります。バニラだとネザーポータルとかそうですね。
ItemInit.javaを開いて以下の行を書き加えます。各自で異なる部分に注意してください。
package com.masec.newmod.init;
import com.masec.newmod.NewMod;
import com.masec.newmod.item.TestIngot;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.Item.Properties;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
public class ItemInit {
public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, NewMod.MOD_ID);
public static final RegistryObject<Item> TEST_INGOT = ITEMS.register("test_ingot", () -> new TestIngot());
public static final RegistryObject<Item> TEST_INGOT_BLOCK = ITEMS.register("test_ingot_block",
() -> new BlockItem(BlockInit.TEST_INGOT_BLOCK.get(),new Properties().tab(ItemGroup.TAB_BUILDING_BLOCKS)));
}
イベントバス
アイテムの時のように、メインクラスのファイルに少し書き加えます。
各自で名前が違うと思いますが「NewMod.java」を開きます。
package com.masec.newmod;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.masec.newmod.init.BlockInit;
import com.masec.newmod.init.ItemInit;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
// The value here should match an entry in the META-INF/mods.toml file
@Mod(NewMod.MOD_ID)
public class NewMod {
// Directly reference a log4j logger.
public static final Logger LOGGER = LogManager.getLogger();
public static final String MOD_ID = "new_mod";
public NewMod() {
IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
bus.addListener(this::setup);
ItemInit.ITEMS.register(bus);
BlockInit.BLOCKS.register(bus);
// Register ourselves for server and other game events we are interested in
MinecraftForge.EVENT_BUS.register(this);
}
private void setup(final FMLCommonSetupEvent event) {
// some preinit code
}
}
これを書き加えて終わりです。上のほうは各自で書き換える部分がありますね。
ルートテーブル
Package Explorerから「src/main/resources」を右クリックして「data.new_mod.loot_table.blocks」というパッケージを作ります。

その中に「test_ingot_block.json」を作ります。
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "new_mod:test_ingot_block"
}
]
}
]
}
リソース
Package Explorerから「src/main/resources」を右クリックしてパッケージを作ります。名前は「assets.new_mod.blockstates」のようにします。
同様に、models.blockも追加します。

モデル/テクスチャ
「assets.new_mod.blockstates」に「test_ingot_block.json」を作ります。ファイル名はブロックのIDです。
{
"variants": {
"": { "model": "new_mod:block/test_ingot_block" }
}
}
「assets.new_mod.models.block」にも「test_ingot_block.json」を作ります。ファイル名はブロックのIDです。
{
"parent": "block/cube_all",
"textures": {
"all": "new_mod:blocks/test_ingot_block"
}
}
ブロックのアイテム用に「assets.new_mod.models.item」にも「test_ingot_block.json」を作ります。ファイル名はブロックのIDです。
{
"parent": "new_mod:block/test_ingot_block"
}
Eclipseからちょっと出て、はじめに作ったフォルダの「src/main/resources/assets/newmod/textures」に
「blocks」フォルダを作り、テクスチャを入れます。テクスチャの名前は「test_ingot_block.png」のようにします。
最後はEclipseに戻り、「src/main/resources」を右クリックして「Refresh」します。
マイクラを起動して確認
このように、きれいなブロックが追加できました。
