物品使用限制

基本信息

属性 值
实现类 com.github.namikon.blocklimiter.events.ItemUseEvent
监听事件 net.minecraftforge.event.entity.player.PlayerInteractEvent
事件总线 MinecraftForge.EVENT_BUS
订阅优先级 EventPriority.HIGHEST
注册时机 BlockLimiter.postInit 当 Config.LoadConfig() 成功时

触发条件

  1. event.entityPlayer.worldObj.isRemote 时直接 return(仅服务端生效)。
  2. Action == LEFT_CLICK_BLOCK 或 !event.isCancelable() 时直接 return。
  3. 当玩家处于创造模式且 BlockLimiter.Config.DenyCreativeMode == false 时直接 return。
  4. 玩家手持物为空时直接 return。
  5. 通过 ItemDescriptor.fromStack(equippedItem) 取得物品描述符;若为 null(如 Pam’s Harvestcraft 食物)则直接 return(代码注释中标注 “Duct-Tape pam’s food”)。
  6. 遍历 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,被显式放行——这是代码注释明确承认的临时方案。

相关条目