提供: Minecraft Modding Wiki
FirstSpring (トーク | 投稿記録) (ページ作成) |
(ソースコードの一部を修正) |
||
(他の1人の利用者による、間の1版が非表示) | |||
10行目: | 10行目: | ||
import java.util.List; | import java.util.List; | ||
− | public class ItemTNTRemote extends Item { | + | public class ItemTNTRemote extends Item |
+ | { | ||
public int posx,posy,posz; | public int posx,posy,posz; | ||
− | ItemHoge(int id){ | + | public ItemHoge(int id) |
+ | { | ||
super(id); | super(id); | ||
//スタック不可能にする。 | //スタック不可能にする。 | ||
23行目: | 25行目: | ||
//1.3.xのみメソッド名がtryPlaceIntoWorldなので注意 | //1.3.xのみメソッド名がtryPlaceIntoWorldなので注意 | ||
@Override | @Override | ||
− | public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int side){ | + | public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int side) |
− | if(!world.isRemote){ | + | { |
+ | if(!world.isRemote) | ||
+ | { | ||
//NBTタグを取得します。 | //NBTタグを取得します。 | ||
NBTTagCompound nbt = itemstack.getTagCompound(); | NBTTagCompound nbt = itemstack.getTagCompound(); | ||
− | if(nbt == null){ | + | if(nbt == null) |
+ | { | ||
nbt = new NBTTagCompound(); | nbt = new NBTTagCompound(); | ||
itemstack.setTagCompound(nbt); | itemstack.setTagCompound(nbt); | ||
} | } | ||
//対象ブロックがTNTの場合は位置を記録し、それ以外の場合は着火処理を行う。 | //対象ブロックがTNTの場合は位置を記録し、それ以外の場合は着火処理を行う。 | ||
− | if(world.getBlockId(x, y, z) == Block.tnt.blockID){ | + | if(world.getBlockId(x, y, z) == Block.tnt.blockID) |
+ | { | ||
nbt.setInteger("PosX", x); | nbt.setInteger("PosX", x); | ||
nbt.setInteger("PosY", y); | nbt.setInteger("PosY", y); | ||
nbt.setInteger("PosZ", z); | nbt.setInteger("PosZ", z); | ||
− | }else{ | + | } |
+ | else | ||
+ | { | ||
onItemRightClick(itemstack, world, entityplayer); | onItemRightClick(itemstack, world, entityplayer); | ||
} | } | ||
45行目: | 53行目: | ||
//空中を右クリックした場合に呼ばれます。 | //空中を右クリックした場合に呼ばれます。 | ||
@Override | @Override | ||
− | public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer){ | + | public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) |
− | if(!world.isRemote){ | + | { |
+ | if(!world.isRemote) | ||
+ | { | ||
NBTTagCompound nbt = itemstack.getTagCompound(); | NBTTagCompound nbt = itemstack.getTagCompound(); | ||
if(nbt == null) | if(nbt == null) | ||
53行目: | 63行目: | ||
posy = nbt.getInteger("PosY"); | posy = nbt.getInteger("PosY"); | ||
posz = nbt.getInteger("PosZ"); | posz = nbt.getInteger("PosZ"); | ||
− | if(world.getBlockId(posx, posy, posz) == Block.tnt.blockID){ | + | if(world.getBlockId(posx, posy, posz) == Block.tnt.blockID) |
+ | { | ||
Block.tnt.onBlockDestroyedByPlayer(world, posx, posy, posz, 1); | Block.tnt.onBlockDestroyedByPlayer(world, posx, posy, posz, 1); | ||
world.setBlockWithNotify(posx, posy, posz, 0); | world.setBlockWithNotify(posx, posy, posz, 0); | ||
64行目: | 75行目: | ||
@Override | @Override | ||
public void addInformation(ItemStack itemstack, List list) | public void addInformation(ItemStack itemstack, List list) | ||
− | + | { | |
NBTTagCompound nbt = itemstack.getTagCompound(); | NBTTagCompound nbt = itemstack.getTagCompound(); | ||
if(nbt == null) | if(nbt == null) | ||
73行目: | 84行目: | ||
posz = nbt.getInteger("PosZ"); | posz = nbt.getInteger("PosZ"); | ||
list.add("[" + posx + "," + posy + "," + posz + "]"); | list.add("[" + posx + "," + posy + "," + posz + "]"); | ||
− | + | } | |
} | } | ||
82行目: | 93行目: | ||
<source lang="java"> | <source lang="java"> | ||
NBTTagCompound nbt = itemstack.getTagCompound(); | NBTTagCompound nbt = itemstack.getTagCompound(); | ||
− | if(nbt == null){ | + | if(nbt == null) |
+ | { | ||
nbt = new NBTTagCompound(); | nbt = new NBTTagCompound(); | ||
itemstack.setTagCompound(nbt); | itemstack.setTagCompound(nbt); | ||
91行目: | 103行目: | ||
**なのでnullが返ってきた場合は、新しくNBTタグを作成し、アイテムに登録します。 | **なのでnullが返ってきた場合は、新しくNBTタグを作成し、アイテムに登録します。 | ||
<source lang="java"> | <source lang="java"> | ||
− | if(world.getBlockId(x, y, z) == Block.tnt.blockID){ | + | if(world.getBlockId(x, y, z) == Block.tnt.blockID) |
+ | { | ||
nbt.setInteger("PosX", x); | nbt.setInteger("PosX", x); | ||
nbt.setInteger("PosY", y); | nbt.setInteger("PosY", y); | ||
nbt.setInteger("PosZ", z); | nbt.setInteger("PosZ", z); | ||
− | }else{ | + | } |
+ | else | ||
+ | { | ||
onItemRightClick(itemstack, world, entityplayer); | onItemRightClick(itemstack, world, entityplayer); | ||
} | } | ||
102行目: | 117行目: | ||
===onItemRightClick=== | ===onItemRightClick=== | ||
<source lang="java"> | <source lang="java"> | ||
− | |||
NBTTagCompound nbt = itemstack.getTagCompound(); | NBTTagCompound nbt = itemstack.getTagCompound(); | ||
if(nbt == null) | if(nbt == null) | ||
224行目: | 238行目: | ||
</tr> | </tr> | ||
</table> | </table> | ||
+ | *<b style="color:red;">NBTタグの変数の型を後から変更するとエラーが発生し、最悪の場合ワールドデータが破損します。十分注意して下さい。</b> |
2013年7月13日 (土) 14:44時点における最新版
この記事は"ModLoader"を前提MODとしています。 |
ItemStack(アイテムを管理している部分)にエンチャント等の情報を保存するためにNBTを使用するメソッドがあります。
今回はそれを使用してTNTを遠隔で着火するアイテムを追加します。
なお、MOD部のソースコードは省略しています。
目次
ソースコード[編集]
package net.minecraft.src; import java.util.List; public class ItemTNTRemote extends Item { public int posx,posy,posz; public ItemHoge(int id) { super(id); //スタック不可能にする。 maxStackSize = 1; } //ブロックを右クリックした時に呼ばれます。 //1.3.x以降で使用する場合は引数を(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int side, float p, float q, float r)に変えて下さい。 //1.3.xのみメソッド名がtryPlaceIntoWorldなので注意 @Override public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int side) { if(!world.isRemote) { //NBTタグを取得します。 NBTTagCompound nbt = itemstack.getTagCompound(); if(nbt == null) { nbt = new NBTTagCompound(); itemstack.setTagCompound(nbt); } //対象ブロックがTNTの場合は位置を記録し、それ以外の場合は着火処理を行う。 if(world.getBlockId(x, y, z) == Block.tnt.blockID) { nbt.setInteger("PosX", x); nbt.setInteger("PosY", y); nbt.setInteger("PosZ", z); } else { onItemRightClick(itemstack, world, entityplayer); } } return true; } //空中を右クリックした場合に呼ばれます。 @Override public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer) { if(!world.isRemote) { NBTTagCompound nbt = itemstack.getTagCompound(); if(nbt == null) return itemstack; posx = nbt.getInteger("PosX"); posy = nbt.getInteger("PosY"); posz = nbt.getInteger("PosZ"); if(world.getBlockId(posx, posy, posz) == Block.tnt.blockID) { Block.tnt.onBlockDestroyedByPlayer(world, posx, posy, posz, 1); world.setBlockWithNotify(posx, posy, posz, 0); } } return itemstack; } //アイテム名の表示の下に記録された位置を表示させます。 @Override public void addInformation(ItemStack itemstack, List list) { NBTTagCompound nbt = itemstack.getTagCompound(); if(nbt == null) return; int posx,posy,posz; posx = nbt.getInteger("PosX"); posy = nbt.getInteger("PosY"); posz = nbt.getInteger("PosZ"); list.add("[" + posx + "," + posy + "," + posz + "]"); } }
ソースの解説[編集]
onItemUse[編集]
NBTTagCompound nbt = itemstack.getTagCompound(); if(nbt == null) { nbt = new NBTTagCompound(); itemstack.setTagCompound(nbt); }
- ここでアイテムからNBTタグを取得します。
- getTagCompoundはアイテムにNBTタグが存在しない場合nullを返すようになっており、そのままではNullPointerExceptionが発生します。
- なのでnullが返ってきた場合は、新しくNBTタグを作成し、アイテムに登録します。
if(world.getBlockId(x, y, z) == Block.tnt.blockID) { nbt.setInteger("PosX", x); nbt.setInteger("PosY", y); nbt.setInteger("PosZ", z); } else { onItemRightClick(itemstack, world, entityplayer); }
- ここでは右クリックしたブロックがTNTの場合NBTに座標情報を記録し、そうでない場合は、onItemRightClickを呼び出しています。
onItemRightClick[編集]
NBTTagCompound nbt = itemstack.getTagCompound(); if(nbt == null) return itemstack; posx = nbt.getInteger("PosX"); posy = nbt.getInteger("PosY"); posz = nbt.getInteger("PosZ"); if(world.getBlockId(posx, posy, posz) == Block.tnt.blockID){ Block.tnt.onBlockDestroyedByPlayer(world, posx, posy, posz, 1); world.setBlockWithNotify(posx, posy, posz, 0); }
- ここでは、NBTタグから座標情報を読み出し、その位置にTNTが存在すればTNTの着火処理メソッドを呼び出します。
addInformation[編集]
NBTTagCompound nbt = itemstack.getTagCompound(); if(nbt == null) return; int posx,posy,posz; posx = nbt.getInteger("PosX"); posy = nbt.getInteger("PosY"); posz = nbt.getInteger("PosZ"); list.add("[" + posx + "," + posy + "," + posz + "]");
- ここでは、NBTタグから座標情報を読み出し、表示情報リストに追加しています。
メソッド解説[編集]
- ItemやItemStack内には大量にメソッドがあるので今回は、直接関係のあるメソッドだけ紹介します。
Item[編集]
メソッド名 | 説明 |
---|---|
boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int i, int j, int k, int l) | ブロックを右クリックした時に呼ばれる |
ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) | (onItemUseがfalseを返している時に)何も起きないブロックを右クリックした時やブロックにカーソルが合わさっていない場合に右クリックした時呼ばれる。 |
void addInformation(ItemStack itemstack, List list) | アイテムの表示に独自情報(例:エンチャント)を追加するときに使う |
ItemStack[編集]
メソッド名 | 説明 |
---|---|
NBTTagCompound getTagCompound() | アイテムのNBTタグを取得する |
void setTagCompound(NBTTagCompound par1NBTTagCompound) | アイテムにNBTタグを登録する |
List getItemNameandInformation() | アイテムにカーソルを合わせた時に表示される情報のリストを取得する。 先述したaddInformationはここから呼ばれている |
NBTTagCompound[編集]
メソッド名 | 説明 |
---|---|
void setByte(String par1Str, byte par2) | Byte型の変数を記録する。 |
void setShort(String par1Str, short par2) | Short型の変数を記録する。 |
void setInteger(String par1Str, int par2) | Integer型の変数を記録する。 |
void setLong(String par1Str, long par2) | Long型の変数を記録する。 |
void setFloat(String par1Str, float par2) | Float型の変数を記録する。 |
void setDouble(String par1Str, double par2) | Double型の変数を記録する。 |
void setString(String par1Str, String par2Str) | String型の変数を記録する。 |
void setByteArray(String par1Str, byte par2ArrayOfByte[]) | Byte型の配列を記録する。 |
void setIntArray(String par1Str, int par2ArrayOfInteger[]) | Int型の配列を記録する。 |
void setBoolean(String par1Str, boolean par2) | Boolean型の変数を記録する。 |
byte getByte(String par1Str) | Byte型の変数を取得する。 |
short getShort(String par1Str) | Short型の変数を取得する。 |
int getInteger(String par1Str) | Integer型の変数を取得する。 |
long getLong(String par1Str) | Long型の変数を取得する。 |
float getFloat(String par1Str) | Float型の変数を取得する。 |
double getDouble(String par1Str) | Double型の変数を取得する。 |
String getString(String par1Str) | String型の変数を取得する。 |
byte[] getByteArray(String par1Str) | Byte型の配列を取得する。 |
int[] getIntArray(String par1Str) | Integer型の配列を取得する。 |
boolean getBoolean(String par1Str) | Boolean型の変数を取得する。 |
- NBTタグの変数の型を後から変更するとエラーが発生し、最悪の場合ワールドデータが破損します。十分注意して下さい。