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"
            }    
        }
    }
]

类似文章

发表回复