細 (誤字修正) |
ModderKina (トーク | 投稿記録) 細 |
||
39行目: | 39行目: | ||
writeToNBT(あるいは類似名称のメソッド)をOverrideして、引数のNBTTagCompoundにデータを書き込む形となる。 | writeToNBT(あるいは類似名称のメソッド)をOverrideして、引数のNBTTagCompoundにデータを書き込む形となる。 | ||
保存のタイミングはシステムの処理による。(大体チャンク保存処理時に行われる) | 保存のタイミングはシステムの処理による。(大体チャンク保存処理時に行われる) | ||
+ | |||
+ | ==関連リンク== | ||
+ | *[http://forum.minecraftuser.jp/viewtopic.php?f=21&t=4937 MOD開発に関する留意事項 チャンク初期化とNBTデータの不整合] |
2017年2月17日 (金) 00:51時点における版
この記事は"Minecraft Forge Universal 10.12.1~"を前提MODとしています。 |
「NBT」を利用したデータ管理システムについての概論。
NBTとは
NBTとはMinecraftで利用されているデータの管理システム、あるいは保存書式のようなものである。 ゲームを終了した際にHDDに記録しておきたいデータは“ほとんどすべて”NBT形式で書かれ(datファイルに)保存されている。 (例外としてはプレイヤーの実績・統計、Forge式Config等)
「NBTBaseクラス」が基本クラスであるが、バニラ含め多くの場合「NBTTagCompoundクラス」を利用する。 状況によっては、「NBTTagListクラス」を使うこともある。(Enchantmentの管理)
データ書式と扱えるデータの種類
NBTTagCompoundへのデータの読み書きは以下の書式で行える。(コピペしても動かないので注意)
NBTTagCompound nbt; //読み込み nbt.get<データ形式>("<データの保存名>"); //書き込み nbt.set<データ形式>("<データ保存名>", <データ形式と同型のデータ>);
また、NBTの扱えるデータは以下の通りである。
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にデータを書き込む形となる。 保存のタイミングはシステムの処理による。(大体チャンク保存処理時に行われる)