提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 11.14.3.1464~"を前提MODとしています。 |
ワールド上に設置できる簡単な液体ブロックの追加方法
目次
液体ブロックの追加
注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。
ソースコード
- SampleMod.java
package com.example.examplemod; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.client.renderer.ItemMeshDefinition; import net.minecraft.client.renderer.block.statemap.StateMapperBase; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @Mod(modid = SampleFluidMod.MODID, name = SampleFluidMod.MODID, version = "1.0", dependencies = "required-after:Forge@[1.8-11.14.3.1464,)", useMetadata = true) public class SampleFluidMod { /** * MODのMODID */ public static final String MODID = "samplefluidmod"; /** * 液体ブロック */ public static Block sampleFluidBlock; /** * 液体 * 1.8からは、停滞状態と流動状態のModelResourceLocationの指定が必要 */ public static Fluid sampleFluid = new Fluid("samplefluid", new ResourceLocation("blocks/water_still"), new ResourceLocation("blocks/water_flow")); /** * ブロックのModelResourceLocation * BlockState別指定やアイテムとしての描画時に使用 */ public static ModelResourceLocation fluidModelLocation = new ModelResourceLocation("samplefluidmod:fluid_block", "fluid"); @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { /** * 液体の登録 * 液体ブロックの登録前に行うこと */ FluidRegistry.registerFluid(sampleFluid); sampleFluidBlock = new SampleFluidBlock(); //クライアントサイドでの処理。Proxyシステムを使ってもよい。 if (event.getSide().isClient()) { //ItemMeshDefinitionの登録。手持ち時の描画用 ModelLoader.setCustomMeshDefinition(Item.getItemFromBlock(sampleFluidBlock), new ItemMeshDefinition() { @Override public ModelResourceLocation getModelLocation(ItemStack stack) { return fluidModelLocation; } }); //StateMapperの登録。ブロック描画用 ModelLoader.setCustomStateMapper(sampleFluidBlock, new StateMapperBase() { @Override protected ModelResourceLocation getModelResourceLocation(IBlockState p_178132_1_) { return fluidModelLocation; } }); } } }
- SampleFluidBlock.java
package com.example.examplemod; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fml.common.registry.GameRegistry; public class SampleFluidBlock extends BlockFluidClassic { public SampleFluidBlock() { super(SampleFluidMod.sampleFluid, Material.water); //ブロック名の登録 this.setUnlocalizedName("sample_fluid_block"); //ブロックのForgeへの登録 GameRegistry.registerBlock(this, "fluid_block"); //クリエイティブタブへの登録 this.setCreativeTab(CreativeTabs.tabBlock); } }
- fluid_block.json(assets/samplefluidmod/blockstates配下に格納)
{ "forge_marker": 1, "variants": { "fluid": { "model" : "forge:fluid", "custom": { "fluid": "samplefluid" } } } }
解説
SampleFluidMod.java
public static Fluid sampleFluid = new Fluid("samplefluid", new ResourceLocation("blocks/water_still"), new ResourceLocation("blocks/water_flow"));
液体インスタンスの生成。扱いとしては“流体”なので、気体を作りたい場合も同じ。 第2引数は停滞状態の時のResourceLocation、第3引数は流動状態のResourceLocation
public static ModelResourceLocation fluidModelLocation = new ModelResourceLocation("samplefluidmod:fluid_block", "fluid");
ブロック用ModelResourceLocationのインスタンスの生成。 第1引数はMODID:Block登録名、第2引数は液体の場合は“fluid”固定
FluidRegistry.registerFluid(sampleFluid); sampleFluidBlock = new SampleFluidBlock();
液体の登録と液体ブロックのインスタンスの生成。 必ず、液体ブロックの登録の前に液体を登録すること。(今回は液体ブロックのコンストラクタ内で登録している。)
//ItemMeshDefinitionの登録。手持ち時の描画用 ModelLoader.setCustomMeshDefinition(Item.getItemFromBlock(sampleFluidBlock), new ItemMeshDefinition() { @Override public ModelResourceLocation getModelLocation(ItemStack stack) { return fluidModelLocation; } }); //StateMapperの登録。ブロック描画用 ModelLoader.setCustomStateMapper(sampleFluidBlock, new StateMapperBase() { @Override protected ModelResourceLocation getModelResourceLocation(IBlockState p_178132_1_) { return fluidModelLocation; } });
描画用のクラス登録。 今回は匿名クラスを用いているが、複数登録する場合は、ModelResourceLocationを引数に持つクラスを作ったほうが良い。
SampleFluidBlock.java
public class SampleFluidBlock extends BlockFluidClassic { public SampleFluidBlock() { super(SampleFluidMod.sampleFluid, Material.water); //ブロック名の登録 this.setUnlocalizedName("sample_fluid_block"); //ブロックのForgeへの登録 GameRegistry.registerBlock(this, "fluid_block"); //クリエイティブタブへの登録 this.setCreativeTab(CreativeTabs.tabBlock); } }
液体ブロッククラス。通常の液体描画を行いたいなら、必ずBlockFluidClassicクラスを継承すること。
fluid_block.json
{ "forge_marker": 1, "variants": { "fluid": { "model" : "forge:fluid", "custom": { "fluid": "samplefluid" } } } }
液体ブロックのblockstate用JSONファイル。ファイル名はブロック登録名。
forge_marker:forge用の記述かどうか。(おそらく)1でforge用。
variants:本来はblockstateの状態を指定する。液体は“fluid”で指定。
model:本来は、モデル用JSONファイルの指定。液体は"forge:fluid"固定。(カスタマイズもおそらく出来る。)
custom:forge専用。液体クラスの登録名を指定。