物品使用限制
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | 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查询当前生效的禁止物品列表