« Minecraft MOD開発 12 | トップページ | 大円小円ジェネレータ Ver. 1.0 »

2014年3月23日 (日)

Minecraft MOD開発 13

ゲーム終了時にTileEntityの内容が保存されない問題について。MOD初期化時にGameRegistry.registerTileEntityを呼ぶ必要があった。また前回のコードにデバッグコードを埋め込んだ。

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(x, y, z);
  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.Mod.Instance;
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", "カウンタ ブロック");
  GameRegistry.registerTileEntity(TileEntityCounter.class, "TileEntityCounter"); 
 }
 
 @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
{
 public int x, y, z;
 public int count;
 
 public TileEntityCounter()
 {
  super();
 }
 
 @Override
 public void readFromNBT(NBTTagCompound par1nbtTagCompound)
 {
  count = par1nbtTagCompound.getInteger("count");
  super.readFromNBT(par1nbtTagCompound);
  System.out.printf( "readFromNBT ( %d, %d, %d) count=%d\n", x, y, z, count);
 }
 
 @Override
 public void writeToNBT(NBTTagCompound par1nbtTagCompound)
 {
  par1nbtTagCompound.setInteger("count", count);
  super.writeToNBT(par1nbtTagCompound);
  System.out.printf( "writeToNbt ( %d, %d, %d) count=%d\n", x, y, z, count);
 }
 
 public int getCount()
 {
  return count;
 }
 
 public void incrementCount( int _x, int _y, int _z)
 {
  x = _x;
  y = _y;
  z = _z;
  count++;
  System.out.printf( "incrementCount ( %d, %d, %d) count=%d\n", x, y, z, count); 
  this.onInventoryChanged();
 }
 
}

実行結果を見るとwriteToNbtが呼ばれたときのインスタンスの内容が全く正しくない。シングルプレイでも中身はマルチプレイと同じになったから、パケットハンドラーを使って同期を取る必要があるとか、そういう話?

2014-03-23 19:40:47 [情報] [STDOUT] incrementCount ( 142, 64, 244) count=5
2014-03-23 19:40:47 [情報] [Minecraft-Client] [CHAT] 4
2014-03-23 19:40:47 [情報] [STDOUT] incrementCount ( 142, 64, 244) count=6
2014-03-23 19:40:47 [情報] [Minecraft-Client] [CHAT] 5
2014-03-23 19:40:47 [情報] [STDOUT] incrementCount ( 142, 64, 244) count=7
2014-03-23 19:40:47 [情報] [Minecraft-Client] [CHAT] 6
2014-03-23 19:40:47 [情報] [STDOUT] incrementCount ( 142, 64, 244) count=8
2014-03-23 19:40:47 [情報] [Minecraft-Client] [CHAT] 7
2014-03-23 19:40:48 [情報] [Minecraft-Server] Saving and pausing game...
2014-03-23 19:40:48 [情報] [Minecraft-Server] Saving chunks for level 'New World'/Overworld
2014-03-23 19:40:48 [情報] [STDOUT] writeToNbt ( 0, 0, 0) count=0
2014-03-23 19:40:48 [情報] [Minecraft-Server] Saving chunks for level 'New World'/Nether
2014-03-23 19:40:48 [情報] [Minecraft-Server] Saving chunks for level 'New World'/The End

« Minecraft MOD開発 12 | トップページ | 大円小円ジェネレータ Ver. 1.0 »

コメント

コメントを書く

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

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

トラックバック

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

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

« Minecraft MOD開発 12 | トップページ | 大円小円ジェネレータ Ver. 1.0 »