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:system namespace.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:system namespace.stack_frame:[ { map:{ key:["qwq","owo","nya"], value:["pwp","uwu","meow"], data:{ "qwq":"pwp","owo":"uwu","nya":"meow" } } } ]