提供: Minecraft Modding Wiki
このページは
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; } } }
- 骨粉の処理はItemDye.javaをいじらないとできませんよ。 --180.29.222.145 2012年3月22日 (木) 16:55 (JST)
コメントの自動更新を有効化