当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇Hero引擎定时刷怪脚本怪物存活检测与刷新控制方案

热度:
核心逻辑设计思路

定时刷怪需解决两个关键问题:时间周期控制与怪物状态检测。使用全局变量记录刷新时间戳,配合怪物数量检测实现条件刷新。怪物存活时阻止新怪生成,死亡后允许下一周期刷新。

变量定义与初始化

在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配置文件中调整上述参数,确保脚本稳定运行。
[顶部]