如图 报错文件 如何修复
初步推测为CatServer与该mod不兼容。尝试更新两者到最新版本,还不行就换个服务端
道家深湖 发表于 2021-2-6 19:15
初步推测为CatServer与该mod不兼容。尝试更新两者到最新版本,还不行就换个服务端 ...
catsever端 和 插件不兼容吗 方便丢下相关下载链接吗
 本帖最后由 Lonely丶独独 于 2021-2-6 19:20 编辑 
用这个
 [B][物品]BanItem_with_NBT.jar
(434.05 KB, 下载次数: 6)
[B][物品]BanItem_with_NBT.jar
(434.05 KB, 下载次数: 6)
 
汉化文件
 lang.yml
(1.89 KB, 下载次数: 5)
lang.yml
(1.89 KB, 下载次数: 5)
 
教程 超长 慎点
命令 所有命令支持Tab自动补全
命令参数 所有参数支持Tab自动补全
所有物品禁用权限(Flag)
配置多世界继承
如何配置防止法杖使用禁用核心(类似还有枪,植物魔法透镜)
如何配置相同id的[物品/方块(地上的)]
如何设置物品NBT值来使用JS解析(Ban附魔和泰拉镐为例子)
常见问题与回答
关于判断优先度以及判断方法
用这个
汉化文件
教程 超长 慎点
| 权限,所有权限op拥有(可以通过添加非权限取消) | 
命令 所有命令支持Tab自动补全
| 命令规则 中括号[]包裹的表示该项可填可不填,尖括号<>包裹的表示该项为必填, 竖线|分隔的表示多个可选项,例如<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] 重载插件 | 
命令参数 所有参数支持Tab自动补全
| 很多人都不知道参数是干嘛用的,都认为很难理解,其实完全不用担心,比起一个需要输入一定 顺序的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/,代表就是默认世界 | 
所有物品禁用权限(Flag)
| Drop: 需要3.0.31版本及以上才有该Flag 描述: 物品丢弃 适用事件: 物品丢弃事件,可以用来防止熊孩子乱丢铀238 Pickup: 需要3.0.31版本及以上才有该Flag 描述: 物品拾取 适用事件: 物品拾取事件 Break: 描述: 方块破坏 适用事件: 方块破坏事件 Craft: 描述: 取出合成物品 适用事件: 背包点击事件 Hold: 描述: 切换物品拿着东西事件 适用事件: 切换物品事件 Interact: 描述: 交互方块 适用事件: 玩家交互事件 Inv: 描述: 背包内存在 适用事件: 几乎插件监听的所有事件适用 Place: 描述: 方块放置 适用事件: 方块放置事件 Use: 描述: 使用物品 适用事件: 玩家交互事件 UseInNBT: 描述: 在NBT中使用的权限 适用事件: 玩家交互事件 | 
配置多世界继承
| 配置例子 /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: - 四世界禁用列表 | 
如何配置防止法杖使用禁用核心(类似还有枪,植物魔法透镜)
| 1.先手上拿着法杖输入/banitem nbt add d:-1 不用担心上面这个命令,上面这个并不是ban物品的命令,只是把法杖加到nbt检查列表 2.拿着要ban的核心输入/banitem add f:useinnbt 此命令值禁止了核心在NBT中使用的权限 如果想要设置没收,/banitem add f:useinnbt c:true 操作完毕之后,核心上到法杖上后,插件会到法杖的nbt中查找被禁用的物品 如果配置了核心没收,那么法杖会一起被没收 如果你不想法杖被一起没收,可到主配置文件中设置配置节点RemoveBanedItemFromNBT为true 这样只要法杖本身没被禁,就只会移除被禁用的核心,法杖不会被没收 | 
如何配置相同id的[物品/方块(地上的)]
| ----------------==物品篇==---------------- 1.手上先拿着要ban的物品,输入/banitem nbtdump,结果如下(这是一把拔刀)  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.然后地上的花直接撸就不能撸掉了 ----------------==方块篇结束==---------------- | 
如何设置物品NBT值来使用JS解析(Ban附魔和泰拉镐为例子)
| 插件如何判断是使用正常的字符串匹配来比较还是用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.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语句太长了想要直接编辑文件,一定要注意单引号的转义,单引号是配置文件的边界符号,所以如果字符串 中包含了单引号,写到文件里一定要改成两个,所以可以的话,尽量不要使用单引号,可以使用双引号代替单引号 | 
常见问题与回答
| 注意,此问答只针对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 命令查看一下 | 
关于判断优先度以及判断方法
| 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值匹配 |