传奇游戏内想要达成击杀怪物之后,等待一段时间再把玩家传送到指定地图的效果,核心依靠脚本定时器功能配合怪物死亡触发段来完成,不同引擎写法存在差异,需要区分GOM引擎与GEE引擎两套常用脚本逻辑。
先讲整体实现思路,怪物死亡时,不能直接执行传送命令,直接写传送会在怪物倒地瞬间完成跳转。需要在怪物死亡触发段给玩家绑定一个计时器,计时器设置等待时长,倒计时结束之后,再调用地图传送命令,同时增加状态判断,防止玩家中途下线、死亡或者切换地图导致传送异常。
GOM引擎完整示例脚本,放在怪物数据库对应的怪物死亡脚本段。
[@OnDie]
#IF
ISADMIN < 1
#ACT
TIMERADD 1 10
#SACT
#CALL [\游戏功能\延迟传送.txt] @延迟传送检测
新建延迟传送.txt文件,写入检测逻辑。
[@延迟传送检测]
#IF
TIMER 1
#ACT
MAPMOVE 3 330 330
TIMERDEL 1
#ELSEACT
#IF
!TIMER 1
#ACT
TIMERDEL 1
脚本参数说明,TIMERADD后面第一个数字代表计时器编号,同一个角色不能重复使用相同编号计时器,第二个数字单位是秒,示例10代表等待10秒。MAPMOVE后面依次是地图编号,坐标X,坐标Y,根据需求替换目标地图和坐标。TIMERDEL作用是清除计时器,避免计时器残留重复触发传送。增加#IF判断玩家不是管理员,防止测试账号被传送,可以根据需求删除这段判断。
GEE引擎语法和GOM略有区别,计时器关键字写法不同,怪物死亡段[@OnDie]触发逻辑不变。
[@OnDie]
#IF
ISADMIN < 1
#ACT
SetTimer 1 10
#SACT
#CALL [\游戏功能\gee延迟传送.txt] @gee传送判断
gee延迟传送.txt内容。
[@gee传送判断]
#IF
Timer 1
#ACT
MAPMOVE 3 330 330
ClearTimer 1
#ELSEACT
#IF
!Timer 1
#ACT
ClearTimer 1
编写脚本时需要增加容错判断,在计时器执行传送之前增加玩家状态校验,避免出现BUG。增加判断条件,#IF ISONMAP 3,代表只有玩家还停留在触发任务的地图内才执行传送,如果玩家提前跑图离开,直接清除计时器,不执行跳转。增加#IF !ISDEAD,判断玩家存活状态,玩家死亡则取消本次传送。完整增加判断后的传送段示例。
[@延迟传送检测]
#IF
TIMER 1
ISONMAP 0
!ISDEAD
#ACT
MAPMOVE 3 330 330
TIMERDEL 1
#ELSEACT
TIMERDEL 1
还有一种备选方案,使用全局计时器,适合多人同时击杀同一只怪物的场景,普通角色计时器会绑定角色,全局计时器绑定怪物对象。全局计时器写法适合BOSS怪物使用,怪物死亡后,计时器挂载在怪物实例上,倒计时完成再传送,需要注意怪物死亡后对象销毁问题,大部分引擎不推荐怪物死亡后挂载全局计时器,优先使用角色计时器方案稳定性更高。
配置完成之后的测试步骤,把脚本保存到对应目录,重新加载M2脚本,不需要重启服务端。进入游戏召唤对应怪物击杀,观察倒计时期间角色移动、死亡、小退会不会中断传送。如果出现倒计时结束不传送,优先检查地图编号、坐标是否正确,查看M2日志,确认脚本段是否成功触发,计时器有没有正常创建。常见报错原因,计时器编号重复,文件路径书写错误,缺少#SACT指令导致调用外部脚本失效,目标地图没有开放访问权限。
额外拓展用法,可以在倒计时期间给玩家发送提示文字,告知剩余传送时间,在计时器创建之后添加SENDMSG指令,SENDMSG 7 击杀完成,10秒后将传送至指定地图。也可以设置倒计时中途取消传送的机制,添加NPC指令或者物品触发TIMERDEL,玩家使用指定道具就清除计时器,放弃本次传送。
多怪物共用一套延迟传送脚本时,可以把传送地图、等待时间设置为变量,怪物[@OnDie]段给变量赋值,外部脚本读取变量执行传送,减少重复编写脚本的工作量,方便后期统一修改参数。使用变量写法,不同怪物可以设置不一样的等待时长和目标地图,维护起来更加便捷。
需要注意引擎版本差异,老旧版本引擎部分计时器指令不支持,升级M2程序之后再使用这套脚本。部分引擎角色小退会清空身上所有计时器,属于正常机制,在需求设计阶段提前考虑该特性。如果业务要求玩家小退后依旧保留传送倒计时,就不能使用角色计时器,改用数据库记录标记,用定时全局脚本轮询读取标记,到达设定时间完成传送,这种方案资源消耗更高,适合特殊场景使用。

