物品使用限制
基本信息
| 属性 |
值 |
| 实现类 |
com.github.namikon.blocklimiter.events.ItemUseEvent |
| 监听事件 |
net.minecraftforge.event.entity.player.PlayerInteractEvent |
| 事件总线 |
MinecraftForge.EVENT_BUS |
| 订阅优先级 |
EventPriority.HIGHEST |
| 注册时机 |
BlockLimiter.postInit 当 Config.LoadConfig() 成功时 |
触发条件
event.entityPlayer.worldObj.isRemote 时直接 return(仅服务端生效)。
Action == LEFT_CLICK_BLOCK 或 !event.isCancelable() 时直接 return。
- 当玩家处于创造模式且
BlockLimiter.Config.DenyCreativeMode == false 时直接 return。
- 玩家手持物为空时直接
return。
- 通过
ItemDescriptor.fromStack(equippedItem) 取得物品描述符;若为 null(如 Pam’s Harvestcraft 食物)则直接 return(代码注释中标注 “Duct-Tape pam’s food”)。
- 遍历
BlockLimiter.Config.LimitedItems,对每条 ItemInfo 调用 isDenied(tID, player.dimension)。
与 BlockPlaceEvent 不同:本事件使用 HIGHEST 优先级,即在大多数其他 mod 之后触发,可能被其他 mod 抢先 setCanceled。
判定逻辑(ItemInfo.isDenied)
if (_mItemDescriptor.isEqualTo(pID, ItemEqualsCompareMethodEnum.Exact)) {
if (_mBannedDimensions.contains(pDimensionID) || _mGlobalDenied) tResult = true;
}
- 使用
YAMCore 的 ItemDescriptor + ItemEqualsCompareMethodEnum.Exact(精确匹配 meta 与 NBT)。
- 与
BlockInfo 大小写不敏感匹配不同,ItemInfo 使用 ItemDescriptor 自带的精确匹配策略。
拦截后的反馈
| 步骤 |
行为 |
| 音效 |
playSoundAtEntity(player, SFXOnItemDeny, 1F, 1F);空字符串则静音 |
| 消息 |
从 RandomItemDenyMessages 中随机选一条,通过 PlayerChatHelper.SendNotifyWarning 发送给玩家 |
| 异常保护 |
try/catch 捕获任何运行时异常,避免崩溃 |
数值
| 数值 |
默认值 |
| 默认拒绝消息数量 |
4 条(RandomItemDenyMessages) |
| 默认拒绝音效 |
minecraft:ambient.weather.thunder |
默认 DenyCreativeMode |
false |
限制
- 仅对
PlayerInteractEvent 生效,因此左键攻击方块/实体(LEFT_CLICK_BLOCK / 攻击实体)不在拦截范围——只拦截右键交互(包括右键方块、右键空气、右键实体)。
HIGHEST 优先级意味着其他 mod 取消事件后,本监听器可能根本不会跑到判定逻辑(事件被前置取消后仍会到达所有订阅者,但其他 mod 可能已经改变了物品状态)。
ItemDescriptor.fromStack 对 Pam’s Harvestcraft 的食物返回 null,被显式放行——这是代码注释明确承认的临时方案。
相关条目
- 方块放置限制 - 同一机制的方块版本,使用
BlockEvent.PlaceEvent
- BlockLimiter 配置 -
ItemList / ItemRejectMessages / SFXOnItemDeny 配置项
- /blimit 指令 - 通过
/blimit iteminfo 查询当前生效的禁止物品列表