传奇刷怪NPC脚本:塔防波次与动态补怪双模式实现

来源: 作者: 点击:
刷怪NPC脚本的核心只有四个要素:地图编号、怪物计数命令、刷怪命令、定时器。把这四样串起来,就能做出“清完一波、等几秒、刷下一波”的塔防节奏,也能做出“地图上始终维持50只、打掉多少补多少”的无限模式。下面分别给出两种模式的脚本结构和关键写法,命令名称以GOM/GEE/Hero系主流引擎为基准,不同引擎个别命令可能需要微调。

---

## 一、塔防波次模式:进图自动开刷,清完一波等N秒刷下一波

这个模式不需要点击NPC,玩家进入指定地图后脚本自动接管。核心逻辑是:**进图触发第一波 → 定时器检测地图怪物是否归零 → 归零后延迟N秒 → 刷下一波 → 继续检测**。

### 1. 进图触发第一波

在QManage.txt或地图关联的脚本中,用[@IntoMap]或传送NPC的[@gomap]段触发首波。以地图`D717`为例,刷20只白野猪:

```
[@IntoMap]
#IF
CHECKMAPNAME D717
#ACT
SENDMSG 6 第一波怪物将在5秒后刷新!
DELAYGOTO 5000 @Wave1
BREAK

[@Wave1]
#IF
#ACT
MonGen D717 50 50 白野猪 20
SENDMSG 0 第1波怪物已出现,击杀后10秒刷新下一波!
SETONTIMER 1 1000
BREAK
```

`SETONTIMER 1 1000`表示开启1号定时器,每1000毫秒(1秒)检测一次。

### 2. 定时器检测怪物归零并触发下一波

在同一个脚本文件或QManage.txt中声明[@OnTimer1]:

```
[@OnTimer1]
#IF
CHECKMAPMONCOUNT D717 = 0
#ACT
SETOFFTIMER 1
DELAYGOTO 10000 @Wave2
BREAK
#ELSEACT
BREAK
```

`CHECKMAPMONCOUNT D717 = 0`用来判断地图内怪物是否已经清空。清空后先关掉定时器,用`DELAYGOTO 10000`延迟10秒,再跳到下一波脚本段。如果不关定时器就继续检测,会在等待期间反复触发,造成刷怪混乱。

### 3. 第二波及后续波次

```
[@Wave2]
#IF
#ACT
MonGen D717 50 50 祖玛卫士 20
SENDMSG 0 第2波怪物已出现!
SETONTIMER 1 1000
BREAK
```

后续波次复制[@Wave2]改为[@Wave3]、[@Wave4]即可,怪物种类和数量逐波调整。如果不想手动写死波次,可以把波数存入变量(如`INC G100 1`),在刷怪命令中使用变量控制数量,但前提是引擎的`MonGen`支持数量参数带变量。

---

## 二、动态补怪模式:点NPC开启,保持50只,打多少补多少

这个模式维持地图上的怪物数量恒定。你设定目标数量为50,脚本定时统计当前存活数量,差值是多少就补多少。打掉20只,就补20只;打掉30只,就补30只。

### 1. NPC对话入口

NPC脚本放在Market_Def目录下,对话触发启动和停止两个开关:

```
[@main]
我可以让你在地图中保持50只怪物,打掉多少就补多少。\
<开启/@StartFill>\
<停止/@StopFill>

[@StartFill]
#IF
#ACT
SETONTIMER 2 3000
SENDMSG 6 动态补怪已开启,目标数量50只,每3秒检测一次。
BREAK

[@StopFill]
#IF
#ACT
SETOFFTIMER 2
SENDMSG 6 动态补怪已关闭。
BREAK
```

`SETONTIMER 2 3000`表示用2号定时器每3秒检测一次,间隔不宜低于2000毫秒,避免给脚本队列造成压力。

### 2. 定时器内计算差值并补怪

```
[@OnTimer2]
#IF
CHECKMAPNAME D717
#ACT
MOV N$当前数量 0
MOV N$差值 0
GETMONCOUNT D717 白野猪 N$当前数量
#IF
N$当前数量 < 50
#ACT
CALC N$差值 50 - N$当前数量
MonGen D717 50 50 白野猪 <$STR(N$差值)>
```

`GETMONCOUNT`把地图内指定怪物的当前数量读入变量`N$当前数量`,`CALC`算出与目标值50的差值,再把差值作为`MonGen`的数量参数刷出去。如果引擎的`MonGen`数量参数不支持变量,就退一步用固定值分批补:每次检测到不足50时刷10只,下一轮检测再补,几轮之后自然会凑满,效果相同但代码更简单。

---

## 三、两种模式共用的关键命令与避坑要点

**怪物计数**。主流引擎常用`CHECKMAPMONCOUNT`或`GETMONCOUNT`。`CHECKMAPMONCOUNT`适合做条件判断(如`= 0`表示清空),`GETMONCOUNT`适合把数量取出来参与计算。老引擎如果不支持,可以用`CHECKMONMAP`配合变量替代。

**刷怪命令**。`MonGen`用于按坐标和数量直接刷怪;`MONGENEX`是扩展版本,支持范围、名字颜色、内功怪物等更多参数。脚本中的怪物名称必须与怪物数据库完全一致,多一个空格都会导致不刷。

**定时器管理**。塔防模式在清怪后要用`SETOFFTIMER`关掉检测定时器,等延迟结束刷完下一波再重新开启;动态补怪模式在玩家离开地图或手动停止时也要关掉定时器,否则脚本会在后台空转,长期运行会积累负担。每个定时器编号(1—19)只能被一个脚本段占用,开新定时器前先在文件里搜索`@OnTimer`加编号,确认没有重复。

**坐标与刷怪点**。固定坐标刷怪容易让怪物扎堆,可以用矩形范围参数让引擎在区域内随机选点,或者在脚本里准备3—5个坐标轮流使用,降低卡墙和堆叠的概率。地图参数方面,如果后续需要接入怪物死亡触发来精确控制波次节奏,可以在MapInfo.txt中为目标地图加上`FIGHT`或`FIGHT3`标志。

两种模式并不冲突,可以放在同一张地图上由玩家自行选择:进图自动走塔防节奏,点击NPC则切换为无限补怪。把地图编号、目标数量、怪物名称、检测间隔这四个参数按自己的版本改掉,保存后重启服务端加载脚本即可生效。