MOD製作チュートリアル > 作物の追加

概要

新しく種、作物を追加する。
テクスチャは、
  • 作物(ブロック)が成長段階によって"textures/blocks/cropAluminium_stage_0.png"から"blocks/cropAluminium_stage_7.png"。
  • 種が"textures/items/seedsAluminium.png"、作物が"textures/items/wheatAluminium.png"。

ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod;
 
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.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
 
@Mod(modid = AluminiumMod.MOD_ID, name = AluminiumMod.MOD_NAME, version = AluminiumMod.MOD_VERSION)
public class AluminiumMod {
	public static final String MOD_ID = "AluminiumMod";
	public static final String MOD_NAME = "Aluminium Mod";
	public static final String MOD_VERSION = "1.0.0";
	public static Block cropAluminium;
	public static Item seedsAluminium;
	public static Item wheatAluminium;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		// 作物ブロックのインスタンス生成。
		cropAluminium = new BlockAluminiumCrop().setBlockName("cropAluminium").setBlockTextureName("cropAluminium");
		GameRegistry.registerBlock(cropAluminium, "aluminium_crop");
		// 種のインスタンス生成。
		seedsAluminium = new ItemAluminiumSeeds().setUnlocalizedName("seedsAluminium").setTextureName("seedsAluminium");
		GameRegistry.registerItem(seedsAluminium, "aluminium_seeds");
		// 小麦のインスタンス生成。
		wheatAluminium = new Item().setUnlocalizedName("wheatAluminium").setTextureName("wheatAluminium").setCreativeTab(CreativeTabs.tabMaterials);
		GameRegistry.registerItem(wheatAluminium, "aluminium_wheat");
	}
}
 

  • BlockAluminiumCrop.java
+ 長いので囲みます

  • ItemAluminiumSeeds.java
package tutorial.aluminiummod;
 
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemSeeds;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.EnumPlantType;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.util.ForgeDirection;
 
public class ItemAluminiumSeeds extends ItemSeeds implements IPlantable {
	private Block field_150925_a;
	// 土台となるブロックのインスタンス。使われていない。
	//	private Block soilBlockID;
 
	public ItemAluminiumSeeds() {
		super(AluminiumMod.cropAluminium, Blocks.farmland);
		// 以下はItemSeedsのコンストラクタ。
		this.field_150925_a = AluminiumMod.cropAluminium;
		//		this.soilBlockID = Blocks.farmland;
		//		this.setCreativeTab(CreativeTabs.tabMaterials);
	}
 
	/** アイテムを使用した時の処理。 */
	@Override
	public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
		if (side != 1) {
			return false;
		} else if (player.canPlayerEdit(x, y, z, side, itemStack) && player.canPlayerEdit(x, y + 1, z, side, itemStack)) {
			// 上からの使用で、プレイヤーが編集可能で、右クリックしたブロックが耕地であり、その上が空気の時。
			if (world.getBlock(x, y, z).canSustainPlant(world, x, y, z, ForgeDirection.UP, this) && world.isAirBlock(x, y + 1, z)) {
				// 作物を設置する。
				world.setBlock(x, y + 1, z, this.field_150925_a);
				// スタック数を減らす。
				--itemStack.stackSize;
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	}
 
	/** 作物の種別を返す。 */
	@Override
	public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) {
		// IPlantableの実装。作物。耕地の上に設置する。
		return EnumPlantType.Crop;
	}
 
	/** 作物ブロックのインスタンスを返す。 */
	@Override
	public Block getPlant(IBlockAccess world, int x, int y, int z) {
		// IPlantableの実装。
		return field_150925_a;
	}
 
	/** 作物のメタデータを返す。 */
	@Override
	public int getPlantMetadata(IBlockAccess world, int x, int y, int z) {
		// IPlantableの実装。
		return 0;
	}
}
 

解説

Block

Block setTickRandomly(boolean needsRandomTick)

trueにすると、updateTickがランダムなタイミングで呼ばれるようになる。

void setBlockBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ)

ブロックの大きさを設定する。
あたり判定やカーソルがあった時の枠の大きさに使われる。

Block disableStats()

統計にカウントされないようにする。(?)
正確な挙動を把握できていません。ご存知の方、ご教授いただければ幸いです。

boolean canPlaceBlockAt(World world, int x, int y, int z)

その座標に設置できるか。

void onNeighborBlockChange(World world, int x, int y, int z, Block block)

隣接ブロックが更新された時の処理。

void updateTick(World world, int x, int y, int z, Random random)

Tick更新時の処理。

boolean canBlockStay(World world, int x, int y, int z)

その座標で維持できるか。

AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)

あたり判定を返す。
BlockのデフォルトではsetBlockBoundsの設定が適用される。

boolean isOpaqueCube()

不透明なブロックか。

boolean renderAsNormalBlock()

通常と同様に描画するか。

int getRenderType()

描画の種別を返す。

void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float dropChance, int fortune)

ブロックをドロップさせる。

Item getItemDropped(int meta, Random random, int fortune)

ドロップアイテムを返す。

int quantityDropped(Random random)

ドロップ数を返す。

ArrayList<ItemStack> getDrops(World world, int x, int y, int z, int metadata, int fortune)

ドロップアイテムのリストを返す。

Item getItem(World world, int x, int y, int z)

対応するアイテムを返す。
Clientのみ。第三ボタンでのピックアップに使っている。

IIcon getIcon(int side, int meta)

ブロックのテクスチャを返す。

void registerBlockIcons(IIconRegister register)

ブロックのテクスチャを登録する。

BlockBush

植物系ブロックの親クラス。

boolean canPlaceBlockOn(Block block)

そのブロックの上に設置できるか。

void checkAndDropBlock(World world, int x, int y, int z)

設置状態を維持できるかを確認し、維持できなければドロップする。

BlockCrops

小麦のクラス。
人参やジャガイモの親クラスでもある。

float func_149864_n(World world, int x, int y, int z)

成長しやすさの数値を返す。
周囲の耕地、作物の状況を判定し、成長しやすさを算出する。
privateメソッドなので、隠蔽して実装しなおしている。

Item func_149866_i()

種のアイテムを返す。

Item func_149865_P()

作物のアイテムを返す。

void func_149863_m(World world, int x, int y, int z)

骨粉を使用した時の成長させる処理。

IPlantable

植物用のインターフェース。
下のブロックの判定などに使う。
ここでは、種と作物(ブロック)が実装している。

EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z)

作物の種別を返す。

Block getPlant(IBlockAccess world, int x, int y, int z)

作物ブロックのインスタンスを返す。

int getPlantMetadata(IBlockAccess world, int x, int y, int z)

作物のメタデータを返す。

IGrowable

骨粉を使用できるブロックのためのインターフェース。

boolean func_149851_a(World world, int x, int y, int z, boolean isRemote)

骨粉を使用できるか。

boolean func_149852_a(World world, Random random, int x, int y, int z)

骨粉を適用するか。

void func_149853_b(World world, Random random, int x, int y, int z)

骨粉を適用する。

使用例

オファレンMOD-[1.7.10]2.0.0で実装予定のオファレン草。
ただし、作物はオファレンの欠片で、成長段階数、成長判定、骨粉判定などは小麦と異なる予定。

コメント

この項目に関する質問などをどうぞ。
名前: