この記事は1.8のブロック追加を読んだ事を前提としています。 |
この記事は"Minecraft Forge Universal 11.14.0.xxx~"を前提MODとしています。 |
ブロックで部分的に色を変える方法
目次
ブロックの追加
注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。
ソースコード
- SampleMod.java
package等省略 @Mod(modid = "SampleMod", name = "SampleMod", version = "1.0", dependencies = "required-after:Forge@[1.8-11.14.0.1239,)", acceptedMinecraftVersions = "[1.8,1.8.8]", useMetadata = true) public class SampleMod { public static final String MOD_ID = "SampleMod"; @Mod.Instance("SampleMod") public static SampleMod INSTANCE; 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:三人称視点での指定。
他のファイルの説明は省略。