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

