发表于 2023-8-5 23:30:19

一个利用标签保存数据的方法

我们都知道,在Script Api中,每次进入存档或者使用reload指令的时候,我们的变量都会初始化,保存数据,单看Script Api已经不够了,这时候就需要其他可以报错数据的东西了

我们知道,标签是个好东西,通过Script Api可以获取他,而且是字符串形式,长度也是近乎无限,利用JSON的俩个方法,使得它可以储存几乎所有数据,而且,还有一个好处,标签是跟实体绑定的。

接下来就是代码了,我从我自己写的代码里挑出一段

var InTag = {
Add:function(entity,tag){
entity.runCommand(`tag @s add "${tag}"`)
},
//为实体添加标签,tag为字符串,即要添加的标签
Remove:function(entity,tag){
entity.runCommand(`tag @s remove "${tag}"`)
},
//删除指定标签
Replace:function(entity,remove,add){
InTag.Remove(entity,remove)
InTag.Add(entity,add)
},
//替换标签,由于标签不能通过Script Api直接修改,所以需要替换,就相当于修改了
GetTagArray:function(entity,TagId){
let Tag = entity.getTags()
for(let t of Tag){
if(t.includes(TagId)){
return JSON.parse(t.replace(/¥/g,'"'))
}
}
},
//获取一个含有TagId的标签,转化后的对象,假如这个标签是通过下面的方法添加的话
SetTagArray:function(entity,TagId,Add = false,NewTag){
if(!Add){
InTag.Replace(entity,JSON.stringify(InTag.GetTagArray(entity,TagId)).replace(/"/g,'¥'),JSON.stringify(NewTag).replace(/"/g,'¥'))}
else{
let Tag = JSON.stringify(NewTag)
InTag.Add(entity,Tag.replace(/"/g,'¥'))
}
}
//NewTag就是要填入的对象了:object,同时也要指明TagId,毕竟一个实体可能会有多个标签
}
前面三个主要是为了随意的调换标签的,比较entity.addTag()的长度被限制在128了,这显然是不够的,所以就需要指令了,不过直接调用指令加标签的话,含有一些特殊字符就报错了,所以用""将被操作的标签包裹
至于为什么会用到replace(),是因为对象转字符串也含有",操作标签时依然会报错,所以需要用replace()将"替换掉

示例
假设有一个实体 entity
let a = {
id:entity.id + "1"
type:entity.typeId
}
InTag.SetTagArray(entity,entity.id + "1",true,a)
//因为是第一次,所以哪里填true,默认为false
InTag.GetTagArray(entity,entity.id + "1")
//返回定义的a
a["&$$"] = 1000
InTag.SetTagArray(entity,entity.id + "1",true,a)
InTag.GetTagArray(entity,entity.id + "1")
//返回
{
id:entity.id + "1"
type:entity.typeId
&$$:1000
}

发表于 2023-8-5 23:30:52

水个贴[哔哩_doge]

MC平明 发表于 2023-8-7 15:57:20

学到了awa
页: [1]
查看完整版本: 一个利用标签保存数据的方法