背包变更事件

基本信息

属性 值
事件基类 com.gtnewhorizon.gtnhlib.event.InventoryChangedEvent(extends PlayerEvent)
具体子类 InventoryChangedEvent.ItemAdded、InventoryChangedEvent.ItemRemoved
源码 src/main/java/com/gtnewhorizon/gtnhlib/event/InventoryChangedEvent.java
扫描间隔配置 GTNHLibConfig.inventoryScanInterval(默认 5 tick,范围 1–200)
调试开关 GTNHLibConfig.debugInventoryEvents(默认 false)

功能

玩家背包中某物品的持有总量发生变化时触发。README 的描述(README.md Events 节):

Fires InventoryChangedEvent when a player’s net item holdings change. Subscribe to ItemAdded or ItemRemoved, which carry the changed ItemStack, a signed delta, and inventoryCount, the player’s total of that item after the change.

匹配规则(README 同节):

Items are matched by type and metadata ignoring NBT, so sorting an inventory fires nothing. Scans run every few ticks (configurable).

即比较 Item 引用与 meta,忽略 NBT(附魔、耐久、自定义数据都不参与),因此整理背包不会误触发。

字段与方法

InventoryChangedEvent 是抽象基类:

成员 类型 说明
item ItemStack 发生变化的物品
inventoryCount int 变化之后玩家持有的该物品总量
getCount() int 返回 inventoryCount
getDelta() int 抽象,子类返回带符号变化量

两个子类的 getDelta() 分别为 +1(ItemAdded)与 -1(ItemRemoved)。

为何拆成两个子类(InventoryChangedEvent.java:9-10 注释):

ItemAdded / ItemRemoved subclasses (1.7.10 Forge cannot register against abstract base without no-arg constructor)

即 1.7.10 的 Forge 事件总线无法在抽象基类上注册(缺无参构造),故拆分为两个可实例化的具体类。

数值

数值名 值
事件类数 3(1 抽象基类 + 2 具体子类)
公开字段 2(item、inventoryCount)
getDelta() 绝对值 恒为 1
默认扫描间隔 5 tick(= 每 0.25 秒)
扫描间隔范围 1–200 tick

inventoryScanInterval 越高越省 CPU 但时间粒度越粗(GTNHLibConfig.java:99-100 注释):

Higher = less CPU but coarser timing. 1 = every tick.

交互

订阅方式(经 自动事件总线):

@EventBusSubscriber
public class MyHandler {
    @SubscribeEvent
    public static void onAdd(InventoryChangedEvent.ItemAdded e) { ...; }
}

debugInventoryEvents = true 时额外注册 InventoryEventDebugHandler 到 MinecraftForge.EVENT_BUS(CommonProxy.java:116-118),把每次增删打到控制台。GTNHLib 自身通过 inventoryScanInterval 读取该配置(eventhandlers/PlayerInventoryEventHandler.java:53)。

相关条目