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