传奇定时开放地图NPC脚本命令写法与地图通道动态增删实战详解教程

来源: 作者: 点击:
地图想按点开门、到点关门,路子有两条。一条是在NPC脚本里加时间判断,玩家点NPC那一刻卡时间,不到点不给进。另一条是直接让引擎把地图通道动态开出来或者拆掉,没到点那条路根本不存在,玩家绕着地图边跑也过不去。两条路解决的问题不一样,用对了省事,用混了就是玩家卡在门口刷屏骂人。

动态开通道:ADDMAPROUTE 和 DELMAPROUTE

BLUEM2一系的引擎给了两条专门干这事的命令,一条开通道,一条拆通道。

开通道的写法:

text
ADDMAPROUTE 源地图 源坐标X 源坐标Y 目标地图 目标坐标X 目标坐标Y 是否相通(0/1)


最后那个参数是是否相通,填1表示源坐标和目标坐标直接连通,填0就是不通。

拆通道的写法:

text
DELMAPROUTE 源地图 源坐标X 源坐标Y


举个实际点的例子,让当前地图3的333,333这个点通向D515的50,50:

text
#IF
ADDMAPROUTE 3 333 333 D515 50 50 1


不想让人再走了,把这条通道删掉:

text
#IF
DELMAPROUTE 3 333 333


这组命令的好处是动态。地图的静态通道写在MapInfo里,改一次要重载,用命令加出来的通道是运行时的,发一条命令立刻就生效,删一条立刻就不通。做限时活动图、临时秘境入口、周末才开的地宫,都是这个思路。活动开始发一条ADDMAPROUTE,活动结束发一条DELMAPROUTE,地面上干干净净,不用留个进不去的门让玩家反复点。

坐标要写对。源坐标是通道这一头的位置,通常选在安全区边上的一个点位,目标坐标是通道那一头的落点。落点最好避开怪物密集区,不然玩家一进去就被围。坐标抄错一位,通道就通到墙里或者别的地图去了,这个错脚本不会报,只有玩家撞出来。

NPC脚本里卡时间:HOUR 和 MIN

不想动通道,只在对话上做限制,最简单的是用时间判断命令。引擎里管小时的命令是 HOUR,管分钟的是 MIN。

一个常见的写法,规定8点10分到8点20分能进:

text
[@进入]
#IF
HOUR 8 8
MIN 10 20
#ACT
GOTO @放行
#ELSEACT
MESSAGEBOX 只有8点10分到8点20分才能进入!


HOUR后面跟两个数字,前面是起始小时,后面是结束小时,前后都包含在内。MIN一样,前面是起始分钟,后面是结束分钟。两个命令写在#IF里,是并且的关系,得同时满足才往下走。

时段的写法可以叠加。想开两段,比如8点20到8点50、12点20到12点50,就在#ELSEACT里再跳一段继续判断:

text
[@清风魔塔]
#IF
HOUR 8 8
MIN 20 50
CHECKRENEWLEVEL > 90
#ACT
MAPMOVE mota 100 100
GIVE 回城卷 1
SENDMSG 1 玩家%s进入清风魔塔一层!这里可以爆出给力装备!
BREAK
#ELSEACT
GOTO @清风魔塔1

[@清风魔塔1]
#IF
HOUR 12 12
MIN 20 50
CHECKRENEWLEVEL > 90
#ACT
MAPMOVE mota 100 100
GIVE 回城卷 1
SENDMSG 1 玩家%s进入清风魔塔一层!这里可以爆出给力装备!
BREAK
#ELSEACT
GOTO @清风魔塔2


有几个时间点就往下接几段。这里有个容易踩的地方,HOUR 8 8 这种写法的意思是8点整到8点59分这一整个小时,其实写成 HOUR 0 23 覆盖全天也行,真正卡精度靠的是后面的MIN。所以像8点10到8点20这种跨不了小时段的,用 HOUR 8 8 配 MIN 10 20 就够;要是想卡8点50到9点10这种跨小时的,就得拆成两段判断,HOUR 8 8 配 MIN 50 59,再接 HOUR 9 9 配 MIN 0 10,一段写不出来。

地图配置里带时间参数

还有一类做法,把时间直接写进地图配置。在MapInfo.txt里给地图条目挂上时间参数,玩家进图后引擎自己计时,时间到了自动把人弄出去。

text
[HD001 活动地图] SAFE NOMANNOMON NORECALL TimeRecall(60|3)


第一个参数60是允许停留的分钟数,第二个3是超时后传送到哪张地图,3一般是主城。企意就是进图之后最多待60分钟,超时自动送回城。

Geem2这一系还有更细的TimeMap写法:

text
[HD002 高级副本] FIGHT NORECALL TimeMap(3|30|1|@超时惩罚)


四个参数依次是返回地图编号、倒计时分钟数、是否显示倒计时面板、超时触发的脚本标签。最后那个标签写在功能脚本里,超时的时候引擎去调它,可以在里面扣钱、扣道具、发提示。

text
[@超时惩罚]
#IF
#ACT
TAKE 金币 1000000
SENDMSG 6 超时未通关,扣除100万金币!


这样地图的开放和关闭是连着一起管的,进得去也出得来,不用两处脚本各写一遍。

进图挂倒计时

想让玩家进图后有个剩余时间的紧迫感,用 TimeRecall 命令。数值单位是分钟,进图那一刻挂上去,到点自动传走。

text
[@main]
#IF
CHECKLEVEL > 50
#ACT
MAPMOVE HD001
TimeRecall 60
SENDMSG 6 您已进入活动地图,停留时间60分钟


配套的还有 BreakTimeRecall,中途想取消倒计时就用它。限时地图收尾的那一下,靠的就是这条倒计时。

倒计时和地图配置里的参数不要重复挂。MapInfo里已经写了TimeRecall(60|3),NPC脚本里再挂一个TimeRecall 60,两个计时打架,玩家可能被提前送回城,也可能一直不传走,具体表现看引擎实现,反正不是你要的结果。选一处挂就行。

机器人脚本定时开和关

上面那些都是玩家点NPC才触发的。真要全自动,到点自己开、到点自己关,得靠机器人脚本。

机器人脚本分两个文件,一个管时间,一个管执行。路径在服务端 Mir200\Envir\Robot_def\ 下面,AutoRunRobot.txt负责什么时候跑,RobotManage.txt负责跑什么。

AutoRunRobot.txt里加触发:

text
#AutoRun NPC RUNONDAY 19:00 @开启活动
#AutoRun NPC RUNONDAY 20:00 @关闭活动


RUNONDAY表示每天定点执行,后面跟具体时刻,再后面是脚本标签。时间单位那栏不只RUNONDAY,还有SEC按秒、MIN按分、HOUR按小时、DAY按天、RUNONWEEK按星期几,哪个合适用哪个。

text
#AutoRun NPC SEC 10 @检测
#AutoRun NPC MIN 5 @检查刷怪
#AutoRun NPC HOUR 6 @时间检测
#AutoRun NPC RUNONWEEK 5:15:55 @周五百点活动


RobotManage.txt里写标签的内容:

text
[@开启活动]
#ACT
ADDMAPROUTE 3 333 333 D515 50 50 1
SENDMSG 0 限时秘境已开启,去盟重333,333进入!

[@关闭活动]
#ACT
DELMAPROUTE 3 333 333
SENDMSG 0 今日活动结束,入口已关闭!


这两段一开一关,配上上面的动态通道命令,就是个闭合的定时地图。到点通道出现,玩家能走过去;到点通道消失,再没人能进。已经进去的人怎么办,靠另一段传出来。

到点清人出图

活动关了不代表地图里的人出得来。得写一段专门检测地图里有没有人,有就传走。

text
[@关闭活动]
#IF
#ACT
GMEXECUTE 开始提问 @清场
SENDMSG 0 活动已结束,场内玩家正在传送回城


然后在QManage.txt里写上对应的:#IF ISONMAP hddt 判断玩家是否在活动图里,在就 MAPMOVE 3 330 330 传回主城。

text
[@神魔屠PK关闭]
#IF
ISONMAP hddt
#ACT
MAPMOVE 3 330 330
SENDMSG 0 神魔活动场已结束,开放时间为每天23点开门、24点关门


这里有个坑。机器人脚本里的清场命令是让全场玩家都去跑那一段判断,只有真正在活动图里的人才会被传。要是判断条件写错,比如漏了ISONMAP,全服玩家都会被拉回主城,那就出大事了。上机器人脚本之前,先在测试号上把清场那段单独跑一遍。

开区后延迟开放

不是所有地图都按钟点开,有的要等开区之后过一段时间才放出来。比如开区6小时后才开放某张图,这种用全局变量记状态。

机器人脚本里加一条按小时的检测:

text
#AutoRun NPC HOUR 6 @时间检测


RobotManage.txt里给变量赋值:

text
[@时间检测]
#IF
EQUAL G88 0
#ACT
MOV G88 1


意思是从开区算起每走一小时跑一次,第一次跑到就把G88置成1,之后EQUAL判断不成立,不会再改。

进图的NPC脚本再读这个变量:

text
[@趣游之家]
#IF
EQUAL G88 0
#ACT
MESSAGEBOX 趣游之家将于开区后6小时开放,敬请关注!
BREAK

#IF
CHECKGOLD 1000000
#ACT
TAKE 金币 1000000
GIVE 回城卷 1
MAPMOVE quyoubbsditu
SENDMSG 0 玩家%s进入趣游之家寻宝!此图为1层
BREAK
#ELSEACT
MESSAGEBOX 需要100万金币作为服务费用!


G88没到1,打开NPC就是一句提示,进不去。到了1,花钱就能进。变量号要挑没被占用的,G88这种大编号一般空着,改之前搜一下全脚本文本里有没有出现过,重复用会和别的功能串。

用A变量做开放状态和倒计时显示

有的版本喜欢在对话框上直接显示还有几分钟开放,靠的是A变量。机器人脚本每按分跑一次,算一次剩余时间写进A变量,NPC界面上读出来。

text
#IF
CHECKMAPMONCOUNT huodong > 0
#ACT
MOV A101 <有怪/SCOLOR=253>
#ELSEACT
MOV A101 <无怪/SCOLOR=249>


进入条件挂在状态变量上:

text
[@进入]
#IF
EQUAL A252 已开放
#ELSEACT
MESSAGEBOX 活动未开放或者已经结束!


开放那一刻由机器人脚本把A252改成已开放,关门再改回测试。进图时先看这个状态,再扣钱再传送。整个流程里,状态变量是关卡,扣道具和传送是动作,两件事分开写,哪一步出问题都能单独查。

地图通道和NPC两道限制一起用

单靠NPC判断,玩家能想办法绕,比如用传送戒指直接飞进去,或者从别的地图过图过进去。想把这口子堵上,通道和NPC两道一起用。

通道那层用ADDMAPROUTE控制,没到点那条路不存在。NPC那层用HOUR、MIN和状态变量控制对话放行。地图配置里再挂个NORECALL或者NOMANNOMON之类的属性,把随机传送、直接飞图这类入口也关掉。

text
[HD003 限时禁地] FIGHT NORECALL NOPOSITIONMOVE


这类属性各地图属性表不同,不同M2认的字不一样,写之前把引擎自带的帮助文档调出来对一遍。字写错引擎当没看见,属性不生效也不报错,玩家照样飞进去,你还以为堵住了。

常见坑

地图编号写错是最多的一个。ADDMAPROUTE里那张目标地图,编号得跟MapInfo里一致,写错通道指向一片空白,玩家走进去就卡住。坐标写错同理。

时间边界不清是第二个。HOUR和MIN前后两个数字都是包含的,8到8其实是整个8点这一小时,卡不到具体的分,跨小时的时段得拆段写。

变量忘了复位是第三个。G88只要被置成1,没有另行清零,这张图就永久开放了,下次想关都关不掉。要做周期开放的,关门的时候把变量改回来,或者干脆换个只算当天的变量。

机器人脚本标签重名是第四个。RobotManage里的标签如果和别处撞了,脚本看着没错但就是不动,把标签名字改一下再加载一次,往往就好了。写完先随便加条测试输出,看聊天框里有没有那行字,有字说明定时和标签都对,再往下写功能。

通道开了忘了删是第五个。活动结束只发广播不删通道,玩家能一直走进去,地图里空空如也挂一整天。开关成对写,DELMAPROUTE那一条不要漏。

最后是没在测试号上跑。定时脚本牵扯时间,改完当场看不出问题,得把系统时间或者机器人触发时间挪到眼前,看着它开一次关一次,确认通道真加了也真删了,再放进正式环境。