EventJS
是一个 KubeJS 附加模组,为 KubeJS 添加了可重载的原生事件支持。
使用 EventJS,你可以:
- 无需重启整个游戏即可刷新原生事件监听器,或将处理器存储在
global['someId']中,这既更简单又更高效。 - 按需添加/移除原生事件监听器而无需重启游戏,这在 KubeJS 1.16-1.20 版本中是不可能的
- 防止原生事件监听器出错时导致游戏崩溃
- 仅在服务端或客户端添加事件监听器
使用方法
默认情况下,EventJS 会替换原有的原生事件监听方法,使其变得可重载。因此,你实际上不需要学习任何新知识就能使用 EventJS,只需安装它,你的 Forge 事件监听就会变得可重载了。
但是,如果你正在寻找更动态和定义更明确的事件监听方式,你可以使用 NativeEvents.onEvent(...),以及用于泛型事件监听的 NativeEvents.onGenericEvent(...)。
NativeEvents 将可用于所有 3 种脚本类型(客户端/服务端/启动),因此你可以执行侧限定的事件监听,例如,在 client_scripts 中监听仅客户端事件,那么此事件监听将不会在服务端发生。
语法(v1.0.0~1.3.0)
NativeEvents.onEvent(eventType, handler)
NativeEvents.onEvent(priority, receiveCancelled, eventType, handler)
NativeEvents.onGenericEvent(genericClassFilter, eventType, handler)
NativeEvents.onGenericEvent(genericClassFilter, priority, receiveCancelled, eventType, handler)
JS 端的 handler 是一个接收事件的回调函数,例如:(event) => {...}
eventType 和 genericClassType 是能够表示类的东西,比如包含事件类名的字符串,或者通过 java(...) 或 Java.loadClass(...) 加载的事件类本身。
let handler: (event: AnyForgeEvent) => void
let eventType: string | Class
let genericClassFilter: string | Class
let priority: $EventPriority | "highest" | "high" | "normal" | "low" | "lowest"
let receiveCancelled: boolean
1.4.0 版本的变化
在 EventJS 1.4.0 中,为了支持 ProbeJS Legacy 开箱即用,eventType 和 genericClassFilter 将仅主动支持通过 java(...)(1.16.5)或 Java.loadClass(...)(1.20.1)加载的 Class。
let eventType: Class
let genericClassFilter: Class
支持的版本
1.0.0: 1.16.5
1.1.0: 1.16.5, 1.20.1
1.2.0: 1.16 到 1.20 之间的所有主要版本
你知道吗
我制作这个模组的原因是 KubeJS 在实现类似功能时异常缓慢。他们直到 KubeJS 更新到 1.21 版本后才添加了原生事件监听器重载功能,将 1.16~1.20 之间的所有版本都抛在了后面。
适用于 1.21+ 的 KubeJS 也包含对原生事件监听器重载的支持,使用相同的名称 NativeEvents,但其实现方式与 EventJS 不同,因此在通过 Java 与 EventJS 内部交互时请不要做出假设。