一、脚本放在哪里,先弄清文件分工
初级技能教师是一个功能型NPC,它由两部分组成,一是NPC在游戏里的注册信息,二是玩家点击它之后执行的脚本逻辑,两者分放在不同文件里,缺一个都不会生效。
NPC注册信息写在 MirServer\Mir200\Envir\MerChant.txt 里,部分老引擎把它叫 Merchant.txt 或者 Npcs.txt,作用都一样,就是告诉服务端地图上哪个坐标站着一个什么名字、什么形象的NPC,以及它的脚本文件叫什么。脚本逻辑放在同级的 Market_Def 文件夹下,文件名必须和注册信息对得上。另外还有三个容易混淆的位置,QFunction-0.txt 放触发类脚本,比如升级触发、攻击触发;MapQuest_Def 下的 QManage.txt 放任务类脚本,比如登录触发、活动任务;QuestDiary 是功能脚本的默认搜索目录,脚本里用 #CALL 调用的公共段落一般放这里。做技能教师只需要动 MerChant.txt 和 Market_Def 两项。
二、注册信息那一行怎么写
MerChant.txt 里一行对应一个NPC,字段之间用空格或者制表符隔开,常见顺序是:
NPC脚本目录名 地图号 X坐标 Y坐标 NPC显示名 朝向 外观编号 是否城堡NPC 是否移动 移动间隔
一个可以直接照用的例子:
初级技能教师 0 330 266 初级技能教师 0 208 0 0 0
这里地图号 0 一般指比奇省,330 和 266 是坐标,外观编号 208 是道士类形象编号,具体编号要看自己客户端 Data 目录里补丁的形象排布,编号对不上NPC会显示成空白或者错位的怪物样子。最后三个 0 分别表示不是沙巴克NPC、不自动移动、不需要移动间隔。
因为脚本目录名是“初级技能教师”,地图号是 0,所以脚本文件必须命名为 初级技能教师-0.txt,放在 Market_Def 里。名字里不能带说明性的后缀,也不能和别的NPC重名,地图号后面要多一个“-0”这种后缀,写错一个字,点了就没有任何反应。
三、脚本的基本骨架
脚本语言不复杂,全写在txt里,核心就几个块:用 [#标签] 分段,用 #IF 写判断条件,用 #ACT 写执行动作,用 #SAY 输出对白,条件不成立时走 #ELSEACT 或者 #ELSESAY,按钮用尖括号包成 <按钮文字/@跳转标签>,一行末尾的反斜杠表示对话换行,少量变量用 <$USERNAME> 这类写法直接嵌入。默认入口标签固定是 [@main],玩家第一次点到这个NPC就看这一段。
新手最常出错的地方是按钮跳转名和标签名不一致,比如按钮里写的是 @学基本剑术,而下面的段落标题写成了 [@学习基本剑术],中间差一个字,点了就完全没有反馈。
四、三职业初级技能的等级对照
这段等级按经典1.76类版本整理,不同版本的数据库会把技能开放等级改掉,动手前先打开自己版本的技能数据库核对技能名字和等级,不要照抄。
战士:基本剑术 7 级、攻杀剑术 19 级、刺杀剑术 25 级、半月弯刀 28 级、野蛮冲撞 30 级、狮子吼 50 级。
法师:火球术 7 级、抗拒火环 12 级、诱惑之光 13 级、地狱火 16 级、雷电术 17 级、瞬息移动 19 级、大火球 19 级、爆裂火焰 22 级、火墙 24 级、疾光电影 26 级、寒冰掌 28 级,再往上的技能在各个版本里开放等级差别较大,按自己数据库里的数值填。
道士:治愈术 7 级、精神力战法 9 级、施毒术 14 级、灵魂火符 18 级、隐身术 20 级、集体隐身术 21 级、幽灵盾 22 级、神圣战甲术 25 级、心灵启示 26 级、困魔咒 28 级、群体治疗术 33 级。
五、完整脚本范例
下面这段可以直接落到 初级技能教师-0.txt 里改,思路是主菜单按职业分流,每个技能一个独立段落,先判断是否已学过,再判断等级和金币,两个条件同时成立才扣钱发技能。
[@main]
#IF
#ACT
#SAY
这里是初级技能教师,本处只传授本职业的基础技能。
等级不够或者金币不足都学不了,每次学习收取金币 500。
<开始学习/@选择职业>
<学习须知/@须知>
<离开/@exit>
[@须知]
#IF
#ACT
#SAY
战士可以在 7 级、19 级、25 级、28 级、30 级修习对应技能。
法师可以在 7 级、12 级、13 级、16 级、17 级、19 级修习对应技能。
道士可以在 7 级、9 级、14 级、18 级、20 级修习对应技能。
<返回/@main>
[@选择职业]
#IF
CHECKJOB WARRIOR
#ACT
GOTO @战士技能
BREAK
#IF
CHECKJOB WIZARD
#ACT
GOTO @法师技能
BREAK
#IF
CHECKJOB TAOIST
#ACT
GOTO @道士技能
BREAK
#ELSESAY
没有读到你的职业信息,请重新选择角色后再来。
<返回/@main>
[@战士技能]
#IF
#ACT
#SAY
请选择要学习的技能。
<基本剑术/@学基本剑术>
<攻杀剑术/@学攻杀剑术>
<刺杀剑术/@学刺杀剑术>
<半月弯刀/@学半月弯刀>
<野蛮冲撞/@学野蛮冲撞>
<返回/@main>
[@学基本剑术]
#IF
CHECKLEVELEX > 6
CHECKGOLD 500
CHECKMAGICNAME 基本剑术
#ACT
SENDMSG 6 你已经学过基本剑术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX > 6
CHECKGOLD 500
#ACT
TAKEGOLD 500
ADDSKILL 基本剑术 3
SENDMSG 6 你学会了基本剑术。
BREAK
#ELSESAY
没有学成,人物等级要到 7 级以上,且身上金币不少于 500。
<返回/@战士技能>
[@学攻杀剑术]
#IF
CHECKLEVELEX > 18
CHECKGOLD 500
CHECKMAGICNAME 攻杀剑术
#ACT
SENDMSG 6 你已经学过攻杀剑术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX > 18
CHECKGOLD 500
#ACT
TAKEGOLD 500
ADDSKILL 攻杀剑术 3
SENDMSG 6 你学会了攻杀剑术。
BREAK
#ELSESAY
没有学成,人物等级要到 19 级以上,且身上金币不少于 500。
<返回/@战士技能>
刺杀剑术、半月弯刀、野蛮冲撞三段照上面的结构写就行,改动三处即可,按钮里的跳转名、段落标题、CHECKMAGICNAME 后面的技能名保持一致,等级判断改成 > 24、> 27、> 29,提示文字里的等级改成 25、28、30。
[@法师技能]
#IF
#ACT
#SAY
请选择要学习的技能。
<火球术/@学火球术>
<抗拒火环/@学抗拒火环>
<诱惑之光/@学诱惑之光>
<地狱火/@学地狱火>
<雷电术/@学雷电术>
<瞬息移动/@学瞬息移动>
<返回/@main>
[@学火球术]
#IF
CHECKLEVELEX > 6
CHECKGOLD 500
CHECKMAGICNAME 火球术
#ACT
SENDMSG 6 你已经学过火球术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX > 6
CHECKGOLD 500
#ACT
TAKEGOLD 500
ADDSKILL 火球术 3
SENDMSG 6 你学会了火球术。
BREAK
#ELSESAY
没有学成,人物等级要到 7 级以上,且身上金币不少于 500。
<返回/@法师技能>
[@学抗拒火环]
#IF
CHECKLEVELEX > 11
CHECKGOLD 500
CHECKMAGICNAME 抗拒火环
#ACT
SENDMSG 6 你已经学过抗拒火环,不用重复花钱。
BREAK
#IF
CHECKLEVELEX > 11
CHECKGOLD 500
#ACT
TAKEGOLD 500
ADDSKILL 抗拒火环 3
SENDMSG 6 你学会了抗拒火环。
BREAK
#ELSESAY
没有学成,人物等级要到 12 级以上,且身上金币不少于 500。
<返回/@法师技能>
其余法师技能同理,诱惑之光写 > 12,地狱火写 > 15,雷电术写 > 16,瞬息移动写 > 18,技能名和按钮名同步替换。
[@道士技能]
#IF
#ACT
#SAY
请选择要学习的技能。
<治愈术/@学治愈术>
<精神力战法/@学精神力战法>
<施毒术/@学施毒术>
<灵魂火符/@学灵魂火符>
<隐身术/@学隐身术>
<返回/@main>
[@学治愈术]
#IF
CHECKLEVELEX > 6
CHECKGOLD 500
CHECKMAGICNAME 治愈术
#ACT
SENDMSG 6 你已经学过治愈术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX > 6
CHECKGOLD 500
#ACT
TAKEGOLD 500
ADDSKILL 治愈术 3
SENDMSG 6 你学会了治愈术。
BREAK
#ELSESAY
没有学成,人物等级要到 7 级以上,且身上金币不少于 500。
<返回/@道士技能>
[@学精神力战法]
#IF
CHECKLEVELEX > 8
CHECKGOLD 500
CHECKMAGICNAME 精神力战法
#ACT
SENDMSG 6 你已经学过精神力战法,不用重复花钱。
BREAK
#IF
CHECKLEVELEX > 8
CHECKGOLD 500
#ACT
TAKEGOLD 500
ADDSKILL 精神力战法 3
SENDMSG 6 你学会了精神力战法。
BREAK
#ELSESAY
没有学成,人物等级要到 9 级以上,且身上金币不少于 500。
<返回/@道士技能>
六、脚本里每个命令干什么
#IF 是条件区,下面的每一行都是一个独立条件,写多行就表示要同时成立。#ACT 是动作区,条件全部成立才执行里面的命令。#SAY 是对话框内容,#ELSESAY 和 #ELSEACT 是条件不成立时走的另一条路。#ELSEACT 和 #SAY 可以搭配使用,条件不成立直接弹一段提示,比让玩家点了没反应要好。
CHECKJOB 检测职业,参数按引擎给,多数引擎写 WARRIOR、WIZARD、TAOIST,也有的版本接受 Warrior、Wizard、Taoist 或者直接写中文的战士、法师、道士,大小写不匹配会判定失败,写之前翻一下自己引擎帮助文档里的写法。
CHECKLEVELEX 检测等级,格式是控制符加数值,控制符只有大于、小于、等于三种,比如 CHECKLEVELEX > 6 表示等级高于 6 级。这里最容易踩的坑是把控制符写成等于,玩家从 6 级升到 7 级的那一瞬间如果刚好没点NPC,之后永远等于不了 7,技能就漏学了,所以一律用大于判定更稳。
CHECKGOLD 检测金币数量,TAKEGOLD 扣除金币,GIVE 给予物品,金币用 GIVE 金币 数量 这种写法,具体参数以引擎为准。
ADDSKILL 学习技能并指定等级,格式是 ADDSKILL 技能名 等级,比如 ADDSKILL 雷电术 3。技能名必须和数据库里的名字一模一样。
SKILLLEVEL 调整人物已有技能等级,格式是 SKILLLEVEL 技能名 控制符 等级,用于把玩家已有的技能拉到指定级别。CHANGETRANPOINT 用来改技能修炼点,格式是 CHANGETRANPOINT 技能名 加或减或等于 数值。
检测玩家是否已经学过某个技能这块,各引擎命令名不一样,蓝色引擎常用 CHECKMAGICNAME 技能名,部分老引擎用 CHECKMAGIC 技能名,也有的版本用 CHECKSKILL 技能名 控制符 修炼等级。这一处不要凭经验照抄,先在自己的引擎帮助文档里搜“检测技能”确认命令名,写错了整段判断就会静默失效。
SENDMSG 发系统提示,第一个参数是消息类型,0 是全服公告,6 是自己能看到,写 0 的时候记得不要用来发学习成功的私事提示。
GOTO 跳转到指定标签,BREAK 结束当前段落执行,通常写在 GOTO 后面。段落末尾不加 BREAK 时会顺着往下继续执行,把后面的段落也跑一遍,表现就是提示连着刷好几条。
七、书写规范上的细节
一条命令单独占一行,命令和参数之间用空格分开,不要用全角空格。标签名以 @ 开头,必须用半角方括号包起来。按钮里尖括号包裹的文字和跳转名之间用斜杠隔开,跳转名要和目标标签逐字符一致。
每行对白末尾的换行符是反斜杠,写在按钮行末尾时,控制的是按钮的换行位置,漏写会让整排按钮挤成一行显示。对白里的标点用中文标点,但代码部分的逗号、冒号、括号、斜杠必须保持半角,混用全角符号在部分引擎下会让脚本加载失败,服务端弹 script error,load fail。
脚本文本的保存编码要注意,不少引擎要求以 ANSI 编码保存,用别的编码存了之后中文技能名会变成乱码,肉眼看着没问题,实际判定时一个字都对不上,学不会也没有任何报错。
文件名、注册行里的脚本目录名、地图号三者要一致,初级技能教师配 -0,写到别的地图号就要建对应的新文件。
八、改完怎么让它生效
保存脚本之后回到服务端,打开引擎主程序,找到控制菜单里的重新加载,先执行重新加载所有NPC;如果同时动过技能数据库或者MerChant.txt,还要重新加载一次物品与技能数据。此时回到游戏,在对应坐标就能看到NPC,点开就能测。调试阶段建议先在一个只有自己的测试账号上跑一遍,把每个按钮都点到底,确认提示文字、扣钱、技能栏三个环节都对,再放到正式环境。
九、常见问题按现象排查
点了NPC完全没反应。先确认 MerChant.txt 里那一行的脚本目录名、地图号与 Market_Def 下的文件名对得上;再确认坐标是不是落在地图边界外或者墙里;最后确认有没有重新加载NPC,只保存文件不重新加载是不会生效的。
能弹出对话框,点按钮没反应。九成是按钮跳转名和段落标签名不一致,其次是没有加换行符导致按钮显示异常,也有的是目标段落标题忘了写 @。
提示学了技能但技能栏里是空的。多半是技能名和数据库里的名字不一致,少数情况是客户端缺少对应技能图标素材,服务端已经有数据,客户端显示不出来。可以用 SKILLLEVEL 再设一次等级验证是不是名字的问题。
金币被扣了,技能没加上。看是不是把 CHECKGOLD 和 TAKEGOLD 拆到了两段里,中间插入了 #SAY,导致条件判断段落和扣钱段落各走一半。动作集中在同一段的 #ACT 里写更稳。
玩家卡的正好是那个等级,技能漏发。把 CHECKLEVELEX 的等于号改成大于号即可,或者同时判断大于和等于两个条件。
同一个技能可以反复点、反复扣钱。在条件里加上已学检测,用批次里对应的检测技能命令判断,学会的直接给一句提示并 BREAK 跳出。
战法道三个职业点进去看到的是别人的技能表。检查 CHECKJOB 后面参数的大小写和引擎要求是否一致,有的引擎只认全大写。
服务端启动时报 script error,load fail。说明脚本存在语法错误,把段落逐块加注释二分排查,重点看标签是否闭合、括号是否配对、是否存在全角符号,改完再重新加载。
十、几种常见的功能改动
去掉 CHECKGOLD 和 TAKEGOLD 两行,就是免费学习。想按等级阶梯收费,把每个技能的段落拆成两段 #IF,低段收 500,高段收 2000,提示文字同步改。想让学完直接满熟练度,ADDSKILL 后面把等级写成 3,再补一句 CHANGETRANPOINT 技能名 等于 满值。如果版本里已经在 QFunction-0.txt 的升级触发段落写了自动学技能,NPC 就当作补漏入口保留,两者的技能集合保持一致,避免一边给了技能另一边又收钱重复给。
动手前把 MerChant.txt 和 Market_Def 整目录备份一份,改动只落在这两个位置,出问题直接还原,比逐行回滚省事。

