七个星位要真正亮起来,脚本得拆成地图定义、入阵对话、星位轮询、定时重置四块来写。少了哪一块,玩家要么进不了阵,要么站上星位毫无反应,要么点亮了却等不到阵眼。下面按搭建顺序把明文一段段摆开,坐标、变量名和命令参数都按能直接套用的写法给出,引擎以主流的 HEROM2、GOM 系列为准,写法有出入的地方单独标出来。
一、四个文件各管一段
地图配置写在 Mir200\Envir\MapInfo.txt,一个方括号开头的地图段对应一张图,后面跟一串属性标记。
玩家进阵、看进度、领奖的对话放在 Mir200\Envir\Market_Def 目录下,一个阵法建一个文本,比如北斗七星阵.txt。
星位轮询是触发逻辑,靠个人定时器驱动,段名写成 [@OnTimer编号],可以写在 NPC 脚本里,也可以放 QFunction-0.txt,看你想让它跟人还是跟图走。
定时重置交给 Mir200\Envir\Robot_def 目录下的两个文本。AutoRunRobot.txt 负责隔多久跑一次,RobotManage.txt 负责跑的时候干什么。
这四类文件改完,NPC 和脚本可以在 M2 控制台用重新加载所有 NPC 生效,地图、机器人这两类必须重启引擎才认。这是很多人改完没反应的第一处坑。
二、阵图与七位星位坐标
先在 MapInfo.txt 里开一张阵图,编号取一个不冲突的,这里用 7000:
text
[7000 北斗七星阵] FIGHT NORECALL NOPOSITIONMOVE NORANDOMMOVE
[7000 北斗七星阵] NORECALL
FIGHT 表示阵内可战斗。NORECALL 禁止玩家用飞随机、回城卷一类道具乱跳,防止中途打断站位轮询。NOPOSITIONMOVE 挡掉定点移动,避免有人用瞬移卡在星位上刷进度。如果这张阵图里你不想刷怪,别再顺手加 NOMON,加了之后 MONGEN 命令就刷不出阵眼,这是后面 BOSS 出不来的常见原因。
七个星位按北斗形状摆开,坐标按自己地图尺寸微调,这里给一组能用的:
天枢 110 120,天璇 130 115,天玑 150 108,天权 165 100,玉衡 180 110,开阳 200 120,摇光 215 130。
天权位在北斗里是斗魁与斗柄的接点,把它放在阵法正中偏上,后面启动北极星、召唤北斗尊主都以它为圆心。踩点检测的半径别写 0,写 0 只认同一格坐标,玩家走位稍微偏一点就判不到,写 1 或 2 都行。
三、入阵对话与计时启动
在 Market_Def\北斗七星阵.txt 里写:
text
[@main]
#SAY
北斗七星阵,踏齐七位方可启动北极星。\
入阵需人物等级六十以上,阵内每秒检测一次站位。\
<进入阵法/@enter> <查看进度/@progress> <退出对话/@exit>
[@enter]
#IF
CHECKLEVELEX < 60
#ACT
SENDMSG 6 等级不足六十,暂不可入阵。
BREAK
#IF
ISONMAP 7000
#ACT
SENDMSG 6 你已经在阵法之中。
BREAK
#IF
#ACT
MOV N$点亮 0
RESET [101] 7
MAPMOVE 7000 108 120
SETONTIMER 1 1
SENDMSG 6 已入北斗七星阵,请依次踏亮七位星位。
BREAK
[@progress]
#IF
EQUAL N$点亮 7
#SAY
七位星位已全部点亮,北极星已启,速去天权位斩杀北斗尊主。
#ELSESAY
当前点亮星位:<$STR(N$点亮)> / 7。
这里三处细节决定成败。MOV N
点亮
0
把个人进度清零,
𝑁
点亮0把个人进度清零,N 开头是个人变量,只跟当前角色走。RESET [101] 7 一次把 101 到 107 这七个逻辑变量归零,正好对应七个星位的点亮标记,比逐条 SET [101] 0 省事。SETONTIMER 1 1 是开一个编号 1 的定时器,每秒触发一次,编号要和你后面写的 [@OnTimer1] 对上。少数引擎这条命令是三段式 SETONTIMER 1 1 @段名,把触发段直接写在参数里,改了参数就把后面的标签省掉,两种别混着写。
四、星位轮询与点亮计数
定时器每秒醒来一次,就做一件事,看玩家脚步落在哪个星位上。整段逻辑靠 CheckInMapRange 判定坐标范围,它的写法是地图号加横纵坐标加范围:
text
[@OnTimer1]
#IF
EQUAL N$点亮 7
#ACT
SETOFFTIMER 1
BREAK
#IF
CHECKINMAPRANGE 7000 110 120 1
#ACT
GOTO @点亮天枢
BREAK
#IF
CHECKINMAPRANGE 7000 130 115 1
#ACT
GOTO @点亮天璇
BREAK
#IF
CHECKINMAPRANGE 7000 150 108 1
#ACT
GOTO @点亮天玑
BREAK
#IF
CHECKINMAPRANGE 7000 165 100 1
#ACT
GOTO @点亮天权
BREAK
#IF
CHECKINMAPRANGE 7000 180 110 1
#ACT
GOTO @点亮玉衡
BREAK
#IF
CHECKINMAPRANGE 7000 200 120 1
#ACT
GOTO @点亮开阳
BREAK
#IF
CHECKINMAPRANGE 7000 215 130 1
#ACT
GOTO @点亮摇光
BREAK
七个 [@点亮X] 段的写法完全一样,只换标记编号和提示文字,以天枢为例:
text
[@点亮天枢]
#IF
CHECK [101] 1
#ACT
BREAK
#IF
#ACT
SET [101] 1
INC N$点亮 1
SENDMSG 6 天枢星位已点亮,当前 <$STR(N$点亮)>/7。
GOTO @检查满阵
BREAK
CHECK [101] 1 这句是防重复的关键。玩家在同一个星位上站几秒,定时器就会触发几次,没有这句判断,同一个星位能被计进进度好几遍,七位还没走完进度就满了。SET [101] 1 打上标记,之后每次再踩到这一格都会被 CHECK 挡掉,直接 BREAK 结束。后面天璇到摇光依次用 102 到 107。
text
[@检查满阵]
#IF
EQUAL N$点亮 7
#ACT
GOTO @启动北极星
#ELSESAY
七个段尾部都指向这一段,只有进度到 7 才往下走。
五、集齐七星启动北极星
text
[@启动北极星]
#ACT
SETOFFTIMER 1
MONGENEX 7000 165 100 北斗尊主 1
SENDMSG 0 玩家【<$USERNAME>】已踏亮北斗七星,北极星阵启动!
SENDMSG 6 北极星已现,北斗尊主于天权位现身。
SETRANKLEVELNAME 北斗护阵者
BREAK
先关定时器,不然玩家站在原地每秒仍在跑轮询,白白增加引擎负担。MONGENEX 的格式是地图号、坐标、怪物名、数量,坐标就落在天权位。北斗尊主这个怪物必须先在怪物数据库里有对应记录,名字一个字都不能差,否则命令执行了也刷不出东西。SETRANKLEVELNAME 给完成者挂上封号,是这类阵法常见的荣誉反馈。
要是想让七位通关后更强,可以在这一段后面再接几句调整,例如给怪物加外观、给人物加攻击倍率。ChangeMapMonAppr 能改地图上怪物的外观,写法是地图名、坐标、范围、怪物名、外观编号、有效分钟,坐标范围全写 0 表示全图。这类附加动作放在启动段里,和召唤命令串在一起即可。
六、击杀北斗尊主与发奖
奖励逻辑放 QFunction-0.txt,接在怪物死亡触发后面:
text
[@OnKillMob]
#IF
CHECKHITMONNAME 北斗尊主
#ACT
GIVE 北斗令牌 1
GAMEGOLD + 5000
SENDMSG 6 北斗尊主已伏诛,获得北斗令牌一枚。
GOTO @阵法收尾
BREAK
[@阵法收尾]
#ACT
MOV N$点亮 0
RESET [101] 7
SETRANKLEVELNAME
MAPMOVE 3 330 330
BREAK
CHECKHITMONNAME 认的是玩家当前正在攻击的怪物名,配在死亡触发里能筛出是不是打死的那只。发完奖把进度、七个标记、封号一起清掉,再把玩家传回城,一轮阵法才算闭环。SETRANKLEVELNAME 后面不带内容就是清除封号,别写成空引号。
如果你们的引擎用 CheckRangeMonCount 或 CheckRangeMonCountEx 来判断阵眼是否被清光,写法是地图号、坐标、范围、控制符、数量,Ex 版本在坐标后面多一个怪物名参数,用来只数某一种怪。这种写法适合把七个星位各放一只守护怪、打完才亮的玩法,判定条件从踩点换成杀怪,其余结构不变。
七、定时重置
阵图上的怪和进度放着不管会越积越多,用机器人脚本定期清场。
AutoRunRobot.txt 里写:
text
#AutoRun NPC MIN 30 @北斗阵重置
RobotManage.txt 里写:
text
[@北斗阵重置]
#ACT
CLEARMAPMON 7000
SENDMSG 0 北斗七星阵三十秒轮空时间到,阵内怪物已清理。
MIN 30 是每三十分钟一次,写成 RUNONDAY 8:00 就是每天早上八点清一次。CLEARMAPMON 按地图号清掉这张图上所有刷出来的怪,玩家身上的进度标记不受影响。要是你想让每天固定时段开阵,把 MIN 30 换成 RUNONDAY 19:00 @开阵,再在 RobotManage 里配一段开阵脚本就行。
八、单人副本用镜像地图
上面这套是所有人共用一张 7000 图的写法,适合抢阵、拼速度的玩法。如果要让每个玩家进自己的阵,共用图就不合适了,进度会互相看见。这时改用镜像地图,一名玩家一张独立阵图。开图写在入阵段里:
text
ADDIMIRRORMAP 7000 7001 北斗副本 3600 3 0
参数依次是原图编号、新图编号、新图名、有效秒数、玩家退出时返回的图号、小地图编号。开完把 MAPMOVE 的目标改成 7001。查图存在与否用 CHECKMIRRORMAP,删图用 DELIMIRRORMAP。镜像图里刷的怪和进度天然隔离,重置换成玩家退出时删图即可,不必再靠机器人定时清。
九、变量的作用域与持久化
阵法脚本最容易错在变量选型上,四种变量用途不一样。
P0 到 P9 这类变量只在本次对话触发期间有效,玩家一关对话框、一换地图就归零。拿它记点亮数,就会出现每踩一格进度都显示 1 的现象。
N$ 开头的是个人变量,跟角色绑定,跨对话跨地图都保留,踩点计数、进度显示都该用它。
单个字母的全局变量是整台服务器共享的,用它记点亮数,一个人点亮会点亮所有人,多人玩法里绝对不能这么写。
方括号逻辑变量只有真和假两个值,初始为假,适合当星位开关,SET [101] 1 置真、CHECK [101] 1 判真、RESET [101] 7 批量归假,正好够七个星位用。
进度需要跨重启保留,就不能只放在内存里,要落到文件。用 LOADVAR HUMAN 变量名 文件路径 读,CALCVAR HUMAN 变量名 + 1 改,SAVEVAR HUMAN 变量名 文件路径 存,变量名前面带 HUMAN 表示按角色分区存储。登录时在 [@Login] 段把进度读回来,玩家下次上线还能接着上次的星位数目。
还有一处别忘,玩家中途下线或换图,定时器不会自己停,最好在退出地图、死亡、小退这几个触发点里补一句 SETOFFTIMER 1,不然定时器会一直空转。
十、踩不亮、计数不动、BOSS不出来怎么查
星位踩上去没反应,先看 CheckInMapRange 的地图号和三段坐标有没有别字,再把半径从 0 调到 1 或 2。范围写 0 只认同一格,玩家脚一偏就判不到。
进度一直显示 1,多半是点亮数用了 P 变量,换成 N$ 变量,或直接用逻辑变量标记。
一个人点亮,全服都亮,是把进度记到了全局变量上,换回个人变量。
定时器根本没触发,查三处,SETONTIMER 的编号和标签 [@OnTimer编号] 是否对得上,同一编号有没有被别的功能占用,启动命令是不是写在了只会执行一次的分支里。有的引擎还要求定时器在登录段初始化,阵法脚本里再改间隔,遇到这种引擎就按它的规矩来。
北斗尊主刷不出来,先看坐标有没有落在地图范围之外,再看怪物数据库里有没有这个名字,最后看阵图属性有没有误加 NOMON。
改完不生效,地图、机器人、怪物数据库这几类要重启 M2,光重新加载 NPC 不够。
命令速查
表格
用途 命令 写法
判定人物是否在坐标范围 CHECKINMAPRANGE 地图号 X Y 范围
检测范围内怪物数量 CheckRangeMonCount 地图号 X Y 范围 控制符 数量
检测范围内指定怪物 CheckRangeMonCountEx 地图号 怪物名 X Y 范围 控制符 数量
检测撞击目标名 CHECKHITMONNAME 怪物名
刷怪 MONGENEX 地图号 X Y 怪物名 数量
清光地图怪物 CLEARMAPMON 地图号
开个人定时器 SETONTIMER 编号 秒数
关个人定时器 SETOFFTIMER 编号
个人进度变量 MOV/INC N$变量 值
星位开关 SET/CHECK/RESET [编号] 1 / [编号] 1 / [编号] 7
存读进度 SAVEVAR/LOADVAR HUMAN 变量名 文件路径
开镜像图 ADDIMIRRORMAP 原图 新图 新图名 秒数 返回图 小地图
挂封号 SETRANKLEVELNAME 封号内容
机器人定时 #AutoRun NPC MIN 分钟 @段名
命令照抄进四个文件,坐标按图改,变量名统一,七个星位就能一格一格亮起来,最后一格踏完北极星落地,北斗尊主应声而出。参数写反、变量选错、地图属性挡住刷怪,这三类错最隐蔽,也最值得在改完第一遍时逐条回读核对。
传奇北斗七星阵七位星位完整明文脚本参考设置与触发检测写法全解
来源:
作者:
点击:

