玩家点击入口NPC→检查是否有空闲层→分配最低空闲层→传送进图+启动计时器
进入后立即刷BOSS→玩家杀怪→点击NPC进入下一层
离开当前层时:清除玩家变量→重置层状态为"空闲"→准备迎接下一位玩家
新玩家进入→系统检测空闲层→自动刷新对应层BOSS
一、文件部署位置(以GEE引擎为例)
NPC脚本:MirServer\Mir200\Envir\Market_Def\盟重省-闯关使者.txt(入口NPC)
地图触发脚本:MirServer\Mir200\Envir\MapQuest_Def\QManage.txt(全局管理定时器)
层地图参数:MirServer\Mir200\Envir\MapInfo.txt(设置地图限制参数)
刷怪文件:MirServer\Mir200\Envir\MonGen.txt(常规刷怪,但本方案主要用脚本刷)
二、超详细脚本实现(GEE引擎语法)
📍步骤1:定义闯关地图信息(MapInfo.txt)
[TDG001第一层]SAFEDAYNORECALLNODEALNORECONNECT(N)NOTALLOWUSEITEMS(回城卷|随机传送卷)INCGAMEPOINT(0/1)TIMELIMIT(30)NEEDHOLE
[TDG002第二层]SAFEDAYNORECALLNODEALNORECONNECT(N)...TIMELIMIT(30)NEEDHOLE
...同样格式定义第3层到第10层TDG003-TDG010
关键参数解释:
NOTALLOWUSEITEMS(回城卷|随机传送卷):禁止使用逃跑道具
TIMELIMIT(30):限制本图最多停留30分钟
NEEDHOLE:必须通过洞口/NPC传送进出(配合脚本控制)
NORECONNECT(N):掉线重连不回地图(防止利用漏洞)
📍步骤2:入口NPC脚本(盟重省-闯关使者.txt)
[@Main]
if
act
显示闯关信息
SAY
<闯关使者/SCOLOR=249>:想挑战十重天关?\\
每层仅限一人,限时30分钟!\\
成功通关可获极品奖励!\\
<我要挑战!/@EnterChallange>\\
<排行榜/@ShowRank>\
[@EnterChallange]
IF
检查玩家是否已在闯关系统中
CHECKVARHUMANIsInTDG=1
ACT
MESSAGEBOX[失败]您正在挑战中!请先完成当前层挑战!
BREAK
IF
尝试为玩家分配一个空闲层
GetAvailTDGLevel
ACT
分配成功(返回值在P0)
SETTING:
SETTING:
设置玩家所在层变量
SETHUMANTDGLevel=<$STR(P0)>
SETHUMANIsInTDG=1
记录进入时间(单位:秒)
SETHUMANTDGEnterTime=<$DATETIME>
传送玩家到对应层
MAPMOVETDG0<$STR(P0)>
发送提示
SENDMSG6[系统]你已进入第[<$STR(P0)>]层,限时30分钟!
ELSEACT
所有层都满了
MESSAGEBOX[失败]所有关卡已满员!请稍后再试!
BREAK
;---查找最低空闲层函数---
[@GetAvailTDGLevel()]
ACT
初始化层号P0=0(未找到)
SETP00
循环检查1-10层状态
LoopSetP11101
;检测全局变量G101-G110(1-10层状态0=空闲1=占用)
CHECKVARGLOBALTDG_Status_<$STR(P1)>=0
SETP0<$STR(P1)>;找到空闲层,赋值给P0
将该层状态标记为占用
SETGLOBALTDG_Status_<$STR(P1)>=1
跳出循环
BREAK
}
返回P0(0表示无空闲,1-10表示层号)
RETURNP0
📍步骤3:每层通关NPC(放在每层地图里,例如TDG001-NPC.txt)
[@Main]
IF
检查玩家是否在本层(防止跨层点)
CHECKVARHUMANTDGLevel=1;注意:第2层就改成2,以此类推
SAY
<守关天将/SCOLOR=250>:击败本层BOSS方可前往下一关!\\
<BOSS刷新状态:>{目前存活|/SCOLOR=254}\\
<离开挑战/@Exit>|<下一关/@NextLevel>\
[@NextLevel]
IF
检查本层BOSS是否死亡(根据引擎不同,可以用变量控制)
CHECKVARGLOBALTDG1_BOSS_Alive=0;0=死亡
ACT
清除当前层变量
SETHUMANTDGLevel=0
关闭计时器
DELTIMERTDGTimer
设置玩家进入下一层状态
SETHUMANIsInTDG=1
SETHUMANTDGLevel=2;进入第2层
SETHUMANTDGEnterTime=<$DATETIME>;重置计时
标记本层为空闲状态
SETGLOBALTDG_Status_1=0
传送至下一层
MAPMOVETDG002
提示
SENDMSG6[系统]你已进入第2层,限时重新计算!
ELSEACT
MESSAGEBOX[失败]BOSS尚未击败!
BREAK
[@Exit]
IF
ACT
调用公共退出函数(在QManage.txt里实现)
Gmexecute退出闯关
📍步骤4:全局管理触发(QManage.txt)
=玩家进入任何闯关地图时触发刷怪=
[@EnterMap]
IF
检查是否进入闯关地图(格式:TDG001-TDG010)
ISONMAPTDG0
ACT
获取玩家所在层号(如1)
GetUserVarHumanTDGLevelP0
立即刷出本层BOSS
PARAM1TDG0<$STR(P0)>;地图名
PARAM2本层BOSS名称;替换为真实BOSS名
PARAM350;X坐标
PARAM450;Y坐标
PARAM41;范围
PARAM51;数量
MONGEN;关键刷怪命令
标记本层BOSS为存活状态(层号变量)
SETGLOBALTDG<$STR(P0)>_BOSS_Alive=1
启动玩家专属计时器
SETONTIMER11TDGTimer
=关键限时与监控计时器=
[@OnTimerTDGTimer]
if
检查玩家是否还在闯关地图中
ISONMAPTDG0
ACT
计算停留时间(秒)
GetUserVarHumanTDGEnterTimeP0
CALCULATION_TIME_PASSED:SETP1=<DATETIME>-<STR(P0)>
检查是否超时(30*60=1800秒)
if
LARGEP11799
ACT
超时处理!踢回安全区
MESSAGEBOX[超时]停留时间已到30分钟!
Gmexecute退出闯关
BREAK
endif
=统一退出闯关函数(重要!)=
[@Exit_Challenge]
ACT
获取玩家当前层
GetUserVarHumanTDGLevelP0
如果层号有效(1-10),重置状态
if
RANGE<$STR(P0)>110
ACT
清除玩家闯关标记
SETHUMANIsInTDG=0
SETHUMANTDGLevel=0
DELTIMERTDGTimer;关闭计时器
标记本层为空闲
SETGLOBALTDG_Status_<$STR(P0)>=0
传送回土城安全区
MAPMOVE3330330
SENDMSG6[系统]你已被传送回安全区!
特殊:如果玩家是正常通关下一层,此函数会被覆盖变量
此处仅处理异常退出(超时/主动离开)
ELSEACT
非闯关状态调用此函数则忽略
BREAK
📍步骤5:BOSS死亡触发(MonItems目录下的BOSS配置)
路径:Mir200\Envir\MonItems\本层BOSS名称.txt
#IF
#ACT
重要!标记本层BOSS死亡
SETGLOBALTDG1_BOSS_Alive=0;注意修改对应层号
SENDMSG6[全服]第1层守关BOSS已被勇士击败!
三、核心机制总结表
功能实现方式关键变量/命令
单层人数控制全局变量G标记层状态(G101-G110)TDG_Status_X(X=层号)
限时30分钟玩家变量记录进入时间+OnTimer每秒检查HUMANTDGEnterTime+<$DATETIME>
动态刷怪玩家进入地图事件+MONGEN命令@EnterMap+MONGEN
层状态重置通关或退出时清除玩家层变量,重置G标记SETGLOBALTDG_Status_X=0
防作弊地图参数禁用卷轴+掉线不回图+NPC校验玩家所在层NOTALLOWUSEITEMS+NORECONNECT(N)
BOSS状态跟踪全局变量记录存活状态,死亡时更新TDGX_BOSS_Alive
四、脚本调试技巧
变量查看:游戏中输入@ViewGVar查看全局变量,@ViewSVar查看个人变量
实时测试:
//强制进入第1层(测试用)
#ACT
SETHUMANTDGLevel=1
SETHUMANIsInTDG=1
MAPMOVETDG001
常见错误排查:
BOSS不刷新:检查@EnterMap是否触发,坐标是否有效
超时无效:确认QManage.txt加载,<$DATETIME>是否正常返回秒数
层状态混乱:用@ViewGVar查看G101-G110的值是否正常重置
NPC不响应:检查NPC文件名是否与MapInfo.txt中地图名匹配
五、最终效果模拟
玩家A点击入口NPC:
系统扫描G101-G110,发现G101=0(空闲)
传送A到第1层,同时:
设置G101=1(占用)
刷新第1层BOSS
启动30分钟倒计时
A击败BOSS后点NPC进入第2层:
重置G101=0
刷新第2层BOSS(A专用)
重置A的计时器
此时玩家B点击NPC:
系统扫描发现G101=0(空闲)
传送B到第1层,立即刷新专属BOSS
两人独立闯关,互不干扰
投入运营前务必全流程测试10次以上!建议用测试账号模拟多人并发抢占资源池情况。
进入后立即刷BOSS→玩家杀怪→点击NPC进入下一层
离开当前层时:清除玩家变量→重置层状态为"空闲"→准备迎接下一位玩家
新玩家进入→系统检测空闲层→自动刷新对应层BOSS
一、文件部署位置(以GEE引擎为例)
NPC脚本:MirServer\Mir200\Envir\Market_Def\盟重省-闯关使者.txt(入口NPC)
地图触发脚本:MirServer\Mir200\Envir\MapQuest_Def\QManage.txt(全局管理定时器)
层地图参数:MirServer\Mir200\Envir\MapInfo.txt(设置地图限制参数)
刷怪文件:MirServer\Mir200\Envir\MonGen.txt(常规刷怪,但本方案主要用脚本刷)
二、超详细脚本实现(GEE引擎语法)
📍步骤1:定义闯关地图信息(MapInfo.txt)
[TDG001第一层]SAFEDAYNORECALLNODEALNORECONNECT(N)NOTALLOWUSEITEMS(回城卷|随机传送卷)INCGAMEPOINT(0/1)TIMELIMIT(30)NEEDHOLE
[TDG002第二层]SAFEDAYNORECALLNODEALNORECONNECT(N)...TIMELIMIT(30)NEEDHOLE
...同样格式定义第3层到第10层TDG003-TDG010
关键参数解释:
NOTALLOWUSEITEMS(回城卷|随机传送卷):禁止使用逃跑道具
TIMELIMIT(30):限制本图最多停留30分钟
NEEDHOLE:必须通过洞口/NPC传送进出(配合脚本控制)
NORECONNECT(N):掉线重连不回地图(防止利用漏洞)
📍步骤2:入口NPC脚本(盟重省-闯关使者.txt)
[@Main]
if
act
显示闯关信息
SAY
<闯关使者/SCOLOR=249>:想挑战十重天关?\\
每层仅限一人,限时30分钟!\\
成功通关可获极品奖励!\\
<我要挑战!/@EnterChallange>\\
<排行榜/@ShowRank>\
[@EnterChallange]
IF
检查玩家是否已在闯关系统中
CHECKVARHUMANIsInTDG=1
ACT
MESSAGEBOX[失败]您正在挑战中!请先完成当前层挑战!
BREAK
IF
尝试为玩家分配一个空闲层
GetAvailTDGLevel
ACT
分配成功(返回值在P0)
SETTING:
SETTING:
设置玩家所在层变量
SETHUMANTDGLevel=<$STR(P0)>
SETHUMANIsInTDG=1
记录进入时间(单位:秒)
SETHUMANTDGEnterTime=<$DATETIME>
传送玩家到对应层
MAPMOVETDG0<$STR(P0)>
发送提示
SENDMSG6[系统]你已进入第[<$STR(P0)>]层,限时30分钟!
ELSEACT
所有层都满了
MESSAGEBOX[失败]所有关卡已满员!请稍后再试!
BREAK
;---查找最低空闲层函数---
[@GetAvailTDGLevel()]
ACT
初始化层号P0=0(未找到)
SETP00
循环检查1-10层状态
LoopSetP11101
;检测全局变量G101-G110(1-10层状态0=空闲1=占用)
CHECKVARGLOBALTDG_Status_<$STR(P1)>=0
SETP0<$STR(P1)>;找到空闲层,赋值给P0
将该层状态标记为占用
SETGLOBALTDG_Status_<$STR(P1)>=1
跳出循环
BREAK
}
返回P0(0表示无空闲,1-10表示层号)
RETURNP0
📍步骤3:每层通关NPC(放在每层地图里,例如TDG001-NPC.txt)
[@Main]
IF
检查玩家是否在本层(防止跨层点)
CHECKVARHUMANTDGLevel=1;注意:第2层就改成2,以此类推
SAY
<守关天将/SCOLOR=250>:击败本层BOSS方可前往下一关!\\
<BOSS刷新状态:>{目前存活|/SCOLOR=254}\\
<离开挑战/@Exit>|<下一关/@NextLevel>\
[@NextLevel]
IF
检查本层BOSS是否死亡(根据引擎不同,可以用变量控制)
CHECKVARGLOBALTDG1_BOSS_Alive=0;0=死亡
ACT
清除当前层变量
SETHUMANTDGLevel=0
关闭计时器
DELTIMERTDGTimer
设置玩家进入下一层状态
SETHUMANIsInTDG=1
SETHUMANTDGLevel=2;进入第2层
SETHUMANTDGEnterTime=<$DATETIME>;重置计时
标记本层为空闲状态
SETGLOBALTDG_Status_1=0
传送至下一层
MAPMOVETDG002
提示
SENDMSG6[系统]你已进入第2层,限时重新计算!
ELSEACT
MESSAGEBOX[失败]BOSS尚未击败!
BREAK
[@Exit]
IF
ACT
调用公共退出函数(在QManage.txt里实现)
Gmexecute退出闯关
📍步骤4:全局管理触发(QManage.txt)
=玩家进入任何闯关地图时触发刷怪=
[@EnterMap]
IF
检查是否进入闯关地图(格式:TDG001-TDG010)
ISONMAPTDG0
ACT
获取玩家所在层号(如1)
GetUserVarHumanTDGLevelP0
立即刷出本层BOSS
PARAM1TDG0<$STR(P0)>;地图名
PARAM2本层BOSS名称;替换为真实BOSS名
PARAM350;X坐标
PARAM450;Y坐标
PARAM41;范围
PARAM51;数量
MONGEN;关键刷怪命令
标记本层BOSS为存活状态(层号变量)
SETGLOBALTDG<$STR(P0)>_BOSS_Alive=1
启动玩家专属计时器
SETONTIMER11TDGTimer
=关键限时与监控计时器=
[@OnTimerTDGTimer]
if
检查玩家是否还在闯关地图中
ISONMAPTDG0
ACT
计算停留时间(秒)
GetUserVarHumanTDGEnterTimeP0
CALCULATION_TIME_PASSED:SETP1=<DATETIME>-<STR(P0)>
检查是否超时(30*60=1800秒)
if
LARGEP11799
ACT
超时处理!踢回安全区
MESSAGEBOX[超时]停留时间已到30分钟!
Gmexecute退出闯关
BREAK
endif
=统一退出闯关函数(重要!)=
[@Exit_Challenge]
ACT
获取玩家当前层
GetUserVarHumanTDGLevelP0
如果层号有效(1-10),重置状态
if
RANGE<$STR(P0)>110
ACT
清除玩家闯关标记
SETHUMANIsInTDG=0
SETHUMANTDGLevel=0
DELTIMERTDGTimer;关闭计时器
标记本层为空闲
SETGLOBALTDG_Status_<$STR(P0)>=0
传送回土城安全区
MAPMOVE3330330
SENDMSG6[系统]你已被传送回安全区!
特殊:如果玩家是正常通关下一层,此函数会被覆盖变量
此处仅处理异常退出(超时/主动离开)
ELSEACT
非闯关状态调用此函数则忽略
BREAK
📍步骤5:BOSS死亡触发(MonItems目录下的BOSS配置)
路径:Mir200\Envir\MonItems\本层BOSS名称.txt
#IF
#ACT
重要!标记本层BOSS死亡
SETGLOBALTDG1_BOSS_Alive=0;注意修改对应层号
SENDMSG6[全服]第1层守关BOSS已被勇士击败!
三、核心机制总结表
功能实现方式关键变量/命令
单层人数控制全局变量G标记层状态(G101-G110)TDG_Status_X(X=层号)
限时30分钟玩家变量记录进入时间+OnTimer每秒检查HUMANTDGEnterTime+<$DATETIME>
动态刷怪玩家进入地图事件+MONGEN命令@EnterMap+MONGEN
层状态重置通关或退出时清除玩家层变量,重置G标记SETGLOBALTDG_Status_X=0
防作弊地图参数禁用卷轴+掉线不回图+NPC校验玩家所在层NOTALLOWUSEITEMS+NORECONNECT(N)
BOSS状态跟踪全局变量记录存活状态,死亡时更新TDGX_BOSS_Alive
四、脚本调试技巧
变量查看:游戏中输入@ViewGVar查看全局变量,@ViewSVar查看个人变量
实时测试:
//强制进入第1层(测试用)
#ACT
SETHUMANTDGLevel=1
SETHUMANIsInTDG=1
MAPMOVETDG001
常见错误排查:
BOSS不刷新:检查@EnterMap是否触发,坐标是否有效
超时无效:确认QManage.txt加载,<$DATETIME>是否正常返回秒数
层状态混乱:用@ViewGVar查看G101-G110的值是否正常重置
NPC不响应:检查NPC文件名是否与MapInfo.txt中地图名匹配
五、最终效果模拟
玩家A点击入口NPC:
系统扫描G101-G110,发现G101=0(空闲)
传送A到第1层,同时:
设置G101=1(占用)
刷新第1层BOSS
启动30分钟倒计时
A击败BOSS后点NPC进入第2层:
重置G101=0
刷新第2层BOSS(A专用)
重置A的计时器
此时玩家B点击NPC:
系统扫描发现G101=0(空闲)
传送B到第1层,立即刷新专属BOSS
两人独立闯关,互不干扰
投入运营前务必全流程测试10次以上!建议用测试账号模拟多人并发抢占资源池情况。

