传奇服务端神器唯一性控制与下线回收脚本

来源: 作者: 点击:
你遇到的“小退不消失”问题,根源在于脚本逻辑依赖在线计时器,且缺乏全局唯一性锁。要实现“全区仅一把、下线即消失、怪物同步刷新”,必须抛弃单纯的物品数据库属性,改用全局变量(G变量) + 在线检测 + 机器人脚本的组合方案。以下是基于HERO引擎的完整解决方案。

一、核心逻辑重构:用变量代替物品

不要直接检测“包里是否有武器”,而是用全局变量(G变量)来标记神器状态。
- G100:标记神器是否存在于世界(0=无,1=有)。
• G101:记录当前持有者的名字(字符串变量)。

- 神器消失条件:时间到30分钟 或 人物下线(OnTimer检测)。

二、杀死怪物触发脚本(MapQuest)

在怪物死亡触发脚本(如MapQuest或OnKillMob)中,写入以下逻辑:
[@Kill_ChallengeBoss]
#if
; 关键:检测全局锁,确保全区唯一
equal G100 0
; 此处加入你的怪物名称检测,如:CheckKillMonName 挑战BOSS
#act
; 设置全局锁,标记神器已出
mov G100 1
mov G101 <$USERNAME>
; 给予限时武器(物品名需与数据库一致)
give 挑战神器 1
; 发送全服公告
SendMsg 0 玩家【<$USERNAME>】击败了守护者,获得了限时神器(30分钟)!
; 启动个人计时器(用于30分钟倒计时消失)
SetOnTimer 60 1
; 跳转到计时器处理段
goto @CheckWeaponTime
#elseact
; 如果G100=1,说明神器已存在,只刷新怪物不爆武器
MonGen 挑战BOSS 1 1
SendMsg 6 神器已被【<$STR(G101)>】持有,BOSS复活但无奖励。


三、登录脚本处理(QManage.txt)

在 Mir200\Envir\MapQuest_def\QManage.txt 的 [@Login] 段加入以下代码,用于玩家上线时的状态恢复与神器回收。
[@Login]
; 情况1:如果是神器持有者上线,且神器时间未超时(此处逻辑可根据需求简化,如直接判定为失效)
#if
equal G101 <$USERNAME>
#act
; 可选:给予一个短暂的缓冲时间,或者直接判定为超时回收
SendMsg 6 警告:你持有限时神器,请勿长时间下线。
; 重新启动计时器(如果还需要剩余时间逻辑,需用变量记录)
SetOnTimer 60 1
goto @CheckWeaponTime

; 情况2:如果神器持有者已消失,但全局锁未解除(防宕机残留)
#if
large G100 0
CheckOffline <$STR(G101)>
#act
; 强制重置状态,并刷新BOSS
mov G100 0
mov G101
MonGen 挑战BOSS 1 1
SendMsg 0 由于持有者消失,限时神器已失效,BOSS重新刷新。


四、计时器与下线触发(QFunction-0.txt)

在 QFunction-0.txt 中处理计时结束和下线事件。
; 计时器每秒触发一次,检查时间或武器是否存在
[@OnTimer60]
#act
; 方法1:直接检测背包是否有武器(简单粗暴)
#IF
CheckItem 挑战神器 1
#ACT
; 武器还在,继续计时(或者用变量递减,这里简化处理)
break
#ELSEACT
; 武器没了(被扔、被存、被销毁),强制重置
mov G100 0
mov G101
; 刷新BOSS
MonGen 挑战BOSS 1 1
SendMsg 0 限时神器已消失,挑战BOSS重新降临。
SetOffTimer 60

; 人物下线触发(关键!解决小退不消失的问题)
[@OffLine]
#if
equal G101 <$USERNAME>
#act
; 直接清除该玩家的神器(如果在线则回收,离线时由登录脚本处理)
Take 挑战神器 1
mov G100 0
mov G101
MonGen 挑战BOSS 1 1
SendMsg 0 持有者已离线,限时神器回收,BOSS刷新。


五、机器人脚本兜底(Robot.txt)

在 Mir200\Envir\Robot.txt 中设置一个每分钟运行的脚本,作为最终保险,防止任何逻辑遗漏导致神器卡死。
AutoRun NPC Minute 1 @CheckGodWeapon

在 Robot_def 目录下创建 CheckGodWeapon.txt:
[@CheckGodWeapon]
; 如果G100锁着,但持有者不在线,强制清理
#if
large G100 0
CheckOffline <$STR(G101)>
#act
mov G100 0
mov G101
MonGen 挑战BOSS 1 1
; 此处可加一个全服清理命令,确保无残留


六、关键配置与调试要点

1. 物品数据库设置:神器武器建议设置 AC=0, MAC=0, DC=0, MC=0, SC=0,避免被误存仓,不要设置 Bind=1(绑定会导致无法被Take命令回收)。
2. 全局变量初始化:在服务端启动脚本或第一次开区时,执行 mov G100 0 和 mov G101 (清空)。
3. 测试流程:
• 杀死BOSS → 得武器 → 小退 → 上线检查武器是否还在(应为无)。

- 杀死BOSS → 得武器 → 等待30分钟 → 检查武器是否消失、BOSS是否刷新。
- 两个号同时测试,确认A号拿武器后,B号杀BOSS不再爆武器。

此方案通过 G100全局锁 确保了全区唯一性,通过 @OffLine 和 Robot 双重检测解决了下线残留问题。如果你的版本中 CheckOffline 命令无效,可改用机器人脚本每分钟检测 <$STR(G101)> 是否在线来实现类似功能。