传奇定时自动攻沙城脚本配置全流程与多引擎命令差异详解

来源: 作者: 点击:
定时自动攻沙城是通过服务端机器人脚本系统实现的,核心逻辑是在指定时间点触发攻沙命令,将攻城申请自动提交给引擎,使沙巴克攻城战按预设时间准时开启。整个配置过程涉及两个关键文件的协同工作,以及不同引擎之间命令格式的适配。

## 机器人脚本双文件配合机制

自动攻沙的实现依赖于Robot_def文件夹下的两个脚本文件。AutoRunRobot.txt负责时间触发,RobotManage.txt负责执行具体命令。在AutoRunRobot.txt中添加定时指令:

```
#AutoRun NPC RUNONDAY 19:30:00 @开始攻城
```

这行代码的含义是每天19点30分执行标注为“@开始攻城”的脚本段。时间参数RUNONDAY表示每日运行,如需改为每周六攻城,可将参数替换为RUNONWEEK 6 19:30:00。

在RobotManage.txt中添加对应的执行脚本段:

```
[@开始攻城]
#ACT
AddAttackSabukAll 0
SENDMSG 0 [攻城提示]沙巴克争霸战将于今天晚上8点准时开启,请各行会做好战前准备!
```

其中AddAttackSabukAll 0中的参数“0”代表沙巴克城堡的默认编号,无需修改。SENDMSG用于向全服发送攻城预告通知。

需要特别注意的是,机器人脚本在19:30触发的是“提交攻城申请”这个动作,实际的攻城战开始时间仍然由引擎参数中的攻城开启时间决定,通常设定为20:00。

## 各引擎攻沙命令对照

不同引擎的攻沙命令存在差异,配置前需确认服务端所使用的引擎类型。

HERO引擎使用AddAttackSabukAll命令,格式为`AddAttackSabukAll 0`,参数0为城堡编号。

GOM引擎同样使用AddAttackSabukAll命令,写法与HERO一致。在RobotManage中添加`#AutoRun NPC RUNONDAY 19:30 @攻沙设置`即可在每天特定时间自动呼出攻沙命令。

LEG引擎的命令格式不同,需使用Gmexecute AddToCastleWarList命令,格式为`Gmexecute AddToCastleWarList 0 *`,其中星号表示所有行会,无需逐个提交祖玛头像即可参与攻城。

BLUE引擎的命令与LEG类似,同样使用AddToCastleWarList,可配合ISATTACKGUILD和ISCASTLEGUILD等判定命令使用。

GEE引擎的攻沙命令与GOM接近,但在怪物刷新等扩展功能上指令格式有所不同,GEE引擎使用MOBPLACE命令,GOM引擎则使用SpawnMonster命令。

## 开区天数判断与首次攻沙控制

多数运营场景需要控制开区后第几天开启首次攻沙,之后转为每日固定攻沙。这一功能通过G变量或HUM变量记录开区天数实现。

在QManage.txt的登录触发段中添加天数统计逻辑,使用CheckServerOpenDay命令读取开区时长:

```
[@Login]
#IF
CheckServerOpenDay<1
#ACT
SetVarHUM 开区天数 1
SaveVarHUM 开区天数 ..\Envir\QuestDiary\变量存储.txt
#ELSE
#ACT
LoadVarHUM 开区天数 ..\Envir\QuestDiary\变量存储.txt
IncVarHUM 开区天数 1
SaveVarHUM 开区天数 ..\Envir\QuestDiary\变量存储.txt
```

变量存储于专属文件,避免服务器重启后数据丢失。CheckServerOpenDay为HERO引擎自带命令,可直接读取开区时长,无需额外配置。

另一种实现方式是在AutoRunRobot.txt中设置每日00:01执行天数递增:

```
#AutoRun NPC RUNONDAY 00:01 @开区天数

[@开区天数]
#IF
#ACT
Inc G1 1
```

然后在攻沙脚本段中通过判断G1变量的值来决定是否提交攻城申请。例如开区第二天攻城,判断条件写为`LARGE G1 0`;开区第三天则改为`LARGE G1 1`,依次类推。

攻沙提交脚本段结合天数判断的完整写法:

```
[@开始攻城]
#IF
LARGE G1 1
#ACT
AddAttackSabukAll 0
SENDTOPCHATBOARDMSG 0 255 249 60 [攻城信息]:今晚20:00开启沙巴克攻城战,请所有行会做好战斗准备!
break
```

此脚本在G变量大于1(即开区第二天)时才执行攻沙提交,同时通过SENDTOPCHATBOARDMSG发送屏幕滚动公告。

## 攻沙结束判定与奖励发放脚本

攻沙结束后需要自动获取获胜行会信息,为后续NPC发放奖励提供依据。HERO引擎在QManage.txt中配置结束触发脚本:

```
[@SandAttackEnd]
#ACT
GetSandWinner 行会名称
SaveVarGLOBAL 获胜行会 行会名称 ..\Envir\QuestDiary\变量存储.txt
SetVarGLOBAL 攻沙奖励可领取 1
SaveVarGLOBAL 攻沙奖励可领取 ..\Envir\QuestDiary\变量存储.txt
SendMsg 0 本次攻沙结束!获胜行会可前往指定NPC领取奖励! 255 3
```

@SandAttackEnd为HERO引擎攻沙结束自带触发标识,GetSandWinner命令自动获取占领皇宫的获胜行会名称,全局变量记录确保NPC脚本可读取该信息。

GOM引擎的攻城结束判定需通过全局计时脚本实现。在QFunction-0.txt中添加以攻城结束时间为基准的倒计时脚本,5分钟后触发奖励推送。该脚本需分“全局计时脚本”“城主奖励脚本”“全服消息脚本”三部分,分别实现计时、发奖、推送功能。

NPC奖励脚本需判断攻沙类型(首次或日常),区分不同奖励额度。以HERO引擎为例,通过检查攻沙次数变量来确定奖励档位,首次攻沙发放较高额度奖励,后续日常攻沙发放基础额度,同时记录领取状态避免重复领取。

## 引擎时间参数与配置校验

脚本配置完成后,还需在引擎控制台中确认时间参数与脚本触发时间保持一致。打开M2Server引擎主界面,依次点击“选项”、“参数设置”、“时间控制”,找到攻城开始时间设置项。该参数默认值为20:00,需与实际攻沙开始时间同步修改。

攻城持续时间默认120分钟,可根据运营需求调整。禁止占领时间默认在攻沙开始后1分钟内不允许占领,攻沙结束提示时间默认10分钟,爆物品可捡时间默认2分钟。这些参数均可在同一界面中修改。

对于GOM引擎,如果版本中存在自带的自动攻沙脚本,可通过脚本编辑器搜索“AddAttackSabukAll”或“AddToCastleWarList”关键字,分析现有脚本的功能是否可用,避免重复配置导致冲突。

## 常见配置问题排查

脚本配置后攻沙未按预期时间触发时,按以下顺序排查:先确认AutoRunRobot.txt中时间格式是否正确,24小时制格式为HH:MM:SS或HH:MM;再检查RobotManage.txt中脚本标签名称是否与AutoRunRobot.txt中引用的标签完全一致,包括大小写;然后确认机器人脚本文件保存后是否重启了服务端或执行了脚本重载命令。

部分引擎要求机器人脚本文件的编码为ANSI格式,UTF-8格式会导致中文标签或公告内容读取乱码,从而引发脚本解析失败。

若攻沙已开启但玩家无法进入沙巴克皇宫,需检查MapInfo.txt中沙巴克地图是否已添加FIGHT参数以允许地图内战斗,以及地图链接点是否正确指向皇宫坐标。复活点脚本也需同步调整,确保攻城状态下玩家死亡后传送至安全区而非攻城地图内部。

使用假人系统参与攻沙的版本,还需在开区时运行假人行会初始化程序,确保假人具备行会归属,否则假人无法参与攻城战。