传奇脚本编写从入门到精通全面解析语法结构与命令变量的实战指南

来源: 作者: 点击:
先说清楚一件事,脚本不是代码意义上的编程语言,它是服务端引擎读得懂的一套指令文本。引擎在什么时候读它、读到哪一条、执行什么动作,全由脚本里的标点和关键词决定。搞明白这一点,后面所有命令都只是填空。

脚本文件放在哪,先弄清楚目录

服务端装好后,主要目录长这个样子。根目录一般是 MirServer,里面套一层 Mir200,脚本和各种配置全在 Mir200\Envir 下面。这个文件夹是整套服务端的神经中枢,地图、爆率、NPC、功能都从这里读。

Envir 下面按用途分成了好几个子目录,新手只要记住常用的几个就够了。

Market_Def 放 NPC 交互脚本,玩家点开商人、使者、活动NPC看到的对话和功能都出自这里。QFunction-0.txt 也在这里,管的是卷轴、会员命令、物品使用后的效果这类功能脚本。

MapQuest_def 里有个 QManage.txt,是登录脚本。每个角色进游戏都会经过它,新手引导、上线送药、安全检测这类逻辑通常写在这一段。

QuestDiary 是数据中枢,排行榜、充值记录、活动参数、防刷名单这些文本数据都存在里面,很多脚本读写文件都是往这里放。

Robot_def 是机器人脚本,管定时任务。里面 AutoRunRobot.txt 定义检测周期,比如每十秒跑一次,另一个机器人脚本按分钟命名,控制每天几点发全服公告、刷世界BOSS这类事。

MonItems 放怪物爆率,一个怪一个文件,文件名对应怪物名。MerChant.txt 是所有服务NPC的总表,MonGen.txt 是刷怪表,MapInfo.txt 管地图跳转和坐标点,Npcs.txt 与 Npc_def 配合放系统功能NPC,AdminList.txt 写GM名字,UserCmd.txt 定义玩家能敲的命令。

要新增一个NPC,得走两步。先在 Market_Def 里写脚本文件,再到 MerChant.txt 里登记一行。登记格式是脚本名称、地图编号、X坐标、Y坐标、NPC显示名称,后面跟着标志、形象编号、是否属于沙城、是否移动、移动间隔、是否允许变色、变色速度。例如一行写特修使者 3 330 330 特修使者,表示脚本名特修使者,放在编号3的地图上,坐标330 330。脚本文件名后面加地图号,常见写法是特修使者-3.txt。

引擎不一样,细节也不一样

服务端引擎有好几种,常用的有GOM、GEE、HERO、Blue也就是Leg、3K也就是Hge,近些年还有翎风和带三端互通的996。

GOM是老牌,脚本体系成熟,资料多,各种1.76和1.80复古版本大多跑在它上面。GEE在自定义技能、地图特效、坐骑翅膀这些扩展上做了原生支持,做神器、超变类版本顺手。HERO在封包处理和大型PK场景上有优势。Blue和Leg轻量,适合英雄合击和复古版本。3K和Hge多见于仿盛大。996主打PC、安卓、苹果三端数据互通。

脚本命令大同小异,但变量命名和个别参数的写法会在引擎之间有差别。GOM里变量分组常叫GLOBAL和HUMAN,HERO里叫GVAL和HVAL,老引擎直接用P0到P9、D0到D9这一套。换引擎的时候,脚本往往要按新引擎的规范改一遍,不能直接搬。另外GOM和GEE这类引擎需要单独配登录器,Blue和HERO自带,这也是搭建时的差异。

脚本的骨架就四块

一段脚本拆开看,无非四样东西,标签、跳转、条件、动作。

标签用中括号加@开头,写成 [@MAIN] 或者 [@领取奖励],是一段逻辑的入口。MAIN一般作为主入口,玩家点NPC先跑这里。

跳转写法是尖括号包住显示文字,斜杠后面跟目标标签,比如 <领取奖励/@领取奖励>,玩家点这四个字就跳到对应的段。

换行用反斜杠,写一个反斜杠就是一个回车,对话框里要多行显示就靠它。分号是注释,引擎读到分号就忽略后面的内容。

条件、动作、输出这三样,用关键词引导。这套结构是固定的:

#IF 开头写条件,条件成立才执行下面的动作
#ACT 是条件成立时执行的动作,具体命令一行一条
#SAY 是条件成立时弹出的对话内容
#ELSESAY 是条件不成立时弹出的内容
#ELSEACT 是条件不成立时执行的动作
BREAK 结束当前段落
CLOSE 关闭对话框

默认情况下,#IF 下面写多个条件是并且的关系,全满足才往下走。要表达满足其中一个就行,用 #OR 连接。

条件命令有哪些

条件写在 #IF 下面,判断玩家的状态。常用的有这么一批。

检测物品和金币,CHECKITEM 物品名 数量,看背包里有没有;CHECKITEMW 物品名 数量,看身上有没有装备;CHECKGOLD 数量,看金币够不够。

检测等级、职业、声望,CHECKLEVELEX 大于等级数,注意这里用大于号;CHECKJOB 后面跟Warrior、Wizard、Taoist,对应战法道;CHECKCREDITPOINT 检测声望。

检测身份和归属,ISADMIN 看是不是管理员,HAVEGUILD 看有没有行会,ISGUILDMASTER 看是不是行会掌门,ISCASTLEGUILD 看是不是沙城成员,ISCASTLEMASTER 看是不是沙城城主,CHECKOFGUILD 行会名称 看是不是指定行会。

检测名单和状态,CHECKNAMELIST 角色名列表.txt 看角色名在不在名单里,CHECKGUILDLIST、CHECKACCOUNTLIST、CHECKIPLIST 分别对应行会、账号、IP名单。CHECKHUM 地图名 数量 看某张地图上的人数,CHECKCASTLEDOOR 看城门状态,CHECKSLAVECOUNT 看宠物数量,ONLINELONGMIN 看在线时长。

变量类判断用 SMALL、LARGE、EQUAL,分别表示小于、大于、等于。比如 SMALL N8 10,成立的条件就是变量N8小于10。CHECK [n] 数值 用来测标识变量,做任务进度最常用。CHECKMISSION 同理,测任务标识。

随机用 RANDOM 数值,数值填2就是一半概率,填3就是三分之一。

动作命令有哪些

动作写在 #ACT 或 #ELSEACT 下面,是真正改变游戏状态的指令。

给和收,GIVE 物品名 数量 发放物品,金币也可以直接给;TAKE 物品名 数量 收回物品。

传送和地图,MAP 地图名 随机落点;MAPMOVE 地图名 X Y 定点传送;MONCLEAR 地图名 清怪;MONGENEX 按坐标刷怪,后面跟地图、坐标、怪物名、范围、数量、名字颜色。

提示和消息,SENDMSG 颜色 内容 往聊天框发消息,颜色填6是常见的一种;SENDCENTERMSG 往屏幕中央发消息,做活动提示常用。

变量操作,MOV 变量 数值 赋值,INC 变量 数值 加,DEC 减,MUL 乘,DIV 整除,MOD 取余,PERCENT 变量 数值 按百分比换算,SUM 变量A 变量B 求和。MOVR 变量 数值 是给变量赋一个从0到该数值的随机值。

界面和跳转,GOTO @段 直接跳转,不再弹对话;OPENWEB 打开网页地址,充值跳转常这么写。

退出与关闭,CLOSE 关掉对话框,BREAK 结束当前段落的执行。

文件类还有 CopyFile 源路径 目标路径,做数据备份;TextLength 字符串 变量,量一段文字的字符数,注意汉字占两个字符,英文和数字各占一个。这些命令在不同引擎上支持情况不一样,用之前最好先查对应引擎的说明书。

变量是脚本的记性

变量的命名不是随便起的,按作用范围分成了好几组,用错了数据就串了。

N 是个人数字临时变量,小退归零,下线不保存,做一段对话里的临时计算用得多。S 是个人字符临时变量,用来存文字。P 是只在当前NPC里有效的数字变量,对话框一关就归零,适合临时传参,但要注意有些引擎里N0到N9、S0到S9被内部占用,别拿来当普通变量用。

C 是个人数字变量,下线保存,用来记玩家的进度,比如充值次数、任务阶段。B 是个人字符串变量,同样下线保存,但要留意总长度有限制,写太多会截断。

G 是全局数字变量,重启服务端也保存。A 是全局字符串变量,同样重启保存。I 和 U 是全局变量但重启不保存,适合当天有效的全服数据,比如今日活动次数。

还有一类是标识变量,用中括号括起来的编号,CHECK [n] 判断,SET [n] 值 设置,RESET [n] 个数 批量清零。任务做没做过、礼包领没领过,用这个最省事。

显示变量值的时候,要用 <
𝑆
𝑇
𝑅
(
变量
)
>
,比如对话框里写你当前金币是
<
STR(变量)>,比如对话框里写你当前金币是<STR(N1)>,玩家看到的就是实际数字。

写一个完整NPC脚本

下面这段实现的是:等级达到10级并且金币不少于1000,可以领一次奖励,领过之后不能重复领。

[@MAIN]
#IF
CHECKLEVELEX > 9
CHECKGOLD 1000
#SAY
你符合领取条件。
<领取奖励/@领取>
<离开/@Exit>
#ELSESAY
等级到10级、金币不少于1000再来找我。
<知道了/@Exit>

[@领取]
#IF
CHECK [100] 0
#ACT
TAKE 金币 1000
GIVE 屠龙 1
SET [100] 1
SENDMSG 6 奖励已发放。
CLOSE
#ELSEACT
SENDMSG 6 你已经领过了。
CLOSE

逐段看。入口[@MAIN]先判断等级和金币,两条都成立,弹出差对话框,里面两个可点选项。不成立,弹另一段话。玩家点领取奖励,跳到[@领取],这里先看标识100是不是0,是0说明没领过,就扣金币、发装备、把标识设成1,再发一条聊天提示,最后关掉对话框。如果标识不是0,走#ELSEACT,提示已经领过。

这里有个容易错的地方,判断用的 [100] 和设置用的 [100] 必须是同一个编号,编号冲突会让两个完全不相干的功能互相影响,所以写之前最好记一下哪个编号用在哪个功能上。

做触发类功能要懂的入口标签

除了NPC对话,脚本还能挂到各种事件上。攻击时触发写 [@Attack],魔法攻击触发写 [@MagicAttack],被攻击触发写 [@Struck],被魔法打触发写 [@MagicStruck],玩家退出游戏用玩家退出游戏这类标签,进入地图、升级、使用物品也各有对应的入口。

举个实际一点的例子。要做佩戴某件装备后,攻击怪物有一半概率削掉它两成最大血量,思路是先判断有没有戴这件装备,再判断目标是不是怪物,然后用随机数控制概率,最后算出血量减多少。

[@Attack]
#IF
CHECKITEMW 装备 1
NOT CHECKCURRTARGETRACE = 0
RANDOM 2
#ACT
MOV N1 <
𝐴
𝑇
𝑇
𝐴
𝐶
𝐾
𝑀
𝑂
𝑁
𝑆
𝑇
𝐸
𝑅
𝑀
𝐴
𝑋
𝐻
𝑃
>
𝐷
𝐼
𝑉
𝑁
1100
𝑀
𝑈
𝐿
𝑁
120
𝑀
.
𝐻
𝑈
𝑀
𝐴
𝑁
𝐻
𝑃
−
<
ATTACKMONSTER
M
​

AXHP>DIVN1100MULN120M.HUMANHP−<STR(N1)>
SENDMSG 6 装备效果触发,目标掉了 <$STR(N1)> 点血。
BREAK

关键几点。CHECKITEMW 判断身上有没有装备,NOT 是取反,CHECKCURRTARGETRACE 用来区分目标类型。变量不支持小数,所以算百分比要先除再乘,不能直接乘0.2。M.HUMANHP 前面的 M. 表示对目标操作,不带就是对自己。<$ATTACKMONSTER_MAXHP> 是被攻击怪物的最大血量,这类系统变量在引擎说明书里有一张专门的表,用到的时候去翻。

显示和排版能让对话框好看很多

对话框里的文字不只是白字,还能设颜色、字号、字体,甚至插图片。

颜色用 FCOLOR,写在尖括号里,例如 <字体颜色/FCOLOR=69>。字号用 FSIZE,字体用 FNAME 后跟字体名,加粗用 FBOLD=1。要文字自己变色就用 AUTOCOLOR,后面跟一串颜色编号。

脚本里还能插图标,格式 Img:N:F:X:Y:D/@标签,N是图片在资源里的序号,F是WIL文件序号,X和Y是偏移坐标,D是输入框编号,斜杠后面是点击后要跳转的标签。

输入框也是一个常被忽略的功能,让玩家在对话框里填数字,脚本再拿这个数字做判断,做充值金额、数量选择、抽奖次数都能用得上。

新手最常踩的坑

路径和文件名错。脚本文件放错目录,或者文件名多了空格、少了地图号,引擎就找不到。名称大小写和扩展名也要对上,本该是txt的写成别的格式一样读不了。

编码不对。脚本保存成带BOM的UTF-8,或者存成了别的编码,引擎解析时会出乱码,命令直接失效。多数情况用ANSI或UTF-8无BOM更稳。

变量编号冲突。前面提过,乱用编号会让功能互相干扰,尤其是普遍被内部占用的那几个号段。

该结尾没结尾。一段执行完不加BREAK或者CLOSE,引擎会继续往下读,可能把下一段的条件当成这一段的一部分,行为就乱了。

忘了重载。脚本改完保存,服务端不重载NPC和脚本是不会生效的,看着没反应其实是没加载。

全角标点和中文符号。命令、括号、斜杠都必须是半角,全角写出来引擎按普通文字处理,命令就废了。

循环没有出口。用GOTO跳转回自己或者互相跳转,中间没有跳出条件,玩家一操作就卡死。

想写好,按这个顺序练

先从一个最简单的NPC开始,弹一句话,加两个选项。跑通之后,加一个条件判断,比如等级够了才给东西。再往后,引入变量,让同一个NPC能记住玩家领过没有。这几步走下来,骨架就成型了。

然后去模仿现成的脚本。版本里自带的NPC脚本、活动脚本,都是可读的文本,打开对着改,比从零写快得多。改的时候一次只动一处,改完重载看效果,别一口气改十几行再测,出了问题根本不知道是哪一句。

最后再去碰触发类和定时类,比如攻击触发、登录触发、定时活动。这类脚本对时机和变量的要求更高,前面基础不牢,写出来就是各种乱。

命令表要常翻。不同引擎的命令名称、参数顺序、参数个数会有出入,与其背,不如把说明书放在手边,用一条查一条。写脚本这件事,本质就是把玩家的动作用条件和指令翻译给引擎听,翻得准,脚本就稳。