提供: Minecraft Modding Wiki
2015年12月30日 (水) 23:47時点におけるA.K. (トーク | 投稿記録)による版 (ソースコード)
移動先: 案内検索

この記事は1.8のブロック追加を読んだ事を前提としています。

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

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

ブロックで部分的に色を変える方法

ブロックの追加

注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。

ソースコード

  • SampleMod.java
package等省略

@Mod(modid = SampleMod.MOD_ID, 
        name = SampleMod.MOD_NAME, 
        version = SampleMod.MOD_VERSION, 
        dependencies = SampleMod.MOD_DEPENDENCIES,
        acceptedMinecraftVersions = SampleMod.MOD_ACCEPTED_MC_VERSIONS,
        useMetadata = true)
public class SampleMod {
    /** ModId文字列 */
    public static final String MOD_ID = "samplemod";
    /** MOD名称 */
    public static final String MOD_NAME = "SampleMod";
    /** MODのバージョン */
    public static final String MOD_VERSION = "0.0.1";
    /** 早紀に読み込まれるべき前提MODをバージョン込みで指定 */
    public static final String MOD_DEPENDENCIES = "required-after:Forge@[1.8-11.14.0.1239,)";
    /** 起動出来るMinecraft本体のバージョン。記法はMavenのVersion Range Specificationを検索すること。 */
    public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"

    public static Block sampleBlock;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        sampleBlock = new SampleBlock();
        //ブロックの登録。登録文字列はMOD内で被らなければ何でも良い。

        GameRegistry.registerBlock(sampleBlock, SampleItemBlock.class, "sampleblock");

        //テクスチャ・モデル指定JSONファイル名の登録。
        if (event.getSide().isClient()) {
            //モデルJSONファイルのファイル名を登録。1IDで1つだけなら、登録名はGameRegistryでの登録名と同じものにする。
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleBlock), 0, new ModelResourceLocation(MOD_ID + ":" + "sampleblock", "inventory"));
        }
    }
}
  • SampleBlock.java
package等省略

public class SampleBlock extends Block {
    public SampleBlock() {
        super(Material.rock);
        setCreativeTab(CreativeTabs.tabBlock);/*クリエイティブタブの選択*/
        setUnlocalizedName("blockSample");/*システム名の設定*/
    }

    /**返しているのは「切り抜き」「ミップマップされた」である。*/
    @Override
    @SideOnly(Side.CLIENT)
    public EnumWorldBlockLayer getBlockLayer(){
        return EnumWorldBlockLayer.CUTOUT_MIPPED;
    }

    /**
     RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。
     @see #getRenderColor
     */
    @SideOnly(Side.CLIENT)
    public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass){
        return ItemDye.dyeColors[renderPass];
    }
}
  • SampleItemBlock.java
package等省略

public class SampleItemBlock extends ItemBlock{
    public SampleItemBlock(Block block){
        super(block);
    }

    /**
     Layerが機能しているかの確認。
     */
    @SideOnly(Side.CLIENT)
    public int getColorFromItemStack(ItemStack stack, int renderPass){
        return block.colorMultiplier(null, null, renderPass);
    }
}
  • sampleblock.json(BlockState用)
{
    "variants": {
        "normal":  { "model": "samplemod:sampleblock" }
    }
}

</source>

  • samplebase.json
{
  "elements": [
    {
      "from": [0,0,0],
      "to": [16,16,16],
      "faces": {
        "down": {
          "uv": [0,0,16,16],
          "texture": "#bottom",
          "cullface": "down"
        },
        "up": {
          "uv": [ 0,0,16,16],
          "texture": "#top",
          "cullface": "up"
        },
        "north": {
          "uv": [0,0,16,16],
          "texture": "#north",
          "cullface": "north"
        },
        "south": {
          "uv": [0,0,16,16],
          "texture": "#south",
          "cullface": "south"
        },
        "west": {
          "uv": [0,0,16,16],
          "texture": "#west",
          "cullface": "west"
        },
        "east": {
          "uv": [0,0,16,16],
          "texture": "#east",
          "cullface": "east"
        }
      }
    },
    {
      "from": [0,0,0],
      "to": [16,16,16],
      "faces": {
        "down": {
          "uv": [0,0,16,16],
          "texture": "#overlaybottom",
          "tintindex": 0,
          "cullface": "down"
        },
        "up": {
          "uv": [0,0,16,16],
          "texture": "#overlaytop",
          "tintindex": 1,
          "cullface": "up"
        },
        "north": {
          "uv": [0,0,16,16],
          "texture": "#overlaynorth",
          "tintindex": 2,
          "cullface": "north"
        },
        "south": {
          "uv": [0,0,16,16
          ],
          "texture": "#overlaysouth",
          "tintindex": 3,
          "cullface": "south"
        },
        "west": {
          "uv": [0,0,16,16],
          "texture": "#overlaywest",
          "tintindex": 4,
          "cullface": "west"
        },
        "east": {
          "uv": [0,0,16,16],
          "texture": "#overlayeast",
          "tintindex": 5,
          "cullface": "east"
        }
      }
    }
  ]
}
  • samplebase_all.json
{
  "parent": "samplemod:block/samplebase",
  "textures": {
    "particle": "#all",
    "bottom": "#all",
    "top": "#all",
    "north": "#all",
    "east": "#all",
    "south": "#all",
    "west": "#all",
    "overlaybottom": "#overlayall",
    "overlaytop": "#overlayall",
    "overlaynorth": "#overlayall",
    "overlayeast": "#overlayall",
    "overlaysouth": "#overlayall",
    "overlaywest": "#overlayall"
  }
}
  • sampleblock0.json(Block Model用)
{
    "parent": "samplemod:block/samplebase_all",
    "textures": {
        "all": "blocks/stone",
        "overlayall": "blocks/grass_side_overlay"
    }
}
  • sampleblock0.json(Item Model用)
{
    "parent": "samplemod:block/sampleblock0",
    "display": {
        "thirdperson": {
            "rotation": [ 10, -45, 170 ],
            "translation": [ 0, 1.5, -2.75 ],
            "scale": [ 0.375, 0.375, 0.375 ]
        }
    }
}
  • sampleblock1.json(Block Model用)
{
    "parent": "samplemod:block/samplebase_all",
    "textures": {
        "all": "blocks/dirt",
        "overlayall": "items/snowball"
    }
}
  • sampleblock1.json(Item Model用)
{
    "parent": "samplemod:block/sampleblock1",
    "display": {
        "thirdperson": {
            "rotation": [ 10, -45, 170 ],
            "translation": [ 0, 1.5, -2.75 ],
            "scale": [ 0.375, 0.375, 0.375 ]
        }
    }
}

解説

SampleMod.java

同様の処理なため1.8のブロック追加を参照のこと。

SampleBlock.java

/**返しているのは「切り抜き」「ミップマップされた」である。*/
    @Override
    @SideOnly(Side.CLIENT)
    public EnumWorldBlockLayer getBlockLayer(){
        return EnumWorldBlockLayer.CUTOUT_MIPPED;
    }

    /**
     RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。
     @see #getRenderColor
     */
    @SideOnly(Side.CLIENT)
    public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass){
        return ItemDye.dyeColors[renderPass];
    }

基本的にコメントのとおりである。

sampleblock0.json(BlockState用)

BlockState別のモデルJSONファイルの指定を行う。 このファイルは、
assets\<modid>\blockstates
ディレクトリに配置する。

meta=0:BlockStateの状態指定。"meta=0,bool=false"のように書く。BlockStatesが無い場合は、"normal"とする。

model:モデル用JSONファイルのファイル名を指定。"<modid>:ファイル名"という形式。

sampleblock0.json(Block Model用)

ブロックモデル用JSONファイルである。 このファイルは、
assets\<modid>\models\block
ディレクトリに配置する。

parent:親のモデルJSONファイルを指定。"samplemod:block/samplebase_all"で全面同一テクスチャの立方体モデルを指定。

texture:テクスチャのファイルパスを指定。この場合は、"all"と"overlayall"に指定。

sampleblock0.json(Item Model用)

アイテムモデル用JSONファイルである。 このファイルは、
assets\<modid>\models\item
ディレクトリに配置する。

parent:親のモデルJSONファイルを指定。ブロックの場合は、ブロックモデルのJSONファイルを指定。

display:描画時の回転、平行移動、拡大縮小の係数を指定。コピペ安定。

thirdperson:三人称視点での指定。

他のファイルの説明は省略。