使用方式(OverlayPlugin回调) - Natsukage/PostNamazu GitHub Wiki

此方法仅限配合OverlayPlugin使用,CactBot等依托于OverlayPlugin应用也可以使用此方法调用邮差。
类似于Triggernometry的具名回调方法,此方法只能接收来自同一ACT进程中的OverlayPlugin投递的指令,不能跨进程接收。
由于此方法不需要监听端口,因此不会与其他插件发生端口占用冲突,也不会出现因为端口不匹配而无法运行的问题
因此配合OverlayPlugin使用时,更推荐使用此方法调用邮差

在没有安装OverlayPlugin的ACT环境中运行时,此功能将自动禁用。

邮差本身不需要进行任何特别设置,只需在ACT中加载并启用即可。
需要注意,邮差的加载顺序需位于解析插件OverlayPlugin之后。否则将不会注册OverlayPlugin的回调动作。对于新版本的OverlayPlugin,还有可能导致OverlayPlugin加载时报错。

当邮差正确注册OverlayPlugin的回调时,在OverlayPlugin的界面中将会看到一个名为鲶鱼精邮差的空白标签。

如图所示

配合OverlayPlugin使用

在网页中引用OverlayPlugin的common.min.js

<script type="text/javascript" src="https://ngld.github.io/OverlayPlugin/assets/shared/common.min.js"></script>

如果你位于中国境内,推荐引用这里的镜像文件。

<script type="text/javascript" src="https://overlay.diemoe.net/common/common.min.js"></script>

随后通过callOverlayHandler()方法将指令通过回调传递给邮差。 callOverlayHandler()接收一个JSON字符串为参数,其中call固定为'PostNamazu',c为指令类型,p为指令内容。
例如

<input type="text" id="tcommand" value='/e 123'>
<button type="button" onclick="callOverlayHandler({call:'PostNamazu', c:'command', p:tcommand.value});">command</button>

在OverlayPlugin悬浮窗中添加网页,按下按钮后,在游戏内看到默语频道的提示文字,即为配置成功。

为简化测试步骤,可以直接新建悬浮窗并指定路径为https://toys.senriakane.com/OverlayNamazuTest/,刷新悬浮窗后即可进行测试。

配合Cactbot使用

在Cactbot的\user\raidboss\文件夹下新建任意后缀名为.js的文件。
输入以下内容:

Options.Triggers.push({
  zoneId: ZoneId.MatchAll,
  triggers: [
    {
      id: "PostNamazu Callback Test",
      netRegex: NetRegexes.gameNameLog({ line: "postnamazu", capture: false }),
      promise: async (data) => {
        const combatants = (await callOverlayHandler({ call: "getCombatants" })).combatants;
        const player = combatants.find((v) => v.Name === data.me);

        // command 文本指令
        callOverlayHandler({ call: "cactbotSay", text: "command" });
        callOverlayHandler({ call: "PostNamazu", c: "command", p: "/e 123" });

        // place 本地标点
        await wait(2000);
        callOverlayHandler({ call: "cactbotSay", text: "place" });
        callOverlayHandler({
          call: "PostNamazu",
          c: "place",
          p: JSON.stringify({ A: { X: player.PosX, Y: player.PosZ, Z: player.PosY, Active: true } }),
        });

        // mark 标记
        await wait(2000);
        callOverlayHandler({ call: "cactbotSay", text: "mark" });
        callOverlayHandler({
          call: "PostNamazu",
          c: "mark",
          p: JSON.stringify({ ActorID: player.ID, MarkType: "square", LocalOnly: false }),
        });

        // preset 写入预设标点
        await wait(2000);
        callOverlayHandler({ call: "cactbotSay", text: "preset" });
        callOverlayHandler({
          call: "PostNamazu",
          c: "preset",
          p: JSON.stringify({
            Name: "Slot5",
            MapID: 676,
            A: { X: -170.684, Y: -0.204, Z: 464.994, Active: true },
            C: { X: -171.698, Y: 0.022, Z: 470.941, Active: true },
          }),
        });

        // queue 队列执行指令
        await wait(2000);
        callOverlayHandler({ call: "cactbotSay", text: "queue" });
        callOverlayHandler({
          call: "PostNamazu",
          c: "queue",
          p: JSON.stringify([
            { c: "qid", p: "PostNamazu Test" },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack1", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack2", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack3", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack4", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack5", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack6", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack7", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "attack8", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "bind1", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "bind2", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "bind3", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "stop1", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "stop2", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "square", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "circle", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "cross", LocalOnly: true }), d: 1000 },
            { c: "mark", p: JSON.stringify({ ActorID: player.ID, MarkType: "triangle", LocalOnly: true }), d: 1000 },
          ]),
        });
      },
    },
  ],
});

function wait(milliseconds) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve();
    }, milliseconds);
  });
}

可以任意修改run: ()部分中的指令内容与顺序,保存并重载Cactbot后,在游戏中发送/e postnamazu,即可看到指令成功执行。

注意:使用此方法调用邮差时,无关主界面中的“端口”“启动”“停止”“自动启动”选项的状态。即使你没有点击启动,只要邮差已经加载,就会执行所有收到的OverlayPlugin的回调指令。

⚠️ **GitHub.com Fallback** ⚠️