細 (誤字修正) |
ModderKina (トーク | 投稿記録) (いろいろ。好みが分かれるかも?) |
||
(同じ利用者による、間の1版が非表示) | |||
3行目: | 3行目: | ||
「NBT」を利用したデータ管理システムについての概論。 | 「NBT」を利用したデータ管理システムについての概論。 | ||
==NBTとは== | ==NBTとは== | ||
− | NBTとはMinecraftで利用されているデータの管理システム、あるいは保存書式のようなものである。 | + | NBTとはMinecraftで利用されているデータの管理システム、あるいは保存書式のようなものである。<br> |
− | + | ゲームを終了した際に記録されるデータのほとんどすべてがNBT形式で(datファイルに)保存されている。 | |
(例外としてはプレイヤーの実績・統計、Forge式Config等) | (例外としてはプレイヤーの実績・統計、Forge式Config等) | ||
− | + | 「NBTBase」クラスを基として様々な継承クラスがあるが、バニラ含め多くの場合「NBTTagCompound」クラスで管理されている。 | |
− | + | 状況によっては、「NBTTagList」クラスで管理される場合もある。(Enchantmentなど) | |
− | == | + | ==書式と扱える型== |
− | + | NBTTagCompoundへのデータの読み書きはGetter,Setterを介して行う。(コピペしても動かないので注意) | |
<source lang = "java"> | <source lang = "java"> | ||
NBTTagCompound nbt; | NBTTagCompound nbt; | ||
//読み込み | //読み込み | ||
− | nbt. | + | nbt.getXxx("<データのキー>"); |
//書き込み | //書き込み | ||
− | nbt. | + | nbt.setXxx("<データのキー>", <データ>); |
</source> | </source> | ||
− | + | また、NBTTagCompoundの扱える型は以下の通りである。<br /> | |
byte, short, int, long, float, double, byte配列, 文字列, NBTBaseのリスト, NBTTagCompound, int配列<br /> | byte, short, int, long, float, double, byte配列, 文字列, NBTBaseのリスト, NBTTagCompound, int配列<br /> | ||
それぞれのgetter,setterは以下の通りである。<br /> | それぞれのgetter,setterは以下の通りである。<br /> | ||
getByte, getShort, getInteger, getLong, getFloat, getDouble, getByteArray, getString, getTagList, getCompoundTag, getIntArray<br /> | getByte, getShort, getInteger, getLong, getFloat, getDouble, getByteArray, getString, getTagList, getCompoundTag, getIntArray<br /> | ||
setByte, setShort, setInteger, setLong, setFloat, setDouble, setByteArray, setString, setTagList, setCompoundTag, setIntArray<br /> | setByte, setShort, setInteger, setLong, setFloat, setDouble, setByteArray, setString, setTagList, setCompoundTag, setIntArray<br /> | ||
− | |||
− | + | setterメソッドではそれぞれ以下のNBTBase継承クラスとして保管されるので、データ形式の違うものであっても同じ保存名を付けるとデータ不整合が起こる。<br /> | |
NBTTagByte, NBTTagShort, NBTTagInt, NBTTagLong, NBTTagFloat, NBTTagDouble, NBTTagByteArray, NBTTagString, NBTTagList, NBTTagCompound, NBTTagIntArray<br /> | NBTTagByte, NBTTagShort, NBTTagInt, NBTTagLong, NBTTagFloat, NBTTagDouble, NBTTagByteArray, NBTTagString, NBTTagList, NBTTagCompound, NBTTagIntArray<br /> | ||
− | NBTBaseで読み込み、書き込み出来るメソッドgetTag, | + | NBTBaseで読み込み、書き込み出来るメソッドgetTag, setTagが用意されているため、より汎用的に扱うこともできる。 |
==NBTでデータを保存する方法== | ==NBTでデータを保存する方法== | ||
NBTでデータを保存する方法は、NBTTagCompoundを用意して紐付ける方法と引数にNBTTagCompoundを持つwriteToNBTメソッドを利用する方法がある。 | NBTでデータを保存する方法は、NBTTagCompoundを用意して紐付ける方法と引数にNBTTagCompoundを持つwriteToNBTメソッドを利用する方法がある。 | ||
*NBTTagCompoundを用意して紐付ける方法 | *NBTTagCompoundを用意して紐付ける方法 | ||
ItemStackにNBTを保存する場合はこちらを用いる。 | ItemStackにNBTを保存する場合はこちらを用いる。 | ||
− | ItemStack#hasTagCompoundメソッドで紐付けされてるNBTTagCompoundがあるかどうか判定し、ない場合はItemStack# | + | ItemStack#hasTagCompoundメソッドで紐付けされてるNBTTagCompoundがあるかどうか判定し、ない場合はItemStack#setTagCompoundメソッドで新たに生成したNBTTagCompoundを紐付ける。 |
− | すでに紐付けられているNBTTagCompoundがあるなら、ItemStack# | + | すでに紐付けられているNBTTagCompoundがあるなら、ItemStack#getTagCompoundメソッドから取得できる。 |
*引数にNBTTagCompoundを持つwriteToNBTメソッドを利用する方法 | *引数にNBTTagCompoundを持つwriteToNBTメソッドを利用する方法 | ||
TileEntity, EntityCustomData, WorldSavedData等はこちらを用いる。 | TileEntity, EntityCustomData, WorldSavedData等はこちらを用いる。 | ||
writeToNBT(あるいは類似名称のメソッド)をOverrideして、引数のNBTTagCompoundにデータを書き込む形となる。 | writeToNBT(あるいは類似名称のメソッド)をOverrideして、引数のNBTTagCompoundにデータを書き込む形となる。 | ||
保存のタイミングはシステムの処理による。(大体チャンク保存処理時に行われる) | 保存のタイミングはシステムの処理による。(大体チャンク保存処理時に行われる) | ||
+ | |||
+ | ==関連リンク== | ||
+ | *[http://forum.minecraftuser.jp/viewtopic.php?f=21&t=4937 MOD開発に関する留意事項 チャンク初期化とNBTデータの不整合] |
2017年2月19日 (日) 16:05時点における最新版
この記事は"Minecraft Forge Universal 10.12.1~"を前提MODとしています。 |
「NBT」を利用したデータ管理システムについての概論。
NBTとは[編集]
NBTとはMinecraftで利用されているデータの管理システム、あるいは保存書式のようなものである。
ゲームを終了した際に記録されるデータのほとんどすべてがNBT形式で(datファイルに)保存されている。
(例外としてはプレイヤーの実績・統計、Forge式Config等)
「NBTBase」クラスを基として様々な継承クラスがあるが、バニラ含め多くの場合「NBTTagCompound」クラスで管理されている。 状況によっては、「NBTTagList」クラスで管理される場合もある。(Enchantmentなど)
書式と扱える型[編集]
NBTTagCompoundへのデータの読み書きはGetter,Setterを介して行う。(コピペしても動かないので注意)
NBTTagCompound nbt; //読み込み nbt.getXxx("<データのキー>"); //書き込み nbt.setXxx("<データのキー>", <データ>);
また、NBTTagCompoundの扱える型は以下の通りである。
byte, short, int, long, float, double, byte配列, 文字列, NBTBaseのリスト, NBTTagCompound, int配列
それぞれのgetter,setterは以下の通りである。
getByte, getShort, getInteger, getLong, getFloat, getDouble, getByteArray, getString, getTagList, getCompoundTag, getIntArray
setByte, setShort, setInteger, setLong, setFloat, setDouble, setByteArray, setString, setTagList, setCompoundTag, setIntArray
setterメソッドではそれぞれ以下のNBTBase継承クラスとして保管されるので、データ形式の違うものであっても同じ保存名を付けるとデータ不整合が起こる。
NBTTagByte, NBTTagShort, NBTTagInt, NBTTagLong, NBTTagFloat, NBTTagDouble, NBTTagByteArray, NBTTagString, NBTTagList, NBTTagCompound, NBTTagIntArray
NBTBaseで読み込み、書き込み出来るメソッドgetTag, setTagが用意されているため、より汎用的に扱うこともできる。
NBTでデータを保存する方法[編集]
NBTでデータを保存する方法は、NBTTagCompoundを用意して紐付ける方法と引数にNBTTagCompoundを持つwriteToNBTメソッドを利用する方法がある。
- NBTTagCompoundを用意して紐付ける方法
ItemStackにNBTを保存する場合はこちらを用いる。 ItemStack#hasTagCompoundメソッドで紐付けされてるNBTTagCompoundがあるかどうか判定し、ない場合はItemStack#setTagCompoundメソッドで新たに生成したNBTTagCompoundを紐付ける。 すでに紐付けられているNBTTagCompoundがあるなら、ItemStack#getTagCompoundメソッドから取得できる。
- 引数にNBTTagCompoundを持つwriteToNBTメソッドを利用する方法
TileEntity, EntityCustomData, WorldSavedData等はこちらを用いる。 writeToNBT(あるいは類似名称のメソッド)をOverrideして、引数のNBTTagCompoundにデータを書き込む形となる。 保存のタイミングはシステムの処理による。(大体チャンク保存処理時に行われる)