492 字
1 分钟
MCFPP数据结构——NBTList,NBTDictionary,NBTMap
Minecraft中的NBT除了单层的键值对以外,还有复合标签和列表等结构,让NBT成为了数据包中一种天然的数据储存结构。对于Storage,非极端情况下的访问的速度大概相当于5~10记分板,速度较为优良,而对于方块和实体,这一耗时则要长的多,特别对于玩家来说,进行一次访问可能需要上百个记分板的时间。
MCFPP利用Storage NBT,实现了NBTList,NBTDictionary,NBTMap三种主要的数据结构。第一种对应了NBT中的列表,而后两个则对应了复合标签,并且第三个是第二个的更复杂实现,用三倍的写入消耗,用来满足更多条件下的需求。
NBTList
List list = List<int>();list.add(1);int b = list[0]; //b = 1
list.removeAt(0); //移出第一个元素NBTList只是一个普通的NBT列表,在其上提供了额外的方法。例如,对于上面的例子,在list.add(1)执行完毕后,NBT中有这样的数据
//mcfpp:systemnamespace.stack_frame:[ {list:[1]}]你可以使用强制类型转换将其转换为一个普通的NBT类型数据:nbt nbtList = (nbt)list 但是在转换后,你将不能再将其转换为一个列表,因为编译器无法保证这个数据仍然能作为列表使用。
NBTDictionary
和NBTList类似,NBTDictionary也只是一个普通的复合标签,但是有一些包装的方法可供调用。除了底层是一个NBTCompound以外,NBTDictionary和NBTList几乎相同
Dict dict = Dict();dict["qwq"] = "pwp";
dict.put("owo","uwu");
dict.remove("qwq");NBTMap
NBTMap是NBTDictionary的强化版本。NBTMap除了储存原本的数据以外,还会额外储存两个列表,表示键和值。因此,你可以遍历NBTMap,或者单独获取其中的键和值的列表。下面列出了NBTMap的某些独有方法
Map map = Map();
map["qwq"] = "pwp";map["owo"] = "uwu";map["nya"] = "meow";
list key = map.key;list value = map.value;
foreach(value in map.value){ print(value);}在上面的例子中,栈中的数据是这样储存的:
//mcfpp:systemnamespace.stack_frame:[ { map:{ key:["qwq","owo","nya"], value:["pwp","uwu","meow"], data:{ "qwq":"pwp","owo":"uwu","nya":"meow" } } }] MCFPP数据结构——NBTList,NBTDictionary,NBTMap
https://alumopper.top/posts/mcfppnbtdata/ 部分信息可能已经过时



