组队防跑单的核心逻辑是通过脚本记录队员状态,在BOSS死亡后到奖励分配完成前设置锁定标记,队员在此期间离队则触发惩罚或取消领奖资格。服务端本身不提供现成的防跑单功能,需要利用组队触发事件配合自定义变量来实现。
##一、基础原理与变量规划
防跑单机制依赖三个关键节点:队员入队时记录状态、BOSS死亡时设置分配锁定、队员离队时检测是否处于锁定期。实现这套逻辑需要用到人物个人变量和队伍共享变量。
个人变量A97和A98用于标记单个队员的状态。A98=1表示BOSS已死、进入分配锁定期;A97=1表示该队员可被队长NPC分配奖励。队伍共享变量G0可用于绑定任务标识,G0=1001表示队伍正在执行防跑单任务。
变量文件存放在QuestDiary目录下的防跑单文件夹内,使用SAVEVAR命令持久化保存,确保服务端重启后数据不丢失。
##二、登录初始化配置
在QManage.txt的[@Login]段加入变量清零操作,确保每个角色上线时防跑单状态为初始值:
```
[@Login]
#IF
#ACT
CALCVARHUMANA97=0
CALCVARHUMANA98=0
SAVEVARHUMANA97..\QuestDiary\防跑单\可领取.txt
SAVEVARHUMANA98..\QuestDiary\防跑单\分配锁.txt
```
这段脚本的作用是每次登录时将可领取标记和分配锁定标记重置为0,防止上次离线时的残留状态影响本次游戏。
##三、组队事件触发配置
在QFunction-0.txt中添加组队事件的触发脚本。GOM和GEE引擎支持@GroupAddMember和@GroupDelMember事件,分别在队员入队和离队时触发。
队员入队时,记录队员名字并标记为已组队状态:
```
[@GroupAddMember]
#IF
#ACT
MOVS0<$USERNAME>
CALCVARHUMANA99=1
SAVEVARHUMANA99..\QuestDiary\防跑单\队员状态.txt
SENDMSG5已加入队伍,防跑单机制生效!
```
队员离队时,跳转到离队检测脚本进行后续判断:
```
[@GroupDelMember]
#IF
CHECKLEVEL>0
#ACT
GOTO@防跑单_离队检测
```
CHECKLEVEL>0是一个通用条件,确保触发脚本的角色是有效在线玩家。
##四、离队惩罚逻辑
离队检测脚本需要判断队员是否处于分配锁定期。如果A98=1,说明BOSS已被击杀且奖励尚未分配完毕,此时离队视为跑单行为:
```
[@防跑单_离队检测]
#IF
CHECKVARHUMANA98=1
#ACT
TAKE金币50000
SENDMSG1<$USERNAME>在分配期间离队,视为跑单已扣除金币并取消分配资格!
CALCVARHUMANA98=0
SAVEVARHUMANA98..\QuestDiary\防跑单\分配锁.txt
BREAK
#ELSEACT
SENDMSG5<$USERNAME>已离开队伍。
```
惩罚方式可以根据需要调整。扣除金币是最常见的做法,也可以改用MAPMOVE将队员强制传送回队长身边,或者直接清除其领奖资格标记。部分引擎支持GROUPRECALL命令强制取消离队操作,但并非所有引擎都兼容,使用前需确认引擎版本。
##五、BOSS死亡触发分配锁定
在QFunction-0.txt的[@KillMob]段或怪物触发脚本中,检测BOSS被击杀后为全队设置分配锁定:
```
[@KillMob]
#IF
KILLMONNAME祖玛教主
CHECKGROUPCOUNT>1
#ACT
TEAMMEMBEREXECUTECALCVARHUMANA98=1
TEAMMEMBEREXECUTESAVEVARHUMANA98..\QuestDiary\防跑单\分配锁.txt
SENDMSG5BOSS已击杀!请全队速至分配NPC领取,中途离队视为跑单!
```
TEAMMEMBEREXECUTE命令是GOM和GEE较新版本提供的队伍成员批量执行命令,可以对全队每个成员同时设置A98=1。如果引擎不支持该命令,需要改为每个队员自己点击NPC时检测BOSS死亡状态。
CHECKGROUPCOUNT>1用于确认队伍人数大于1,单人击杀BOSS不触发防跑单机制。
##六、奖励分配NPC脚本
在Market_Def目录下新建分配NPC脚本文件,用于队长将奖励发放给仍在队伍中的成员:
```
[@main]
#IF
ISGROUPMEMBER
CHECKVARHUMANA97=1
#ACT
GIVE屠龙1
GIVE金币50000
CALCVARHUMANA97=0
SAVEVARHUMANA97..\QuestDiary\防跑单\可领取.txt
SENDMSG6你已领扔伍分配奖励!
#ELSESAY
你不在分配名单或已离队/已领取!
```
ISGROUPMEMBER检测玩家当前是否仍在队伍中,CHECKVARHUMANA97=1确认该玩家有领奖资格。已经离队的玩家因A97被清零或ISGROUPMEMBER检测失败,无法领取任何奖励。
队长在NPC处发放奖励前,需要先将队员标记为可领取状态。这部分脚本可以在BOSS死亡触发中通过TEAMMEMBEREXECUTE完成,也可以设计为队长与NPC对话后手动触发。
##七、副本名单比对方案
如果防跑单场景是自定义副本而非普通组队打宝,可以采用名单比对的方式。队长开启副本时将队员名字写入队伍名单文件,通关发放奖励时逐行读取名单进行比对。
队长开启副本时的脚本:
```
[@开启副本]
#IF
ISGROUPMASTER
#ACT
AddTextListEx..\QuestDiary\防跑单\队伍名单.txt<$USERNAME>
TEAMMEMBEREXECUTEAddTextListEx..\QuestDiary\防跑单\队伍名单.txt<$USERNAME>
SENDMSG5副本已开启,队员名单已记录。
```
发放奖励时使用CHECKNAMEINLIST检测玩家是否在名单中:
```
[@领取奖励]
#IF
CHECKNAMEINLIST..\QuestDiary\防跑单\队伍名单.txt<$USERNAME>
CHECKGROUPCOUNT>1
#ACT
GIVE奖励物品1
#ELSESAY
你不在本次副本名单中或已离队,无法领取奖励。
```
这种方式的优势是不依赖组队触发事件,适合自定义副本NPC场景。
##八、引擎适配与注意事项
不同引擎对组队触发事件和队伍命令的支持存在差异。GOM引擎支持TEAMMEMBEREXECUTE命令,可以批量对队员执行操作。GEE引擎支持批量TeamAdd指令,一次可添加多名玩家。Blue引擎和老版本HERO引擎不支持TEAMMEMBEREXECUTE,需要改为每个队员自己点击NPC时检测状态。
变量作用域需要注意。A系变量为人物个人变量,每个角色独立存储;G系变量为队伍共享变量,部分引擎支持G0-G99,队伍共享变量更适合标记BOSS死亡状态。如果引擎不支持队伍共享变量,需要用TEAMVAR指令替代。
队员在任务开始前必须已经组队。中途加入的队员无法继承之前设置的G0值或队伍状态标记,需要单独处理。队长解散队伍会导致所有队伍状态清零,建议在解散事件中增加拦截或提示。
所有脚本修改后需要重新加载NPC或重启服务端才能生效。测试时先用GM命令模拟BOSS死亡和队员离队,确认惩罚逻辑和奖励分配逻辑均正常工作。
##一、基础原理与变量规划
防跑单机制依赖三个关键节点:队员入队时记录状态、BOSS死亡时设置分配锁定、队员离队时检测是否处于锁定期。实现这套逻辑需要用到人物个人变量和队伍共享变量。
个人变量A97和A98用于标记单个队员的状态。A98=1表示BOSS已死、进入分配锁定期;A97=1表示该队员可被队长NPC分配奖励。队伍共享变量G0可用于绑定任务标识,G0=1001表示队伍正在执行防跑单任务。
变量文件存放在QuestDiary目录下的防跑单文件夹内,使用SAVEVAR命令持久化保存,确保服务端重启后数据不丢失。
##二、登录初始化配置
在QManage.txt的[@Login]段加入变量清零操作,确保每个角色上线时防跑单状态为初始值:
```
[@Login]
#IF
#ACT
CALCVARHUMANA97=0
CALCVARHUMANA98=0
SAVEVARHUMANA97..\QuestDiary\防跑单\可领取.txt
SAVEVARHUMANA98..\QuestDiary\防跑单\分配锁.txt
```
这段脚本的作用是每次登录时将可领取标记和分配锁定标记重置为0,防止上次离线时的残留状态影响本次游戏。
##三、组队事件触发配置
在QFunction-0.txt中添加组队事件的触发脚本。GOM和GEE引擎支持@GroupAddMember和@GroupDelMember事件,分别在队员入队和离队时触发。
队员入队时,记录队员名字并标记为已组队状态:
```
[@GroupAddMember]
#IF
#ACT
MOVS0<$USERNAME>
CALCVARHUMANA99=1
SAVEVARHUMANA99..\QuestDiary\防跑单\队员状态.txt
SENDMSG5已加入队伍,防跑单机制生效!
```
队员离队时,跳转到离队检测脚本进行后续判断:
```
[@GroupDelMember]
#IF
CHECKLEVEL>0
#ACT
GOTO@防跑单_离队检测
```
CHECKLEVEL>0是一个通用条件,确保触发脚本的角色是有效在线玩家。
##四、离队惩罚逻辑
离队检测脚本需要判断队员是否处于分配锁定期。如果A98=1,说明BOSS已被击杀且奖励尚未分配完毕,此时离队视为跑单行为:
```
[@防跑单_离队检测]
#IF
CHECKVARHUMANA98=1
#ACT
TAKE金币50000
SENDMSG1<$USERNAME>在分配期间离队,视为跑单已扣除金币并取消分配资格!
CALCVARHUMANA98=0
SAVEVARHUMANA98..\QuestDiary\防跑单\分配锁.txt
BREAK
#ELSEACT
SENDMSG5<$USERNAME>已离开队伍。
```
惩罚方式可以根据需要调整。扣除金币是最常见的做法,也可以改用MAPMOVE将队员强制传送回队长身边,或者直接清除其领奖资格标记。部分引擎支持GROUPRECALL命令强制取消离队操作,但并非所有引擎都兼容,使用前需确认引擎版本。
##五、BOSS死亡触发分配锁定
在QFunction-0.txt的[@KillMob]段或怪物触发脚本中,检测BOSS被击杀后为全队设置分配锁定:
```
[@KillMob]
#IF
KILLMONNAME祖玛教主
CHECKGROUPCOUNT>1
#ACT
TEAMMEMBEREXECUTECALCVARHUMANA98=1
TEAMMEMBEREXECUTESAVEVARHUMANA98..\QuestDiary\防跑单\分配锁.txt
SENDMSG5BOSS已击杀!请全队速至分配NPC领取,中途离队视为跑单!
```
TEAMMEMBEREXECUTE命令是GOM和GEE较新版本提供的队伍成员批量执行命令,可以对全队每个成员同时设置A98=1。如果引擎不支持该命令,需要改为每个队员自己点击NPC时检测BOSS死亡状态。
CHECKGROUPCOUNT>1用于确认队伍人数大于1,单人击杀BOSS不触发防跑单机制。
##六、奖励分配NPC脚本
在Market_Def目录下新建分配NPC脚本文件,用于队长将奖励发放给仍在队伍中的成员:
```
[@main]
#IF
ISGROUPMEMBER
CHECKVARHUMANA97=1
#ACT
GIVE屠龙1
GIVE金币50000
CALCVARHUMANA97=0
SAVEVARHUMANA97..\QuestDiary\防跑单\可领取.txt
SENDMSG6你已领扔伍分配奖励!
#ELSESAY
你不在分配名单或已离队/已领取!
```
ISGROUPMEMBER检测玩家当前是否仍在队伍中,CHECKVARHUMANA97=1确认该玩家有领奖资格。已经离队的玩家因A97被清零或ISGROUPMEMBER检测失败,无法领取任何奖励。
队长在NPC处发放奖励前,需要先将队员标记为可领取状态。这部分脚本可以在BOSS死亡触发中通过TEAMMEMBEREXECUTE完成,也可以设计为队长与NPC对话后手动触发。
##七、副本名单比对方案
如果防跑单场景是自定义副本而非普通组队打宝,可以采用名单比对的方式。队长开启副本时将队员名字写入队伍名单文件,通关发放奖励时逐行读取名单进行比对。
队长开启副本时的脚本:
```
[@开启副本]
#IF
ISGROUPMASTER
#ACT
AddTextListEx..\QuestDiary\防跑单\队伍名单.txt<$USERNAME>
TEAMMEMBEREXECUTEAddTextListEx..\QuestDiary\防跑单\队伍名单.txt<$USERNAME>
SENDMSG5副本已开启,队员名单已记录。
```
发放奖励时使用CHECKNAMEINLIST检测玩家是否在名单中:
```
[@领取奖励]
#IF
CHECKNAMEINLIST..\QuestDiary\防跑单\队伍名单.txt<$USERNAME>
CHECKGROUPCOUNT>1
#ACT
GIVE奖励物品1
#ELSESAY
你不在本次副本名单中或已离队,无法领取奖励。
```
这种方式的优势是不依赖组队触发事件,适合自定义副本NPC场景。
##八、引擎适配与注意事项
不同引擎对组队触发事件和队伍命令的支持存在差异。GOM引擎支持TEAMMEMBEREXECUTE命令,可以批量对队员执行操作。GEE引擎支持批量TeamAdd指令,一次可添加多名玩家。Blue引擎和老版本HERO引擎不支持TEAMMEMBEREXECUTE,需要改为每个队员自己点击NPC时检测状态。
变量作用域需要注意。A系变量为人物个人变量,每个角色独立存储;G系变量为队伍共享变量,部分引擎支持G0-G99,队伍共享变量更适合标记BOSS死亡状态。如果引擎不支持队伍共享变量,需要用TEAMVAR指令替代。
队员在任务开始前必须已经组队。中途加入的队员无法继承之前设置的G0值或队伍状态标记,需要单独处理。队长解散队伍会导致所有队伍状态清零,建议在解散事件中增加拦截或提示。
所有脚本修改后需要重新加载NPC或重启服务端才能生效。测试时先用GM命令模拟BOSS死亡和队员离队,确认惩罚逻辑和奖励分配逻辑均正常工作。

