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

この記事は"ModLoader"を前提MODとしています。

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はすべてのコメントを歓迎します。匿名で投稿したくない場合は、アカウント作成またはログインしてください。無料です。


  • 1.5からテクスチャのシステムが変わったから出来ねー --221.38.206.124 2013年9月7日 (土) 10:32 (JST)

  • mod_hogecropはBaseModを継承する必要があるはずでは? --210.234.155.122 2012年10月16日 (火) 23:46 (JST)

  • これと同じように作ったが、どうしても@Overrideのとこで必ずエラーが出る、どうすればいいんだ? --114.198.223.38 2012年9月3日 (月) 21:35 (JST)

  • 1.2.5現在このサンプルは手を加えないと動作しないようです。 --Exteft 2012年5月24日 (木) 16:56 (JST)

  • ModLoaderだけだと、骨粉使っても意味無いですがForgeでハンドラ使えるので書いておけばいいかなと。※未だ書いてないですが --Nagisawa 2012年3月22日 (木) 17:27 (JST)

  • いえ、種を植えた後に骨粉つかって成長させるときのに呼び出すメソッドのことです。<fertilize --Nagisawa 2012年3月22日 (木) 17:09 (JST)

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