ModderKina (トーク | 投稿記録) (作った。おかしな点や解説が少ないところもある。) |
ModderKina (トーク | 投稿記録) 細 (→ソースコード) |
||
(3人の利用者による、間の6版が非表示) | |||
1行目: | 1行目: | ||
+ | {{前提チュートリアル|page=1.8のブロック追加}} | ||
{{前提MOD|reqmod="Minecraft Forge Universal 11.14.0.xxx~"}} | {{前提MOD|reqmod="Minecraft Forge Universal 11.14.0.xxx~"}} | ||
{{チュートリアル難易度|difficulty=0|clear=none}} | {{チュートリアル難易度|difficulty=0|clear=none}} | ||
{{チュートリアルカテゴリー |type=Block| difficulty=0}} | {{チュートリアルカテゴリー |type=Block| difficulty=0}} | ||
− | <p> | + | <p>ブロックで部分的に色を変える方法</p> |
==ブロックの追加== | ==ブロックの追加== | ||
注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。 | 注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。 | ||
10行目: | 11行目: | ||
package等省略 | package等省略 | ||
− | @Mod(modid = | + | @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 { | public class SampleMod { | ||
− | public static final String MOD_ID = "SampleMod"; | + | /** ModId文字列 */ |
− | + | public static final String MOD_ID = "samplemod"; | |
− | + | /** MOD名称 */ | |
− | public static | + | 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; | public static Block sampleBlock; | ||
25行目: | 37行目: | ||
GameRegistry.registerBlock(sampleBlock, SampleItemBlock.class, "sampleblock"); | GameRegistry.registerBlock(sampleBlock, SampleItemBlock.class, "sampleblock"); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
//テクスチャ・モデル指定JSONファイル名の登録。 | //テクスチャ・モデル指定JSONファイル名の登録。 | ||
if (event.getSide().isClient()) { | if (event.getSide().isClient()) { | ||
//モデルJSONファイルのファイル名を登録。1IDで1つだけなら、登録名はGameRegistryでの登録名と同じものにする。 | //モデルJSONファイルのファイル名を登録。1IDで1つだけなら、登録名はGameRegistryでの登録名と同じものにする。 | ||
− | + | ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleBlock), 0, new ModelResourceLocation(MOD_ID + ":" + "sampleblock", "inventory")); | |
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
51行目: | 53行目: | ||
public class SampleBlock extends Block { | public class SampleBlock extends Block { | ||
− | |||
− | |||
− | |||
public SampleBlock() { | public SampleBlock() { | ||
super(Material.rock); | super(Material.rock); | ||
setCreativeTab(CreativeTabs.tabBlock);/*クリエイティブタブの選択*/ | setCreativeTab(CreativeTabs.tabBlock);/*クリエイティブタブの選択*/ | ||
setUnlocalizedName("blockSample");/*システム名の設定*/ | setUnlocalizedName("blockSample");/*システム名の設定*/ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
104行目: | 67行目: | ||
/** | /** | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | ||
@see #getRenderColor | @see #getRenderColor | ||
127行目: | 72行目: | ||
@SideOnly(Side.CLIENT) | @SideOnly(Side.CLIENT) | ||
public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass){ | public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass){ | ||
− | return | + | return ItemDye.dyeColors[renderPass]; |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
144行目: | 80行目: | ||
package等省略 | package等省略 | ||
− | public class SampleItemBlock extends | + | public class SampleItemBlock extends ItemBlock{ |
− | /** | + | public SampleItemBlock(Block block){ |
− | public | + | super(block); |
− | + | } | |
+ | |||
+ | /** | ||
+ | Layerが機能しているかの確認。 | ||
+ | */ | ||
+ | @SideOnly(Side.CLIENT) | ||
+ | public int getColorFromItemStack(ItemStack stack, int renderPass){ | ||
+ | return block.colorMultiplier(null, null, renderPass); | ||
} | } | ||
} | } | ||
− | |||
</source> | </source> | ||
*sampleblock.json(BlockState用) | *sampleblock.json(BlockState用) | ||
156行目: | 98行目: | ||
{ | { | ||
"variants": { | "variants": { | ||
− | " | + | "normal": { "model": "samplemod:sampleblock" } |
− | |||
} | } | ||
} | } | ||
298行目: | 239行目: | ||
"textures": { | "textures": { | ||
"all": "blocks/dirt", | "all": "blocks/dirt", | ||
− | "overlayall": "items/ | + | "overlayall": "items/snowball" |
} | } | ||
} | } | ||
330行目: | 271行目: | ||
/** | /** | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | ||
@see #getRenderColor | @see #getRenderColor | ||
353行目: | 276行目: | ||
@SideOnly(Side.CLIENT) | @SideOnly(Side.CLIENT) | ||
public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass){ | public int colorMultiplier(IBlockAccess worldIn, BlockPos pos, int renderPass){ | ||
− | return | + | return ItemDye.dyeColors[renderPass]; |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
</source> | </source> | ||
基本的にコメントのとおりである。 | 基本的にコメントのとおりである。 | ||
− | |||
− | |||
− | |||
===sampleblock0.json(BlockState用)=== | ===sampleblock0.json(BlockState用)=== |
2016年1月3日 (日) 02:58時点における最新版
この記事は1.8のブロック追加を読んだ事を前提としています。 |
この記事は"Minecraft Forge Universal 11.14.0.xxx~"を前提MODとしています。 |
ブロックで部分的に色を変える方法
目次
ブロックの追加[編集]
注意:一度入れた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:三人称視点での指定。
他のファイルの説明は省略。