您尚未登录,请登录后浏览更多内容! 登录 | 加入最MC

QQ登录

只需一步,快速开始

 找回密码
 加入最MC

QQ登录

只需一步,快速开始

查看: 172280|回复: 327

[转载插件] [管理|安全]Banitem With Nbt —— 更好的封禁物品插件,支持NBT[1.7-1.15]

  [复制链接]
  • TA的每日心情
    奋斗
    2022-8-20 13:28
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2020-5-5 11:19:20 | 显示全部楼层 |阅读模式
    服务端插件
    中文名称: Banitem With Nbt
    英文名称: Banitem With Nbt
    来源: 转载
    类型: |Bukkit/Spigot插件| |其它| 
    前置插件:
    原帖地址: http://zuimc.com
    下载地址: http://zuimc.com
    更新时间: 2020-05-05
    语言支持: 简体中文 
    本帖最后由 夕离丶 于 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]

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?加入最MC

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    开心
    2020-5-7 20:30
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-5-7 20:43:27 | 显示全部楼层
    来支持一手大佬。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

    该用户从未签到

    发表于 2020-5-23 16:56:23 | 显示全部楼层
    有点牛皮啊
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
  • TA的每日心情
    开心
    2023-4-30 20:01
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2020-5-23 19:50:24 | 显示全部楼层
    感谢大佬56666
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

    该用户从未签到

    发表于 2020-5-23 20:38:48 | 显示全部楼层
    正式我要找的插件,感谢楼主大大
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

    该用户从未签到

    发表于 2020-5-23 20:49:21 | 显示全部楼层
    6666666666666666666
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

    该用户从未签到

    发表于 2020-5-24 10:18:36 | 显示全部楼层
    感谢楼主分享
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    您需要登录后才可以回帖 登录 | 加入最MC

    本版积分规则