ModderKina (トーク | 投稿記録) (ModelLoader.setCustomModelResourceLocationを利用するように変更) |
ModderKina (トーク | 投稿記録) (意味不明な解説になってたので) |
||
29行目: | 29行目: | ||
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")); | |
− | |||
− | |||
− | ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleBlock), 0, new ModelResourceLocation(MOD_ID + ":" + " | ||
− | |||
} | } | ||
} | } | ||
45行目: | 41行目: | ||
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");/*システム名の設定*/ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
98行目: | 55行目: | ||
/** | /** | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | ||
@see #getRenderColor | @see #getRenderColor | ||
121行目: | 60行目: | ||
@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]; |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
} | } | ||
138行目: | 68行目: | ||
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用) | ||
150行目: | 86行目: | ||
{ | { | ||
"variants": { | "variants": { | ||
− | " | + | "normal": { "model": "samplemod:sampleblock" } |
− | |||
} | } | ||
} | } | ||
292行目: | 227行目: | ||
"textures": { | "textures": { | ||
"all": "blocks/dirt", | "all": "blocks/dirt", | ||
− | "overlayall": "items/ | + | "overlayall": "items/snowball" |
} | } | ||
} | } | ||
324行目: | 259行目: | ||
/** | /** | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | RenderPassに渡される数値はJsonで指定したtintindexで、tintindexを指定しないとこのメソッドは呼ばれない。 | ||
@see #getRenderColor | @see #getRenderColor | ||
347行目: | 264行目: | ||
@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用)=== |
2015年9月10日 (木) 21:23時点における版
この記事は"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,)", 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:三人称視点での指定。
他のファイルの説明は省略。