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

概要

新しく苗木・原木・葉を追加し、苗木が育ったら木が生成されるようにする。
今回は一つのIDで一種類の木しか追加していないが、バニラの木のようにメタデータを利用して何種類かの木を追加することも可能。
※5/22更新
葉のテクスチャの指定ができていなかったため、追記・修正しました。
テクスチャは、sapling_aluminium,log_aluminium_top,log_aluminium_side,leaves_aluminium,leaves_aluminium_opaqueでそれぞれ指定できます。

ソースコード

  • 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.minecraftforge.oredict.OreDictionary;
 
@Mod(modid = AluminiumMod.MODID, name = AluminiumMod.MODNAME, version = AluminiumMod.VERSION)
public class AluminiumMod {
 
	public static final String MODID = "AluminiumMod";
	public static final String MODNAME = "Aluminium Mod";
	public static final String VERSION = "1.0.0";
 
	public static Block saplingAluminium;
	public static Block logAluminium;
	public static Block leavesAluminium;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		saplingAluminium = new BlockAluminiumSapling()
				.setBlockName("saplingAluminium")
				.setBlockTextureName("aluminiummod:sapling_aluminium");
		GameRegistry.registerBlock(saplingAluminium, "saplingAluminium");
		OreDictionary.registerOre("saplingAluminium", saplingAluminium);
 
		logAluminium = new BlockAluminiumLog()
				.setBlockName("logAluminium")
				.setBlockTextureName("aluminiummod:log_aluminium");
		GameRegistry.registerBlock(logAluminium, "logAluminium");
		OreDictionary.registerOre("logAluminium", logAluminium);
 
		leavesAluminium = new BlockAluminiumLeaves()
				.setBlockName("leavesAluminium")
				.setBlockTextureName("aluminiummod:leaves_aluminium");
		GameRegistry.registerBlock(leavesAluminium, ItemAluminiumLeaves.class, "leavesAluminium");
		OreDictionary.registerOre("leavesAluminium", leavesAluminium);
	}
 
}
 

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

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

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

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

  • ItemAluminiumLeaves.java
package tutorial.aluminiummod;
 
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLeaves;
import net.minecraft.item.ItemLeaves;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
 
public class ItemAluminiumLeaves extends ItemLeaves {
 
	protected final Block leaves;
 
	public ItemAluminiumLeaves(Block block) {
		super((BlockLeaves) block);
		this.leaves = block;
		this.setMaxDamage(0);
		this.setHasSubtypes(true);
	}
 
	@Override
	public int getMetadata(int meta) {
		// 設置時は二進数三桁目が1になる。
		return meta | 4;
	}
 
	@Override
	public String getUnlocalizedName(ItemStack itemStack) {
		return leaves.getUnlocalizedName();
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public IIcon getIconFromDamage(int meta) {
		return leaves.getIcon(0, meta);
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public int getColorFromItemStack(ItemStack itemStack, int pass) {
		return leaves.getRenderColor(itemStack.getItemDamage());
	}
 
}
 

解説

Block

+ 長いので囲みます

BlockBush

boolean canPlaceBlockOn(Block block)

引数のブロックの上に設置が可能かどうか。

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

設置されている状況が保てるかどうか判定し、保てないならドロップさせる。

BlockSapling

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

苗木を成長させる処理。

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

木を生成する処理。

boolean func_149880_a(World world, int x, int y, int z, int type)

引数の座標のブロックが同じ種類の苗木かどうか。
ダークオーク・松などの生成に使っている。

EnumPlantType

植物の植え方を表すenum。

Plains

苗木や草、花など。
草・土・耕された土に植えられる。

ForgeDirection

方向を表すenum。

UP

上方向。

AxisAlignedBB

ブロックの当たり判定などを保持するクラス。

TerrainGen

生成に関するEventを呼び出すクラス。

saplingGrowTree

SaplingGrowTreeEventを呼び出す。

IPlantable

植物のインターフェース。

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

植物の植え方によってenumを返す。

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

引数の座標にある植物を返す。
基本的にはthisでよい。

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)

成長させる処理。

BlockRotatedPillar

IIcon getSideIcon(int meta)

横の面のアイコンを返す。

IIcon getTopIcon(int meta)

上下面のアイコンを返す。

ColorizerFoliage

葉や草などの色を扱うクラス。

int getFoliageColor(double temperature, double humidity)

気温・湿度から色を生成して返す。

int getFoliageColorBasic()

基本の色を返す。
4764952(0x48A518, RGB:(72,181,24))。

BlockLeaves

void func_150124_c(World world, int x, int y, int z, int meta, int chance)

リンゴのドロップに使うメソッド。

int func_150123_b(int meta)

苗木のドロップ確率を返す。

void setGraphicsLevel(boolean isFancy)

描画優先/処理優先の設定を反映する。

String[] func_150125_e()

木の種類名の配列を返す。

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

引数の座標にあるブロックをドロップして破壊する。
privateなのでBlockAluminiumLeavesでは新しく実装していることになる。

IShearable

ハサミで回収できるブロックのインターフェース。

boolean isShearable(ItemStack item, IBlockAccess world, int x, int y, int z)

ハサミで回収できるかどうかを返す。

ArrayList<ItemStack> onSheared(ItemStack item, IBlockAccess world, int x, int y, int z, int fortune)

ハサミで回収された時の処理。
ハサミで回収した時のドロップアイテムのリストを返す。

使用例

星の樹MODは木のカスタマイズ機能の影響で非常にわかりにくくなっているため、使用例は載せません。
Beta 1.0.0以前のコードは参考になるかもしれません。

コメント

この項目に関する質問などをどうぞ。
  • 左のメニューでTileEntityの追加を押すとこのページに来てしまいます。 - 名無しさん 2016-01-09 22:38:31
    • 申し訳ありません。訂正いたしました。 - Tom Kate 2016-01-10 08:41:18
  • 1.7.10で丸ごとコピーしてみたのですが、preInitのLeavesのところで落ちてしまいます。 - 名無しさん 2016-04-30 05:28:57
    • ご報告ありがとうございます。修正しました。 - 赤砂蛇凪浜 2016-04-30 16:13:34
  • 葉のテクスチャは新しい文で指定する必要があるのでしょうか - 名無しさん 2016-05-20 16:43:05
    • テクスチャの指定に関する部分はいくつかあるため、どこについてなのかもう少し詳しくお願いします。 - 赤砂蛇凪浜 2016-05-20 17:28:58
      • 葉のブロックのテクスチャ(描画設定で切り替わったり)です。例えばここのコードを丸ごと持ってきた場合、画像ファイルの名前や位置次第でテクスチャは表示されうるのでしょうか。すみません枝間違えました - ポン酢 2016-05-20 20:44:34
        • 入力ミスのようですので、コメントは片方削除させていただきます。
          チュートリアルに不備があり、葉のテクスチャの指定がうまくできていなかったので修正しました。
          AluminiumMod.javaおよびBlockAluminiumLeaves.javaに変更がありますのでご確認ください。
          ご迷惑をおかけして申し訳ありませんでした。解説がわかりにくければ、またご質問いただけるとありがたいです。 - 赤砂蛇凪浜 2016-05-22 13:42:04
  • 同じIDでいくつかの原木ブロックを追加するには、どのようにすれば良いのでしょうか。 - 名無しさん 2016-06-17 23:31:47
    • 「メタデータを持つブロックの追加」に記載している方法で、getSubBlocksなどをオーバーライドしてテクスチャの指定を少し変更すればできます。
      ただし、原木の場合は向きをメタデータで記録しているので、一つのIDで追加できるのは4種類までです。
      バニラのコードや、(カスタム機能の影響で少しわかりにくくなっていますが)星の樹MODのソースコードも見てみてください。
      返信が遅くなってしまい、申し訳ありません。 - 赤砂蛇凪浜 2016-06-25 10:48:37
  • ありがとうございます! - 名無しさん 2016-06-25 21:53:03
    • 返信するとこ間違えました... - 名無しさん 2016-06-25 21:53:43
  • このソースコードは1.10でも使用することができますか? - 名無しさん 2016-10-06 00:48:58
    • こちらのチュートリアルは記載の通り1.7.10版のものです。1.8以降は大きくコーディングが変更されておりますので使うことはできません。 - Tom Kate 2016-10-06 23:07:20
名前: