|
我们都知道,在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 } |
提升卡
观察者