(→ItemCustomModelToolsRenderer.java) |
|||
(同じ利用者による、間の11版が非表示) | |||
10行目: | 10行目: | ||
package custom.tool.item; | package custom.tool.item; | ||
+ | import net.minecraft.block.Block; | ||
+ | import net.minecraft.item.EnumToolMaterial; | ||
+ | import net.minecraft.item.Item; | ||
+ | import net.minecraft.item.ItemStack; | ||
+ | import net.minecraft.item.ItemTool; | ||
+ | import net.minecraftforge.client.IItemRenderer; | ||
+ | import net.minecraftforge.client.MinecraftForgeClient; | ||
import cpw.mods.fml.common.Mod; | import cpw.mods.fml.common.Mod; | ||
− | |||
import cpw.mods.fml.common.Mod.EventHandler; | import cpw.mods.fml.common.Mod.EventHandler; | ||
import cpw.mods.fml.common.event.FMLPreInitializationEvent; | import cpw.mods.fml.common.event.FMLPreInitializationEvent; | ||
+ | import cpw.mods.fml.common.network.NetworkMod; | ||
+ | import cpw.mods.fml.common.registry.GameRegistry; | ||
+ | import cpw.mods.fml.common.registry.LanguageRegistry; | ||
@Mod( | @Mod( | ||
− | modid = | + | modid = CustomModelTools.modid, |
− | name = | + | name = CustomModelTools.name, |
− | version = | + | version = CustomModelTools.version |
) | ) | ||
@NetworkMod( | @NetworkMod( | ||
26行目: | 35行目: | ||
public class CustomModelTools | public class CustomModelTools | ||
{ | { | ||
+ | public static final String modid = "CustomModelTools"; | ||
+ | public static final String name = "Custom Model Tools Modification"; | ||
+ | public static final String version = "1"; | ||
+ | |||
public static final boolean clientSideRequiredBoolean = true; | public static final boolean clientSideRequiredBoolean = true; | ||
− | public static final boolean | + | public static final boolean serverSideRequiredBoolean = false; |
+ | |||
+ | public static boolean Model_ON_OFF_Boolean = true; | ||
+ | public static String ModelTexture; | ||
+ | public static String texture = "model"; | ||
+ | public static int textureWidth = 64; | ||
+ | public static int textureHeight = 32; | ||
+ | |||
+ | public static EnumToolMaterial toolMaterial; | ||
public static ItemTool mainItem; | public static ItemTool mainItem; | ||
+ | public static int itemID = 3001; //default 3001 = 3257 | ||
+ | public static int damageFloat = (int) 1.0; | ||
+ | public static String domain = "CustomModelItem"; | ||
+ | public static String item_name = "CustomModelItem"; | ||
− | @ | + | @EventHandler |
public void mainLoading(FMLPreInitializationEvent event) | public void mainLoading(FMLPreInitializationEvent event) | ||
{ | { | ||
− | mainItem = new | + | mainItem = (ItemTool) new ItemCustomModelTools(itemID, toolMaterial.IRON).setData(domain, item_name, damageFloat); |
+ | registerItem(mainItem, "CustomModelItem", "Custom Model Item", "カスタムモデルアイテム", new ItemCustomModelToolsRenderer(), true, texture, textureWidth, textureHeight); | ||
+ | GameRegistry.addRecipe(new ItemStack(mainItem, 1, 0), new Object[] {" S ", "DCF", " X ", 'S', Item.pickaxeIron, 'D', Item.shovelIron, 'F', Item.axeIron, 'X', Item.stick, 'C', Block.stone}); | ||
+ | } | ||
+ | public void registerItem(Item items, String name, String en_US, String ja_JP, IItemRenderer itemRenderer, boolean modeling, String texture, int width, int height) | ||
+ | { | ||
+ | GameRegistry.registerItem(items, name); | ||
+ | LanguageRegistry.instance().addNameForObject(items, "en_US", en_US); | ||
+ | LanguageRegistry.instance().addNameForObject(items, "ja_JP", ja_JP); | ||
+ | MinecraftForgeClient.registerItemRenderer(items.itemID, itemRenderer); | ||
+ | Model_ON_OFF_Boolean = modeling; | ||
+ | ModelTexture = texture; | ||
+ | ModelCustomModelTools modelings = new ModelCustomModelTools(); | ||
+ | modelings.setTextureSize(width, height); | ||
+ | } | ||
+ | public static void configInformation(int ItemID, String domain, String name, int damage, boolean modeling, int width, int height) | ||
+ | { | ||
+ | itemID = ItemID; | ||
+ | CustomModelTools.domain = domain; | ||
+ | item_name = name; | ||
+ | damageFloat = damage; | ||
+ | Model_ON_OFF_Boolean = modeling; | ||
+ | ModelCustomModelTools modelings = new ModelCustomModelTools(); | ||
+ | modelings.setTextureSize(width, height); | ||
} | } | ||
} | } | ||
44行目: | 92行目: | ||
<source lang = java> | <source lang = java> | ||
package custom.tool.item; | package custom.tool.item; | ||
− | + | import net.minecraft.item.Item; | |
+ | import net.minecraft.item.ItemTool; | ||
+ | import net.minecraft.item.ItemStack; | ||
+ | import net.minecraft.item.EnumToolMaterial; | ||
import net.minecraft.block.Block; | import net.minecraft.block.Block; | ||
+ | import net.minecraft.block.material.Material; | ||
public class ItemCustomModelTools extends ItemTool | public class ItemCustomModelTools extends ItemTool | ||
{ | { | ||
− | private static final Block[] setBleakingList = new Block[] {// | + | //壊せるブロックのリスト |
+ | private static final Block[] setBleakingList = new Block[] {// ItemSpade.java | ||
Block.grass, | Block.grass, | ||
Block.dirt, | Block.dirt, | ||
59行目: | 112行目: | ||
Block.tilledField, | Block.tilledField, | ||
Block.slowSand, | Block.slowSand, | ||
− | Block.mycelium | + | Block.mycelium, |
− | // ItemPickaxe | + | // ItemPickaxe.java |
Block.cobblestone, | Block.cobblestone, | ||
Block.stoneDoubleSlab, | Block.stoneDoubleSlab, | ||
81行目: | 134行目: | ||
Block.railDetector, | Block.railDetector, | ||
Block.railPowered, | Block.railPowered, | ||
− | Block.railActivator}; | + | Block.railActivator, |
− | + | // ItemAxe.java | |
+ | Block.planks, | ||
+ | Block.bookShelf, | ||
+ | Block.wood, Block.chest, | ||
+ | Block.stoneDoubleSlab, | ||
+ | Block.stoneSingleSlab, | ||
+ | Block.pumpkin, | ||
+ | Block.pumpkinLantern}; | ||
+ | // 詳しい情報は、ItemSpade.java ItemPickaxe.java ItemAxe.javaを参照 | ||
+ | public static float damageFloat = 1.0F; | ||
+ | |||
public ItemCustomModelTools(int par1ID, EnumToolMaterial par2EnumToolMaterial) | public ItemCustomModelTools(int par1ID, EnumToolMaterial par2EnumToolMaterial) | ||
{ | { | ||
super(par1ID, damageFloat, par2EnumToolMaterial, setBleakingList); | super(par1ID, damageFloat, par2EnumToolMaterial, setBleakingList); | ||
} | } | ||
+ | @Override | ||
+ | public boolean canHarvestBlock(Block par1Block) | ||
+ | { | ||
+ | return setBleakingList != null; | ||
+ | } | ||
+ | @Override | ||
+ | public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) | ||
+ | { | ||
+ | return par2Block != null && | ||
+ | (par2Block.blockMaterial == Material.iron || //マテリアル属性 鉄 | ||
+ | par2Block.blockMaterial == Material.anvil || //マテリアル属性 金床 | ||
+ | par2Block.blockMaterial == Material.rock || //マテリアル属性 石 | ||
+ | par2Block.blockMaterial == Material.wood || //マテリアル属性 原木 | ||
+ | par2Block.blockMaterial == Material.plants || //マテリアル属性 木の厚板 | ||
+ | par2Block.blockMaterial == Material.vine) ? //マテリアル属性 つる | ||
+ | this.efficiencyOnProperMaterial : | ||
+ | super.getStrVsBlock(par1ItemStack, par2Block); | ||
+ | } | ||
+ | public Item setData(String domain, String path, float damage) | ||
+ | { | ||
+ | setUnlocalizedName(path); | ||
+ | iconString = domain + ":" + path; | ||
+ | damageFloat = damage; | ||
+ | return this; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | *ItemCustomModelToolsRenderer.java | ||
+ | |||
+ | <source lang = java> | ||
+ | package custom.tool.item; | ||
+ | |||
+ | import net.minecraft.client.Minecraft; | ||
+ | import net.minecraft.entity.Entity; | ||
+ | import net.minecraft.item.ItemStack; | ||
+ | import net.minecraft.util.ResourceLocation; | ||
+ | import net.minecraftforge.client.IItemRenderer; | ||
+ | |||
+ | import org.lwjgl.opengl.GL11; | ||
+ | |||
+ | public class ItemCustomModelToolsRenderer implements IItemRenderer | ||
+ | { | ||
+ | private ModelCustomModelTools modeling; | ||
+ | public ItemCustomModelToolsRenderer() | ||
+ | { | ||
+ | modeling = new ModelCustomModelTools(); | ||
+ | } | ||
+ | @Override | ||
+ | public boolean handleRenderType(ItemStack item, ItemRenderType type) | ||
+ | { | ||
+ | switch(type) | ||
+ | { | ||
+ | case EQUIPPED : | ||
+ | return CustomModelTools.Model_ON_OFF_Boolean; | ||
+ | default: | ||
+ | return false; | ||
+ | } | ||
+ | } | ||
+ | @Override | ||
+ | public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) | ||
+ | { | ||
+ | return false; | ||
+ | } | ||
+ | @Override | ||
+ | public void renderItem(ItemRenderType type, ItemStack item, Object... data) | ||
+ | { | ||
+ | switch(type) | ||
+ | { | ||
+ | case EQUIPPED : | ||
+ | { | ||
+ | GL11.glPushMatrix(); | ||
+ | |||
+ | float scala = 2.5F; | ||
+ | |||
+ | GL11.glScalef(scala, scala, scala); | ||
+ | |||
+ | GL11.glRotatef(0F, -10.0F, 0.0F, 0.0F); | ||
+ | GL11.glRotatef(8F, 0.0F, -10.0F, 0.0F); | ||
+ | GL11.glRotatef(125F, 0.0F, 0.0F, -10.0F); | ||
+ | |||
+ | GL11.glTranslatef(-0.304800F, -0.500F, -0.09F); | ||
+ | |||
+ | Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(CustomModelTools.domain, "textures/model/" + CustomModelTools.texture + ".png")); | ||
+ | |||
+ | modeling.render((Entity) data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); | ||
+ | |||
+ | GL11.glPopMatrix(); | ||
+ | } | ||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | *ModelCustomModelTools | ||
+ | |||
+ | <source lang = java> | ||
+ | package custom.tool.item; | ||
+ | |||
+ | import net.minecraft.client.model.ModelBase; | ||
+ | import net.minecraft.client.model.ModelRenderer; | ||
+ | import net.minecraft.entity.Entity; | ||
+ | |||
+ | public class ModelCustomModelTools extends ModelBase | ||
+ | { | ||
+ | public ModelRenderer Stick; | ||
+ | public ModelRenderer EnderEye; | ||
+ | public ModelRenderer PickaxePats1; | ||
+ | public ModelRenderer PickaxePats2; | ||
+ | public ModelRenderer PickaxePats3; | ||
+ | public ModelRenderer MainCenter; | ||
+ | public ModelRenderer AxeUp; | ||
+ | public ModelRenderer AxeLeft; | ||
+ | public ModelRenderer AxeRight; | ||
+ | public ModelRenderer AxeDown; | ||
+ | public ModelRenderer Forward; | ||
+ | |||
+ | public int TextureSizeWidth = 64; | ||
+ | public int TextureSizeHeight = 32; | ||
+ | public ModelCustomModelTools() | ||
+ | { | ||
+ | textureWidth = TextureSizeWidth ; | ||
+ | textureHeight = TextureSizeHeight ; | ||
+ | Stick = new ModelRenderer(this, 0, 0); | ||
+ | Stick.addBox(0F, 0F, 0F, 2, 14, 2); | ||
+ | Stick.setRotationPoint(-1F, 0F, -1F); | ||
+ | Stick.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | Stick.mirror = true; | ||
+ | setRotation(Stick, 0F, 0F, 0F); | ||
+ | EnderEye = new ModelRenderer(this, 8, 0); | ||
+ | EnderEye.addBox(0F, 0F, 0F, 3, 3, 3); | ||
+ | EnderEye.setRotationPoint(-1.5F, 13.5F, -1.5F); | ||
+ | EnderEye.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | EnderEye.mirror = true; | ||
+ | setRotation(EnderEye, 0F, 0F, 0F); | ||
+ | PickaxePats1 = new ModelRenderer(this, 20, 0); | ||
+ | PickaxePats1.addBox(0F, 0F, 0F, 10, 2, 2); | ||
+ | PickaxePats1.setRotationPoint(-4F, -2F, -1F); | ||
+ | PickaxePats1.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | PickaxePats1.mirror = true; | ||
+ | setRotation(PickaxePats1, 0F, 0F, 0F); | ||
+ | PickaxePats2 = new ModelRenderer(this, 44, 0); | ||
+ | PickaxePats2.addBox(0F, 0F, 0F, 5, 2, 2); | ||
+ | PickaxePats2.setRotationPoint(6F, -2F, -1F); | ||
+ | PickaxePats2.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | PickaxePats2.mirror = true; | ||
+ | setRotation(PickaxePats2, 0F, 0F, 0.2617994F); | ||
+ | PickaxePats3 = new ModelRenderer(this, 20, 4); | ||
+ | PickaxePats3.addBox(0F, 0F, 0F, 3, 1, 2); | ||
+ | PickaxePats3.setRotationPoint(10F, 0F, -1F); | ||
+ | PickaxePats3.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | PickaxePats3.mirror = true; | ||
+ | setRotation(PickaxePats3, 0F, 0F, 0.4363323F); | ||
+ | MainCenter = new ModelRenderer(this, 30, 4); | ||
+ | MainCenter.addBox(0F, 0F, 0F, 4, 6, 4); | ||
+ | MainCenter.setRotationPoint(-8F, -5F, -2F); | ||
+ | MainCenter.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | MainCenter.mirror = true; | ||
+ | setRotation(MainCenter, 0F, 0F, 0F); | ||
+ | AxeUp = new ModelRenderer(this, 30, 14); | ||
+ | AxeUp.addBox(0F, 0F, 0F, 2, 6, 4); | ||
+ | AxeUp.setRotationPoint(-4F, -9F, -2F); | ||
+ | AxeUp.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | AxeUp.mirror = true; | ||
+ | setRotation(AxeUp, 0F, 0F, 0.7853982F); | ||
+ | AxeLeft = new ModelRenderer(this, 30, 2); | ||
+ | AxeLeft.addBox(0F, 0F, 0F, 2, 6, 6); | ||
+ | AxeLeft.setRotationPoint(-3F, -5F, -5F); | ||
+ | AxeLeft.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | AxeLeft.mirror = true; | ||
+ | setRotation(AxeLeft, 0F, -1.047198F, 0F); | ||
+ | AxeRight = new ModelRenderer(this, 30, 2); | ||
+ | AxeRight.addBox(0F, 0F, 0F, 2, 6, 6); | ||
+ | AxeRight.setRotationPoint(-8F, -5F, 2F); | ||
+ | AxeRight.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | AxeRight.mirror = true; | ||
+ | setRotation(AxeRight, 0F, 1.047198F, 0F); | ||
+ | AxeDown = new ModelRenderer(this, 30, 14); | ||
+ | AxeDown.addBox(0F, 0F, 0F, 2, 6, 4); | ||
+ | AxeDown.setRotationPoint(-8F, 1F, -2F); | ||
+ | AxeDown.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | AxeDown.mirror = true; | ||
+ | setRotation(AxeDown, 0F, 0F, -0.7853982F); | ||
+ | Forward = new ModelRenderer(this, 8, 6); | ||
+ | Forward.addBox(0F, 0F, 0F, 1, 4, 2); | ||
+ | Forward.setRotationPoint(-8.5F, -4F, -1F); | ||
+ | Forward.setTextureSize(TextureSizeWidth, TextureSizeHeight); | ||
+ | Forward.mirror = true; | ||
+ | setRotation(Forward, 0F, 0F, 0F); | ||
+ | } | ||
+ | public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) | ||
+ | { | ||
+ | super.render(entity, f, f1, f2, f3, f4, f5); | ||
+ | setRotationAngles(f, f1, f2, f3, f4, f5, entity); | ||
+ | Stick.render(f5); | ||
+ | EnderEye.render(f5); | ||
+ | PickaxePats1.render(f5); | ||
+ | PickaxePats2.render(f5); | ||
+ | PickaxePats3.render(f5); | ||
+ | MainCenter.render(f5); | ||
+ | AxeUp.render(f5); | ||
+ | AxeLeft.render(f5); | ||
+ | AxeRight.render(f5); | ||
+ | AxeDown.render(f5); | ||
+ | Forward.render(f5); | ||
+ | } | ||
+ | private void setRotation(ModelRenderer model, float x, float y, float z) | ||
+ | { | ||
+ | model.rotateAngleX = x; | ||
+ | model.rotateAngleY = y; | ||
+ | model.rotateAngleZ = z; | ||
+ | } | ||
+ | public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) | ||
+ | { | ||
+ | super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); | ||
+ | } | ||
+ | public void setTextureSize(int width, int height) | ||
+ | { | ||
+ | TextureSizeWidth = width; | ||
+ | TextureSizeHeight = height; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | ==解説== | ||
+ | |||
+ | 注意、Mod開発上級者しかわからないと思いますが、すべて解説していきます。 | ||
+ | |||
+ | ===CustomModelTools.java=== | ||
+ | |||
+ | <source lang = java> | ||
+ | public void mainLoading(FMLPreInitializationEvent event) | ||
+ | </source> | ||
+ | これは、最前列に実行するポイントで、メドッソ名のmainLoadingはpreInit限定ではありません。<br> | ||
+ | <source lang = java> | ||
+ | public static void configInformation(int ItemID, String domain, String name, int damage, boolean modeling, int width, int height) | ||
+ | </source> | ||
+ | ここでは、メドッソ名道理、コンフィグ用のところです。<br> | ||
+ | なので、使わない場合、消去してかまいません。<br> | ||
+ | UTF-8で保存してください。 | ||
+ | |||
+ | <source lang = java> | ||
+ | mainItem = (ItemTool) new ItemCustomModelTools(itemID, toolMaterial.IRON).setData("CustomModelItem", "CustomModelItem", damageFloat); | ||
+ | </source> | ||
+ | ここの最初のコンテナで、アイテム登録します。<br> | ||
+ | setDataは、最初のストリングは「場所」、2番目のストリングは「アイテム名、テクスチャ名」、3番目は「アイテムのダメージカウント」 | ||
+ | |||
+ | <source lang = java> | ||
+ | registerItem(mainItem, "CustomModelItem", "Custom Model Item", "カスタムモデルアイテム", new ItemCustomModelToolsRenderer(), true, texture, textureWidth, textureHeight); | ||
+ | </source> | ||
+ | ここでは、アイテムデータを詳しく登録するところです。<br> | ||
+ | 1番目は「アイテムコンテナ」、2番目は「アイテム名」、3番目は「英語名」、4番目は「日本語名」、5番目は「モデルデータ」、6番目は「モデルを使うか」、7_8番目は「モデルテクスチャサイズ」<br> | ||
+ | |||
+ | ===ItemCustomModelTools.java=== | ||
+ | |||
+ | <source lang = java> | ||
+ | private static final Block[] setBleakingList = new Block[] {..., ...., ..., ....}; | ||
+ | </source> | ||
+ | ここでは、壊せるブロックのリストです。<br> | ||
+ | ここに、登録されてなくても壊せるものはありますが、ここで登録しといたほうがいいです。 | ||
+ | |||
+ | <source lang = java> | ||
+ | public static float damageFloat = 1.0F; | ||
+ | </source> | ||
+ | ここでは、対mobに使うところです。 | ||
+ | |||
+ | <source lang = java> | ||
+ | public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) | ||
+ | </source> | ||
+ | ここでは、掘れるマテリアル属性を登録するところです。 | ||
+ | |||
+ | ===ItemCustomModelToolsRenderer.java=== | ||
+ | |||
+ | <source lang = java> | ||
+ | private ModelCustomModelTools modeling; | ||
+ | public ItemCustomModelToolsRenderer() | ||
+ | { | ||
+ | modeling = new ModelCustomModelTools(); | ||
} | } | ||
+ | </source> | ||
+ | ここでは、モデルデータを登録するところです。 | ||
+ | <source lang = java> | ||
+ | public boolean handleRenderType(ItemStack item, ItemRenderType type) | ||
</source> | </source> | ||
+ | ここでは、モデルをつけるかどうかを認識するところです。<br> | ||
+ | IItemRendererないにある、EnumクラスのItemRenderType.javaにある、「ENTITY」「EQUIPPED」「EQUIPPED_FIRST_PERSON」「INVENTORY」「FIRST_PERSON_MAP」の五つあり、 | ||
+ | ENTITYは、EntityItem認識を行うところです。<br> | ||
+ | EQUIPPEDは、今回使うもので、モデル認識を行うところです。<br> | ||
+ | EQUIPPED_FIRST_PERSONは、三人称視点でのモデル認識を行うところです<br> | ||
+ | INVENTORYは、インベントリ内のみモデル認識を行うところです。<br> | ||
+ | FIRST_PERSON_MAPは、MapData.javaの認識転移範囲内にプレイヤーがあるかどうかを確認させて、実行させるかどうかです。 | ||
+ | |||
+ | <source lang = java> | ||
+ | public void renderItem(ItemRenderType type, ItemStack item, Object... data) | ||
+ | </source> | ||
+ | ここでは、モデルデータを詳しく登録するところで、先ほど出した「EQUIPPED」の内容を登録するところです。<br> | ||
+ | テクスチャロードは、CustomModelItemをドメインにしてるので、 | ||
+ | assets/CustomModelItem/... | ||
+ | となり、モデル名前が「model」なので、 | ||
+ | assets/CustomModelItem/textures/model/model.png | ||
+ | となります。 | ||
+ | テクスチャの場所は「assets/CustomModelItem/textures/model/model.png」 | ||
+ | |||
+ | ===ModelCustomModelTools.java=== | ||
− | + | ここでは、アイテムに使うモデルを設定するところです。 |
2015年7月8日 (水) 02:59時点における最新版
目次
1.6のモデル付きカスタムツール追加[編集]
このアイテムは、(つるはし)(ショベル)(斧)の三つ(鉄製)にモデルを付けて追加するものです。
ソース[編集]
- CustomModelTools.java
package custom.tool.item; import net.minecraft.block.Block; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemTool; import net.minecraftforge.client.IItemRenderer; import net.minecraftforge.client.MinecraftForgeClient; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.LanguageRegistry; @Mod( modid = CustomModelTools.modid, name = CustomModelTools.name, version = CustomModelTools.version ) @NetworkMod( clientSideRequired = CustomModelTools.clientSideRequiredBoolean, serverSideRequired = CustomModelTools.serverSideRequiredBoolean ) public class CustomModelTools { public static final String modid = "CustomModelTools"; public static final String name = "Custom Model Tools Modification"; public static final String version = "1"; public static final boolean clientSideRequiredBoolean = true; public static final boolean serverSideRequiredBoolean = false; public static boolean Model_ON_OFF_Boolean = true; public static String ModelTexture; public static String texture = "model"; public static int textureWidth = 64; public static int textureHeight = 32; public static EnumToolMaterial toolMaterial; public static ItemTool mainItem; public static int itemID = 3001; //default 3001 = 3257 public static int damageFloat = (int) 1.0; public static String domain = "CustomModelItem"; public static String item_name = "CustomModelItem"; @EventHandler public void mainLoading(FMLPreInitializationEvent event) { mainItem = (ItemTool) new ItemCustomModelTools(itemID, toolMaterial.IRON).setData(domain, item_name, damageFloat); registerItem(mainItem, "CustomModelItem", "Custom Model Item", "カスタムモデルアイテム", new ItemCustomModelToolsRenderer(), true, texture, textureWidth, textureHeight); GameRegistry.addRecipe(new ItemStack(mainItem, 1, 0), new Object[] {" S ", "DCF", " X ", 'S', Item.pickaxeIron, 'D', Item.shovelIron, 'F', Item.axeIron, 'X', Item.stick, 'C', Block.stone}); } public void registerItem(Item items, String name, String en_US, String ja_JP, IItemRenderer itemRenderer, boolean modeling, String texture, int width, int height) { GameRegistry.registerItem(items, name); LanguageRegistry.instance().addNameForObject(items, "en_US", en_US); LanguageRegistry.instance().addNameForObject(items, "ja_JP", ja_JP); MinecraftForgeClient.registerItemRenderer(items.itemID, itemRenderer); Model_ON_OFF_Boolean = modeling; ModelTexture = texture; ModelCustomModelTools modelings = new ModelCustomModelTools(); modelings.setTextureSize(width, height); } public static void configInformation(int ItemID, String domain, String name, int damage, boolean modeling, int width, int height) { itemID = ItemID; CustomModelTools.domain = domain; item_name = name; damageFloat = damage; Model_ON_OFF_Boolean = modeling; ModelCustomModelTools modelings = new ModelCustomModelTools(); modelings.setTextureSize(width, height); } }
- ItemCustomModelTools.java
package custom.tool.item; import net.minecraft.item.Item; import net.minecraft.item.ItemTool; import net.minecraft.item.ItemStack; import net.minecraft.item.EnumToolMaterial; import net.minecraft.block.Block; import net.minecraft.block.material.Material; public class ItemCustomModelTools extends ItemTool { //壊せるブロックのリスト private static final Block[] setBleakingList = new Block[] {// ItemSpade.java Block.grass, Block.dirt, Block.sand, Block.gravel, Block.snow, Block.blockSnow, Block.blockClay, Block.tilledField, Block.slowSand, Block.mycelium, // ItemPickaxe.java Block.cobblestone, Block.stoneDoubleSlab, Block.stoneSingleSlab, Block.stone, Block.sandStone, Block.cobblestoneMossy, Block.oreIron, Block.blockIron, Block.oreCoal, Block.blockGold, Block.oreGold, Block.oreDiamond, Block.blockDiamond, Block.ice, Block.netherrack, Block.oreLapis, Block.blockLapis, Block.oreRedstone, Block.oreRedstoneGlowing, Block.rail, Block.railDetector, Block.railPowered, Block.railActivator, // ItemAxe.java Block.planks, Block.bookShelf, Block.wood, Block.chest, Block.stoneDoubleSlab, Block.stoneSingleSlab, Block.pumpkin, Block.pumpkinLantern}; // 詳しい情報は、ItemSpade.java ItemPickaxe.java ItemAxe.javaを参照 public static float damageFloat = 1.0F; public ItemCustomModelTools(int par1ID, EnumToolMaterial par2EnumToolMaterial) { super(par1ID, damageFloat, par2EnumToolMaterial, setBleakingList); } @Override public boolean canHarvestBlock(Block par1Block) { return setBleakingList != null; } @Override public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block) { return par2Block != null && (par2Block.blockMaterial == Material.iron || //マテリアル属性 鉄 par2Block.blockMaterial == Material.anvil || //マテリアル属性 金床 par2Block.blockMaterial == Material.rock || //マテリアル属性 石 par2Block.blockMaterial == Material.wood || //マテリアル属性 原木 par2Block.blockMaterial == Material.plants || //マテリアル属性 木の厚板 par2Block.blockMaterial == Material.vine) ? //マテリアル属性 つる this.efficiencyOnProperMaterial : super.getStrVsBlock(par1ItemStack, par2Block); } public Item setData(String domain, String path, float damage) { setUnlocalizedName(path); iconString = domain + ":" + path; damageFloat = damage; return this; } }
- ItemCustomModelToolsRenderer.java
package custom.tool.item; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; import org.lwjgl.opengl.GL11; public class ItemCustomModelToolsRenderer implements IItemRenderer { private ModelCustomModelTools modeling; public ItemCustomModelToolsRenderer() { modeling = new ModelCustomModelTools(); } @Override public boolean handleRenderType(ItemStack item, ItemRenderType type) { switch(type) { case EQUIPPED : return CustomModelTools.Model_ON_OFF_Boolean; default: return false; } } @Override public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) { return false; } @Override public void renderItem(ItemRenderType type, ItemStack item, Object... data) { switch(type) { case EQUIPPED : { GL11.glPushMatrix(); float scala = 2.5F; GL11.glScalef(scala, scala, scala); GL11.glRotatef(0F, -10.0F, 0.0F, 0.0F); GL11.glRotatef(8F, 0.0F, -10.0F, 0.0F); GL11.glRotatef(125F, 0.0F, 0.0F, -10.0F); GL11.glTranslatef(-0.304800F, -0.500F, -0.09F); Minecraft.getMinecraft().renderEngine.bindTexture(new ResourceLocation(CustomModelTools.domain, "textures/model/" + CustomModelTools.texture + ".png")); modeling.render((Entity) data[1], 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F); GL11.glPopMatrix(); } default: break; } } }
- ModelCustomModelTools
package custom.tool.item; import net.minecraft.client.model.ModelBase; import net.minecraft.client.model.ModelRenderer; import net.minecraft.entity.Entity; public class ModelCustomModelTools extends ModelBase { public ModelRenderer Stick; public ModelRenderer EnderEye; public ModelRenderer PickaxePats1; public ModelRenderer PickaxePats2; public ModelRenderer PickaxePats3; public ModelRenderer MainCenter; public ModelRenderer AxeUp; public ModelRenderer AxeLeft; public ModelRenderer AxeRight; public ModelRenderer AxeDown; public ModelRenderer Forward; public int TextureSizeWidth = 64; public int TextureSizeHeight = 32; public ModelCustomModelTools() { textureWidth = TextureSizeWidth ; textureHeight = TextureSizeHeight ; Stick = new ModelRenderer(this, 0, 0); Stick.addBox(0F, 0F, 0F, 2, 14, 2); Stick.setRotationPoint(-1F, 0F, -1F); Stick.setTextureSize(TextureSizeWidth, TextureSizeHeight); Stick.mirror = true; setRotation(Stick, 0F, 0F, 0F); EnderEye = new ModelRenderer(this, 8, 0); EnderEye.addBox(0F, 0F, 0F, 3, 3, 3); EnderEye.setRotationPoint(-1.5F, 13.5F, -1.5F); EnderEye.setTextureSize(TextureSizeWidth, TextureSizeHeight); EnderEye.mirror = true; setRotation(EnderEye, 0F, 0F, 0F); PickaxePats1 = new ModelRenderer(this, 20, 0); PickaxePats1.addBox(0F, 0F, 0F, 10, 2, 2); PickaxePats1.setRotationPoint(-4F, -2F, -1F); PickaxePats1.setTextureSize(TextureSizeWidth, TextureSizeHeight); PickaxePats1.mirror = true; setRotation(PickaxePats1, 0F, 0F, 0F); PickaxePats2 = new ModelRenderer(this, 44, 0); PickaxePats2.addBox(0F, 0F, 0F, 5, 2, 2); PickaxePats2.setRotationPoint(6F, -2F, -1F); PickaxePats2.setTextureSize(TextureSizeWidth, TextureSizeHeight); PickaxePats2.mirror = true; setRotation(PickaxePats2, 0F, 0F, 0.2617994F); PickaxePats3 = new ModelRenderer(this, 20, 4); PickaxePats3.addBox(0F, 0F, 0F, 3, 1, 2); PickaxePats3.setRotationPoint(10F, 0F, -1F); PickaxePats3.setTextureSize(TextureSizeWidth, TextureSizeHeight); PickaxePats3.mirror = true; setRotation(PickaxePats3, 0F, 0F, 0.4363323F); MainCenter = new ModelRenderer(this, 30, 4); MainCenter.addBox(0F, 0F, 0F, 4, 6, 4); MainCenter.setRotationPoint(-8F, -5F, -2F); MainCenter.setTextureSize(TextureSizeWidth, TextureSizeHeight); MainCenter.mirror = true; setRotation(MainCenter, 0F, 0F, 0F); AxeUp = new ModelRenderer(this, 30, 14); AxeUp.addBox(0F, 0F, 0F, 2, 6, 4); AxeUp.setRotationPoint(-4F, -9F, -2F); AxeUp.setTextureSize(TextureSizeWidth, TextureSizeHeight); AxeUp.mirror = true; setRotation(AxeUp, 0F, 0F, 0.7853982F); AxeLeft = new ModelRenderer(this, 30, 2); AxeLeft.addBox(0F, 0F, 0F, 2, 6, 6); AxeLeft.setRotationPoint(-3F, -5F, -5F); AxeLeft.setTextureSize(TextureSizeWidth, TextureSizeHeight); AxeLeft.mirror = true; setRotation(AxeLeft, 0F, -1.047198F, 0F); AxeRight = new ModelRenderer(this, 30, 2); AxeRight.addBox(0F, 0F, 0F, 2, 6, 6); AxeRight.setRotationPoint(-8F, -5F, 2F); AxeRight.setTextureSize(TextureSizeWidth, TextureSizeHeight); AxeRight.mirror = true; setRotation(AxeRight, 0F, 1.047198F, 0F); AxeDown = new ModelRenderer(this, 30, 14); AxeDown.addBox(0F, 0F, 0F, 2, 6, 4); AxeDown.setRotationPoint(-8F, 1F, -2F); AxeDown.setTextureSize(TextureSizeWidth, TextureSizeHeight); AxeDown.mirror = true; setRotation(AxeDown, 0F, 0F, -0.7853982F); Forward = new ModelRenderer(this, 8, 6); Forward.addBox(0F, 0F, 0F, 1, 4, 2); Forward.setRotationPoint(-8.5F, -4F, -1F); Forward.setTextureSize(TextureSizeWidth, TextureSizeHeight); Forward.mirror = true; setRotation(Forward, 0F, 0F, 0F); } public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { super.render(entity, f, f1, f2, f3, f4, f5); setRotationAngles(f, f1, f2, f3, f4, f5, entity); Stick.render(f5); EnderEye.render(f5); PickaxePats1.render(f5); PickaxePats2.render(f5); PickaxePats3.render(f5); MainCenter.render(f5); AxeUp.render(f5); AxeLeft.render(f5); AxeRight.render(f5); AxeDown.render(f5); Forward.render(f5); } private void setRotation(ModelRenderer model, float x, float y, float z) { model.rotateAngleX = x; model.rotateAngleY = y; model.rotateAngleZ = z; } public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) { super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); } public void setTextureSize(int width, int height) { TextureSizeWidth = width; TextureSizeHeight = height; } }
解説[編集]
注意、Mod開発上級者しかわからないと思いますが、すべて解説していきます。
CustomModelTools.java[編集]
public void mainLoading(FMLPreInitializationEvent event)
これは、最前列に実行するポイントで、メドッソ名のmainLoadingはpreInit限定ではありません。
public static void configInformation(int ItemID, String domain, String name, int damage, boolean modeling, int width, int height)
ここでは、メドッソ名道理、コンフィグ用のところです。
なので、使わない場合、消去してかまいません。
UTF-8で保存してください。
mainItem = (ItemTool) new ItemCustomModelTools(itemID, toolMaterial.IRON).setData("CustomModelItem", "CustomModelItem", damageFloat);
ここの最初のコンテナで、アイテム登録します。
setDataは、最初のストリングは「場所」、2番目のストリングは「アイテム名、テクスチャ名」、3番目は「アイテムのダメージカウント」
registerItem(mainItem, "CustomModelItem", "Custom Model Item", "カスタムモデルアイテム", new ItemCustomModelToolsRenderer(), true, texture, textureWidth, textureHeight);
ここでは、アイテムデータを詳しく登録するところです。
1番目は「アイテムコンテナ」、2番目は「アイテム名」、3番目は「英語名」、4番目は「日本語名」、5番目は「モデルデータ」、6番目は「モデルを使うか」、7_8番目は「モデルテクスチャサイズ」
ItemCustomModelTools.java[編集]
private static final Block[] setBleakingList = new Block[] {..., ...., ..., ....};
ここでは、壊せるブロックのリストです。
ここに、登録されてなくても壊せるものはありますが、ここで登録しといたほうがいいです。
public static float damageFloat = 1.0F;
ここでは、対mobに使うところです。
public float getStrVsBlock(ItemStack par1ItemStack, Block par2Block)
ここでは、掘れるマテリアル属性を登録するところです。
ItemCustomModelToolsRenderer.java[編集]
private ModelCustomModelTools modeling; public ItemCustomModelToolsRenderer() { modeling = new ModelCustomModelTools(); }
ここでは、モデルデータを登録するところです。
public boolean handleRenderType(ItemStack item, ItemRenderType type)
ここでは、モデルをつけるかどうかを認識するところです。
IItemRendererないにある、EnumクラスのItemRenderType.javaにある、「ENTITY」「EQUIPPED」「EQUIPPED_FIRST_PERSON」「INVENTORY」「FIRST_PERSON_MAP」の五つあり、
ENTITYは、EntityItem認識を行うところです。
EQUIPPEDは、今回使うもので、モデル認識を行うところです。
EQUIPPED_FIRST_PERSONは、三人称視点でのモデル認識を行うところです
INVENTORYは、インベントリ内のみモデル認識を行うところです。
FIRST_PERSON_MAPは、MapData.javaの認識転移範囲内にプレイヤーがあるかどうかを確認させて、実行させるかどうかです。
public void renderItem(ItemRenderType type, ItemStack item, Object... data)
ここでは、モデルデータを詳しく登録するところで、先ほど出した「EQUIPPED」の内容を登録するところです。
テクスチャロードは、CustomModelItemをドメインにしてるので、
assets/CustomModelItem/...
となり、モデル名前が「model」なので、
assets/CustomModelItem/textures/model/model.png
となります。
テクスチャの場所は「assets/CustomModelItem/textures/model/model.png」
ModelCustomModelTools.java[編集]
ここでは、アイテムに使うモデルを設定するところです。