提供: Minecraft Modding Wiki
移動先: 案内検索

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[編集]

ここでは、アイテムに使うモデルを設定するところです。