传奇自定义变量突破固定PDAIMSNG限制HUMANGUILDGLOBAL存盘与跨NPC脚本教程

来源: 作者: 点击:
传奇老脚本只用P0、D0、M0、N0、S0、I0、G0、A0这类系统变量,数量按引擎给到几百或上千,做复杂活动、排行榜、消费积分、任务进度、行会数据、跨天统计会很紧。自定义变量用VAR声明名字,配合LOADVAR读取、CALCVAR运算、SAVEVAR存盘、CHECKVAR判断,可不受固定字母序列限制;个人数据用HUMAN,行会用GUILD,全服公共用GLOBAL,字符用String,数字用Integer。

一、固定系统变量与自定义变量区别

P0系列通常对话框关闭归零,适合临时传参;D0下线不保存,适合骰子、临时计算;M0切图清、N0小退清、S0字符临时;I0全局不保存、G0/A0全局可存GlobalVal.ini;U0/T0存人物库,J0按引擎定时重置。做长期数据别全靠这些,活动一多就会不够用。

自定义变量不走P/D/M/N/S/I/G/A固定号。声明时用有意义中文或英文,例如“屠龙次数”“商铺消费”“行会捐献”“开区天数”。多数资料要求自定义名不要以P、D、M、N、S、I、G、A开头,避免和系统变量、引擎内部解析冲突。

二、通用声明与四步操作

以GOM、GEE、Hero类支持自定义VAR的引擎为例,Mir200\Envir下建QuestDiary\数据文件,存文本最直观。

1)声明

数字个人变量:
VAR Integer HUMAN 屠龙次数
VAR Integer HUMAN 商铺消费
字符个人变量:
VAR String HUMAN 上次签到日期
全局数字:
VAR Integer GLOBAL 开区天数
VAR Integer GLOBAL 全服捐献总额
全局字符:
VAR String GLOBAL 当日活动名
行会数字:
VAR Integer GUILD 行会运镖次数
行会字符:
VAR String GUILD 行会口号

2)读取

LOADVAR HUMAN 屠龙次数 ..\QuestDiary\数据文件\屠龙次数Save.txt
LOADVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
LOADVAR GLOBAL 开区天数 ..\QuestDiary\数据文件\全局变量\开区天数.txt
LOADVAR GUILD 行会运镖次数 ..\QuestDiary\数据文件\行会数据\运镖Save.txt

文本不存在、新号无记录时,部分引擎读出来是空或0;运算前最好做初始化判断,避免“变量不存在”导致脚本中断。

3)运算

数字加减:
CALCVAR HUMAN 屠龙次数 + 1
CALCVAR HUMAN 商铺消费 + 100
CALCVAR HUMAN 屠龙次数 - 1
CALCVAR HUMAN 屠龙次数 = 0
CALCVAR GLOBAL 开区天数 + 1
CALCVAR GUILD 行会运镖次数 + 1

支持+ - = * /按引擎实现而定,字符型一般只赋值、拼接,不做四则。简单自增也可用INC/DEC,但自定义命名变量优先用CALCVAR保持跨引擎一致。

4)保存

SAVEVAR HUMAN 屠龙次数 ..\QuestDiary\数据文件\屠龙次数Save.txt
SAVEVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
SAVEVAR GLOBAL 开区天数 ..\QuestDiary\数据文件\全局变量\开区天数.txt
SAVEVAR GUILD 行会运镖次数 ..\QuestDiary\数据文件\行会数据\运镖Save.txt

文本存盘优点是能用记事本排查,缺点是合区、多服同步不如数据库;996类资料提到老模式写文本不支持合区自动合并,写数据库变量合区更易处理,具体按所用引擎选择文本或库内自定义变量。

5)判断

CHECKVAR HUMAN 屠龙次数 > 5
CHECKVAR HUMAN 屠龙次数 = 0
CHECKVAR HUMAN 商铺消费 >= 1000
CHECKVAR GLOBAL 开区天数 > 0
CHECKVAR GUILD 行会运镖次数 > 3

NPC段示例,接任务扣次数:

[@领屠龙材料]
IF

CHECKVAR HUMAN 屠龙次数 > 0
ACT

CALCVAR HUMAN 屠龙次数 - 1
SAVEVAR HUMAN 屠龙次数 ..\QuestDiary\数据文件\屠龙次数Save.txt
Give 屠龙碎片 1
SendMsg 6 已领取材料,剩余屠龙次数已扣减
ELSEACT

SendMsg 6 屠龙次数不足,先完成火龙将军相关任务

三、登录初始化与个人长期数据

QManage或QFunction登录段做加载,避免新号直接运算报错。Hero/通用可放QManage[@Login],全局启动放[@Startup];不同引擎文件名可能为QManage.txt、QM.txt,以实际Envir文件为准。

[@Login]
IF

ACT

VAR Integer HUMAN 屠龙次数
VAR Integer HUMAN 商铺消费
VAR String HUMAN 上次签到日期
LOADVAR HUMAN 屠龙次数 ..\QuestDiary\数据文件\屠龙次数Save.txt
LOADVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
LOADVAR HUMAN 上次签到日期 ..\QuestDiary\数据文件\签到\签到日期Save.txt
CHECKVAR HUMAN 屠龙次数 < 0
ACT

CALCVAR HUMAN 屠龙次数 = 0
SAVEVAR HUMAN 屠龙次数 ..\QuestDiary\数据文件\屠龙次数Save.txt

新号文本不存在时,部分引擎LOADVAR后变量为空;用小于0或等于空判断补0最稳。字符日期可配合系统日期变量比对,跨天重置签到。

签到NPC示例:

[@main]
IF

CHECKVAR HUMAN 上次签到日期 = <$DATE>
ACT

SendMsg 6 今日已签到
ELSEACT

CALCVAR HUMAN 商铺消费 + 50
MOV S0 <$DATE>
CALCVAR HUMAN 上次签到日期 = S0
SAVEVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
SAVEVAR HUMAN 上次签到日期 ..\QuestDiary\数据文件\签到\签到日期Save.txt
Give 绑定元宝 1
SendMsg 6 签到成功,发放商铺消费与绑定元宝

<$DATE>按所用引擎日期变量名替换;有些版本用系统宏、有些用自定义日期命令,写之前在M2命令列表查日期变量名。

四、全局变量做全服活动与跨天统计

全局自定义变量适合开区天数、全服BOSS击杀、活动开关、排行榜汇总。启动只声明一次,避免每次登录重复声明造成冲突。

QManage[@Startup]或QM[@OnStart]示例:

[@OnStart]
IF

ACT

VAR Integer GLOBAL 开区天数
VAR Integer GLOBAL 全服火龙击杀
VAR String GLOBAL 当日活动名
LOADVAR GLOBAL 开区天数 ..\QuestDiary\数据文件\全局变量\开区天数.txt
LOADVAR GLOBAL 全服火龙击杀 ..\QuestDiary\数据文件\全局变量\火龙击杀.txt
LOADVAR GLOBAL 当日活动名 ..\QuestDiary\数据文件\全局变量\活动名.txt

机器人每日0点加开区天数:

Robot.txt配每日执行,Robot_def写:

[@RobotOpenDay]
IF

ACT

CALCVAR GLOBAL 开区天数 + 1
SAVEVAR GLOBAL 开区天数 ..\QuestDiary\数据文件\全局变量\开区天数.txt
SendMsg 5 全服通知:开区天数已更新

BOSS死亡写全局,QF或MonDie段:

[@FireDragonDie]
IF

ACT

CALCVAR GLOBAL 全服火龙击杀 + 1
SAVEVAR GLOBAL 全服火龙击杀 ..\QuestDiary\数据文件\全局变量\火龙击杀.txt
SendMsg 5 火龙神被击杀,全服累计击杀数已更新

全局变量若引擎支持GlobalVal.ini,也可继续用G0系列;但自定义GLOBAL命名更适合多活动扩展,不用记G编号。

五、行会变量做帮派数据

行会运镖、行会捐献、行会任务进度用GUILD自定义变量。声明后在行会相关NPC、行会登录、完成事件里读写。

[@行会运镖完成]
IF

CHECKGUILD
ACT

VAR Integer GUILD 行会运镖次数
LOADVAR GUILD 行会运镖次数 ..\QuestDiary\数据文件\行会数据\运镖Save.txt
CALCVAR GUILD 行会运镖次数 + 1
SAVEVAR GUILD 行会运镖次数 ..\QuestDiary\数据文件\行会数据\运镖Save.txt
SendMsg 6 行会运镖次数增加,可到行会管理员领阶奖
ELSEACT

SendMsg 6 未加入行会无法记录

行会字符变量存口号、公告摘要时用VAR String GUILD,保存路径单独建文本,避免和数字变量混文件。

六、排行榜与批量排序

个人消费、杀怪、泡点可用自定义HUMAN变量存,再用排序命令出榜。GOM/GEE资料给SortVarToList:自定义变量名、源文本、结果文本、升/降序、保存格式;Hero类可用SortHumVarToListEx、SortHumVarToList处理在线或全量人物变量。

消费排行示例:

[@BuildRank]
IF

ACT

SortVarToList 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt ..\QuestDiary\数据文件\排行\消费排行.txt 1 1
SendMsg 6 消费排行榜已生成

1 1表示降序、保存“人物名:变量值”;只想要名字用0 0或0 1按引擎文档调整。结果文本可在NPC用ReadRandomLine、ReadRandomLine格式或逐行读取展示,具体命令名各引擎不同。

在线人物实时排行:

[@OnlineRank]
IF

ACT

SortHumVarToList 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt 1 ..\QuestDiary\数据文件\排行\在线消费名.txt
SendMsg 6 在线消费排行已生成

七、跨NPC读取同一变量

不同NPC都要用“商铺消费”,每个NPC段自己声明并LOADVAR,或者统一在登录加载、重要操作后立即SAVEVAR。NPC A加消费,NPCB查消费,都不用传P/M/S参数。

NPC A充值返利:

[@recharge]
IF

CHECKGOLD > 0
ACT

VAR Integer HUMAN 商铺消费
LOADVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
CALCVAR HUMAN 商铺消费 + 100
SAVEVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
SendMsg 6 充值后商铺消费积分+100

NPCB查询兑换:

[@exchange]
IF

VAR Integer HUMAN 商铺消费
LOADVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
CHECKVAR HUMAN 商铺消费 > 999
ACT

CALCVAR HUMAN 商铺消费 - 1000
SAVEVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
Give 终极礼包 1
SendMsg 6 消耗1000积分兑换终极礼包
ELSEACT

SendMsg 6 商铺消费不足1000

每个NPC都LOADVAR再判断,能避免别的脚本改完当前NPC没读到最新值;高频操作可只在关键节点加载,减少IO。

八、Blue与新Blue扩展

Blue自定义变量同样用VAR Integer/HUMAN/GLOBAL/GUILD,全局老版本放!Setup,新版本改QuestParams.ini。全局声明放QManage[@OnStart]或QM[@OnStart],个人放[@OnInit]、[@Login]。

[@OnInit]
IF

ACT

VAR Integer HUMAN 累计RMB
VAR String HUMAN 个人备注
LOADVAR HUMAN 累计RMB ..\QuestDiary\数据文件\变量数据.ini
LOADVAR HUMAN 个人备注 ..\QuestDiary\数据文件\变量数据.ini

[@OnStart]
IF

ACT

VAR Integer GLOBAL 全服福利点
VAR String GLOBAL 服务器公告摘要
LOADVAR GLOBAL 全服福利点 ..\QuestDiary\功能脚本\全局变量数据.ini
LOADVAR GLOBAL 服务器公告摘要 ..\QuestDiary\功能脚本\全局变量数据.ini

新Blue支持hardDisk实时读盘,声明时带hardDisk可减少手动SAVEVAR;例如VAR Integer HUMAN 累计RMB "" hardDisk,后续CALCVAR直接写盘。频繁写盘用force会卡,普通变量让引擎定时保存即可。

Blue还扩展地图变量E为整数、F为字符,指向执行命令的玩家所在地图,服务器关闭不保存,适合地图临时状态、房间计数、活动分场数据,不适合长期人物数据。

九、996与其他库内自定义变量

996资料提到N/S为临时不保存,老模式写文本不支持合区;后面加..\路径写文本,不写路径可存数据库。优先读文本用LOADVAR,未读取则按引擎取数据库值。

个人库内变量适合合区:
VAR Integer HUMAN 文本私人数字
LOADVAR HUMAN 文本私人数字 ..\QuestDiary\私人变量.txt
CALCVAR HUMAN 文本私人数字 + 100
SAVEVAR HUMAN 文本私人数字 ..\QuestDiary\私人变量.txt

全局库内变量合区以主区为准,从库变量按合区工具规则迁移;文本变量合区要手工合并或写脚本比对,别直接覆盖文件。

十、Robot定时与自动重置

每日重置个人活动用Robot:

Robot.txt增加执行段,Robot_def写:

[@DailyResetSign]
IF

ACT

VAR Integer HUMAN 每日副本次数
CALCVAR HUMAN 每日副本次数 = 0
SAVEVAR HUMAN 每日副本次数 ..\QuestDiary\数据文件\副本\每日次数Save.txt
SendMsg 6 每日副本次数已重置

全服活动开关用GLOBAL,跨天关闭:

[@DailyCloseActivity]
IF

ACT

VAR String GLOBAL 当日活动名
CALCVAR GLOBAL 全服火龙击杀 = 0
SAVEVAR GLOBAL 全服火龙击杀 ..\QuestDiary\数据文件\全局变量\火龙击杀.txt
MOV S0 无
CALCVAR GLOBAL 当日活动名 = S0
SAVEVAR GLOBAL 当日活动名 ..\QuestDiary\数据文件\全局变量\活动名.txt

Robot时间格式按所用引擎写,有的用分钟间隔,有的用固定小时分钟;先在小服测试再上正式。

十一、QFunction事件写入变量

击杀、死亡、登录、购买、穿装都能写自定义变量。商铺购买成功写消费:

QFunction-0[@BuyShopItem]
IF

ACT

VAR Integer HUMAN 商铺消费
LOADVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt
CALCVAR HUMAN 商铺消费 + <M0>
SAVEVAR HUMAN 商铺消费 ..\QuestDiary\数据文件\商铺消费Save.txt

M0按GOM/Hero商铺变量取总价;其他引擎换对应价格变量。若引擎商铺触发用别的标签,按实际QF文档改段名。

击杀记录写个人和全局:

[@PlayKillMon]
IF

CHECKMCNAME 火龙神
ACT

VAR Integer HUMAN 火龙击杀个人
VAR Integer GLOBAL 全服火龙击杀
LOADVAR HUMAN 火龙击杀个人 ..\QuestDiary\数据文件\击杀\火龙个人.txt
LOADVAR GLOBAL 全服火龙击杀 ..\QuestDiary\数据文件\全局变量\火龙击杀.txt
CALCVAR HUMAN 火龙击杀个人 + 1
CALCVAR GLOBAL 全服火龙击杀 + 1
SAVEVAR HUMAN 火龙击杀个人 ..\QuestDiary\数据文件\击杀\火龙个人.txt
SAVEVAR GLOBAL 全服火龙击杀 ..\QuestDiary\数据文件\全局变量\火龙击杀.txt

CHECKMCNAME按引擎怪物名检测命令替换;有的用CheckMonName,有的用死亡脚本参数。

十二、文件结构与权限

QuestDiary下按模块建目录,别全扔一个txt:

QuestDiary\数据文件\屠龙次数Save.txt
QuestDiary\数据文件\商铺消费Save.txt
QuestDiary\数据文件\签到\签到日期Save.txt
QuestDiary\数据文件\全局变量\开区天数.txt
QuestDiary\数据文件\全局变量\火龙击杀.txt
QuestDiary\数据文件\行会数据\运镖Save.txt
QuestDiary\数据文件\排行\消费排行.txt

文本用ANSI,不带BOM;目录要手动建,引擎常不自动建文件夹。文件别设只读,M2服务对Envir有写权限。大型版本把高频变量放数据库,低频配置、排行结果放文本,便于排查。

十三、常见报错处理

报错“变量不存在”:脚本先CALCVAR后LOADVAR,或新号文本为空直接运算。顺序改声明、加载、初始化、运算、保存。

登录卡死:QManage/QFunction登录段声明变量名拼错,或SAVEVAR路径不存在。先建目录,再简化登录段只加载一个变量复现。

变量互相覆盖:两个NPC用同名但存不同路径,或全局、个人都叫“次数”。命名加前缀,个人用“角色_xxx”,全局用“全服_xxx”,行会用“行会_xxx”。

合区后数据丢:文本变量没合并,库变量合区规则未勾。合区前备份QuestDiary全部Save文本,用脚本按角色名汇总;库内自定义变量优先确认合区工具是否迁移。

重启后全局归零:用了I0或不保存临时全局。长期全局用G0/GlobalVal.ini或自定义GLOBAL+SAVEVAR文本/库;纯内存I0重启必清。

排序命令无效:源文本格式不对,人物名和变量值分隔符不符合SortVarToList要求。先用手工改几行标准格式再跑排序。

Robot不执行:Robot.txt未挂执行段,Robot_def文件名和段名不一致,或M2未重载Robot。改完在M2控制重新加载机器人脚本,用简单SendMsg测试触发。

十四、实战:多活动共用不冲突

版本做签到、消费、屠龙、火龙、行会运镖、副本每日次数,全部自定义变量:

登录加载:
VAR Integer HUMAN 屠龙次数
VAR Integer HUMAN 商铺消费
VAR Integer HUMAN 每日副本次数
VAR String HUMAN 上次签到日期
LOADVAR对应三个数字文本、一个日期文本
初始化:各数字小于0置0,日期空置空。

全局加载启动一次:
VAR Integer GLOBAL 开区天数
VAR Integer GLOBAL 全服火龙击杀
VAR Integer GLOBAL 全服屠龙完成
LOADVAR三个全局文本。

行会NPC加载:
VAR Integer GUILD 行会运镖次数
LOADVAR行会文本。

各功能只改自己变量名,不占用P/D/M/N/S/I/G/A固定号;NPC传参仍可用S0/M0做临时展示,但长期落盘全走自定义名。这样几十个活动也能扩展,不受几个固定变量名限制。

十五、性能与维护

高频购买、击杀、穿装都SAVEVAR文本会增IO。个人消费可按NPC操作后立即存,击杀可按周期汇总存;全局火龙击杀每次BOSS死都存可接受,全服每杀小怪都存文本不建议。Blue用hardDisk自动写盘、force谨慎;GOM/GEE库内变量高频更合适;纯单机、低在线无所谓文本频率。

定期清理无效变量文本,合服、删号后排版用脚本导出活跃角色再保留。排行榜文本单独目录,每日重建,不和历史日志混写。M2更新后先在小服跑VAR/CALCVAR/LOADVAR/SAVEVAR/CHECKVAR全套,再复制到正式服,避免命令名差异导致整段不执行。