传奇脚本命令中变量使用全解:个人变量全局变量赋值计算保存加载与NPC事件触发排错指

来源: 作者: 点击:
传奇脚本做任务、商店、活动、攻城分配、限购统计时几乎都要用变量。不会用变量就只能每段写死数据,后面改一次价格或数量就要翻整个脚本,几个NPC想共享同一个数据更是难上加难。这篇把传奇脚本里个人变量、全局变量、临时变量的区别,赋值计算、保存读取、字符串拼接和调试排错全部讲清楚,用最常见命令写法做示范,拿到自己的引擎上再对照命令表微调就行。

一、变量类型和命名规则

传奇脚本变量一般由一个字母加数字组成,数字范围有的大到10、99、100,不同引擎上限不一样。字母代表类型和作用范围。最常见的有:

N表示数字型个人变量,跟随玩家保存,能参与计算、比较和保存。
P表示数字型临时变量,只在当前脚本执行过程中有效,执行完自动归零。
S表示字符串型个人变量,存放文本内容,能跨NPC保存。
A表示字符串型临时变量,执行完就失效。
G表示全局数字变量,全服所有玩家共用一个数值。
H表示全局字符串变量,全服公用文本。
I在一些引擎里表示整数型全局变量,用法和G类似。
M部分引擎里表示个人数字变量的一种扩展类型,数字范围更大。
L有的是列表变量,有的是另一类全局变量,按引擎文件确认。

不要自己造字母。先查引擎说明书或命令表确认哪些变量类型存在,再看选用的引擎有没有额外扩展变量。GOM、GEE、HGE、Hero、LEG、Max,每一种支持的变量名和格式都有细微差别,但思路一样:临时变量用完就丢,个人变量跟随账号角色存,全局变量全服共享。

二、赋值和计算命令

最常用的是MOV,MOV表示把后面的值赋给前面的变量。MOV N1 10就是把数字10赋给N1,MOV S1 你好就是赋一个文本。很多版本还支持直接在MOV里做简单运算,比如MOV N1 10 + 5,但老引擎不一定认,稳妥写法是先MOV赋初始值再做INC、DEC、MUL、DIV。

INC N1 5代表N1等于原值加5,DEC N1 5代表减5,MUL N1 2是翻倍,DIV N1 2是折半。

有些引擎用CALCVAR命令,格式是CALCVAR N1 + 5,然后必须跟UPDATEVAR N1把计算回写,或者用CALCVAR就能直接刷新,看命令表。也有的引擎在#IF里判断变量后,在#ACT里用MOD或RANDOM生成随机数。常规写法是MOV N1 <$RANDOM(100)>,有的版本直接RANDOM 100赋给N1,这两种都要查本服命令。

三、条件判断和文本显示

条件判断在#IF下面写CHECKVAR,后面接变量名和比较值。检查N1是否等于10,有的版本写CHECKVAR N1 = 10,有的写CHECKVAR N1 10,还有的直接EQUAL N1 10。大于、小于、大于等于这些符号也可能不一样。老传奇脚本里常用CHECK N1 > 5,新引擎推荐统一用CHECKVAR避免歧义。

数字变量不能直接在文本里写N1,要用<STR(N1)>这个格式。比如#SAY里写“当前数量是<STR(N1)>个”。字符串变量显示用<$STR(S1)>,有的引擎写法略有不同。SENDMSG 7或SENDMSG 6后面接的提示文案里也可以插变量,调试非常方便。

要在NPC选项按钮里放动态文字,可以写到按钮标签里,例如<查看第<$STR(N1)>页/@foot_page>,脚本跳到@foot_page后再用变量做页面内容。分页商店和任务列表常用这个技巧。

四、保存和读取机制

个人变量像N、S、M、H,角色下线时自动存到数据库或角色备份文件里。只要正常使用,不需要手动保存。限购次数、任务进度、副本冷却、称号状态都用个人变量计数,角色掉线重进数据还在。

但全局变量G和H不是每次都自动存。很多引擎把全局变量保存在Mir200/Envir/GlobalVal.txt或Global.txt里,需要在变量修改后用SAVEGLOBAL或SAVEVAR命令写入。有些引擎在M2里设置定时保存,有些只在关服时保存,服务器异常断电就会丢。建议每次修改经济类数据时,在脚本段末尾写一条SAVE全局命令,例如SAVEGLOBAL G1 1,具体格式以引擎为准。

个人变量如果想保存到独立文本文件,用SAVEVAR命令配合文件名。MOV N1 5后写SAVEVAR N1 个人任务变量.txt,其他NPC读取时先LOADVAR N1 个人任务变量.txt,再判断,就能跨NPC、跨脚本共享同一个任务进度。这个方法适合做每日任务、活动累计、转职次数。

全局变量读取可先用LOADVAR把备份文件内容读到全局变量,如果引擎自动读取就无需手动。

五、字符串变量拼接

字符串变量最常用来动态发送物品、动态改变NPC位置、动态组队名称。比如给玩家发变量指定的装备名,用GIVE命令:

MOV S1 屠龙
GIVE <$STR(S1)> 1

S1存的是“屠龙”,脚本执行后发物品就是屠龙。注意GIVE的物品名要严格匹配DB里的名称,否则提示物品不存在。

字符串拼接命令不同引擎有区别,常见的有STRCAT、ADDS、APPEND。有的引擎还能用<STR(S2)>直接拼在后面。数字转字符串先MOV S1 <STR(N1)>,或者用整数转字符串命令。

用字符串变量做传送可以这样写:

MOV S1 盟重
MOV N2 330
MOV N3 330
MAPMOVE <STR(S1)> <STR(N2)> <$STR(N3)>。

地图名和坐标都变成变量,适合做随机传送NPC,改动时不用反复改脚本。注意部分版本MAPMOVE命令只能接受直接坐标,不能接受字符串变量,要先把N2、N3赋给坐标型变量或直接用数字写。

六、数组和扩展变量

部分新引擎支持变量数组,N1[10]表示N1变量的第0到第10号位置。使用前先设置数组长度,比如DIM N1[10],再初始化。PLAYER类型是个人数组,GLOBAL类型是全局数组。数组适合做背包检测、量化数据表、排行榜统计。例如N1[1]记录杀怪积分,N1[2]记录消费积分,省一堆变量。老引擎没有数组时,就用P、N变量手动错开编号,也能凑合。

扩展变量在某些引擎里叫EXT变量,文件存放方式和普通个人变量分开,数字范围更大,适合做跨区数据、合区防覆盖。没有EXT可以用普通个人变量加不同前缀。

七、常见错误和排查方法

变量未初始化经常导致判断异常。脚本开始先MOV N1 0,再做后续计算,免得读取到上一次残留数据。

变量名冲突最容易出现在全局变量和个人变量同数字。例如全局N1和个人N1同时存在,两个NPC同时改就会串。给用途设固定范围:N1到N20只做限购,N21到N40只做任务,避免随意混用。

字符串变量不能直接参与加减。数字变量和字符串变量混加会让脚本报错。先确认S1内容纯数字再转换。用<$STR(N1)>转成字符串后也不能直接INC,除非引擎支持自动转换。

变量显示为0不一定真为0。检查是否写错变量名,例如把N2写成N02,有些引擎不认前导零。

保存失败基本是变量没有写盘。等角色正常下线再进,还丢就查角色数据库字段长度,或者全局保存命令是否被跳过。

脚本乱码或点击无反应,检查文件编码是不是ANSI或UTF-8无BOM,变量名里的冒号、等于号、分号全用英文半角,中文全角符号会让命令失效。

多个M2共用同一个全局变量文件时,锁冲突会导致数值不同步。不要用多个M2进程同时操作同一个G变量文件,应该用数据库服务或指定一个M2写全局。

八、变量命令在不同引擎上的差异

Hero、LEG、GOM、GEE、HGE、MAX这几种引擎的变量命令不完全一样。Hero老版本用CHECK、CALCVAR和UPDATEVAR的组合在很多包里还能见到。GOM和GEE比较统一,但GOM旧版不支持数组,GEE新版支持更灵活的个人变量扩展。MAX引擎的套装、标识、变量也可能有自己的特殊命名。真正写脚本前,先打开M2菜单里的命令帮助或脚本说明,查找变量、赋值、保存变量、数值运算这几个分类,照示例命令改。

很多包自带的脚本模板里就有变量的标准写法,比如仓库脚本里P1、N1的使用,任务奖励里的CHECKGAMEGOLD和TAKEGAMEGOLD,这些都能当范本。照着成熟脚本改比自己凭空发明命令稳得多。

九、变量脚本完整示例

下面是一个跨NPC限购示例,用个人变量N1记录购买次数,在NPC1购买,NPC2查询状态。

NPC1主菜单写法:

[@main]
<购买套装/@buy>\n
<查询状态/@check>

[@buy]
IF

CHECKVAR N1 >0
SAY

已经购买过套装,每个角色限购一次。\n
<返回/@main>
ELSEIF

CHECKGAMEGOLD >999
ACT

TAKEGAMEGOLD 1000
GIVE 战神套装 1
MOV N1 1
SAVEVAR N1 套装限购.txt
SENDMSG 6 购买成功,限购次数已记录。
SAY

购买成功。\n
<返回/@main>
ELSESAY

元宝不足或者背包已满。\n
<返回/@main>

[@check]
IF

CHECKVAR N1 >0
SAY

当前已购买该套装。\n
<返回/@main>
ELSESAY

还未购买该套装。\n
<返回/@main>

NPC2读取语句:

[@main]
IF

ACT

LOADVAR N1 套装限购.txt
IF

CHECKVAR N1 >0
SAY

状态:已购买。\n
ELSESAY

状态:未购买。\n

这个示例能直接用在支持CHECKVAR、MOV、SAVEVAR、LOADVAR的引擎上。若引擎不叫CHECKVAR,就换成EQUAL或CHECK,保存变量格式按自己的引擎重写。

十、什么时候该用变量,什么时候不用

只在一个NPC里写死的任务,不用变量。要在多个NPC间传递状态,用个人变量。整个服务器的公共开关、活动开幕、当天税收、系统开关用全局变量。只想在当次脚本里算一个临时价格,用临时变量。变量用对范围,脚本结构才清晰。不要把所有东西都塞进全局变量,全局变量越多越难找错,全服同时读写时效率也差。

使用变量的核心原则:临时计算用P或A,玩家个人状态用N或S,全服共享用G或H,特殊存储需求再用独立文件。按这个原则写,大多数脚本变量问题都能避开。特别是长时间运行的服务器,养成脚本开头先初始化变量、修改完再保存变量的习惯,能省掉很多半夜被人叫起来查问题的麻烦。每一次改动只改一个变量、一个命令,不同时动保存路径和输出文本,出错就能立刻定位。