こちらはPCゲーム「Minecraft」のMod作製の解説記事です。
Minecraft.1.12.2、
Forge-1.12.2-14.23.2.2611での解説になります。
Minecraftの世界に存在する動物やモンスターなどのMob。これらに加え弓から放たれた矢、ブレイズの火球などがEntityに含まれます。
ここではMinecraft-1.15.2でのMod開発の際に私が理解できたメソッドなどを自分用のメモも兼ねて載せていきたいと思います。他にも1.12.2から1.15.2で名称が変わったクラスなども載せていく予定です。
この記事を書いている私自身が元々はJavaを勉強したことが無い状態からMod作製を始めたので、説明内容などはプロのプログラマーの人が見たら「既に知っている」事や「当たり前」の事などもあると思います。この記事は私の様にJavaに初めて触れる人や、これからMod作製に挑戦したい人やMod作製の初心者の人の為に書いているものなので、専門用語を使う時と使わない時があります。また、記載内容に誤りや私自身の理解が誤っている可能性がある事をご了承ください。
記事の内容は徐々に追加していく予定です。
1.12.2からの変更
ブロックへのTileEntityの実装について
TileEntityをBlockに実装する際の注意として、かまどのクラスの元になるクラス「AbstractFurnaceBlock」などが継承している「ContainerBlock」というクラスがある。このクラスを継承して作ったブロックの場合、ContainerBlock自体がITileEntityProviderというインタフェースをimplementsしているので、
createNewTileEntity(IBlockReader worldIn);
というメソッドを実装するようになっているが、@Deprecatedの注釈がついているので、使用しない方が良い。注釈へのコメントにも「使用しないでください。」とあり、代わりにBlockクラスが継承しているIForgeBlockというインタフェースに、
createTileEntity(BlockState state, IBlockReader world)
こちらを使用するようにと記載されている。他のModのソースを参考にしようとした際に、ContainerBlockを継承して作られた追加Blockクラスの記述にはcreateNewTileEntityを使用しているものがあるので、コピーして使用する際はcreateTileEntityに直した方が良いと思われる。
ContainerBlockを継承していない追加Blockクラスの場合は、ITileEntityProviderをimplementsしていないので、createTileEntityを使用する事になるので間違える事は無いと思われる。
同時にIForgeBlockのhasTileEntity(BlockState state)のdefaultの記述が、
default boolean hasTileEntity(BlockState state) {
return this instanceof ITileEntityProvider;
}
となっているので、TileEntityを実装するクラス内でhasTileEntityをオーバーライドしておいた方が良い(特にITileEntityProviderを実装していないクラス)。クラスごとにオーバーライドする場合は、TileEntityを実装した事の確認が確実なら、return ture;で問題は無い。
ブロッククラス内のメソッド
TileEntityを持ったBlockクラスの記述で、onBlockActivatedの戻り値がbooleanからActionResultTypeに変更になり、引数も以下の表の通りに変更されている。
1.12.2 | 1.15.2 |
World world | BlockState state |
BlockPos pos | World world |
IBlockState state | BlockPos pos |
EntityPlayer player | PlayerEntity player |
EnumHand hand | Hand hand |
EnumFacing side | BlockRayTraceResult hit |
float hitX | |
float hitY | |
float hitZ |
クラス
クラス名称の「Entity◯◯」が「◯◯Entity」に変更されている。AIクラスの名称も「AI○○」から「○○Goal」に変更されている。
1.12.2のクラス名称 | 1.15.2のクラス名称 |
Entity | Entity |
EntityLivingBase | LivingEntity |
EntityLiving | MobEntity |
EntityMob | MonsterEntity |
AI◯◯ | ◯◯Goal |
メソッド
1.12.2のメソッド名称 | 1.15.2のメソッド名称 |
getLookHelper() | getLookController() |
updateTask() | tick() |
ItemのProperty(Item.Properties)
アイテムをレジストリに登録する際に使用するEntityなどの登録の際に使用するBuilderクラスと同じような使い方をするクラスで、アイテムのスタック数や耐久値などの設定を追加するクラス。
public static final Item PUMPKIN_ROD = registerItem(new PumpkinRodItem(noStackNoDurability(new Item.Properties())),
LibraryItemNames.PUMPKIN_ROD);
private static <T extends Item> T registerItem(T item, String name) {
item.setRegistryName(name);
return item;
}
private static Item.Properties setDefault(Item.Properties properties) {
properties.group(Golemist.CREATIVE_TAB);
return properties;
}
private static Item.Properties noStackNoDurability(Item.Properties properties) {
properties.maxStackSize(1);
return setDefault(properties);
}
private static Item.Properties setStackSize(Item.Properties properties, int size) {
properties.maxStackSize(size);
return setDefault(properties);
}
上に載せたコードは私が自作しているModのGolemistのMinecraft-1.15.2版のアイテムの登録のクラスの一部で、registerItemという同クラス内のメソッドにItem.Propertiesの登録内容と登録名を渡している。引数に渡すItem.Propertiesを同クラス内のメソッドnoStackNoDurabilityにインスタンスを生成して渡し、その中でプロパティを設定している。noStackNoDurabilityは最大スタック数を1に設定した後にsetDefaultメソッドに渡す。setDefaultは単純にアイテムのクリエイティブタブを設定するだけなので、クリエイティブタブの設定のみのアイテムはsetDefaultを使用している。スタック数を設定したアイテムはsetStackSizeメソッドを使用している。
私がレジストリ登録用のクラスでプロパティを生成している理由は、後で他のアイテムと値を比較しやすくする為なので、それが必要無い場合は個別のクラスの中でプロパティを設定しても良いと思う。更に見やすくするのなら、別クラスとしてプロパティを見易く記述したライブラリの様な参照用のクラスを作っても良いかも知れない。
1.12.2ではアイテムのクラス内でスタック数や耐久値を入力していたが、1.1.52での他の人が書いたModソースを見ているとItem.Propertiesを使用して、レジストリ登録の方で記述が多い印象を受ける。各アイテムクラス内で個別に設定しても問題は無いので、どちらで設定するかは作者の好みになる。
Item.Propertiesの登録内容の中から私が使用できるようになったものの説明を記載していく。
maxStackSIze(int maxStackSizeIn)
名前の通りアイテムのスタック数を設定するメソッドで、引数に渡した値がそのまま最大スタック数となる。この時、そのアイテムの耐久値が設定されていた場合は例外処理でエラーログを出す。
defaultMaxDamage(int maxDamageIn)
アイテムの耐久値を設定するメソッドで、引数に渡した値を耐久値に設定すると同時に最大スタック数を1に設定する。なので、耐久値を設定する場合は上記のmaxStackSIzeのメソッドを使用しなくても良い。
group(ItemGroup groupIn)
そのアイテムをクリエイティブタブのどこのカテゴリに登録するかを決めるメソッドで、自身のMod専用のクリエイティブタブに登録する事も出来る。
setNoRepair()
名前の通りで、これを使用したアイテムは修理が出来なくなる。耐久値が無いアイテムには関係ないので設定しても意味がない。