概要
特殊な機能を持たないブロックを追加します。
動作確認
2020年4月1日
- Minecraft 1.14.4
- Forge 28.2.0
解説
TitaniumMod
TitaniumMod/src/main/java/com/tntmodders/titaniummod/TitaniumMod.java
package com.tntmodders.titaniummod;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@Mod(TitaniumMod.MOD_ID)
public class TitaniumMod {
public static final String MOD_ID = "titaniummod";
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public static class RegistryEventSubscriber {
@SubscribeEvent
public static void registerBlocks(final RegistryEvent.Register<Block> event) {
event.getRegistry().registerAll(Blocks.TITANIUM_BLOCK);
}
@SubscribeEvent
public static void registerItems(final RegistryEvent.Register<Item> event) {
event.getRegistry().registerAll(Items.TITANIUM_BLOCK, Items.TITANIUM_INGOT);
}
}
public static class Blocks {
public static final Block TITANIUM_BLOCK = new Block(Block.Properties
.create(Material.IRON, MaterialColor.IRON)
.hardnessAndResistance(5.0F, 6.0F)
.sound(SoundType.METAL)
.harvestTool(ToolType.PICKAXE)
.harvestLevel(1))
.setRegistryName("titanium_block");
}
public static class Items {
public static final Item TITANIUM_BLOCK = new BlockItem(Blocks.TITANIUM_BLOCK, new Item.Properties()
.group(ItemGroup.BUILDING_BLOCKS))
.setRegistryName("titanium_block");
public static final Item TITANIUM_INGOT = new Item(new Item.Properties()
.group(ItemGroup.MATERIALS))
.setRegistryName("titanium_ingot");
}
}
Block
クラスのインスタンスはMinecraftのブロックの種類を表します。硬度や爆破耐性など、ブロックの種類によって変わる性質を保持しています。バニラのブロックはnet.minecraft.block.Blocks
にすべて記述されています。
create(Material.IRON, MaterialColor.IRON)
で、燃えるかどうかなどの基本的な性質をまとめたMaterial
と、地図で表示される色となるMaterialColor
を指定します。
hardnessAndResistance(5.0F, 6.0F)
でブロックの硬さと爆破耐性を指定します。第一引数は硬さで、数値が大きいほど壊すために時間がかかります。第二引数は爆破耐性で、数値が大きいほど爆発で壊れにくくなります。
sound(SoundType.METAL)
でブロックの設置、破壊、上を歩いた時などに発生する音の種類を指定します。
harvestTool(ToolType.PICKAXE)
でブロックを回収するための適正な道具の種類を指定します。斧(AXE
)、ツルハシ(PICKAXE
)、シャベル(SHOVEL
)の三つから選べます。指定しない場合は、どの道具を使っても早く壊せなくなります。
harvestLevel(1)
でブロックを回収するために必要な道具の素材水準を指定します。デフォルトは-1で、0が木か金、1が石、2が鉄、3がダイヤモンドの道具を要求します。
setRegistryName("titanium_block")
でブロックの登録名を指定します。ブロックIDはtitaniummod:titanium_block
となります。
BlockItem
は、プレイヤーのインベントリの中にある時など、アイテムとしてのブロックを表すクラスです。ほとんどのブロックは破壊されると対応するアイテムをドロップし、対応するアイテムを右クリックするとブロックをワールドに設置します。このような対応関係を示すための、Itemを継承したクラスです。
group(ItemGroup.BUILDING_BLOCKS)
で通常のアイテムと同様に、クリエイティブタブを指定します。今回は「建築ブロック」タブを指定します。
Block State
TitaniumMod/src/main/resources/assets/titaniummod/blockstates/titanium_block.json
{
"variants": {
"": {
"model": "titaniummod:block/titanium_block"
}
}
}
ブロックの状態とモデルとの対応をリソースパックと同様の形式のJSONで記述します。今回は状態を扱わないので、モデルを1つ指定します。
ブロックモデル
TitaniumMod/src/main/resources/assets/titaniummod/models/block/titanium_block.json
{
"parent": "block/cube_all",
"textures": {
"all": "titaniummod:block/titanium_block"
}
}
ブロックモデルをリソースパックと同様の形式のJSONで記述します。今回は正六面体のフルブロックで全面同じテクスチャを使います。
アイテムモデル
TitaniumMod/src/main/resources/assets/titaniummod/models/item/titanium_block.json
{
"parent": "titaniummod:block/titanium_block"
}
アイテムとして表示されるモデルをリソースパックと同様の形式のJSONで記述します。今回はブロックのモデルを指定します。
テクスチャ
TitaniumMod/src/main/resources/assets/titaniummod/textures/block/titanium_block.png
ブロックの各面に表示される16×16ピクセルのpng画像ファイルです。
英語翻訳
TitaniumMod/src/main/resources/assets/titaniummod/lang/en_us.json
{
"block.titaniummod.titanium_block": "Block of Titanium",
"item.titaniummod.titanium_ingot": "Titanium Ingot"
}
ブロック名の翻訳を追加しました。
日本語翻訳
TitaniumMod/src/main/resources/assets/titaniummod/lang/ja_jp.json
{
"block.titaniummod.titanium_block": "チタンブロック",
"item.titaniummod.titanium_ingot": "チタンインゴット"
}
ブロック名の翻訳を追加しました。
ルートテーブル
TitaniumMod/src/main/resources/data/titaniummod/loot_tables/blocks/titanium_block.json
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "titaniummod:titanium_block"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}
ブロックを適正な道具で破壊した際にドロップするアイテムを、データパックと同様の形式のJSONで記述します。今回は常にチタンブロックをアイテムとして1つドロップするよう指定します。フォルダ名が複数形なので注意してください。
"condition": "minecraft:survives_explosion"
により、他のブロックと同様、爆発により壊された時に1/(爆発力)
の確率でアイテムをドロップするようになります。
“ブロックの追加 (1.14.4)” への5件のフィードバック
失礼します!向きのあるブロックの実装の方法教えていただけませんか?
向きはBlockStateで管理されており、Block#getStateForPlacementで設置時にどの向きになるかを指定し、blockstate/に配置するJSONでそれぞれの向きに対応するmodelと回転を指定します。
バニラでは、原木のように各軸に対応した3種類の向きを持つものや、かまどのように正面が水平4方向で変わるものなどがあります。原木ならRotatedPillarBlockとoak_log.json、かまどならAbstractFurnaceBlockとfurnace.jsonに該当する記述があるので、実現したい機能に応じて参考にしてください。
「BlockStateの利用」などの解説を今後追加する予定ですが、具体的にどのような機能を実装したいかお知らせ頂ければ、サンプルコードを返信することもできます。
ありがとうございます!実装できました!
厚かましいとは思いますが1.14.4でのGUIの実装についてもいつか記事にしていただきたいです。
TNTみたいな爆発するブロックの追加方法を教えてください!
「爆発するブロック」であれば、
Block
を継承したクラスを作り、onBlockActivated
などをオーバーライドしてWorld#createExplosion
を呼べば実装できます。これはネザーやエンドでベッドを使おうとした時の挙動です。(
BedBlock
参照)TNTBlock
は着火されるとTNTEntity
を生成し、TNTEntity
は時間経過によりWorld#createExplosion
を呼び出しています。このような挙動のブロックは、
TITANIUM_BLOCK = new Block(...)
の部分で、TNTBlock
を継承した自作クラスのインスタンスを生成して登録すれば追加できます。エンティティを介して爆発する仕様を維持したまま爆発力を変更したいなら、
TNTEntity
を継承したエンティティを登録し、それをブロック側が生成する必要があります。