玩家点击入口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 第一层] SAFE DAY NORECALL NODEAL NORECONNECT(N) NOTALLOWUSEITEMS(回城卷|随机传送卷) INCGAMEPOINT(0/1) TIMELIMIT(30) NEEDHOLE
[TDG002 第二层] SAFE DAY NORECALL NODEAL NORECONNECT(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
检查玩家是否已在闯关系统中
CHECKVAR HUMAN IsInTDG = 1
ACT
MESSAGEBOX [失败] 您正在挑战中!请先完成当前层挑战!
BREAK
IF
尝试为玩家分配一个空闲层
GetAvailTDGLevel
ACT
分配成功(返回值在P0)
SETTING:
SETTING:
设置玩家所在层变量
SET HUMAN TDGLevel = <$STR(P0)>
SET HUMAN IsInTDG = 1
记录进入时间(单位:秒)
SET HUMAN TDGEnterTime = <$DATETIME>
传送玩家到对应层
MAPMOVE TDG0<$STR(P0)>
发送提示
SENDMSG 6 [系统] 你已进入第[<$STR(P0)>]层,限时30分钟!
ELSEACT
所有层都满了
MESSAGEBOX [失败] 所有关卡已满员!请稍后再试!
BREAK
;--- 查找最低空闲层函数 ---
[@GetAvailTDGLevel()]
ACT
初始化层号 P0 = 0 (未找到)
SET P0 0
循环检查1-10层状态
LoopSet P1 1 10 1
; 检测全局变量G101-G110(1-10层状态 0=空闲 1=占用)
CHECKVAR GLOBAL TDG_Status_<$STR(P1)> = 0
SET P0 <$STR(P1)> ; 找到空闲层,赋值给P0
将该层状态标记为占用
SET GLOBAL TDG_Status_<$STR(P1)> = 1
跳出循环
BREAK
}
返回P0(0表示无空闲,1-10表示层号)
RETURN P0
📍 步骤3:每层通关NPC (放在每层地图里,例如 TDG001-NPC.txt)
[@Main]
IF
检查玩家是否在本层(防止跨层点)
CHECKVAR HUMAN TDGLevel = 1 ; 注意:第2层就改成2,以此类推
SAY
<守关天将/SCOLOR=250>:击败本层BOSS方可前往下一关!\ \
<BOSS刷新状态:>{目前存活|/SCOLOR=254}\ \
<离开挑战/@Exit> | <下一关/@NextLevel>\
[@NextLevel]
IF
检查本层BOSS是否死亡(根据引擎不同,可以用变量控制)
CHECKVAR GLOBAL TDG1_BOSS_Alive = 0 ; 0=死亡
ACT
清除当前层变量
SET HUMAN TDGLevel = 0
关闭计时器
DELTIMER TDGTimer
设置玩家进入下一层状态
SET HUMAN IsInTDG = 1
SET HUMAN TDGLevel = 2 ; 进入第2层
SET HUMAN TDGEnterTime = <$DATETIME> ; 重置计时
标记本层为空闲状态
SET GLOBAL TDG_Status_1 = 0
传送至下一层
MAPMOVE TDG002
提示
SENDMSG 6 [系统] 你已进入第2层,限时重新计算!
ELSEACT
MESSAGEBOX [失败] BOSS尚未击败!
BREAK
[@Exit]
IF
ACT
调用公共退出函数(在QManage.txt里实现)
Gmexecute 退出闯关
📍 步骤4:全局管理触发(QManage.txt)
= 玩家进入任何闯关地图时触发刷怪 =
[@EnterMap]
IF
检查是否进入闯关地图(格式:TDG001 - TDG010)
ISONMAP TDG0
ACT
获取玩家所在层号(如1)
GetUserVar Human TDGLevel P0
立即刷出本层BOSS
PARAM1 TDG0<$STR(P0)> ; 地图名
PARAM2 本层BOSS名称 ; 替换为真实BOSS名
PARAM3 50 ; X坐标
PARAM4 50 ; Y坐标
PARAM4 1 ; 范围
PARAM5 1 ; 数量
MONGEN ; 关键刷怪命令
标记本层BOSS为存活状态(层号变量)
SET GLOBAL TDG<$STR(P0)>_BOSS_Alive = 1
启动玩家专属计时器
SETONTIMER 1 1 TDGTimer
= 关键限时与监控计时器 =
[@OnTimerTDGTimer]
if
检查玩家是否还在闯关地图中
ISONMAP TDG0
ACT
计算停留时间(秒)
GetUserVar Human TDGEnterTime P0
CALCULATION_TIME_PASSED: SET P1 = <DATETIME> - <STR(P0)>
检查是否超时(30*60=1800秒)
if
LARGE P1 1799
ACT
超时处理!踢回安全区
MESSAGEBOX [超时] 停留时间已到30分钟!
Gmexecute 退出闯关
BREAK
endif
= 统一退出闯关函数(重要!) =
[@Exit_Challenge]
ACT
获取玩家当前层
GetUserVar Human TDGLevel P0
如果层号有效(1-10),重置状态
if
RANGE <$STR(P0)> 1 10
ACT
清除玩家闯关标记
SET HUMAN IsInTDG = 0
SET HUMAN TDGLevel = 0
DELTIMER TDGTimer ; 关闭计时器
标记本层为空闲
SET GLOBAL TDG_Status_<$STR(P0)> = 0
传送回土城安全区
MAPMOVE 3 330 330
SENDMSG 6 [系统] 你已被传送回安全区!
特殊:如果玩家是正常通关下一层,此函数会被覆盖变量
此处仅处理异常退出(超时/主动离开)
ELSEACT
非闯关状态调用此函数则忽略
BREAK
📍 步骤5:BOSS死亡触发(MonItems目录下的BOSS配置)
路径:Mir200\Envir\MonItems\本层BOSS名称.txt
#IF
#ACT
重要!标记本层BOSS死亡
SET GLOBAL TDG1_BOSS_Alive = 0 ; 注意修改对应层号
SENDMSG 6 [全服] 第1层守关BOSS已被勇士击败!
三、 核心机制总结表
功能 实现方式 关键变量/命令
单层人数控制 全局变量G标记层状态(G101-G110) TDG_Status_X (X=层号)
限时30分钟 玩家变量记录进入时间 + OnTimer每秒检查 HUMAN TDGEnterTime + <$DATETIME>
动态刷怪 玩家进入地图事件 + MONGEN命令 @EnterMap + MONGEN
层状态重置 通关或退出时清除玩家层变量,重置G标记 SET GLOBAL TDG_Status_X=0
防作弊 地图参数禁用卷轴 + 掉线不回图 + NPC校验玩家所在层 NOTALLOWUSEITEMS + NORECONNECT(N)
BOSS状态跟踪 全局变量记录存活状态,死亡时更新 TDGX_BOSS_Alive
四、 脚本调试技巧
变量查看: 游戏中输入 @ViewGVar 查看全局变量,@ViewSVar 查看个人变量
实时测试:
// 强制进入第1层(测试用)
#ACT
SET HUMAN TDGLevel = 1
SET HUMAN IsInTDG = 1
MAPMOVE TDG001
常见错误排查:
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次以上!建议用测试账号模拟多人并发抢占资源池情况。
独家闯关地图脚本教程:1人1层+限时30分钟+智能刷怪(附全套脚本)
来源:
作者:
点击:

