传奇老脚本只用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全套,再复制到正式服,避免命令名差异导致整段不执行。
传奇自定义变量突破固定PDAIMSNG限制HUMANGUILDGLOBAL存盘与跨NPC脚本教程
来源:
作者:
点击:

