本帖最后由 夕离丶 于 2021-7-14 19:50 编辑
Banitem with nbt不支持1.12.2版本的运行 3.0版本不兼容2.0版本,升级前请做好配置的备份工作
开源地址 构建站 插件下载:
功能
·根据多级NBT的值(支持JavaScript,正则表达式解析)来禁用物品和地上的方块
·在NBT上搜索,移除禁用物品
·玩家切换手上物品时检查物品权限
·玩家登陆时检查背包栏,和已经支持的mod的背包来检查物品权限
当前支持的背包有 Baubles饰品背包,匠魂背包,旅行者装备背包
·使用命令检查指定玩家背包
·区块加载时没收黑名单方块(默认关闭,而且貌似有时候无效)
·没事无聊可以看看物品的NBT
更新历史
[spoiler]
[2020-3-36] 3.2.5
更新的内容
·移除语言API以增强兼容性
·允许自动添加世界继承配置
·1.13-1.15.2兼容
[2020-3-18] 3.2.41
更新的内容
·更改world参数的默认值为全局世界
[2020-2-18] 3.2.40
更新的内容
·将World参数检查放到子命令中,为后续命令添加继承关系做准备
·更换NBTGetter为CacheGetter
[2017-07-17] 3.2.2
修复的内容
·修复禁用原因不翻译颜色字符的问题
·修复继承配置如果未配置Inhert节点时,未继承全局配置的问题
更新的内容
·新增非继承禁用列表,只需要在禁用列表前加上短横'-'就可以了,短横后面没有空格
注意,非继承的配置的影响只限当前世界节点,举个例子
有ABCDE
A继承自B
B继承自C,但是B不继承D
C继承自DE
那么A的等价继承就是 BCDE,而不是BCE,继承配置节点下有一个配置例子可以参考
[2017-06-26] 3.2.1
修复的内容
·修复如果Yaml格式稍微不符合规范,可能会造成服务器直接假死的问题
·修复禁用列表混合的一些错误,对禁用功能无影响,对show,remove,add命令
可能会造成影响,例如会出现明明已经remove掉的配置,却还是存在的问题,
而且remove掉的配置是来自继承的自定义禁用列表
更新的内容
·新增命令参数PreferList,缩写pl,用于指定操作的自定义列表
·remove,add命令支持直接操作已经存在的自定义禁用列表,不支持新增自定义禁用列表
·show命令更新,支持显示所有继承的配置,以前的show命令只会显示当前世界
或默认世界未继承的配置,现在会同显示继承的世界和自定禁用列表匹配的配置
show示例
[2017-06-26] 3.2.01
修复的内容
·修复添加JavaScript类型的NBT时,测试结果总是不通过的问题
·修正物品被禁用时,检查的权限子id为当前物品
更新的内容
·增加多级NBT标齐支持,多级NBT标签路径写法有一定规则,建议使用自动补全
nbtdump命令也同时升级了,可以点开查看类型为NBTTagCompound的NBT
·增加在玩家切换世界时,对玩家背包物品的检查,可在配置中配置是否开启
·damage与world两个参数支持使用星号作为值
·新增命令参数DefNBTValue,缩写dnv,用于在物品未设置没收时,替换物品被禁用的NBT
[2017-02-07] 3.0.35
修复的内容
·修复语言API初始化错误的问题,34版本由于语言API初
始化错误会导致插件多个地方报错,例如/bi add命令
[2017-02-06] 3.0.34
修复的内容
·修复区块检查可能会报错的问题
·修复直接使用/banitem nbt命令会报错的问题
[2017-02-02] 3.0.32
修复的内容
·修复add命令在未指定nv,nbtvalue参数的情况下会报错的问题
·修复区块检查可能会报错的问题
[2017-01-21] 3.0.31
修复的内容
·修复BanItem.bypass.flag名字.物品id权限无效的问题
增加的内容
·增加了新的跳过物品检查的权限BanItem.bypass.*.物品id
此权限可以跳过禁了所有Flag的某个物品,避免了以往需要每个权限都要给一次的麻烦
[2017-01-20] 3.0.3
修复的内容
·默认原因和默认没收选项无效的问题
修改的内容
·物品第一级节点下的Flags如果包含全部的权限,将不保存到配置中
增加的内容
·增加两个新的Flag,drop和pickup
[2017-01-13] 3.0.22
修复的内容
·修复nbt命令在未设置参数时会发生错误的问题
[2017-01-07] 3.0.21
修改的内容
·为了符合使用习惯,add与remove命令会在未设置damage参数且当前手上有物品时,
会自动设置damage参数的值为当前手上物品的子id
[2017-01-02] 3.0.2(强烈建议更新)
修复的内容
·禁用继承列表在只配置了全局列表的情况下,无法禁用物品的bug,此问题3.x版本均存在
[2016-12-31] 3.0.14
增加的内容
·增加了在重载自定义禁用列表时,会输出禁用列表加载的物品数量
·玩家登陆检查时,增加了检查了谁的输出
修复的内容
·修复未载入禁止设置为空气的方块列表的问题(此问题建议更新)
[2016-12-23] 3.0.11
修改的内容
·增加了插件状态机制,防止多次合并禁用列表操作(原先重载插件会进行两次列表合并)
修复的内容
·修复未启用信息收集系统的问题
[2016-12-21] 3.0.1
新增内容
·增加在区块加载时,检查区块内方块是否为黑名单方块并进行没收
以下几点注意:
·黑名单方块的定义为,禁止了所有权限,并设置了没收的方块
·此功能中,不会在方块NBT中检索物品,只检查方块本身是否被没收
·开启检查需要设置主配置文件中BlackBlockSetting.EnableSearchOnChunkLoad为true
·区块检查使用异步方式,因此不用担心给服务器造成延迟
·腐竹可以将主配置中LogLevel日志等级设置为DEVELOP,就可以看到每个区块的检查消耗时间
·本人测试纯净和mod服,在禁用列表物品较少的情况下,每个区块检查的花费时间基本在2-4毫秒
修复的内容
·修复add命令在添加新物品到禁用列表时,聊天窗口中物品节点下不显示禁用的Flag和原因的问题
·修复damage节点每次保存后都会被重新写入名字的问题
·修复plugin.yml中BanItem.cmd的子权限BanItem.cmd.param名字错误的问题(原先为viewparam)
修改的内容
·移除了JavaScript类型的NBT值在加载时,控制台输出的测试调试信息
[2016-12-20] 3.0.04
修复的内容
·修复show,nbtdump等会在聊天窗口中生成可点击命令在使用时的报错问题
[2016-12-19] 3.0.03
修改的内容
·remove与add命令在玩家设置了NBTLabel,nv参数之后,如果玩家未设置d,damage子id
参数,那么插件会自动添加当前玩家手上的物品的子id,如果手上无物品,那么就设置
为子id为-1
[2016-12-18] 3.0.02
修复的问题
·修复信息收集系统未初始化导致的信息收集失败的问题
[2016-12-17] 3.0.01
修复的问题
·修复命令参数d,damage在tab补全时,无法补全当前手上的子id的问题
[2016-12-17] 3.0.0
* 版本正式升级至3.0,请注意,3.0版本的配置与2.x的配置和物品列表不兼容
***与2.x不兼容配置
***与2.x不兼容配置
***与2.x不兼容配置
增加内容:
·使用Flag取代不同类型的列表用于管理被禁用物品的权限
·增加禁用物品列表继承功能,各个世界的列表可以进行继承设置
·插件目录下设置了一个文件夹PreferItemList,用于存放禁用物品列表
此文件夹的作用就相当于,例如你把ic2的全部禁用物品整理到了一个文件
然后再丢到此文件夹中后,通过配置世界物品继承可以把禁用物品的配置
应用到继承的世界上(继承方法参考继承设置),下次换周目时,如果ic2这个
mod没有删,那么就不需要重新去禁用ic2的物品,如果每个mod都整理一份
文件,那么换周目后禁用物品就是只要换换此文件夹下的文件就可以了
修改内容
·NBTCheckList,nbt物品检查列表取消继承设置,只有一个配置文件
·删除了test,check命令,增加了nbt命令用于操作nbt物品检查列表
·add,remove命令移除了参数t,type
·add命令增加了c,confiscate参数指定是否没收,f,flag指定禁用的权限
·remove命令在移除整个配置节点后,将会输出全部的子节点
·禁用物品列表名修改为BanItems.yml
·世界禁用物品列表继承方式变化
·NBT值书写格式,脚本NBT值格式变化
[/spoiler]
权限,所有权限op拥有(可以通过添加非权限取消)
[spoiler]
BanItem.*:
BanItem所有权限
权限默认所有者: 管理员
子权限:
BanItem.bypass: true
BanItem.cmdcomplete: true
BanItem.cmd: true
# 对于BanItem.bypass权限,配置文件中启用相应的配置
# 例如一个子id为0的箱子的use权限被禁了
# 启用Permission.CheckItemId,权限检查会检查BanItem.bypass.use.54这样的权限
# 启用Permission.CheckItemDamage,权限检查会检查BanItem.bypass.use.54@0这样的权限
# 两者都未启用,只会检查BanItem.bypass.use这样的权限
#免检查权限的基本格式为 BanItem.bypass.禁用Flag.物品类型@物品子id@NBT禁用节点
#NBT禁用节点就是禁用配置里的那个NBT节点名字
#其中,禁用Flag,物品子id均可以替换为星号
BanItem.bypass:
跳过禁用物品检查的权限
权限默认所有者: 管理员
子权限:
# 破坏方块的权限
BanItem.bypass.break: true
# 合成物品的权限
# 此权限仅在玩家点击结果格子的物品时才会触发检查,例如工作台,炉子
BanItem.bypass.craft: true
# 拿着该物品的权限,此权限处理有缺点
# 如果玩家快捷栏全是没有hold权限的物品,那么就没有意义了
BanItem.bypass.hold: true
# 与方块交互的权限
BanItem.bypass.interact: true
# 基本所有的权限,检查玩家背包,放置,点击,丢弃,切换,基本所有事件都需要检查该权限
BanItem.bypass.inv: true
# 放置方块的权限
BanItem.bypass.place: true
# 使用物品的权限
BanItem.bypass.use: true
BanItem.bypass.*.物品id
此权限3.0.31及以后的版本才存在
跳过某个物品所有禁用Flag检查的权限
物品id支持数字id和文字id
例如,以前版本,如果你禁了箱子的use和hold权限,这时候想给某个玩家用
那么你必须同时给该玩家BanItem.bypass.use.54和BanItem.bypass.hold.54两个权限
非常的繁琐,所以这时候就可以改用给该权限BanItem.bypass.*.54直接给所有Flag的权限
不要忘记将配置中Permission.CheckItemId设置为true,否则此权限无效
BanItem.bypass.useintnbt
在nbt中使用物品的权限,例如法杖核心,枪械mod的子弹
权限默认所有者: 管理员
BanItem.cmdcomplete:
自动补全命令的权限
权限默认所有者: 管理员
BanItem.cmd
所有命令的权限
权限默认所有者: 管理员
子权限:
BanItem.cmd.help: true
BanItem.cmd.item: true
BanItem.cmd.nbt: true
BanItem.cmd.nbtdump: true
BanItem.cmd.reload: true
BanItem.cmd.scan: true
BanItem.cmd.show: true
BanItem.cmd.param: true
BanItem.cmd.help:
获取插件帮助的权限
权限默认所有者: 管理员
BanItem.cmd.add:
添加物品到禁用物品列表的权限
权限默认所有者: 管理员
BanItem.cmd.remove:
从禁用物品列表移除物品的权限
权限默认所有者: 管理员
BanItem.cmd.nbt:
操作NBT检查物品列表的权限
权限默认所有者: 管理员
子权限:
BanItem.cmd.nbt.add: true
BanItem.cmd.nbt.remove: true
BanItem.cmd.nbt.show: true
BanItem.cmd.nbt.add:
添加物品到NBT检查物品列表的权限
权限默认所有者: 管理员
BanItem.cmd.nbt.remove:
从NBT检查物品列表移除物品的权限
权限默认所有者: 管理员
BanItem.cmd.nbt.show:
显示NBT检查物品列表配置的权限
权限默认所有者: 管理员
BanItem.cmd.nbtdump:
获取物品NBT节点列表的权限
权限默认所有者: 管理员
BanItem.cmd.param:
查看参数帮助的权限
权限默认所有者: 管理员
BanItem.cmd.reload:
插件重载总权限
权限默认所有者:管理员
子权限:
BanItem.cmd.reload.config: true
BanItem.cmd.reload.help: true
BanItem.cmd.reload.lang: true
BanItem.cmd.reload.list: true
BanItem.cmd.reload.plugin: true
BanItem.cmd.reload.plugin:
重载插件的权限
权限默认所有者: 管理员
BanItem.cmd.reload.config:
重载插件配置的权限
权限默认所有者: 管理员
BanItem.cmd.reload.help:
获取重载命令帮助的权限
权限默认所有者: 管理员
BanItem.cmd.reload.lang:
重载插件语言文件的权限
权限默认所有者: 管理员
BanItem.cmd.reload.list:
重载禁用物品列表和NBT检查物品列表的权限
权限默认所有者: 管理员
BanItem.cmd.scan:
扫描玩家背包的权限
权限默认所有者: 管理员
BanItem.cmd.show:
显示禁用物品列表配置的权限
权限默认所有者: 管理员
[/spoiler]
命令 所有命令支持Tab自动补全
[spoiler]
命令规则
中括号[]包裹的表示该项可填可不填,尖括号<>包裹的表示该项为必填,
竖线|分隔的表示多个可选项,例如<false|true>,表示必填,可选值为false和true
可选参数为可写可不写的项,具体意义参考命令参数模块
|
/banitem add [参数:值]
可选参数: item,damage,world,nbtlabel,nbtvalue,flag,reason,confiscate,preferlist,defnbtvalue
添加物品配置到禁用物品列表
/banitem remove [参数:值]
可选参数: item,damage,world,nbtlabel,nbtvalue,preferlist
从禁用物品列表中移除物品配置
/banitem show [参数:值]
可选参数: item,damage,world
显示指定物品id在禁用物品列表中的配置
/banitem nbt add [参数:值]
可选参数: item,damage
添加物品配置到NBT物品检查列表
/banitem nbt remove [参数:值]
可选参数: item,damage
从NBT物品检查列表移除物品配置
/banitem nbt show [参数:值]
可选参数: item,damage
显示指定物品id在NBT物品检查列表中的配置
/banitem nbtdump
显示当前手上物品的NBT,若当前手上物品为空,将尝试显示鼠标所指方块的NBT
/banitem param [参数标签]
显示命令参数的作用
/banItem help [页数]
获取banitem插件命令的帮助
/banitem reload config
重载插件主配置
/banitem reload lang
重载插件语言文件
/banitem reload list
重载禁用物品列表,NBT检查物品列表
/banitem reload [plugin]
重载插件
[/spoiler]
命令参数 所有参数支持Tab自动补全
[spoiler]
很多人都不知道参数是干嘛用的,都认为很难理解,其实完全不用担心,比起一个需要输入一定
顺序的5+以上的命令参数,前缀可以指定你输入参数的作用意义而且不用考虑顺序
举个例子,我们要添加一个人,命令是/人 添加,但是人有很多属性,比如性别,年龄等
这时候我们就需要指定那些属性的值,然后命令就是/人 添加 年龄:100 性别:男
有时候,觉得性别这个词数量太多了,想要有个缩写,然后就变成了/人 添加 年龄:100 性:男
BanItem插件也是,类似
参数使用规则就是/命令 [子命令] 参数前缀:值...
各个参数介绍:
PreferList:(3.2.1版本及以上)
简写: pl
说明: 设置操作的自定义禁用列表
默认值: 无默认值
DefNBTValue:(3.2.01版本及以上)
简写: dnv
说明: 设置在某个物品因为某个NBT节点被禁用时,将该NBT节点的值替换成的值
3.2.3版本开始允许为NBTTagList与NBTTagCompound类型的NBT设置默认值,默认值必须严格遵循Json格式
可以使用在线的Json格式检查器检查Json格式,注意,由于Json中会有中括号和大括号,配置到Yaml
配置文件中时,请在json字符串两端加上单引号,不然会被解析成Yaml的配置结构
应用: 例如植物魔法的泰拉镐,mana节点
默认值: 无默认值
Confiscate:
简写: c
说明: 设置是否没收物品
可用值: t,true,yes,f,false,no
默认值: 无默认值
Damage:
简写: d
说明: 设置操作的物品的子id,-1代表全部子id
默认值: 如果当前输入命令的是玩家,那么默认值会读取玩家手中物品的damage值,
如果手中没有物品,或者是控制台发送的命令,那么damage将不设置值
此时,如果使用例如/banitem remove i:54将会移除箱子节点下的所有配置
3.0.03开始,如果玩家设置了NBTLabel的值,将会自动填充子id为手上物品的子id
如果手上物品不存在,那么就设置为-1
Flag:
简写: f
说明:设置物品禁用的权限,用逗号分隔多个权限
默认值:无默认值
Item:
简写: i
说明:设置操作的物品类型
默认值:如果当前输入命令的是玩家,那么默认值会读取玩家手中物品类型
如果手中没有物品,或者是控制台发送的命令,将会报错
NBTLabel:
简写: nl
说明: 设置操作的物品的NBT标签
默认值: 无默认值
NBTValue:
简写: nv
说明: 设置操作的物品的NBT标签的值
默认值: 无默认值,此值的格式有要求
*,直接编辑配置文件的记得在两边加单引号,不然配置读取会报错,代表禁掉所有包含
NBTLabel的NBT,此目的也可以通过不设置NBTValue的值来实现
以normal|开头的正常NBT值,比如我要禁掉abc这个NBT,那么就要写成nv:normal|abc
以reg|开头的正则表达式类型的NBT值,比如我要禁掉NBT全是数字时的NBT,那么
就要写成nv:reg|\d+
以js|开头的JavaScript类型的NBT值,变量名为value,及在使用js解析时,value是
一个已经帮你填好值的变量,比如我要禁掉泰拉镐mana大于666的镐子,那么完
整的命令(手拿镐子的情况下)/bi add d:-1 nl:mananv:js|value>666
Reason:
简写: r
说明:设置物品禁用的原因
默认值:无默认值,在添加到配置文件之后,插件加载该配置时,如果未发现Reason这个配置
将会尝试想他的父配置查找Reason这个配置,如果父节点也没有,那么将读取自配置
World:
简写: w
说明:设置操作的世界
默认值:如果是玩家,那么默认值就是玩家所在的世界,如果是控制台,那么就是默认世界,
那么,玩家如何指定默认世界呢?使用w:/default/,代表就是默认世界
[/spoiler]
所有物品禁用权限(Flag)
[spoiler]
Drop:
需要3.0.31版本及以上才有该Flag
描述: 物品丢弃
适用事件: 物品丢弃事件,可以用来防止熊孩子乱丢铀238
Pickup:
需要3.0.31版本及以上才有该Flag
描述: 物品拾取
适用事件: 物品拾取事件
Break:
描述: 方块破坏
适用事件: 方块破坏事件
Craft:
描述: 取出合成物品
适用事件: 背包点击事件
Hold:
描述: 切换物品拿着东西事件
适用事件: 切换物品事件
Interact:
描述: 交互方块
适用事件: 玩家交互事件
Inv:
描述: 背包内存在
适用事件: 几乎插件监听的所有事件适用
Place:
描述: 方块放置
适用事件: 方块放置事件
Use:
描述: 使用物品
适用事件: 玩家交互事件
UseInNBT:
描述: 在NBT中使用的权限
适用事件: 玩家交互事件
[/spoiler]
配置多世界继承
[spoiler]
配置例子
/default/:
该节点不代表任何世界它指代全局设置
如果别的世界未设置继承或者未配置过继承设置比如我有一个世界
叫abc,但是未出现在上面的配置中那么abc这个世界的禁用物品配置
将会默认继承自全局世界
Inhert节点:
该节点设置此世界继承哪些世界的配置,例如上面的main世界继承
world世界的设置
Perfer节点:
该节点设置继承哪些禁用列表的配置,此处的禁用列表文件位置在插件目录的
PreferItemList文件夹下,例如以上配置中world世界配置了此项,那么插件会到PreferItemList
文件夹下查找名叫ic2.yml的禁用物品列表然后加载并和world中的禁用物品进行合并,
合并只在内存中发生不会影响到world文件的配置
非继承配置例子:
/default/
Prefer
- 只能主世界用
world
Prefer
- -只能主世界用
这样配置之后,"只能主世界用"这个禁用列表里面的物品就只能在world世界用了
嗯,很多人反正就是怎样都看不懂上面的配置,我就直接举例子
1. 我要在main世界禁用某物品
惯例管理会输入命令bi add w:main命令,然后插件会提示main世界未配置
此时需要在配置中这么写
InhertItemList:
plot: {}
也可以这么写
InhertItemList:
plot:
Inhert:
- /default/
效果是一样的
你说Inhert什么意思不知道,怎么用? 请用百度翻译
其中/default/为默认配置,就是插件目录下面的那个禁用列表配置
配置完了记得重载,重载,重载
2. 我要在m1,m2,m3,m4里面都禁用某个配置
首先,按第一个条的,四个世界都配置起来,看起来应该像下面这样子
InhertItemList:
m1: {}
m2: {}
m3: {}
m4: {}
然后你就开始在四个世界输入命令了,到第二个世界突然想起来,不是有Inhert这个功能么
嗯,可以在世界m1中禁用,然后其他世界继承m1世界的配置就好了吧,然后就是下面这个样子
InhertItemList:
m1: {}
m2:
Inhert:
- m1
m3:
Inhert:
- m1
m4:
Inhert:
- m1
然后你想想又有些地方不对,我m1世界有些别的禁用东西不需要在其他世界禁用,但是确实有
很多相同的东西只要在这四个世界禁用
这时候Prefer配置项就起到作用了
比如这四个世界都要禁用的东西我给他取个名字,叫"四世界禁用列表"
然后你会使用.bi add pl:四世界禁用列表来为这个列表增加禁用配置
在接着配置继承列表,像下面这样子
InhertItemList:
m1:
Prefer:
- 四世界禁用列表
m2:
Prefer:
- 四世界禁用列表
m3:
Prefer:
- 四世界禁用列表
m4:
Prefer:
- 四世界禁用列表
[/spoiler]
如何配置防止法杖使用禁用核心(类似还有枪,植物魔法透镜)
[spoiler]
1.先手上拿着法杖输入/banitem nbt add d:-1
不用担心上面这个命令,上面这个并不是ban物品的命令,只是把法杖加到nbt检查列表
2.拿着要ban的核心输入/banitem add f:useinnbt
此命令值禁止了核心在NBT中使用的权限
如果想要设置没收,/banitem add f:useinnbt c:true
操作完毕之后,核心上到法杖上后,插件会到法杖的nbt中查找被禁用的物品
如果配置了核心没收,那么法杖会一起被没收
如果你不想法杖被一起没收,可到主配置文件中设置配置节点RemoveBanedItemFromNBT为true
这样只要法杖本身没被禁,就只会移除被禁用的核心,法杖不会被没收
[/spoiler]
如何配置相同id的[物品/方块(地上的)]
[spoiler]
----------------==物品篇==----------------
1.手上先拿着要ban的物品,输入/banitem nbtdump,结果如下(这是一把拔刀)
[img]https://i.loli.net/2020/05/05/RZdSKeItjV95Gcm.jpg[/img]
2.鼠标移到复制那里,点一下就能快速生成禁用该物品某个NBT节点的命令了,拔刀的话选CurrentItemName
说明一下生成的命令的意思
add就是添加
nl:CustmonMaxDamage ,nl指NBTLabel也可以用全拼,后面的就是NBT标签
nv:flammpfeil.slashblade.named.nihilul,nv指NBTValue,后面就是对应NBT标签的值,这里的nv值还加了normal|的前缀,指示这是一个普通的nbt
还可以更改[d,damage]子id参数为-1,-->d:-1,因为拔刀有耐久
如果你手动输入到了/banitem ban add nl: 按一下Tab就可以出提示,效果和这个差不多
3. 回车后还会有提示,你添加了什么样的物品配置到了文件
4.如果还觉得不清楚,你还可以使用/banitem show命令显示这个物品都ban了什么子id和NBT
对于上面的例子,手里拿着的东西不变,输入/banitem show
show命令可用的参数有三个
[w,world] 世界,如果没有设置,默认当前玩家世界
[i,item] 物品,如果没有设置,默认使用手上的,可以是数字,也可以是英文
[d:damage] 子id,如果没有设置,默认打印全部的子id
输完命令后出来的结果就是这样子,点击蓝色的字体可以快速生成删除该配置节点的命令
----------------==物品篇结束==----------------
----------------==方块篇==----------------
除非你不想玩家和这个方块交互,不然ban相同id的方块并没啥用,对于植物魔法,就算把地上的花ban了,只要撸掉下面的土还是可以的
1.鼠标对着要ban的方块输入/banitem nbtdump 此时你手上不能拿着东西
2.比如以下的植物魔法
3.接下来就和ban物品一样了,植物魔法方块区别类别的就是subTileName
4.然后地上的花直接撸就不能撸掉了
----------------==方块篇结束==----------------
[/spoiler]
如何设置物品NBT值来使用JS解析(Ban附魔和泰拉镐为例子)
[spoiler]
插件如何判断是使用正常的字符串匹配来比较还是用js解析呢,如果是js脚本,你的nbt值中必须以js|为开头,然
后在进行JS语法的解析,再根据解析结果来确定这个物品的NBT是不是被禁用的,nbt的值将通过value这个变量传入
----====泰拉镐例子====----
泰拉镐子根据等级不同可以挖不同数量的方块,所以一些服务器会想办法禁掉高等级的泰拉镐,但是
泰拉稿子的等级是根据魔力的多少来决定的,是一个范围型的NBT,banitem插件不可能把每个数字都
加到禁用列表里,这时候就需要使用JS解析功能,这样输入
/banitem add d:-1 nl:mana nv:js|value>99999999
nv参数的值设置为js|value>9999999,意思就是这个物品的NBT中mana节点的值只要大于9999999都会被禁用
当然你也可以使用正则表达式,reg|\d{8,}匹配到8位数字,那就肯定是大于9999999
添加结果
添加之后,如果nv参数中的值以js|开头,会对这个值进行JS解析的数字和字符串变量替换的测试,如果两项测试都没有通过,那么就认为这个js脚本写错了,需要重写
测试不通过的情况
另外,在版本3.2.0中新出的DefaultNBTValue参数,可以将禁用命令稍加修改为
/banitem add d:-1 nl:mana nv:js|value>99999999 c:f dnv:99999999 这样可以自动将高等级的泰拉镐修改到允许的等级,而不是全盘的禁用导致玩家再也无法使用该镐子
----====Ban附魔====----
随便拿一个带附魔的物品,然后输入/banitem add nl:ench nv:,然后按一下tab,nv的值就会填上了
我这里的值nv:[{lvl:3,id:16},{lvl:2,id:21}] ,一个锋利3,一个抢夺2
我们就拿ban锋利的例子来,锋利的附魔id是16,以上字符串中id就是附魔id,lvl就是附魔等级,
然后我们改一下命令,变成/banitem add nl:ench nv:js|value.indexOf("id:16")!=-1,然后回车
value.indexOf("id:16")!=-1这句话的意思就是把NBT值作为字符串,然后使用JS语法里字符串的indexOf方法来确定id:16这个字符串的位置,如果返回-1,说物品NBT中的ench节点的值不包含id为16的附魔
当然JS解析器的功能肯定不止这么一点,你可以写复杂的语言,不过相对应的耗时就会增加,value变量可以写多个
这里一个复杂的JS解析例子
js|var a=false,b=eval("("+value+")");if(b instanceof Array){for(var i in b){if(b.id==16&&b.lvl>2){a=true;break}}}a;
var a = false,b =eval("(" + value + ")");
if (b instanceof Array) {
for (var i in b) {
if (b[i].id == 16 && b.lvl > 2) {
a = true;
break
}
}
}
a; |
由于ench这个节点的值比较特殊,可以转换成数组,所以可以使用遍历,这段js的作用就是,查找id为16的附魔,如果等级大于2就禁用,只要在js语句最后一句话放上你要返回的结果就可以获取到比较结果了
编辑JS脚本的几个注意事项
·js语句内不能return
·js内的字符串中的特殊字符需要转义,例如var regx="\d{1,}"需要写成var regx="\\d{1,}"
·如果js语句太长了想要直接编辑文件,一定要注意单引号的转义,单引号是配置文件的边界符号,所以如果字符串
中包含了单引号,写到文件里一定要改成两个,所以可以的话,尽量不要使用单引号,可以使用双引号代替单引号
[/spoiler]
常见问题与回答
[spoiler]
注意,此问答只针对3.x版本的banitem插件
问: 怎么禁用镐子等有耐久的物品
答: 手拿要禁用的物品,输入/banitem add damage:-1,
damage:-1表示所有子id,3.1.03版本允许使用damage:*
命令的简单写法为/bi add d:-1
问: 怎么禁止物品使用,但是还能参与合成
答: 手拿要禁用的物品,输入/banitem add flag:use confiscate:false,
flag:,就是要禁用的权限,use就禁用使用权限,多个权限用逗号分隔
confiscate:,设置是否没收,false或者f或者no表示不没收
命令的简单写法为/bi add f:use c:f
问: 使用/banitem nbtdump后,点击复制生成的命令提示nv参数无效
答: 一般上生成的命令为/banitem add d:0 nl:xxxxxx nv:yyyyyyy
无效的原因是因为nv参数即nbtvalue需要指定类型(参考命令参数模块的说明)
所以在复制命令后,需要将nv:yyyyyyy改为nv:normal|yyyyyyy
3.1.03版本不强制添加normal前缀,默认则为此类型的NBT
问: 我禁了泥土(比较**的例子),然后玩家一点地上的泥土就消失了,我不想它消失,但是背包里还是要没收
答: 将泥土的id添加到主配置文件中的BanItem.BlocksNotSetToAir节点即可
问: 我用命令/bi add禁了某个物品,怎么给某个玩家权限
答: 首先,你需要将主配置Permission.CheckItemId设置为true
然后,给该玩家添加BanItem.bypass.*.物品id 的权限,物品id可以是数字id
或者文字id,如果只想给使用权限怎么办,使用权限是BanItem.bypass.use.物品id
use就是使用Flag的名字
问: 怎么禁止熊孩子在主城丢铀238害人
答: 可以通过禁掉drop权限达到目的/bi add flag:drop confiscate:false
flag:,就是要禁用的权限,use就禁用使用权限,多个权限用逗号分隔
confiscate:,设置是否没收,false或者f或者no表示不没收,当然为了惩戒熊孩子,也可以设置为没收
最好配置一下多世界继承,只在主城禁止丢弃
你也可以使用贵重物品插件来达到相同目的
问: 为什么我禁了法杖核心的useinnbt权限,玩家还是能在法杖中使用核心
答: 禁了法杖核心的权限之后,你还需要将法杖添加到NBT物品检查列表
手拿法杖输入/bi nbt add d:-1,那是不是所有的法杖都要拿手上打一次指令
呢?不用的,一般上法杖的大id都是一样得,既然命令里指定了damage:-1这个
参数,那么就是指所有的子id也包括了
这条命令的就是将法杖添加到nbt检查列表,这个列表的作用就是在玩家使用
该物品时,会在该物品的nbt中检索物品是否被禁用
问: 为什么我禁了某个物品,但是该物品已经放置在地上的方块不没收
答: 三种可能
第一种 原本物品是没有子id的,但是放置到地上之后就有了子id
但是,直接手拿物品输入/bi add只ban了0这个子id,地上的其他物品子id没ban,所以
不会没收,这时候,你需要将命令改成/bi add d:-1,当然要确定其他子id没有其他
物品,防止误ban,典型的就是箱子
第二种 你手上的物品与地上的物品id根本就不是一样的,典型的就是木牌
第三种 如果你是用NBT ban的物品,那么就是可能物品的标志名称变了,典型的
就是植物魔法的花,植物魔法的花物品状态在手上时,区分类型的nbt名字是type,但
是在地上时是subTileName,这时候两种NBT就都需要ban一遍,具体可以用nbtdump
命令查看一下
[/spoiler]
关于判断优先度以及判断方法
[spoiler]
1.如果物品本身是禁用的物品
检查物品自身的id以及damage是否符合禁用列表
符合的话再进行NBT值的匹配
2.检查自身的id以及damage是否符合NBT搜索列表内的物品
符合的话对NBT进行禁用物品搜索
NBT搜索规则:
如果存在名字叫id的int类型的nbt标签,将这个的值作为物品的id
如果存在名字叫type的string类型的nbt标签,将这个的值作为物品的id
如果存在名字叫damage或meta的short类型的nbt标签,将这个的值作为物品的子id
如果存在名字叫Tag的NBTTagCompound类型的节点,将这个的值作为物品的NBT进行NBT值匹配
[/spoiler]
|