提供: Minecraft Modding Wiki
2012年3月22日 (木) 16:55時点における180.29.222.145 (トーク)による版 (一行コメント)
移動先: 案内検索

このページは
ModLoaderを前提としています。

1.種ブロックの追加
2.成長段階分のテクスチャデータの定義
3.成長処理判定
4.ドロップさせるアイテム設定
概要はこんな感じです。

ソース解説

mod_hogecropクラスを作成

package net.minecraft.src;

import java.util.*;

public class mod_hogecrop {

	public static int growHoge1;
	public static int growHoge2;
	public static int growHoge3;
	public static int growHoge4;
	public static int growHoge5;
	public static int growHoge6;
	public static int growHoge7;
	public static int growHoge8;
	
	public static Block hogeBlockCrop;
	public static Item hogeItemCrop;
	
	public mod_hogecrop()
	{
	}
	
	public String getVersion()
	{
		return "1.1";
	}
	
	public void load()
	{
		/*
		 * 毎度おなじみaddOverride
		 * 成長させる分のテクスチャデータを定義してます。
		 */
		growHoge1 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop1.png");
		growHoge2 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop2.png");
		growHoge3 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop3.png");
		growHoge4 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop4.png");
		growHoge5 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop5.png");
		growHoge6 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop6.png");
		growHoge7 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop7.png");
		growHoge8 = ModLoader.addOverride("/terrain.png", "/crop/hogeCrop8.png");
		
		/*
		 * BlockIDの定義
		 */
		hogeBlockCrop = new BlockHogeCrop(100, 0);
		hogeBlockCrop.setBlockName("HogeCrop");
		
		/*
		 * ItemHogeCropの()内説明
		 * 5000:ItemID
		 * 上記追加するCropのBlockID
		 * どのでブロックの上で成長するかを指定する。下記はソウルサンドを無駄に割り振ってます。
		 */
		hogeItemCrop = new ItemHogeCrop(5000, mod_hogecrop.hogeBlockCrop.blockID, Block.slowSand.blockID);
		hogeItemCrop.setItemName("Hoge");
		
		/*
		 * BlockとItemを登録
		 */
		ModLoader.AddName(hogeBlockCrop, "Hoge Crop");
		hogeBlockCrop.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/Hogecrop.png");
		
		ModLoader.AddName(hogeItemCrop, "Hoge");
		hogeItemCrop.iconIndex = ModLoader.addOverride("/gui/items.png", "/Hoge.png");
	}
}

BlockHogeCropクラスを作成

package net.minecraft.src;

import java.util.Random;
import java.util.ArrayList;

public class BlockHogeCrop extends BlockFlower
{
    protected BlockHogeCrop(int i, int j)
    {
        super(i, j);
        blockIndexInTexture = j;
        setTickRandomly(true);
        float f = 0.5F;
        setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f);
    }

    /*
     * 対象ブロックで植物が成長できるかの判定だったはず。
     */
    protected boolean canThisPlantGrowOnThisBlockID(int i)
    {
        return i == Block.tilledField.blockID;
    }


    /*
     * ここで成長処理判定
     * world.getBlockLightValueが光度判定
     * 9以上なら成長するよという記述 最大15(太陽が一番照っているとき)
     */
    public void updateTick(World world, int i, int j, int k, Random random)
    {
        super.updateTick(world, i, j, k, random);
        if (world.getBlockLightValue(i, j + 1, k) >= 9)
        {
            int l = world.getBlockMetadata(i, j, k);
            if (l < 7)
            {
                float f = getGrowthRate(world, i, j, k);
                if (random.nextInt((int)(25F / f) + 1) == 0)
                {
                    l++;
                    world.setBlockMetadataWithNotify(i, j, k, l);
                }
            }
        }
    }

    /*
     * 未確認ですが、ここで骨粉処理してるはず。
     */
    public void fertilize(World world, int i, int j, int k)
    {
        world.setBlockMetadataWithNotify(i, j, k, 7);
    }

    /*
     * 成長速度を管理しているメソッドです。
     * 最初の行の
     * float f = 1.0F; で管理してるので、この数字増やせばグングン
     */
    private float getGrowthRate(World world, int i, int j, int k)
    {
        float f = 1.0F;
        int l = world.getBlockId(i, j, k - 1);
        int i1 = world.getBlockId(i, j, k + 1);
        int j1 = world.getBlockId(i - 1, j, k);
        int k1 = world.getBlockId(i + 1, j, k);
        int l1 = world.getBlockId(i - 1, j, k - 1);
        int i2 = world.getBlockId(i + 1, j, k - 1);
        int j2 = world.getBlockId(i + 1, j, k + 1);
        int k2 = world.getBlockId(i - 1, j, k + 1);
        boolean flag = j1 == blockID || k1 == blockID;
        boolean flag1 = l == blockID || i1 == blockID;
        boolean flag2 = l1 == blockID || i2 == blockID || j2 == blockID || k2 == blockID;
        for (int l2 = i - 1; l2 <= i + 1; l2++)
        {
            for (int i3 = k - 1; i3 <= k + 1; i3++)
            {
                int j3 = world.getBlockId(l2, j - 1, i3);
                float f1 = 0.0F;
                if (j3 == Block.tilledField.blockID)
                {
                    f1 = 1.0F;
                    if (world.getBlockMetadata(l2, j - 1, i3) > 0)
                    {
                        f1 = 3F;
                    }
                }
                if (l2 != i || i3 != k)
                {
                    f1 /= 4F;
                }
                f += f1;
            }
        }

        if (flag2 || flag && flag1)
        {
            f /= 2.0F;
        }
        return f;
    }

    /*
     * 成長時のテクスチャを段階的に反映させるのはここ
     */
    public int getBlockTextureFromSideAndMetadata(int i, int j)
    {
    	if (j == 0)
    	{
    		return blockIndexInTexture;
    	}
        if (j == 1)
        {
            return mod_hogecrop.growHoge1;
        }
        if (j == 2)
        {
            return mod_hogecrop.growHoge2;
        }
        if (j == 3)
        {
            return mod_hogecrop.growHoge3;
        }
        if (j == 4)
        {
            return mod_hogecrop.growHoge4;
        }
        if (j == 5)
        {
            return mod_hogecrop.growHoge5;
        }
        if (j == 6)
        {
            return mod_hogecrop.growHoge6;
        }
        if (j == 7)
        {
            return mod_hogecrop.growHoge7;
        }
        if (j == 8)
        {
            return mod_hogecrop.growHoge8;
        }
        else
        {
        	return mod_hogecrop.growHoge8;
        }
        
    }

    public int getRenderType()
    {
        return 6;
    }

    /*
     * 成長段階が最大の際の収穫した場合の判定
     * エンチャントアイテム(フォーチュン)使用時の設定はfor文のところ。
     */
    @Override
    public ArrayList<ItemStack> getBlockDropped(World world, int i, int j, int k, int meta, int fortune)
    {
    	ArrayList<ItemStack> ret = new ArrayList<ItemStack>();
        if (meta == 8)
        {
        	ret.add(new ItemStack(Item.wheat));
        }
        
        for (int n = 0; n < 3 + fortune; n++)
        {
            if (world.rand.nextInt(15) <= meta)
            {
                ret.add(new ItemStack(Item.seeds));
            }
        }
        return ret;
    }

    /*
     * ※成長前段階の作物を壊した時の判定でした。
     * なので、小麦1個だけって定義です。
     * ここの return Item.wheat.shiftedIndexで破壊時小麦をドロップさせていますが
     * オリジナルの作物を入れる場合はここで設定します。
     */
    public int idDropped(int i, Random random, int j)
    {
        if (i == 7)
        {
            return Item.wheat.shiftedIndex;
        }
        else
        {
            return -1;
        }
    }
    /*
     * ドロップアイテムの個数を指定
     * return の後の数字で変わります。
     */
    public int quantityDropped(Random random)
    {
        return 1;
    }
}

ItemHogeCropクラスを作成

package net.minecraft.src;

public class ItemHogeCrop extends Item
{
    private int blockType;
    private int soilBlockID;

    /*
     * mod_hogeCropにも書いたけど
     * i:ItemID
     * j:対象ブロック(BlockHogeCropのこと)
     * k:成長するブロック
     */
	public ItemHogeCrop(int i, int j, int k)
	{
	super(i);
	blockType = j;
	this.soilBlockID = k;
	}
	
	/*
	 * 種を植えるときの処理判定
	 * 特に変える必要はないと思う。
	 */
    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int i, int j, int k, int l)
    {
		if(l != 1)
		{
			return false;
		}
        if (!entityplayer.canPlayerEdit(i, j, k) || !entityplayer.canPlayerEdit(i, j + 1, k))
        {
            return false;
        }
        int i1 = world.getBlockId(i, j, k);
        if (i1 == soilBlockID && world.isAirBlock(i, j + 1, k))
        {
            world.setBlockWithNotify(i, j + 1, k, blockType);
            itemstack.stackSize--;
            return true;
        }
        else
        {
            return false;
        }
    }	
}


自分のコメントを追加
Minecraft Modding Wikiはすべてのコメントを歓迎します。匿名で投稿したくない場合は、アカウント作成またはログインしてください。無料です。


  • 骨粉の処理はItemDye.javaをいじらないとできませんよ。 --180.29.222.145 2012年3月22日 (木) 16:55 (JST)