核心逻辑设计思路
定时刷怪需解决两个关键问题:时间周期控制与怪物状态检测。使用全局变量记录刷新时间戳,配合怪物数量检测实现条件刷新。怪物存活时阻止新怪生成,死亡后允许下一周期刷新。
变量定义与初始化
在M2Server的变量配置文件中定义所需全局变量:
[GlobalVar]
G_LastSpawnTime=0
G_MonsterAlive=0
G_SpawnAllowed=1
G_CurrentHour=0
G_LastSpawnTime记录上次刷新时间,G_MonsterAlive记录怪物存活状态,G_SpawnAllowed控制是否允许刷新,G_CurrentHour记录当前小时数。
定时器触发脚本
使用引擎定时器实现每小时触发,在QFunction.txt中配置定时任务:
[@TimerStart]
ACT
TIMER 1 3600000
BREAK
[@TimerEvent]
IF
CHECKVAR G_SpawnAllowed = 1
ACT
CALL @CheckMonsterStatus
ELSE
SENDMSG 0 上只怪物未清理 暂停刷新
BREAK
定时器时间单位毫秒,3600000等于一小时。TIMER命令启动定时任务,到时间后自动调用@TimerEvent标签。
怪物存活检测逻辑
检测指定范围内怪物数量,存活则阻止刷新,死亡则允许新怪生成:
[@CheckMonsterStatus]
ACT
CHECKMONCOUNT 全部都爆 0
IF
MOV G_MonsterAlive 0
MOV G_SpawnAllowed 1
CALL @SpawnMonster
ELSE
MOV G_MonsterAlive 1
MOV G_SpawnAllowed 0
GETTIME H
MOV G_CurrentHour H
SENDMSG 0 上只怪物仍存活 刷新已暂停
BREAK
CHECKMONCOUNT检测怪物数量,返回0表示怪物已死亡。根据检测结果设置允许刷新标志。
怪物生成脚本
满足条件后执行怪物生成,同时记录刷新时间:
[@SpawnMonster]
ACT
GETTIME H
MOV G_CurrentHour H
MonGen 全部都爆 1 20 23
SET G_LastSpawnTime G_CurrentHour
SET G_MonsterAlive 1
SET G_SpawnAllowed 0
SendCenterMsg 250 252 天降财神活动已经开启 需要高级勋章的速度搞快 1 30
SAVEVAR G_LastSpawnTime
SAVEVAR G_MonsterAlive
SAVEVAR G_SpawnAllowed
BREAK
MonGen参数依次为怪物名称、数量、X坐标、Y坐标。生成后立即设置存活标志,阻止下次刷新。
怪物死亡触发检测
怪物死亡后自动触发检测,允许下一周期刷新:
[@KILLMON]
IF
CHECKMONNAME 全部都爆
ACT
MOV G_MonsterAlive 0
MOV G_SpawnAllowed 1
SENDMSG 0 怪物已清理 下小时可刷新
SAVEVAR G_MonsterAlive
SAVEVAR G_SpawnAllowed
BREAK
在MapInfo.txt中绑定怪物死亡触发器:
D6001 活动地图 ONKILLMON(@KILLMON)
完整脚本整合
将上述功能整合至统一脚本文件:
[@MAIN]
[@StartTimer]
ACT
SET G_SpawnAllowed 1
SET G_MonsterAlive 0
CALL @TimerStart
SENDMSG 0 定时刷怪已启动
BREAK
[@CheckStatus]
ACT
SENDMSG 0 上次刷新时间:%G_LastSpawnTime点
SENDMSG 0 怪物存活状态:%G_MonsterAlive
SENDMSG 0 允许刷新状态:%G_SpawnAllowed
SENDMSG 0 当前小时:%G_CurrentHour
BREAK
[@ManualSpawn]
IF
CHECKVAR G_SpawnAllowed = 1
ACT
CALL @SpawnMonster
ELSE
SENDMSG 0 上只怪物未清理 无法手动刷新
BREAK
[@StopTimer]
ACT
CLEARTIMER 1
SET G_SpawnAllowed 0
SENDMSG 0 定时刷怪已停止
BREAK
时间周期精确控制
使用小时数比较确保严格每小时刷新:
[@CheckHourChange]
ACT
GETTIME H
IF H G_CurrentHour
BEGIN
IF G_MonsterAlive = 0
BEGIN
CALL @SpawnMonster
END
ELSE
BEGIN
SENDMSG 0 小时已更替 但怪物未清理
END
END
BREAK
检测当前小时与记录小时是否不同,不同则进入刷新判断流程。
多怪物类型支持
扩展脚本支持多种怪物定时刷新:
[@SpawnMultiple]
ACT
CHECKMONCOUNT 全部都爆 0
IF
MonGen 全部都爆 1 20 23
CHECKMONCOUNT 天降财神 0
IF
MonGen 天降财神 1 25 25
CHECKMONCOUNT 限时BOSS 0
IF
MonGen 限时BOSS 1 30 30
SET G_SpawnAllowed 0
SAVEVAR G_SpawnAllowed
BREAK
每种怪物独立检测存活状态,分别控制刷新。
刷新时间记录与查询
记录每次刷新时间供玩家查询:
[@RecordSpawnTime]
ACT
GETTIME H
GETTIME M
GETTIME S
CALC G_SpawnRecord = H * 10000 + M * 100 + S
SAVEVAR G_SpawnRecord
SENDMSG 0 刷新时间已记录:%H点%M分%S秒
BREAK
时间戳格式为HHMMSS,便于读取和比较。
地图范围限定
限制怪物刷新在指定地图内:
[@CheckMapLimit]
IF
CHECKMAP D6001
ACT
CALL @SpawnMonster
ELSE
SENDMSG 0 当前地图不允许刷新
BREAK
在MapInfo.txt中配置地图标识,脚本检测地图名称后执行。
玩家在线检测
仅在有玩家在线时执行刷新,节省服务器资源:
[@CheckPlayerOnline]
ACT
CHECKONLINECOUNT > 0
IF
CALL @CheckMonsterStatus
ELSE
SENDMSG 0 无玩家在线 暂停刷新
BREAK
CHECKONLINECOUNT检测在线玩家数量,为零时跳过刷新流程。
刷新次数统计
统计刷新次数供管理查询:
[@CountSpawn]
ACT
INC G_SpawnCount
SAVEVAR G_SpawnCount
SENDMSG 0 累计刷新次数:%G_SpawnCount
BREAK
在@SpawnMonster脚本末尾调用此段落,每次刷新递增计数。
异常处理机制
处理定时器失效等异常情况:
[@TimerCheck]
ACT
CHECKTIMER 1
IF
SENDMSG 0 定时器运行正常
ELSE
CALL @TimerStart
SENDMSG 0 定时器已重启
BREAK
定期检测定时器状态,失效时自动重启。
管理命令配置
在Command.txt中配置GM管理命令:
@刷新状态=@CheckStatus
@强制刷新=@ManualSpawn
@启动刷怪=@StartTimer
@停止刷怪=@StopTimer
@重置计数=@ResetCount
[@ResetCount]
ACT
MOV G_SpawnCount 0
MOV G_LastSpawnTime 0
MOV G_MonsterAlive 0
MOV G_SpawnAllowed 1
SAVEVAR G_SpawnCount
SAVEVAR G_LastSpawnTime
SAVEVAR G_MonsterAlive
SAVEVAR G_SpawnAllowed
SENDMSG 0 刷新数据已重置
BREAK
脚本部署步骤
第一步打开M2Server脚本目录,找到QFunction.txt文件。第二步将脚本代码粘贴至文件末尾。第三步在MapInfo.txt中绑定地图触发器。第四步重启M2Server使配置生效。第五步进入游戏测试功能。
部署检查清单:
变量配置文件已更新
脚本语法无错误
地图触发器已绑定
定时器已启动
测试角色可触发
测试验证流程
创建测试角色进入活动地图,启动定时刷怪功能。观察第一只怪物生成,记录生成时间。等待一小时或手动击杀怪物,检测第二只怪物是否生成。怪物存活时检测刷新是否被阻止。
测试场景:
启动后立即可刷第一只
怪物存活时阻止刷新
怪物死亡后允许刷新
小时更替时触发检测
管理命令可查询状态
常见问题处理
怪物不刷新检查定时器是否启动,变量是否初始化。刷新不受控确认怪物检测逻辑正确,存活标志设置准确。定时器失效检查M2Server脚本执行权限,最大循环次数设置。
排查步骤:
查看M2Server日志
检测变量当前值
验证地图触发器
确认定时器状态
测试单步脚本
性能控制要点
单次检测脚本执行时间控制在五百毫秒内。定时器数量不超过十个,避免资源占用过高。变量保存频率适当,无需每次检测都保存。
性能配置:
ScriptTimeout=500
MaxScriptLoop=100
TimerInterval=3600000
在M2Server配置文件中调整上述参数,确保脚本稳定运行。

