## 需求分析:你要实现的十层单人闯关机制
你在制作的这个闯关地图,核心机制可以拆解成以下几个关键点:
1. **每层单人独占**:十层地图,每一层同时只能有一个人在里面。玩家A进了第一层,别人就不能进第一层,但可以进第二层(如果第二层空着)。
2. **层间递进关系**:玩家必须打死当前层的BOSS,才能通过NPC进入下一层。第一层的人进了第二层,第一层就空出来了,下一个玩家可以进。
3. **单层限时机制**:每一层限制时间30分钟,超时自动传送回土城。
4. **动态刷怪机制**:玩家进入某一层时,该层才刷出BOSS。玩家离开该层(不管是进了下一层还是超时回城),该层怪物消失,留给下一个人重新刷。
这个逻辑里最难的点在于“层间递进”和“动态刷怪”的配合,不能直接用普通地图传送脚本,需要用到变量来记录每一层的状态。
## 脚本文件存放位置与准备工作
你需要创建或修改以下几个文件,所有文件都保存在传奇服务端的 `Mir200\Envir` 目录下:
1. **MapInfo.txt**:地图配置文件,末尾添加你的十层地图。
2. **MerChant.txt**:NPC配置文件,在土城添加一个闯关NPC。
3. **QFunction-0.txt**:功能脚本文件,存放刷怪和触发检测的脚本段。
4. **NPCS文件夹**:在 `Envir\Market_Def` 里新建一个文本文件,存放闯关NPC的具体对话脚本。
假设你的十层地图代码分别为:
- 第一层:G101
- 第二层:G102
- 第三层:G103
- ...以此类推到 G110
## 第一步:配置地图参数(MapInfo.txt)
打开 `MapInfo.txt`,在文件末尾添加以下十行内容。注意后面的参数直接决定了地图的部分行为。
```
[G101 闯关第一层] NORECALL NORANDOMMOVE NODEARRECALL
[G102 闯关第二层] NORECALL NORANDOMMOVE NODEARRECALL
[G103 闯关第三层] NORECALL NORANDOMMOVE NODEARRECALL
[G104 闯关第四层] NORECALL NORANDOMMOVE NODEARRECALL
[G105 闯关第五层] NORECALL NORANDOMMOVE NODEARRECALL
[G106 闯关第六层] NORECALL NORANDOMMOVE NODEARRECALL
[G107 闯关第七层] NORECALL NORANDOMMOVE NODEARRECALL
[G108 闯关第八层] NORECALL NORANDOMMOVE NODEARRECALL
[G109 闯关第九层] NORECALL NORANDOMMOVE NODEARRECALL
[G110 闯关第十层] NORECALL NORANDOMMOVE NODEARRECALL FIGHT
```
- **NORECALL**:禁止记忆套装召唤。
- **NORANDOMMOVE**:禁止使用随机传送卷。
- **NODEARRECALL**:禁止夫妻传送。
- **FIGHT**:第十层加上这个参数,可以作为最终的战斗区域,允许PK(看你自己设定)。
## 第二步:设置NPC对话脚本(Market_Def\闯关使者-3.txt)
在 `Envir\Market_Def` 文件夹里新建一个文本文档,重命名为 `闯关使者-3.txt`(-3代表NPC在土城,坐标你自己定)。写入以下脚本:
```text
[@main]
欢迎来到单人闯关领地,这里共十层,每层限时30分钟。\
每层仅允许一人进入,打倒BOSS即可进入下一层。\
请选择你要挑战的层数(只能从第一层开始):\
<开始闯关(第一层)/@进入一层>\ \
<关闭对话/@exit>
[@进入一层]
#IF
checkhum G101 1
#ACT
messagebox 提示:第一层当前已有人在闯关,请稍后再来。
break
#IF
#ACT
CLEARMAPMON G101
PARAM1 G101
PARAM2 25
PARAM3 25
MONGEN 第一关BOSS 1 1
TimeRecall 30
map G101
SENDMSG 0 玩家【%s】进入了闯关第一层,限时30分钟,请抓紧时间!
break
```
- **checkhum G101 1**:检测G101地图里的人数是否等于1,如果有1个人,就不让进。
- **CLEARMAPMON G101**:清空G101地图的所有怪物,保证进去时只有系统刚刷的那一只。
- **PARAM1/2/3 + MONGEN**:在指定坐标(25,25)刷一只名为“第一关BOSS”的怪,数量1只,范围0。
- **TimeRecall 30**:30分钟定时,时间一到自动回城(回到登录脚本里设定的默认城市,通常是土城)。
- **map G101**:把玩家传送进去。
**特别注意**:你一共有十层,不能写十个按钮让玩家选,因为玩家只能从第一层开始,打完一层再点NPC进下一层。所以这个NPC只需要有进入第一层的功能。**进入下一层的NPC要放在每一层的地图里**。
## 第三步:设置层内NPC(通往下一层)
在每一层的地图里(比如G101),你需要放置一个NPC,名字叫“传送使者”或“进入下一层”。它的脚本逻辑比土城NPC复杂,因为要判断下一层是否为空。
假设G101的NPC脚本(文件放在 `Envir\Market_Def\QFunction-0.txt` 或者单独的文件里,取决于你用什么引擎,这里以最常见的单独文件为例,文件名为 `进入下一层-G101.txt`):
```text
[@main]
恭喜你打倒了第一关的BOSS!\
你可以选择进入第二层继续挑战,或者领取奖励离开。\
<进入第二层/@进二层> \
<离开此地/@回土城>
[@进二层]
#IF
checkhum G102 1
#ACT
messagebox 提示:第二层当前已有人在闯关,请在一层稍等片刻。
break
#IF
#ACT
CLEARMAPMON G102 ;清空二层可能残留的怪
CLEARMAPMON G101 ;清空一层的怪(防止玩家返回)
PARAM1 G102
PARAM2 25
PARAM3 25
MONGEN 第二关BOSS 1 1
TimeRecall 30 ;重置30分钟计时(从进入二层重新算)
map G102
SENDMSG 0 玩家【%s】进入了闯关第二层,限时30分钟!
break
[@回土城]
#IF
#ACT
CLEARMAPMON G101
map 3 ;3通常是土城
break
```
- **关键逻辑**:这里的 `checkhum G102 1` 就是为了实现你说的“我离开了第二层,别人才能进第二层”。如果检测到二层有人,就不让进,必须等着。
- **CLEARMAPMON G101**:当你从第一层进入第二层时,顺便把第一层的怪清了,省得第一层留着空壳子。等下一个玩家进第一层时,土城NPC的脚本里会再刷新的。
## 第四步:超时处理和掉线保护(MapInfo.txt配合QFunction)
你要求30分钟超时自动返回土城,上面已经用了 `TimeRecall 30` 命令,这个命令本身就会在时间到时把玩家传送到登录脚本里设置的回城点(通常是土城)。
但是还有一个问题:**玩家超时被传走,或者掉线了,他所在的那一层地图里的BOSS怎么办?**
如果不处理,就会出现“地图里没人,但BOSS还在,下一个人进不去(因为checkhum检测到地图人数为0,但进去后发现有个怪把路堵着,而且按你要求应该是进去刷新的,不应该是旧怪)”。
解决办法是在 `QFunction-0.txt` 里添加一个 **地图退出触发**。不同引擎触发字段不同,这里以通用性较强的写法为例:
在 `QFunction-0.txt` 里添加:
```text
[@PlayLeaveMapG101]
#IF
#ACT
CLEARMAPMON G101
[@PlayLeaveMapG102]
#IF
#ACT
CLEARMAPMON G102
;一直到G110,依次写下去
```
这个脚本的意思是:只要有玩家离开G101地图(不管是超时、回城、掉线、小退),就立即触发,清空该地图的所有怪物。这样地图就恢复了空置状态,下一个玩家进入时,土城NPC的 `MONGEN` 会重新刷怪。
## 第五步:十层地图的全套配置清单
为了方便你直接复制使用,把整个脚本逻辑涉及的条目汇总如下:
| 文件路径 | 核心内容 | 作用 |
| :--- | :--- | :--- |
| `MapInfo.txt` | `[G101 闯关第一层] NORECALL NORANDOMMOVE` | 定义地图,禁止随机和召唤 |
| `Market_Def\闯关使者-3.txt` | 包含 `checkhum G101` 和 `MONGEN` 命令 | 土城NPC,负责检测第一层是否空置并刷怪送人 |
| `Market_Def\进入下一层-G101.txt` | 包含 `checkhum G102` 和 `CLEARMAPMON` | 一层内部的NPC,负责检测二层空置并清怪传送 |
| `QFunction-0.txt` | `[@PlayLeaveMapG101]` 段内加 `CLEARMAPMON` | 玩家离开地图时自动清怪,防止卡图 |
| (引擎控制) | `TimeRecall 30` | 玩家进入地图时启动,30分钟后强制传送回城 |
## 第六点:常见踩坑提醒
1. **清怪要彻底**:`CLEARMAPMON` 这个命令很管用,但有些引擎的 `CLEARMAPMON` 只能清普通怪,清不掉某些自定义的超级怪。如果发现地图空了还有怪,需要换用 `CLEARMAPMON G101 *` 试试。
2. **变量记录层数**:如果你想做得更精细,比如记录玩家当前闯到了第几层,需要在脚本里加个人变量(比如 `P0`)。进入第一层时 `P0 = 1`,进入第二层时 `P0 = 2`,这样玩家回城后还能通过对话知道自己闯到哪了。这个属于进阶功能,先把你当前的单人独占和限时刷怪逻辑跑通再说。
3. **NPC坐标**:每一层地图里放的那个“进入下一层”NPC,坐标不要和刷BOSS的坐标重合,不然BOSS一出,NPC被挡住点不到。
按照以上步骤,把从G101到G110的地图全部按照这个模板配置好,你要求的“每层单人、递进进入、限时30分、进人刷怪、离人清怪”这套机制就能完整跑起来。

