Skip to content

事件清单 ​

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:webpackReqReadywebpack 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 · 常见问题排查

仅供学习交流 · 请在遵守游戏与服务条款的前提下使用