主题
事件清单
ctx.events.on(name, handler) 订阅的事件来自作弊端内部的全局总线 findorCheat.cheatEventBus:加载器会在初始化时安装一次性桥接,把每一个全局事件转发给所有已加载 Mod 的 ctx.events。
js
export function onEnable(ctx) {
off = ctx.events.on('game:enterBattle', () => {
ctx.ui.notify('进入战斗', 'info');
});
}
export function onDisable(ctx) {
off?.();
}已知事件
| 事件名 | 触发时机 | 说明 |
|---|---|---|
game:enterBattle | 进入战斗 | 战斗初始化完成后 |
game:leaveBattle | 离开战斗 | 返回大厅时 |
game:enterLobby | 进入大厅 | 大厅就绪 |
aimed | 自瞄锁定目标 | 携带一个对象参数,建议先 console.log 观察字段 |
targetLost | 自瞄失去目标 | 目标消失/离开视野 |
protocol:method | 任一协议方法触发 | 参数为 payload(含方法名等信息) |
protocol:method:<MethodName> | 指定协议方法触发 | 例如 protocol:method:MoveCommand |
announcement:ready | 公告数据就绪 | 可读取公告内容 |
code:webpackReqReady | webpack require 就绪 | 注入阶段;此时可访问游戏模块表 |
cheat:getPageClasses | 内部:收集页面类 | 一般不需要自己监听 |
参数形态
上表中只有部分事件带参数(如 aimed、protocol:method)。最稳妥的写法是先把参数打印出来:
js
ctx.events.on('aimed', (...a) => ctx.logger.log('aimed args', a));自定义事件
只在你的 Mod 内部传递
js
ctx.events.on('my:thing', (v) => ctx.logger.log('收到', v));
ctx.events.emit('my:thing', 42); // 只触发本 Mod 的监听广播给所有 Mod(含自己)
js
findorCheat.cheatEventBus.emit('my:thing', 42);因为桥接是双向可见的:任何走 cheatEventBus.emit 的事件都会转发给每个 Mod 的 ctx.events,所以其他 Mod 也能用 ctx.events.on('my:thing', ...) 收到。
事件名建议加命名空间
用 modId:something 或 my-mod:ready 这类前缀,避免和内置事件或别人的 Mod 撞名。
与轮询的选择
没有对应事件时(例如"每帧"或"血量变化"),可以自己用 requestAnimationFrame 或 setInterval 轮询,但记得在 onDisable 里停掉:
js
let raf;
export function onEnable(ctx) {
const tick = () => { /* ... */ raf = requestAnimationFrame(tick); };
raf = requestAnimationFrame(tick);
ctx.onCleanup(() => cancelAnimationFrame(raf));
}下一步:ctx 全量 API · 常见问题排查