传奇HERO引擎自动添加全部行会至沙巴克攻城列表脚本 定时自动开启沙巴克配置教程

来源: 作者: 点击:
HERO引擎可通过定时器脚本实现自动抓取服务器内全部行会,批量添加到沙巴克攻城名单,到指定时间自动开启沙巴克战斗,无需GM手动添加行会、手动开启攻城,整套脚本依托全局定时器、行会遍历指令与沙巴克引擎内置命令,脚本存放于QFunction-0.txt,修改前备份Mir200脚本文件,防止语法错误导致M2加载异常。

全局定时器在[@Startup]服务启动事件内注册,服务器启动后自动创建循环计时器,设定每日固定时间执行行会遍历与攻城初始化。计时器使用全局定时器,到达预设时间触发[@AutoAddGuildCastle]标签,执行批量添加行会逻辑。计时器时间格式按照HERO引擎规范填写,支持时、分参数,设置在攻城开启前一段时间执行行会添加,预留足够时间完成名单写入。

[@AutoAddGuildCastle]作为核心遍历标签,首先执行CLEARCASTLEGUILD清空当前沙巴克攻城列表,避免旧行会残留,防止重复录入行会记录。接着调用GETGUILDCOUNT读取服务器内行会总数量,存入临时变量,使用循环语句从0到行会总数依次遍历,GETGUILDNAME读取对应序号行会名称,再执行ADDCASTLEGUILD把行会名称写入攻城列表。循环完成后发送全服公告,提示所有行会已加入沙巴克攻城,等待攻城开启。

沙巴克自动开启部分,单独设置另一组定时器,到达攻城开始时间执行[@AutoStartCastleWar],调用STARTCASTLEWAR指令启动沙巴克战斗,同时发送全服彩色公告。到达攻城结束时间,定时器触发[@AutoEndCastleWar],执行ENDCASTLEWAR结束攻城,判定攻城结果,发放沙巴克奖励。结束之后清空攻城列表,等待下一轮周期。

增加过滤条件,可设置过滤空白行会,行会人数不足指定数量的行会不加入攻城列表。遍历行会时读取行会人数,GETGUILDMEMBERCOUNT获取该行会成员数量,人数低于阈值则跳过ADDCASTLEGUILD,不加入攻城名单。也可增加黑名单,在脚本内使用多组CHECKGUILDNAME,匹配指定行会名称直接跳过,不参与自动录入。

沙巴克归属处理,脚本执行CLEARCASTLEGUILD只会清空攻城参与列表,不会变更当前沙巴克占有行会。如果需要每次攻城重置沙巴克归属,在清空攻城列表之后执行SETCASTLEGUILD,指定默认行会作为守城方;不执行该指令则沿用当前占领行会作为守城方,其余行会作为进攻方。

防重复执行逻辑,增加全局标记变量,脚本执行前检测标记,标记为0才执行批量添加行会,执行完成后将标记置1,防止同一时间多次触发循环脚本。设置攻城结束后重置标记变量,开启下一轮循环。避免定时器重复触发造成行会重复添加,引发攻城列表错乱。

NPC查询配套脚本,可选增加沙巴克状态查询NPC,玩家点击可以查看本轮参与攻城的行会名单、攻城开始结束时间。脚本读取沙巴克状态,判断是否处于攻城阶段,输出文字提示。

调试步骤,单机环境先注释定时器,手动执行[@AutoAddGuildCastle]测试行会遍历。查看M2日志,确认行会数量读取正常,行会名称依次添加,没有行会名称读取为空的报错。添加完成后查看攻城列表,核对行会数量。测试自动开启与结束,确认沙巴克战斗状态切换正常。调试阶段添加SENDMSG打印行会名称、行会人数,测试无误后删除调试输出语句,减少日志输出。重载M2脚本即可生效,无需重启服务端。

常见故障排查,行会无法全部加入攻城列表,优先检查循环变量写法,HERO引擎循环语法不支持无限循环,变量自增条件要设置正确,超出行会总数立刻跳出循环。行会名称为空报错,遍历的时候增加判断,读取到空行会名称直接跳过。自动时间到没有执行脚本,检查[@Startup]内定时器是否成功注册,M2全局定时器是否开启,核对时分参数格式。多次执行导致行会重复添加,确认脚本开头执行CLEARCASTLEGUILD,每次添加前清空攻城列表。攻城开启命令无效,确认HERO引擎支持STARTCASTLEWAR内置沙巴克指令,精简版本引擎移除该指令会执行失败。

资源占用注意,服务器行会数量较多时,批量遍历行会会短暂占用CPU资源,建议将自动添加行会的定时器设置在低在线时段执行,不要临近攻城瞬间大批量遍历行会。单次遍历完成后立刻跳出循环,不要持续循环读取行会数据。

扩展功能,可增加攻城奖励自动发放,攻城结束后判断获胜行会,给该行会会长或者全体成员发放道具、金币奖励。增加沙巴克提示,攻城开启前五分钟发送全服预告公告。可增加限制,同一个行会连续占领沙巴克多轮之后增加难度,或者自动轮换守城规则。

脚本编写注意,区分攻城参与列表和沙巴克占领行会,ADDCASTLEGUILD只是添加到攻城参与名单,不等于占领沙巴克。脚本执行顺序必须为先清空列表,再遍历添加行会,最后等待定时开启攻城。不要在攻城战斗进行中执行CLEARCASTLEGUILD,会直接中断正在进行的沙巴克战斗。

完整示例脚本片段
[@Startup]
#ACT
SETTIMER AutoCastle 0 19 0
SETTIMER AutoStartCastle 0 20 0
SETTIMER AutoEndCastle 0 22 0

[@TimerAutoCastle]
#ACT
MOV S0 0
CLEARCASTLEGUILD
GETGUILDCOUNT <$\(STR(S1)>
#IF
<\)$STR(S1)> > 0
#ACT
#WHILE
<$STR(S0)> < <$STR(S1)>
#ACT
GETGUILDNAME <$STR(S0)> <$STR(S2)>
GETGUILDMEMBERCOUNT <$STR(S2)> <$STR(S3)>
#IF
<$\(STR(S3)> >= 5
#ACT
ADDCASTLEGUILD <\)$STR(S2)>
#ELSEACT
BREAK
#ACT
INC S0 1
#ENDWHILE
SENDMSG 0 #G系统提示:已自动将全部符合条件行会加入沙巴克攻城列表,20点正式开启攻城。

[@TimerAutoStartCastle]
#ACT
STARTCASTLEWAR
SENDMSG 0 #R沙巴克攻城已经正式开启,各行会可争夺沙巴克!

[@TimerAutoEndCastle]
#ACT
ENDCASTLEWAR
SENDMSG 0 #Y沙巴克攻城已结束,获胜行会获得沙巴克所有权。

脚本内时间参数按需修改,行会人数阈值5可自行调整。HERO引擎定时器标签区分大小写,变量自增INC S0 1为引擎原生指令,循环结束条件不可省略。