传奇执行类NPC命令作用详解与脚本配置排错完整教程

来源: 作者: 点击:
执行类NPC指的是玩家点击后不直接只聊天,而是通过脚本命令完成发物品、扣材料、传送、改属性、记任务状态的NPC。服务端里这类功能主要靠段落标签、条件判断、执行指令三部分配合。NPC脚本通常放在Mir200\Envir\Market_Def,任务类放QuestDiary,全局登录或系统事件放QManage、QFunction等文件,改完在M2点重新加载NPC或重载脚本,很多版本不用重启。

一、NPC脚本基本结构

一个可执行NPC脚本先用[@段名]定义入口,常见是[@main]作为首屏。玩家点NPC后引擎读这个段,遇到#say输出对话,遇到选项标签继续跳段。#act后面写要执行的系统命令,#if后面写判定条件,条件满足走#act,不满足可走#elseact或#elsesay。goto @段名用于强制跳到别的段落,close用于关对话,break用于防止继续往下面段落执行。

示例结构:

[@main]
say

欢迎到兑换使。
点击进入材料兑换。\
点击进入金币兑换。\

[@mati]
if

checkitem 狼皮 5
act

take 狼皮 5
give 银币 200
sendmsg 6 兑换成功
break

[@mati]
elseact

say

狼皮不足5个,无法兑换。
break

这段意思是玩家点材料兑换后,系统先查背包有没有5个狼皮;有就扣5个并发200银币,没有就提示不足。take负责扣物品,give负责发物品,sendmsg给频道提示。

二、对话与跳转类命令

say用于输出NPC对话内容,后面直接写文本,不用引号。多行可用换行符或反斜杠按引擎习惯处理。[@段名]定义子程序入口,goto @段名做无条件跳转。比如主界面列三个功能,点哪个就goto到对应段,再在该段里写条件和执行命令。

[@main]
say

前往石墓阵。\
前往祖玛寺庙。\

[@go_shigu]
if

checkgold 1000
act

takegold 1000
mapmove d717 100 100
sendmsg 6 已扣除1000金币传送石墓阵
break

[@go_zuma]
if

checklevelex > 25
act

mapmove 0159 50 50
sendmsg 6 已传送祖玛寺庙
break

这种结构适合传送员、收费进图、等级限制地图。checkgold看金币,checklevelex看等级,takegold扣金币,mapmove按地图名或编号加坐标传送到点。

三、物品与金币执行命令

give 物品名 数量:给玩家发物品,装备、药水、材料都能发。背包满可能发不出来,复杂脚本可先查背包空间再用checkbaggage判断。
take 物品名 数量:从背包扣物品,任务提交、兑换、洗点、合成都会用到。若物品带改名或特殊绑定,不同引擎可加额外参数。
checkitem 物品名 数量:只检测不扣除,常放在#if下配合take使用。
give gold 数量 / takegold 数量:部分脚本写法用give gold发金币、takegold收金币;条件判断也可用checkgold 数值比对金币是否足够。
checkgold 数值:条件判断用,玩家金币大于等于数值条件成立。

材料兑换完整写法:

[@exchange]
if

checkitem 金矿 5
checklevel 30
act

take 金矿 5
give 金条 1
sendmsg 6 兑换成功
break

elseact

say

需要30级且5个金矿。
break

这里把等级和材料同时作为条件,两个都满足才执行发奖;任意不满足走else分支提示。多条件在#if下逐行写,默认按“全部满足”处理。

四、地图传送与坐标命令

map 地图名:传送到该地图随机点,常用于普通老兵回城。
mapmove 地图名 X Y:传送到固定坐标,活动NPC、收费传送、任务进场都用它。
timerecall 分钟数:设置停留时限,到时间自动召回原位置,适合限时打宝图。
breaktimerecall:取消前面设置的限时召回。
isonmap 地图名:条件判断用,看玩家当前是否在某个地图,可配合回城、处罚、任务触发。

进图限制脚本常把等级、物品、行会、会员、人数写在一起:

if

checklevelex >= 50
checkitem 龙纹剑 1
checkguildname 沙巴克行会
act

takeitem 龙纹剑 1
mapmove 高级图 100 100
sendmsg 5 进入成功
break

elseact

say

需50级、持龙纹剑且属沙巴克行会。
break

地图编号要与MapInfo配置一致,坐标要在地图可行走范围,否则传送失败或掉到非法点。

五、条件判断与变量命令

执行类NPC不是点就给,很多时候要看变量。常用判断命令:
checklevel / checklevelex:等级判断,后者可按大于、等于、小于写。
checkjob:判职业,战士、法师、道士分开给不同奖励。
checkitem / checkitemw:前者查背包,后者查身上穿戴。
checkgold:金币条件。
checkhum 地图 数量:某地图人数条件,用于限流。
random 数值:随机概率,比如random 3可按引擎规则做约三分之一概率发奖。
checkvar / setvar / small / large / equal:变量比较和赋值,不同引擎名称会有差别,GOM类、HERO类、GEE类不完全通用。

变量类型常用P0到P9做个人数字变量,D0到D9做临时变量,G类或全局变量做全服状态。赋值和运算:
mov 变量 数值:直接赋值。
inc 变量 数值:加。
dec 变量 数值:减。
mul 变量 数值:乘。
div 变量 数值:除。
set [标记] 1 / reset [标记] 范围:做任务开关,比如接了某任务置1,提交后reset清状态。

任务NPC示例:

[@gettask]
if

check [HUMAN(新手任务)] 0
act

set [HUMAN(新手任务)] 1
give 木剑 1
give 小量药水 10
sendmsg 6 已接新手任务,发放木剑和药水
break

[@gettask]
elseact

say

任务已接,不要重复领取。
break

有些引擎用!check表示未设置或未开启,有些用equal 0表示等于0,写之前看自己M2命令手册,别把别的引擎写法硬套。

六、子程序调用与复杂功能

call用于调用QuestDiary里的子程序,适合把发奖、记录日志、判断会员、活动统计写成独立段,主NPC只做菜单和分流。比如主NPC收到材料后call进统一发奖段,减少重复代码。

[@main]
say

进入转生处理。\
进入合装处理。\

[@zs]
call [\QuestDiary\转生\主处理.txt] @zhuan_sheng

[@hc]
call [\QuestDiary\合成\主处理.txt] @he_cheng

子程序文件里再写#if、#act、变量、give、take、mapmove等。好处是多个NPC可共用一套逻辑,改一处全局生效。路径必须和服务端目录一致,调用文件编码建议ANSI,中文路径和部分引擎组合容易出乱码。

七、刷怪、清怪与系统动作

执行类NPC不只发东西,也可做活动管理:
mongen 怪物名 数量 时间:在指定地图或当前关联点刷怪,时间按引擎规则填秒或分。
monclear 地图名:清空某地图怪物,关活动、重置副本用。
recallmob 怪物名 数量 持续秒数:给玩家身边召怪,个人打宝或测试用。
sendmsg 颜色 内容:发系统提示,颜色代码各引擎略有差异,常见0白、1红、6系统黄,具体以M2说明为准。
hairstyle 数值、haircolor 红 绿 蓝:改角色发型发色,纯外观类执行命令。
close:直接关NPC窗口;break:停止继续跑后面段落,防止菜单段穿透到其它功能。

活动NPC示例:

[@startboss]
if

checkvar G1 0
act

setvar G1 1
mongen 赤月恶魔 1 1800
sendmsg 0 赤月恶魔已刷新,持续30分钟
break

[@startboss]
elseact

say

本场BOSS已刷新,请勿重复开启。
break

这类写法用全局变量锁一次活动,避免玩家反复点NPC无限刷怪。活动结束可在另一段reset变量或写机器人脚本定时清状态。

八、Merchant与NPC绑定配置

NPC能不能触发脚本,不只是写txt,还要在NPC配置里绑定。Market_Def里建NPC文本,文件名和M2或Merchant.txt里的脚本名对应;地图、坐标、名称、脚本标识要一致。格式类似:

比奇城 老兵 330 330 比奇老兵 0

脚本文件放Market_Def\比奇老兵.txt,里面写[@main]等段。若改了文件名但NPC配置没改,点击无反应;若配置写带后缀而引擎只认无后缀标识,也会加载失败。

QuestDiary子程序被#call时,目录和文件名要存在;QFunction-0处理升级、死亡、用物、进图等系统事件,不通过点击NPC触发,但命令写法与NPC执行类很多通用。

九、常见不执行与报错处理

1. 点NPC没反应:先看M2是否报错,确认NPC文件在Market_Def,文件名和NPC配置一致;确认[@main]或绑定入口存在;确认文件不是UTF-8带BOM,传奇老引擎多用ANSI,中文UTF-8可能乱码或整文件不加载。
2. 条件永远不满足:物品名要和StdItems数据库一致,写“小量药水”还是“小金创药”按版本来;地图名用MapInfo里的标准名;等级用checklevel还是checklevelex要看符号支持,大于条件写错会直接不过。
3. give没发到包:查背包是否满,查物品名是否存在数据库,查是否用了引擎不支持的别名;发装备还可检查是否需要走StdMode、特殊绑定参数。
4. mapmove传错地方:核对地图编号、X、Y;部分地图安全区坐标和刷怪点不同,活动进场建议放安全点。
5. 变量不生效:确认变量类型,个人变量别当全局用;GOM全局变量和HERO的checkvar格式不同,跨引擎抄脚本要改参数。
6. 死循环或卡对话:goto回到前面段又没有break,会反复进菜单;条件永远真且持续call自身也会卡。每段执行完根据业务加break或close。
7. 未知命令:不同引擎支持度不同,比如部分简化命令在翎风、清风、GOM、GEE、HERO之间不通用,遇到未知指令先查本引擎命令表,再改写法。
8. 改完不生效:M2点重新加载NPC、重载登录脚本或重载QFunction;若改了核心触发仍不生效,再考虑重启M2。缓存目录如Envir\cache可按引擎说明清理。

十、按业务整理常用组合

传送收费NPC:#if checkgold金额,#act takegold金额、mapmove地图坐标、sendmsg。
材料兑换NPC:#if checkitem材料数量,#act take材料、give奖励、sendmsg;不满足#elseact提示。
等级进图NPC:#if checklevelex >=等级,#act mapmove;可再加checkitem、checkguildname做综合限制。
新手奖励NPC:#if未领变量,#act set变量、give装备药水、sendmsg;已领#elseact提示。
任务提交NPC:#if checkitem任务物数量,#act take、set任务标记、give经验或装备;可配合checklevel、checkjob分职业发。
活动开启NPC:#if全局变量未开,#act set全局、mongen刷怪、sendmsg全服;已开#elseact提示冷却或未到条件。
自动定时执行:放Robot_def,AutoRunRobot配周期,RobotManage写[@段]、#act发公告或清状态,不依赖玩家点NPC。

写执行类NPC时先定菜单,再定每个菜单要检什么,再定满足后扣什么、给什么、传哪里、记哪个变量。条件放#if,动作放#act,提示放sendmsg或#elseact/#elsesay,复杂发奖放#call子程序。这样后期加材料、改地图、改等级线都不用重写整个NPC,只改对应段和参数即可。不同引擎命令名会有差异,上线前用一个小号逐项点测,看M2日志比单纯看玩家反馈更快定位。