使用方式(OverlayPlugin回调) - Natsukage/PostNamazu GitHub Wiki
此方法仅限配合OverlayPlugin使用,CactBot等依托于OverlayPlugin应用也可以使用此方法调用邮差。
类似于Triggernometry的具名回调方法,此方法只能接收来自同一ACT进程中的OverlayPlugin投递的指令,不能跨进程接收。
由于此方法不需要监听端口,因此不会与其他插件发生端口占用冲突,也不会出现因为端口不匹配而无法运行的问题
因此配合OverlayPlugin使用时,更推荐使用此方法调用邮差
在没有安装OverlayPlugin的ACT环境中运行时,此功能将自动禁用。
邮差本身不需要进行任何特别设置,只需在ACT中加载并启用即可。
需要注意,邮差的加载顺序需位于解析插件与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的\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的回调指令。