实现武器限时持有、下线消失及全区唯一刷新的核心在于正确使用全局变量与计时器脚本,而非依赖普通的背包物品属性。当前出现小退武器不消失、怪物重复刷新的问题,根源在于脚本逻辑未检测玩家离线状态,且未使用服务器级全局变量来标记神器归属状态。必须将神器的存在状态与一个全服唯一的布尔值变量绑定,确保同一时间只有一名玩家能触发获取逻辑,且该状态在玩家离线时必须被强制重置。
首先定义关键变量。在M2Server的变量配置文件中,声明一个全局布尔变量(如G_WeaponExist)用于标记神器是否已被产出,初始值设为FALSE。同时声明一个整型变量(如G_WeaponOwnerLevel)记录当前持有者的等级或ID(可选,用于日志记录),以及一个时间戳变量(如G_WeaponExpireTime)记录过期时间。怪物的刷新逻辑必须前置判断G_WeaponExist的值,只有当该值为FALSE时,挑战怪物才允许被创建或激活攻击状态;若为TRUE,怪物应处于隐藏、无敌或直接不刷新状态,从源头杜绝多人同时击杀的可能性。
编写怪物死亡掉落脚本是第一步。在挑战怪物的死亡执行脚本中,第一行代码必须是条件判断:IF G_WeaponExist = FALSE。只有满足此条件,才执行后续给予物品和设置变量的操作。使用命令给玩家背包添加指定武器,紧接着执行SET G_WeaponExist TRUE,将全局标志位锁定。随后获取当前服务器时间戳(秒数),加上1800秒(30分钟),赋值给G_WeaponExpireTime。此时,系统已记录神器产出,其他玩家即便击杀同类怪物(若因网络延迟导致同时死亡),因变量已变为TRUE,脚本后半段不会执行,无法获得第二把武器。
解决小退下线武器不消失的难题,需引入“登录检测”与“定时轮询”双重机制。单纯依靠物品自带的限时属性无法实现在线倒计时与离线立即消失的逻辑,因为物品计时器通常在物品被使用时或特定触发下才更新。必须在玩家登录脚本(Login.txt)中加入检查逻辑:当玩家上线时,系统读取其背包内是否存在该限时武器。若存在,对比当前时间与G_WeaponExpireTime。若当前时间已超过过期时间,直接删除该武器并重置G_WeaponExist为FALSE,触发怪物刷新;若未过期,则计算剩余时间,启动一个针对该玩家的独立计时器。
关键在于处理“小退”瞬间。传奇服务端通常没有直接的“玩家断开连接”事件脚本供自定义逻辑调用,因此需采用“心跳检测”或“物品持久化 trick”。更稳妥的方案是利用物品的“绑定”与“特殊属性”结合脚本。在给予武器时,将该武器设置为“下线自动消失”的特殊属性(部分引擎支持),或者在脚本中将该武器设为任务物品且不可交易、不可存储。若引擎不支持原生下线消失,则需在登录脚本中做文章:玩家上线时,检查背包是否有该武器。若有,检查全局变量G_WeaponExpireTime。如果玩家是小退后重连,时间仍在30分钟内,脚本重新为该玩家启动一个倒计时线程(使用TIMER函数),设定时间为剩余秒数。若玩家在倒计时期间下线,由于计时器依附于玩家对象,玩家对象销毁,计时器停止。下次上线时,登录脚本再次接管,计算时间差。若发现时间已超,立即删除武器。
为了实现“下线即消失”而非“倒计时暂停”,逻辑需调整为:不记录绝对过期时间戳,而是记录“获得时的累计在线时间”或使用实时校验。但最符合需求(下线立马消失)的做法是:在登录脚本中,一旦检测到玩家背包有该神器,立即检查全局变量中记录的持有者角色名(G_WeaponOwnerName)。若当前登录角色名与记录不符(说明顶号或数据异常),或检测到该玩家此次登录距上次下线间隔极短但全局时间已流逝,直接判定失效。更精准的控制是:在给予武器时,记录当前服务器的“运行总秒数”到变量G_StartSeconds。玩家每次上线,计算(当前服务器运行总秒数 - G_StartSeconds)。若差值大于1800,删除武器。但这无法实现“小退立刻消失”,因为差值会继续增加。
修正逻辑以达成“小退即消失”:放弃纯时间戳,改用“在线状态监测”。由于传奇脚本语言限制,无法实时监测离线,故采用“上线校验 + 物品特殊标记”法。将武器设为“死亡掉落”且“下线删除”属性(若引擎支持)。若不支持,必须在登录脚本强制执行:IF 背包有神器 AND (当前时间 - 记录获得时间 > 1800 OR 玩家曾下线) THEN 删除神器。这里“玩家曾下线”难以直接判断,因此通常采取折中方案:神器绑定“在线倒计时”。玩家在线时,每秒扣除持久度或通过QFunction脚本每秒检查一次。一旦玩家下线,持久度停止扣除或检查中断。再次上线时,脚本计算离线时长,若离线时长>0,直接视为超时,删除武器。具体做法:在给予武器时,记录获得时间的“分钟数”到个人变量P_GetMinute。登录时,读取当前分钟数CurrentMinute。若(CurrentMinute - P_GetMinute) >= 30,删除武器。此法有误差,但能大致实现。
要实现严格的“小退立马消失”,最佳方案是利用引擎的“物品限时存在”功能配合脚本重置。在给予物品时,设置物品存在时间为1800秒,并开启“离线不计费”选项的反向逻辑——即大多数引擎默认离线不计时,我们需要的是离线即失效。若引擎无此原生支持,则必须在登录脚本中写死:只要检测到该玩家背包有此武器,且该玩家本次登录动作发生(意味着之前有过下线行为),直接删除武器并重置全局变量。逻辑如下:
玩家登录。
检查背包是否有“限时神器”。
若有,检查个人变量P_HasLoggedOut(需在正常退出脚本中标记,但非正常退出无法标记)。
替代方案:登录时,直接删除该武器,并提示“因您曾离开游戏,神器已回收”。同时执行SET G_WeaponExist FALSE,并刷新怪物。
这样确保了只要小退,再上线武器就没了。若玩家一直在线,则通过另一个挂机脚本(Timer)每分钟检查一次,若满30分钟则删除。
关于怪物刷新逻辑。当武器被删除(无论是超时还是下线),必须立即触发怪物重生。在删除武器的脚本段落末尾,添加坐标刷新命令(如MONGEN 怪物名字 数量 地图 X Y),将挑战怪物重新生成在指定位置。同时,务必执行SET G_WeaponExist FALSE,解锁全局锁,允许下一次击杀掉落。若忘记重置全局变量,怪物虽刷新但再也打不出武器,导致死循环。
针对“全区只有一把”的严格限制,必须在怪物出生脚本中也加入判断。在怪物自动刷新或手动生成的脚本开头,加入IF $G_WeaponExist = TRUE THEN RETURN。这意味着只要全局变量显示神器未归还,怪物即使到了刷新时间也不会出现在地图上,或者出现后无法被攻击(设置无敌)。只有当上一把武器消失、变量重置后,怪物才会真正“活”过来,等待下一位挑战者。这能有效防止利用多开角色卡BUG同时击杀多只怪物获取多把神器。
最后调试与测试环节。架设完成后,需进行极端情况测试:正常在线挂机30分钟,观察武器是否准时消失、怪物是否刷新;获得武器后立即小退,再上线,检查武器是否瞬间消失、怪物是否立即刷新;尝试两个玩家同时击杀怪物(需模拟高延迟),确认第二人是否无法获得武器。检查M2Server日志,查看变量读写是否有报错。若发现武器消失后怪物未刷新,通常是脚本执行顺序问题,确保删除物品命令在刷新怪物命令之前执行,或在刷新命令前加延时(DELAY 1),确保数据库状态已更新。通过严密的变量控制和登录/定时双轨检测,即可完美实现全区唯一、限时在线、下线回收的武器玩法。

