在传奇游戏的服务端架设中,控制特定BOSS的刷新逻辑是核心玩法之一。针对你提出的需求——在指定地图限制蚩尤BOSS的数量为一只,且必须在死亡后触发30分钟倒计时再次刷新,这需要编写一个结合了“存在性检测”与“延时执行”的脚本。
实现这一功能主要依赖于M2Server引擎的脚本命令,核心逻辑分为两部分:首先是一个循环检测脚本,用于判断BOSS是否存在;其次是一个触发机制,在BOSS死亡时启动计时器。以下是具体的脚本编写思路和代码示例,适用于大多数主流引擎(如GOM、GEE、V8等)。
核心逻辑与变量设置
在编写脚本之前,我们需要定义一个全局变量或区间变量来记录“是否正在计时”或“是否允许刷新”。假设我们使用全局布尔变量 G0 作为标记:
G0 = 0:表示当前没有BOSS,且不在计时中(或者计时结束,可以刷新)。
G0 = 1:表示BOSS已死亡,正在倒计时中,禁止刷新。
同时,脚本需要实时检测地图上是否存在“蚩尤”这个怪物。
机器人脚本编写
我们需要在 M2Server 的机器人脚本设置中(通常在登录器配置器或M2控制台设置),添加一个循环执行的脚本。这个脚本每隔几秒钟运行一次,负责“巡逻”。
脚本代码示例:
[@Main]
; 第一步:检测地图上是否存在蚩尤BOSS
; 假设蚩尤的怪物名字是“蚩尤”,地图号是“3”(请根据实际情况修改地图号和怪物名)
MONCOUNT 3 蚩尤 A0
; 第二步:根据检测结果判断逻辑
; 如果A0等于0,说明地图上没怪了
; 如果A0大于0,说明怪还活着,什么都不做,直接退出循环等待下次检测
MOV G1 A0
IF G1 > 0
BREAK
ENDIF
; 第三步:如果怪死了(A0=0),检查是否正在计时
; 如果G0=1,说明已经触发过死亡事件,正在倒计时,不重复触发
IF G0 = 1
BREAK
ENDIF
; 第四步:如果怪死了且没在计时,触发刷新逻辑
; 1. 标记正在计时
MOV G0 1
; 2. 提示全服或特定玩家(可选)
GIVEGROUPEMSG 30 蚩尤已死亡,30分钟后将重新刷新!
; 3. 启动30分钟延时脚本
; 注意:不同引擎延时命令不同,GOM/GEE常用DELAYGOTO,单位通常是秒
; 30分钟 = 1800秒
DELAYGOTO 1800 @DoRefresh
; 5. 结束当前循环
BREAK
[@DoRefresh]
; 这里是延时结束后的执行标签
; 1. 再次确认一下地图上是否真的没有怪(防止极端情况)
MONCOUNT 3 蚩尤 A0
IF A0 > 0
MOV G0 0
BREAK
ENDIF
; 2. 执行刷新命令
; 这里的坐标 100 100 是示例,请替换为你想要的刷新点坐标
; MONCREEATE 地图号 怪物名 X Y
MONCREATE 3 蚩尤 100 100
; 3. 提示刷新成功
GIVEGROUPEMSG 30 蚩尤已经刷新,快去挑战吧!
; 4. 重置计时标记,允许下一次死亡检测
MOV G0 0
BREAK
怪物死亡触发机制
上述脚本依赖于 DELAYGOTO 的延时功能。为了确保万无一失,部分引擎还支持在怪物的 KillStr 或死亡触发脚本中直接写入逻辑,但最通用的方法还是上述的“轮询检测法”。
如果你使用的是支持怪物死亡直接调用脚本的引擎(如某些版本的GEE),可以在怪物的数据库脚本字段或 Monster.txt 对应的脚本段中加入:
[@KILL]
; 当蚩尤被杀死时执行
; 直接触发一个独立的计时脚本,或者设置一个标志位
MOV G0 1
DELAYGOTO 1800 @DoRefresh
但通常推荐将逻辑统一放在机器人的 @Main 循环中,因为这样便于管理,且能防止因怪物异常死亡(如被踢下线、数据丢失)导致的脚本卡死。
关键参数与注意事项
地图编号:脚本中的 3 代表地图编号。你需要查看引擎的 MapInfo.txt 或使用工具获取“蚩尤”所在地图的确切编号。
怪物名称:蚩尤 必须与 Monster.txt 中的怪物名称完全一致,包括空格和特殊符号。
时间单位:DELAYGOTO 的单位在不同引擎中可能不同,有的是秒,有的是毫秒。如果是毫秒,30分钟应写为 1800000。请务必先进行测试。
变量冲突:确保 G0 变量没有被脚本的其他部分占用。如果是多地图多BOSS,建议使用不同的变量(如 G1, G2)来区分不同BOSS的计时状态。
防卡死机制:在 [@DoRefresh] 中再次检测 MONCOUNT 是个好习惯。如果在30分钟内,管理员手动刷了一只蚩尤,脚本检测到有怪,就不会再重复刷,避免地图出现两只BOSS。
通过以上脚本配置,即可实现蚩尤BOSS“单只存在、死后30分钟复活”的闭环逻辑。这种写法逻辑清晰,占用资源少,是传奇脚本开发中的标准做法。

