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

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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

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


六、关键配置与调试要点

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

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

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