提供: Minecraft Modding Wiki
2015年8月14日 (金) 00:38時点におけるModderKina (トーク | 投稿記録)による版
移動先: 案内検索

この記事は"Minecraft Forge Universal 11.14.3.1464~"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。
C block.png
Blockに関係のあるチュートリアルです。

ワールド上に設置できる簡単な液体ブロックの追加方法

液体ブロックの追加

注意:一度入れた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からは、停滞状態と流動状態のResourceLocationの指定が必要
     */
    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しかない。

variants:本来はblockstateの状態を指定する。液体は“fluid”で指定。

model:本来は、モデル用JSONファイルの指定。液体は"forge:fluid"固定。(カスタマイズもおそらく出来る。)

custom:forge専用。液体クラスの登録名を指定。