« クラス変数とインスタンス変数 | トップページ | Minecraft MOD開発 12 »

2014年3月21日 (金)

Minecraft MOD開発 11

ソースを読むのが大変なのでEclipseをインストールした。calleeからcallerを探すには、ソースコードの構造を解析してくれるツールが必要だ。Eclipseを使うときはテクスチャを\forge\mcp\src\minecraft\assetsへ置く。

日本語のMinecraft Modding Wikiチュートリアルも、Minecraft Forge Wikiチュートリアルも、GUIとかインベントリが出てくるから一気に理解するのは難しいな。

class Blockとワールドに設置されたブロックは厳密に区別する必要がある。Minecraftは基本的に同じブロックIDを持つものに対しては同じ動作をするよう設計されている。

今回はブロックごとに固有の情報を記録することを目的にする。GUIやインベントリは使いたくないので、右クリック(Block.onBlockActivated)で内部変数をインクリメントしてログに出力することにする。

簡単なデバッグ用にチャットログへメッセージを出力する方法を調べた。チュートリアルではModLoader.getMinecraftInstance()でマインクラフトのインスタンスを取得し、minecraft.ingameGUI.addChatMessage("表示したいテキスト")するように書いてある。しかし、ModLoaderは@Deprecatedされている。英語フォーラムでは、denoflionsさんがGateCopyのItemGateCopier.javaを参考にせよと言っている。これはプロキシを使うので難しそうだ。Block.onBlockActivatedでは第5引数でEntityPlayerを取れるので、EntityPlayer.sendChatToPlayerを使うことにする。

これはダメな実装例。ワールドに複数のCounter Blockを設置すると、どれをクリックしてもカウンタがインクリメントする。counterはclass BlockCounterに1つだけしか存在しないので、ワールドに設置されたブロックごとに別の値を保存できない。さらにゲームを終了するときにカウンタの値が保存されない。

BlockCounter.java

package nishina;
 
import net.minecraft.block.Block;
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.util.ChatMessageComponent;
 
public class BlockCounter extends Block
{
 private int counter;
 
 public BlockCounter(int id, Material material)
 {
  super(id, material);
  this.setCreativeTab( CreativeTabs.tabBlock);
  this.setUnlocalizedName("Counter Block");
  this.setTextureName("nishina:pink_block");
  
  counter = 0;
 }
 
 @Override
 public boolean onBlockActivated(World par1World, int par2, int par3,
   int par4, EntityPlayer par5EntityPlayer, int par6, float par7,
   float par8, float par9) {
  counter++;
  par5EntityPlayer.sendChatToPlayer(new ChatMessageComponent().createFromText( new Integer(counter).toString()));
  return super.onBlockActivated(par1World, par2, par3, par4, par5EntityPlayer,
    par6, par7, par8, par9);
 }
}

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");
 }
}

« クラス変数とインスタンス変数 | トップページ | Minecraft MOD開発 12 »

コメント

コメントを書く

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

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

トラックバック

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

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

« クラス変数とインスタンス変数 | トップページ | Minecraft MOD開発 12 »