当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇服务端初级技能教师脚本完整写法与配置实战常见问题排查详解

热度:
一、脚本放在哪里,先弄清文件分工

初级技能教师是一个功能型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是否移动移动间隔

一个可以直接照用的例子:

初级技能教师0330266初级技能教师0208000

这里地图号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
CHECKJOBWARRIOR
#ACT
GOTO@战士技能
BREAK
#IF
CHECKJOBWIZARD
#ACT
GOTO@法师技能
BREAK
#IF
CHECKJOBTAOIST
#ACT
GOTO@道士技能
BREAK
#ELSESAY
没有读到你的职业信息,请重新选择角色后再来。
<返回/@main>

[@战士技能]
#IF
#ACT
#SAY
请选择要学习的技能。

<基本剑术/@学基本剑术>
<攻杀剑术/@学攻杀剑术>
<刺杀剑术/@学刺杀剑术>
<半月弯刀/@学半月弯刀>
<野蛮冲撞/@学野蛮冲撞>

<返回/@main>

[@学基本剑术]
#IF
CHECKLEVELEX>6
CHECKGOLD500
CHECKMAGICNAME基本剑术
#ACT
SENDMSG6你已经学过基本剑术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX>6
CHECKGOLD500
#ACT
TAKEGOLD500
ADDSKILL基本剑术3
SENDMSG6你学会了基本剑术。
BREAK
#ELSESAY
没有学成,人物等级要到7级以上,且身上金币不少于500。
<返回/@战士技能>

[@学攻杀剑术]
#IF
CHECKLEVELEX>18
CHECKGOLD500
CHECKMAGICNAME攻杀剑术
#ACT
SENDMSG6你已经学过攻杀剑术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX>18
CHECKGOLD500
#ACT
TAKEGOLD500
ADDSKILL攻杀剑术3
SENDMSG6你学会了攻杀剑术。
BREAK
#ELSESAY
没有学成,人物等级要到19级以上,且身上金币不少于500。
<返回/@战士技能>

刺杀剑术、半月弯刀、野蛮冲撞三段照上面的结构写就行,改动三处即可,按钮里的跳转名、段落标题、CHECKMAGICNAME后面的技能名保持一致,等级判断改成>24、>27、>29,提示文字里的等级改成25、28、30。

[@法师技能]
#IF
#ACT
#SAY
请选择要学习的技能。

<火球术/@学火球术>
<抗拒火环/@学抗拒火环>
<诱惑之光/@学诱惑之光>
<地狱火/@学地狱火>
<雷电术/@学雷电术>
<瞬息移动/@学瞬息移动>

<返回/@main>

[@学火球术]
#IF
CHECKLEVELEX>6
CHECKGOLD500
CHECKMAGICNAME火球术
#ACT
SENDMSG6你已经学过火球术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX>6
CHECKGOLD500
#ACT
TAKEGOLD500
ADDSKILL火球术3
SENDMSG6你学会了火球术。
BREAK
#ELSESAY
没有学成,人物等级要到7级以上,且身上金币不少于500。
<返回/@法师技能>

[@学抗拒火环]
#IF
CHECKLEVELEX>11
CHECKGOLD500
CHECKMAGICNAME抗拒火环
#ACT
SENDMSG6你已经学过抗拒火环,不用重复花钱。
BREAK
#IF
CHECKLEVELEX>11
CHECKGOLD500
#ACT
TAKEGOLD500
ADDSKILL抗拒火环3
SENDMSG6你学会了抗拒火环。
BREAK
#ELSESAY
没有学成,人物等级要到12级以上,且身上金币不少于500。
<返回/@法师技能>

其余法师技能同理,诱惑之光写>12,地狱火写>15,雷电术写>16,瞬息移动写>18,技能名和按钮名同步替换。

[@道士技能]
#IF
#ACT
#SAY
请选择要学习的技能。

<治愈术/@学治愈术>
<精神力战法/@学精神力战法>
<施毒术/@学施毒术>
<灵魂火符/@学灵魂火符>
<隐身术/@学隐身术>

<返回/@main>

[@学治愈术]
#IF
CHECKLEVELEX>6
CHECKGOLD500
CHECKMAGICNAME治愈术
#ACT
SENDMSG6你已经学过治愈术,不用重复花钱。
BREAK
#IF
CHECKLEVELEX>6
CHECKGOLD500
#ACT
TAKEGOLD500
ADDSKILL治愈术3
SENDMSG6你学会了治愈术。
BREAK
#ELSESAY
没有学成,人物等级要到7级以上,且身上金币不少于500。
<返回/@道士技能>

[@学精神力战法]
#IF
CHECKLEVELEX>8
CHECKGOLD500
CHECKMAGICNAME精神力战法
#ACT
SENDMSG6你已经学过精神力战法,不用重复花钱。
BREAK
#IF
CHECKLEVELEX>8
CHECKGOLD500
#ACT
TAKEGOLD500
ADDSKILL精神力战法3
SENDMSG6你学会了精神力战法。
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时会顺着往下继续执行,把后面的段落也跑一遍,表现就是提示连着刷好几条。

七、书写规范上的细节

一条命令单独占一行,命令和参数之间用空格分开,不要用全角空格。标签名以@开头,必须用半角方括号包起来。按钮里尖括号包裹的文字和跳转名之间用斜杠隔开,跳转名要和目标标签逐字符一致。

每行对白末尾的换行符是反斜杠,写在按钮行末尾时,控制的是按钮的换行位置,漏写会让整排按钮挤成一行显示。对白里的标点用中文标点,但代码部分的逗号、冒号、括号、斜杠必须保持半角,混用全角符号在部分引擎下会让脚本加载失败,服务端弹scripterrorloadfail。

脚本文本的保存编码要注意,不少引擎要求以ANSI编码保存,用别的编码存了之后中文技能名会变成乱码,肉眼看着没问题,实际判定时一个字都对不上,学不会也没有任何报错。

文件名、注册行里的脚本目录名、地图号三者要一致,初级技能教师配-0,写到别的地图号就要建对应的新文件。

八、改完怎么让它生效

保存脚本之后回到服务端,打开引擎主程序,找到控制菜单里的重新加载,先执行重新加载所有NPC;如果同时动过技能数据库或者MerChant.txt,还要重新加载一次物品与技能数据。此时回到游戏,在对应坐标就能看到NPC,点开就能测。调试阶段建议先在一个只有自己的测试账号上跑一遍,把每个按钮都点到底,确认提示文字、扣钱、技能栏三个环节都对,再放到正式环境。

九、常见问题按现象排查

点了NPC完全没反应。先确认MerChant.txt里那一行的脚本目录名、地图号与Market_Def下的文件名对得上;再确认坐标是不是落在地图边界外或者墙里;最后确认有没有重新加载NPC,只保存文件不重新加载是不会生效的。

能弹出对话框,点按钮没反应。九成是按钮跳转名和段落标签名不一致,其次是没有加换行符导致按钮显示异常,也有的是目标段落标题忘了写@。

提示学了技能但技能栏里是空的。多半是技能名和数据库里的名字不一致,少数情况是客户端缺少对应技能图标素材,服务端已经有数据,客户端显示不出来。可以用SKILLLEVEL再设一次等级验证是不是名字的问题。

金币被扣了,技能没加上。看是不是把CHECKGOLD和TAKEGOLD拆到了两段里,中间插入了#SAY,导致条件判断段落和扣钱段落各走一半。动作集中在同一段的#ACT里写更稳。

玩家卡的正好是那个等级,技能漏发。把CHECKLEVELEX的等于号改成大于号即可,或者同时判断大于和等于两个条件。

同一个技能可以反复点、反复扣钱。在条件里加上已学检测,用批次里对应的检测技能命令判断,学会的直接给一句提示并BREAK跳出。

战法道三个职业点进去看到的是别人的技能表。检查CHECKJOB后面参数的大小写和引擎要求是否一致,有的引擎只认全大写。

服务端启动时报scripterrorloadfail。说明脚本存在语法错误,把段落逐块加注释二分排查,重点看标签是否闭合、括号是否配对、是否存在全角符号,改完再重新加载。

十、几种常见的功能改动

去掉CHECKGOLD和TAKEGOLD两行,就是免费学习。想按等级阶梯收费,把每个技能的段落拆成两段#IF,低段收500,高段收2000,提示文字同步改。想让学完直接满熟练度,ADDSKILL后面把等级写成3,再补一句CHANGETRANPOINT技能名等于满值。如果版本里已经在QFunction-0.txt的升级触发段落写了自动学技能,NPC就当作补漏入口保留,两者的技能集合保持一致,避免一边给了技能另一边又收钱重复给。

动手前把MerChant.txt和Market_Def整目录备份一份,改动只落在这两个位置,出问题直接还原,比逐行回滚省事。
[顶部]