« Minecraft MOD開発 11 | トップページ | Minecraft MOD開発 13 »

2014年3月22日 (土)

Minecraft MOD開発 12

独自情報を保持するためのクラスはTileEntityを継承して作る。ブロックはclass Blockではなく、class BlockContainerを継承する。

バニラの音符ブロックがシンプルで読みやすいので見てみよう。class BlockNoteはclass BlockContainerを継承する。間接的にITileEntityProviderを実装しているので、createNewTileEntityメソッドを持たなければならない。ここで音符ブロック用のTileEntityNoteを返す。

class TileEntityを継承するclass TileEntityNoteは、byte型の変数noteを持つ。これがブロックごとに保持される音程情報になる。writeToNBTが呼ばれたときはnoteを保存し、readFromNBTが呼ばれたときはnoteを読み出す。

音符ブロックがクリックされたときはBlockNote.onBlockClikedが呼ばれる。第1引数にWorld、第2~4引数にx, y, zの座標が入っているので、getBlockTileEntityで対応するTileEntityNoteを取得する。TileEntityNote.triggerNoteを呼び、保持しているnoteに基づいて音を鳴らす。

クラス図を描くにはUMLmemoを使ったけど、さくさく描けて使いやすいな。

BlockCounter.java

package nishina;
 
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChatMessageComponent;
 
public class BlockCounter extends BlockContainer
{
 
 public BlockCounter(int id, Material material)
 {
  super(id, material);
  this.setCreativeTab(CreativeTabs.tabBlock);
  this.setUnlocalizedName("Counter Block");
  this.setTextureName("nishina:pink_block");
}
 
 @Override
 public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer entityPlayer, int side, float hitX, float hitY, float hitZ)
 {
  TileEntityCounter tileentitycounter = (TileEntityCounter)world.getBlockTileEntity(x, y, z);
  int counter = tileentitycounter.getCount();
  tileentitycounter.incrementCount();
  entityPlayer.sendChatToPlayer(new ChatMessageComponent().createFromText(new Integer(counter).toString()));
  return super.onBlockActivated(world, x, y, z, entityPlayer, side, hitX, hitY, hitZ);
 }
 
 @Override
 public TileEntity createNewTileEntity(World world)
 {
  return new TileEntityCounter();
 }
 
}

BlockCounterCore.java

package nishina;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
 
@Mod(modid = "CounterBlockMod", name = "CounterMod", version = "1.0")
public class BlockCounterCore
{
 public static Block block;
 public static int blockID = 3500;
 
 @EventHandler
 public void init(FMLInitializationEvent event)
 {
  // 表示名の登録
  LanguageRegistry.addName(block, "Counter Block");
  LanguageRegistry.instance().addNameForObject(block, "ja_JP", "カウンタ ブロック");
 }
 
 @EventHandler
 public void preInit(FMLPreInitializationEvent event)
 {
  // ブロックの登録
  block = new BlockCounter(blockID, Material.rock);
  GameRegistry.registerBlock(block, "blockCounter");
 }
}

TileEntityCounter.java

package nishina;
 
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
 
public class TileEntityCounter extends TileEntity
{
 private int count;
 
 public TileEntityCounter()
 {
  super();
  count = 0;
 }
 
 @Override
 public void readFromNBT(NBTTagCompound par1nbtTagCompound)
 {
  super.readFromNBT(par1nbtTagCompound);
  par1nbtTagCompound.setInteger("count", count);
 }
 
 @Override
 public void writeToNBT(NBTTagCompound par1nbtTagCompound)
 {
  super.writeToNBT(par1nbtTagCompound);
  count = par1nbtTagCompound.getInteger("count");
 }
 
 public int getCount()
 {
  return count;
 }
 
 public void incrementCount()
 {
  count++;
  this.onInventoryChanged();
 }
 
}

ブロックを右クリックすると、カウンタをインクリメントしながら内容を表示する。ブロックごとに個別のカウンタを保持できる。しかし、ゲームを再起動するとカウンタが全てリセットされてしまう。

« Minecraft MOD開発 11 | トップページ | Minecraft MOD開発 13 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1499066/55477075

この記事へのトラックバック一覧です: Minecraft MOD開発 12:

« Minecraft MOD開発 11 | トップページ | Minecraft MOD開発 13 »