最MC论坛

标题: [管理|安全]Banitem With Nbt —— 更好的封禁物品插件,支持NBT[1.7-1.15] [打印本页]

作者: 夕离丶    时间: 2020-5-5 11:19
标题: [管理|安全]Banitem With Nbt —— 更好的封禁物品插件,支持NBT[1.7-1.15]
本帖最后由 夕离丶 于 2021-7-14 19:50 编辑

Banitem with nbt不支持1.12.2版本的运行
可换成Banit
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搜索规则:
        如果存在名字叫idint类型的nbt标签,将这个的值作为物品的id
        如果存在名字叫typestring类型的nbt标签,将这个的值作为物品的id
        如果存在名字叫damagemetashort类型的nbt标签,将这个的值作为物品的子id
        如果存在名字叫TagNBTTagCompound类型的节点,将这个的值作为物品的NBT进行NBT值匹配

[/spoiler]

作者: IsaacTadokoro    时间: 2020-5-7 20:43
来支持一手大佬。
作者: zzzztol    时间: 2020-5-9 17:37
好插件!!
作者: a15941658433    时间: 2020-5-12 13:02
拿走啦。
作者: bobby0917    时间: 2020-5-23 16:56
有点牛皮啊
作者: ChuYinLianMeng    时间: 2020-5-23 19:50
感谢大佬56666
作者: 白墨尘    时间: 2020-5-23 20:38
正式我要找的插件,感谢楼主大大

作者: sdft    时间: 2020-5-23 20:49
6666666666666666666
作者: 丶时七    时间: 2020-5-24 10:18
感谢楼主分享

作者: a472938887    时间: 2020-5-24 18:28
干了!
作者: 战火    时间: 2020-5-24 20:10
666666666666666666
作者: YHset    时间: 2020-5-29 08:05
感谢大哥,正找能ban id的
作者: 30265451    时间: 2020-5-31 18:38
666666666666666666
作者: yuankun1    时间: 2020-6-5 16:59
而单独加固堤坝
作者: 1833765560    时间: 2020-6-5 23:20
不错的插件
作者: 醉梦离殇    时间: 2020-6-8 18:51
刚好需要
作者: 1833765560    时间: 2020-6-12 16:45
这这么多字 真牛皮
作者: moyu    时间: 2020-6-15 21:13
啊大苏打大苏打大苏打
作者: 〒无〒    时间: 2020-6-17 00:26
感谢楼主
作者: wei74191870    时间: 2020-6-18 21:57
太好了,终于找到了
作者: langjing    时间: 2020-6-25 03:51
66666666666666666666
作者: a569650202    时间: 2020-6-30 20:20
流啤 支持LZ !!!
作者: 556049160    时间: 2020-7-2 17:22
666666
作者: anzhi    时间: 2020-7-2 17:55
66666666666
作者: hyx1664899475    时间: 2020-7-3 17:05
牛逼大佬
作者: 辉小月    时间: 2020-7-4 10:25

作者: ketikai    时间: 2020-7-6 18:49
哇 难受 国内搜了好久就找到这一个帖 感谢
作者: 大猫咪    时间: 2020-7-9 11:17
感谢分享
作者: Dr_abubb    时间: 2020-7-11 12:57
awa
作者: dengyu    时间: 2020-7-12 13:39
支持一个
作者: qwe425865    时间: 2020-7-14 19:27
大赞 ,正好需要
作者: 兜兜里有个卵糖    时间: 2020-7-16 16:11
感谢分享
作者: 大傻逼QZH    时间: 2020-7-18 17:03
谢谢楼主
作者: jiajiaxd    时间: 2020-7-18 20:35
谢谢楼主qwq
作者: TheTom233    时间: 2020-7-19 16:29
非常感谢,对我这个萌新腐竹很有帮助
作者: janjidan    时间: 2020-7-20 15:53
看起来这个插件挺强大的
作者: 火焰大大    时间: 2020-7-20 17:28
感谢分享
作者: q1638379570    时间: 2020-7-26 16:26
支持1!
作者: 隔壁老李    时间: 2020-7-26 21:38
感谢分享
作者: 小小啦    时间: 2020-7-27 14:35
感谢楼主分享
作者: 55555e    时间: 2020-7-27 22:03
66666666感谢大佬
作者: DominterKe    时间: 2020-7-27 23:27
zhichi!!!!!!
作者: tyyunxi    时间: 2020-7-29 02:22
很棒的插件 适合mod服
作者: 13674201409    时间: 2020-7-30 08:22
666666666666666666666666666666
作者: 3222630550    时间: 2020-7-30 17:13
好用
作者: David_man    时间: 2020-7-30 17:19
谢谢分享
作者: 1170108045    时间: 2020-7-31 09:51
66666666666666
作者: wanjia    时间: 2020-8-1 21:07
+6666666666666666
作者: huacan    时间: 2020-8-2 11:06
感谢分享!
作者: AJG    时间: 2020-8-2 15:54
我要用  谢谢大佬
作者: 星际qaq    时间: 2020-8-2 19:20
Thanks♪(・ω・)ノ
作者: yuan_ge    时间: 2020-8-9 21:06
很棒的插件!!!
作者: 3085558123    时间: 2020-8-14 18:15

作者: 星叶    时间: 2020-8-15 19:39
过来看看
作者: a794583492    时间: 2020-8-15 23:32
666666666666666666666
作者: Bing_Sang    时间: 2020-8-17 01:02
感谢楼主分享
作者: y2489186    时间: 2020-8-17 02:31
感谢楼主分享!
作者: 546185700    时间: 2020-8-22 09:53
感谢大佬们=w=
作者: chixiao    时间: 2020-8-23 00:13
666666
作者: zxc2907233624    时间: 2020-8-24 10:42

感谢大佬66666
作者: 怀念_    时间: 2020-8-28 08:12
有你更精彩
作者: 1822388404    时间: 2020-8-28 18:42

作者: 氧化钙    时间: 2020-8-31 16:42
nice!
作者: 1451480462    时间: 2020-9-2 20:47
66666666
作者: 往事    时间: 2020-9-3 06:20
非常不错 很需要这个
作者: MadeonXD    时间: 2020-9-4 04:33
666感谢大佬分享
作者: heiguiyaheigui    时间: 2020-9-4 19:52
ewffffffffffffffffffff

作者: IceAsuna    时间: 2020-9-8 18:58
666666666666666666666666666
作者: 往事    时间: 2020-9-9 11:18
感谢分享 非常需要这个
作者: 虎牙    时间: 2020-9-29 20:52
支持楼主ing

作者: lbs    时间: 2020-10-2 11:50
ok阿斯蒂芬
作者: qq2356855213    时间: 2020-10-2 22:53
感谢楼主的分享
作者: Sword_bob    时间: 2020-10-6 14:16
感谢
作者: 我都玩到    时间: 2020-10-7 08:52
6666666666666666666666666666666666666666
作者: 2721311755@qq.c    时间: 2020-10-7 22:50
支持大佬
作者: 2511591168    时间: 2020-10-9 19:37
感谢大佬!!!!
作者: aslkdjajr    时间: 2020-10-10 16:44
非常好用  666
作者: 我是天才1    时间: 2020-10-10 22:15
支持去!!!!!!!!!!!
作者: 我是天才1    时间: 2020-10-10 22:16
DWADAWDAWD
作者: llr5525946    时间: 2020-10-18 21:49
感谢楼主
作者: MrDayan    时间: 2020-10-28 09:53
谢谢楼主,找了很久这个插件其他地方都挂了
作者: 那一抹阳光    时间: 2020-10-28 12:18
最MC有你精彩无比
作者: 65658dsf    时间: 2020-11-1 09:23
66666666666666
作者: Jasonloin    时间: 2020-11-6 20:32
谢谢分享
作者: 1853311832    时间: 2020-11-8 03:48
6666666666666666666666
作者: guaidaojidejs    时间: 2020-11-9 22:27
感谢楼主
作者: 表哥    时间: 2020-11-16 00:30
来支持一手大佬。
作者: 我的世界love    时间: 2020-11-18 07:51
636666666666
作者: Huashui_Aya    时间: 2020-11-24 10:57
感谢分享!
作者: shi_huai    时间: 2020-11-25 02:42
感谢作者,一直在找的禁用物品插件
作者: 沙漏丶刺痛了我    时间: 2020-11-26 18:24
顶顶顶
作者: Linz    时间: 2020-11-27 11:18
正需要这个呢
作者: 1561509141    时间: 2020-12-1 14:52
看起来不错!
作者: 1033789020    时间: 2020-12-2 16:31
感谢分享,服务器整合需要
作者: LingHao    时间: 2020-12-3 19:57
123
作者: yanqq    时间: 2020-12-4 10:16
正好需要
作者: 1293951870    时间: 2020-12-5 13:19
6666感谢LZ
作者: wdsj12345wdsj    时间: 2020-12-7 16:56
66666666666666666666666666
作者: czong    时间: 2020-12-12 16:49
感谢分享!
作者: czong    时间: 2020-12-12 16:49
谢谢楼主分享啊!!!!!




欢迎光临 最MC论坛 (http://www.zuimc.com/) Powered by Discuz! X3.2