MOD製作チュートリアル > メタデータを持つブロックの追加

概要

メタデータを使用し、一つのIDで複数のブロックを追加したり、向きを持つブロックを追加したりする。

ソースコード

  • AluminiumMod.java
package tutorial.aluminiummod;
 
import net.minecraft.block.Block;
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;
 
@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 blockAluminiumColored;
 
	@EventHandler
	public void perInit(FMLPreInitializationEvent event) {
		//ここは通常のブロックと同様。
		blockAluminiumColored = new ColoredAluminiumBlock()
		.setBlockName("blockAluminiumColored")
		.setBlockTextureName("aluminiummod:colored_aluminium_block");
		GameRegistry.registerBlock(blockAluminiumColored, ItemColoredAluminiumBlock.class, "blockAluminiumColored");
	}
 
}
 

  • ColoredAluminiumBlock.java
package tutorial.aluminiummod;
 
import java.util.List;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
 
public class ColoredAluminiumBlock extends Block {
 
	private IIcon[] iicon = new IIcon[16];
 
	protected ColoredAluminiumBlock() {
		super(Material.rock);
		this.setCreativeTab(CreativeTabs.tabBlock);
		this.setHardness(5.0F);
		this.setResistance(10.0F);
		this.setStepSound(Block.soundTypeMetal);
		this.setHarvestLevel("pickaxe", 2);
		this.setLightLevel(0.0F);
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public void registerBlockIcons(IIconRegister register) {
		for (int i = 0; i < 16; i ++) {
			this.iicon[i] = register.registerIcon(this.getTextureName() + "-" + i);
		}
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public IIcon getIcon(int side, int meta) {
		return iicon[meta];
	}
 
	@Override
	@SideOnly(Side.CLIENT)
	public void getSubBlocks(Item item, CreativeTabs creativeTab, List list) {
		for (int i = 0; i < 16; i ++) {
			list.add(new ItemStack(item, 1, i));
		}
	}
 
	@Override
	public int damageDropped(int meta) {
		return meta;
	}
 
}
 

  • ItemColoredAluminiumBlock.java
package tutorial.aluminiummod;
 
import net.minecraft.block.Block;
import net.minecraft.item.ItemBlockWithMetadata;
import net.minecraft.item.ItemStack;
 
public class ItemColoredAluminiumBlock extends ItemBlockWithMetadata {
 
	public ItemColoredAluminiumBlock(Block block) {
		super(block, block);
	}
 
	@Override
	public String getUnlocalizedName(ItemStack itemStack) {
		return this.getUnlocalizedName() + "." + itemStack.getItemDamage();
	}
 
}
 

解説

GameRegistry

Block registerBlock(Block block, Class<? extends ItemBlock> itemclass, String name)

GameRegistryに追加ブロックを登録するメソッド。
対応するItemBlockを指定できる。
デフォルトではItemBlockを指定している。

Block

void registerBlockIcons(IIconRegister register)

ブロックのテクスチャを指定するメソッド。
Itemと同じ。

IIcon getIcon(int side, int meta)

描画時に呼ばれる。
第一引数では面を、第二引数ではメタデータを取得できる。
このメソッドを使えば面によって違うテクスチャを返したり、かまどのように向きを変えたりできる。
第一引数については下の「sideについて」で。

void getSubBlocks(Item item, CreativeTabs creativeTab, List list)

クリエイティブタブに登録するメソッド。
Itemと同じ。

int damageDropped(int meta)

ドロップアイテムのダメージを指定するメソッド。
Blockでは常に0を返しているのでオーバーライドする。

ItemBlockWithMetadata

ItemBlockのサブクラスで、メタデータを使用するブロック用のクラス。

コンストラクタ(Block block, Block localBlock)

第一引数はスーパークラスのコンストラクタに渡し、第二引数はこのクラスで保持する。

String getUnlocalizedName(ItemStack itemStack)

アイテムと同じ。

sideについて

getIconの第一引数などのintは、面の方角を表している。
向きと座標の関係は、net.minecraft.util.FacingのoffsetsXForSide/offsetsYForSide/offsetsZForSideを使えばわかる
side 向き 座標
0 y-
1 y+
2 z-
3 z+
4 西 x-
5 x+

使用例

オファレンブロックを追加している部分。
+ オファレンMOD

コメント

この項目に関する質問などをどうぞ。
  • かまどみたいに置く向きによって変わるのってどうして作るんですか? - 名無しさん 2015-10-12 21:07:02
    • onBlockPlacedByをオーバーライドし、置いたプレイヤーの向きによって、メタデータを設定します。
      バニラのBlockFurnaceや、オファレンMODのBlockSmeltingMachineなどが参考になるかと思います。 - 赤砂蛇凪浜 2015-10-13 08:36:08
  • メタデータによって上面のテクスチャだけを変えるにはどうすればいいですか? - 名無しさん 2016-06-10 23:03:47
    • IIconをあらかじめ用意しておき、getIconでsideとmetadataの判定をして返すIIconをかえればよいです。 - 赤砂蛇凪浜 2016-06-11 06:52:52
  • Optifineのように隣り合ったガラスの縁を消すのにはメタデータの違うブロックを置き換えればよいですか? - 名無しさん 2016-06-12 00:31:06
    • BFOのフチなしガラスでは、getIcon(IBlockAccess,int,int,int,int)で判定を行い、IIconを返しています。メタデータを使う必要はありません。 - 赤砂蛇凪浜 2016-06-12 06:59:29
  • 通常のブロック追加では一つ画像のみでいくらブロックをおいても同じ柄ですが、8×8の64枚の画像をrepeatの形で適応させるにはどう作れば良いのですか?? - 名無しさん 2016-06-14 17:45:47
    • 返答遅くなりまして申し訳ありません。
      アニメーションさせたい場合は、まず、アニメーションさせたいブロックのテクスチャを、アニメーション順に縦に並べてください。
      次に、ブロックのテクスチャと同じ階層に[ブロック名].png.mcmeta というファイルを作って、以下のように記述してください。
      {
      "animation": {
      "frametime": 2
      }
      }
      アニメーションの速度が速ければ、"frametime"の数値を上げてください。
      バニラのリソースでは、火や溶岩が参考になるかと思います。- Tom Kate 2016-06-25 11:36:47
  • メタ付の半ブロックを追加するにはどうすればいいのでしょうか? - 名無しさん 2017-04-20 19:50:42
    • 返信が遅くなってしまい申し訳ありません。
      コメントを別のページから移動させて頂きました。ご了承ください。
      単純なものであれば、BlockStoneSlabやBlockWoodSlabをコピペし、各メソッド内でインスタンスの呼び出しをしている部分を置き換えればよいです。
      ただし、BlockSlabの一部メソッドやItemなど他のクラスでもインスタンスを呼び出しているので、それらも考慮する必要があると思われます。
      今後、ハーフブロックの追加に関するチュートリアルを作成する予定です。
名前: