刷怪NPC脚本的核心只有四个要素:地图编号、怪物计数命令、刷怪命令、定时器。把这四样串起来,就能做出“清完一波、等几秒、刷下一波”的塔防节奏,也能做出“地图上始终维持50只、打掉多少补多少”的无限模式。下面分别给出两种模式的脚本结构和关键写法,命令名称以GOM/GEE/Hero系主流引擎为基准,不同引擎个别命令可能需要微调。
---
##一、塔防波次模式:进图自动开刷,清完一波等N秒刷下一波
这个模式不需要点击NPC,玩家进入指定地图后脚本自动接管。核心逻辑是:**进图触发第一波→定时器检测地图怪物是否归零→归零后延迟N秒→刷下一波→继续检测**。
###1.进图触发第一波
在QManage.txt或地图关联的脚本中,用[@IntoMap]或传送NPC的[@gomap]段触发首波。以地图`D717`为例,刷20只白野猪:
```
[@IntoMap]
#IF
CHECKMAPNAMED717
#ACT
SENDMSG6第一波怪物将在5秒后刷新!
DELAYGOTO5000@Wave1
BREAK
[@Wave1]
#IF
#ACT
MonGenD7175050白野猪20
SENDMSG0第1波怪物已出现,击杀后10秒刷新下一波!
SETONTIMER11000
BREAK
```
`SETONTIMER11000`表示开启1号定时器,每1000毫秒(1秒)检测一次。
###2.定时器检测怪物归零并触发下一波
在同一个脚本文件或QManage.txt中声明[@OnTimer1]:
```
[@OnTimer1]
#IF
CHECKMAPMONCOUNTD717=0
#ACT
SETOFFTIMER1
DELAYGOTO10000@Wave2
BREAK
#ELSEACT
BREAK
```
`CHECKMAPMONCOUNTD717=0`用来判断地图内怪物是否已经清空。清空后先关掉定时器,用`DELAYGOTO10000`延迟10秒,再跳到下一波脚本段。如果不关定时器就继续检测,会在等待期间反复触发,造成刷怪混乱。
###3.第二波及后续波次
```
[@Wave2]
#IF
#ACT
MonGenD7175050祖玛卫士20
SENDMSG0第2波怪物已出现!
SETONTIMER11000
BREAK
```
后续波次复制[@Wave2]改为[@Wave3]、[@Wave4]即可,怪物种类和数量逐波调整。如果不想手动写死波次,可以把波数存入变量(如`INCG1001`),在刷怪命令中使用变量控制数量,但前提是引擎的`MonGen`支持数量参数带变量。
---
##二、动态补怪模式:点NPC开启,保持50只,打多少补多少
这个模式维持地图上的怪物数量恒定。你设定目标数量为50,脚本定时统计当前存活数量,差值是多少就补多少。打掉20只,就补20只;打掉30只,就补30只。
###1.NPC对话入口
NPC脚本放在Market_Def目录下,对话触发启动和停止两个开关:
```
[@main]
我可以让你在地图中保持50只怪物,打掉多少就补多少。\
<开启/@StartFill>\
<停止/@StopFill>
[@StartFill]
#IF
#ACT
SETONTIMER23000
SENDMSG6动态补怪已开启,目标数量50只,每3秒检测一次。
BREAK
[@StopFill]
#IF
#ACT
SETOFFTIMER2
SENDMSG6动态补怪已关闭。
BREAK
```
`SETONTIMER23000`表示用2号定时器每3秒检测一次,间隔不宜低于2000毫秒,避免给脚本队列造成压力。
###2.定时器内计算差值并补怪
```
[@OnTimer2]
#IF
CHECKMAPNAMED717
#ACT
MOVN$当前数量0
MOVN$差值0
GETMONCOUNTD717白野猪N$当前数量
#IF
N$当前数量<50
#ACT
CALCN$差值50-N$当前数量
MonGenD7175050白野猪<$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则切换为无限补怪。把地图编号、目标数量、怪物名称、检测间隔这四个参数按自己的版本改掉,保存后重启服务端加载脚本即可生效。
---
##一、塔防波次模式:进图自动开刷,清完一波等N秒刷下一波
这个模式不需要点击NPC,玩家进入指定地图后脚本自动接管。核心逻辑是:**进图触发第一波→定时器检测地图怪物是否归零→归零后延迟N秒→刷下一波→继续检测**。
###1.进图触发第一波
在QManage.txt或地图关联的脚本中,用[@IntoMap]或传送NPC的[@gomap]段触发首波。以地图`D717`为例,刷20只白野猪:
```
[@IntoMap]
#IF
CHECKMAPNAMED717
#ACT
SENDMSG6第一波怪物将在5秒后刷新!
DELAYGOTO5000@Wave1
BREAK
[@Wave1]
#IF
#ACT
MonGenD7175050白野猪20
SENDMSG0第1波怪物已出现,击杀后10秒刷新下一波!
SETONTIMER11000
BREAK
```
`SETONTIMER11000`表示开启1号定时器,每1000毫秒(1秒)检测一次。
###2.定时器检测怪物归零并触发下一波
在同一个脚本文件或QManage.txt中声明[@OnTimer1]:
```
[@OnTimer1]
#IF
CHECKMAPMONCOUNTD717=0
#ACT
SETOFFTIMER1
DELAYGOTO10000@Wave2
BREAK
#ELSEACT
BREAK
```
`CHECKMAPMONCOUNTD717=0`用来判断地图内怪物是否已经清空。清空后先关掉定时器,用`DELAYGOTO10000`延迟10秒,再跳到下一波脚本段。如果不关定时器就继续检测,会在等待期间反复触发,造成刷怪混乱。
###3.第二波及后续波次
```
[@Wave2]
#IF
#ACT
MonGenD7175050祖玛卫士20
SENDMSG0第2波怪物已出现!
SETONTIMER11000
BREAK
```
后续波次复制[@Wave2]改为[@Wave3]、[@Wave4]即可,怪物种类和数量逐波调整。如果不想手动写死波次,可以把波数存入变量(如`INCG1001`),在刷怪命令中使用变量控制数量,但前提是引擎的`MonGen`支持数量参数带变量。
---
##二、动态补怪模式:点NPC开启,保持50只,打多少补多少
这个模式维持地图上的怪物数量恒定。你设定目标数量为50,脚本定时统计当前存活数量,差值是多少就补多少。打掉20只,就补20只;打掉30只,就补30只。
###1.NPC对话入口
NPC脚本放在Market_Def目录下,对话触发启动和停止两个开关:
```
[@main]
我可以让你在地图中保持50只怪物,打掉多少就补多少。\
<开启/@StartFill>\
<停止/@StopFill>
[@StartFill]
#IF
#ACT
SETONTIMER23000
SENDMSG6动态补怪已开启,目标数量50只,每3秒检测一次。
BREAK
[@StopFill]
#IF
#ACT
SETOFFTIMER2
SENDMSG6动态补怪已关闭。
BREAK
```
`SETONTIMER23000`表示用2号定时器每3秒检测一次,间隔不宜低于2000毫秒,避免给脚本队列造成压力。
###2.定时器内计算差值并补怪
```
[@OnTimer2]
#IF
CHECKMAPNAMED717
#ACT
MOVN$当前数量0
MOVN$差值0
GETMONCOUNTD717白野猪N$当前数量
#IF
N$当前数量<50
#ACT
CALCN$差值50-N$当前数量
MonGenD7175050白野猪<$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则切换为无限补怪。把地图编号、目标数量、怪物名称、检测间隔这四个参数按自己的版本改掉,保存后重启服务端加载脚本即可生效。

