传奇996_24引擎Lua变量体系详解:系统变量与玩家变量完整手册

来源: 作者: 点击:
一、系统(全局)变量分区与持久化规则
996_24引擎全局变量总数1100个,分三组,作用域为全服所有玩家与NPC共享:
- A0–A499:字符型全局变量,500个,重启M2后保留,落盘 Mir200\GlobalVal.ini
• G0–G499:数字型全局变量,500个,重启M2后保留,落盘 Mir200\GlobalVal.ini

- I0–I99:数字型全局变量,100个,重启M2后清零,仅运行期有效

Lua读写函数:
获取:getsysvar("G0") / getsysvar("A0")
设置:setsysvar("G0", 996) / setsysvar("A0", "996引擎")
需落库到SQL而非GlobalVal.ini时用扩展接口:setsysvarex("G0", 996, 1)(第三参=是否存库)

示例:
function main(self)
say(self, "当前全服元宝汇率 A0="..getsysvar("A0").."\\")
end
function setrate(self)
setsysvar("A0", "1:100")
setsysvar("G0", 888888)
say(self, "全局变量已写入\\")
end

二、玩家(个人)内置变量分区
作用域仅当前角色,按生命周期拆分:

临时型(下线/切图/关对话即清):
• S0–S99:字符型,100个,下线不保存

• P0–P99:数字型,100个,仅当前NPC对话有效,CloseDialog归零

- D0–D99:数字型,100个,下线不保存(摇骰子类逻辑常用)
• N0–N99:数字型,100个,下线不保存

• M0–M99:数字型,100个,切换地图清空

持久型(存SQL角色库,最大21亿/8000字符):
- U0–U254:数字型,255个,下线保存
• T0–T254:字符型,255个,下线保存

• Z0–Z499:字符型,500个,存SQL角色库

• B0–B99:数字型,100个,最高19位大数,存SQL角色库

Lua读写函数:
获取:getplaydef(actor, "U1")
设置:setplaydef(actor, "U1", 100) / setplaydef(actor, "T1", "已领首日礼包")

TXT侧等价命令:MOV U1 1、INC U1 1、DEC U3 1、#IF EQUAL U1 5、#IF LARGE G0 100

三、Lua自定义变量(扩展键值)
超出内置字母区间的大数据/多字段结构用自定义变量:
初始化:iniplayvar(actor, "integer", "HUMAN", "N变量1")
赋值:setplayvar(actor, "HUMAN", "N变量1", 997, 1) —— 第五参1=落SQL
读取:getplayvar(actor, "HUMAN", "N变量1")

行会级:
guild = getmyguild(actor)
iniguildvar(guild, "integer", "N贡献值")
setguildvar(guild, "N贡献值", 5000, 1)
getguildvar(guild, "N贡献值")

临时自定义(不落库):
setplaydef(actor, "N$临时计数", 99)
setplaydef(actor, "S$临时文本", "测试")
getplaydef(actor, "N$临时计数")

四、TXT脚本调用Lua的挂载方式
Lua文件放 Mir200\Envir\Market_Def\,编码必须 GB2312/ANSI,否则中文乱码
NPC脚本里触发:
[@Main]
IF

ACT

CallLua script @message
向Lua传参:
MOV S$lua文件 script
MOV S$lua函数 message
MOV S$发送数据 1000
CallLua @,
Lua侧签名:
function message(player, ss)
for i=1,100 do ss = ss + 1 end
sendmsg(player, 1, '{"Msg":"'..ss..'","FColor":255,"BColor":0,"Type":1,"Time":3}')
end

新派加载方式:Envir\Market_Def 下建 LuaFunc-0.lua / LuaCond-0.lua,配合 LuaFuncList.txt / LuaCondList.txt 注册函数名,M2启动或重读NPC时装载

五、跨服与排行类变量接口
996内置跨服同步:
Synzvar 1 G15 996 —— 将跨服G15置为996
UPGRIDEVARCACHE A81 —— 强制刷缓存

排行排序:
local ranking = sorthumvar("U1", 0, 1, 0) —— 变量名,0全服/1在线/2行会,0升1降,0取全部
for i=1,#ranking,2 do
release_print("角色", ranking[i], "值", ranking[i+1])
end
取单名次:humvarrank(actor, "U1", 0, 1)
清个人自定义:clearhumcustvar(actor, "N$临时计数") 或 "*" 清全部
清全局自定义:clearglobalcustvar("A81")
清行会自定义:clearguildcustvar("行会名", "N贡献值")

六、类型计算差异(踩点)
数字型(G/I/P/D/N/M/U/J/B/Z部分):支持 MOV/INC/DEC/MUL/DIV 与公式运算
字符型(A/S/T/Z部分):不支持 INC T1 1 这类数值运算,INC T1 1 结果变 "11" 字符串拼接,做任务标记用 EQUAL/CHECKSTR 判断,别拿来做加减

七、调试与耗时约束
Lua只在复杂排序、跨表关联、封包解析等TXT不好写的逻辑里调用,禁放在杀怪触发、切地图触发等高频路径
M2日志在 engine/log 或 Mir200\Log,Lua内用 release_print / PrintLog 打点;单次CallLua耗时 >20000微秒必须拆逻辑或缓存结果
改完Lua热更:重读NPC(M2→控制→重读NPC脚本)或改 Market_Def 后重载,不必全服重启

八、常见错象
• 重启后A/G丢了 → GlobalVal.ini未写盘、用了I变量误当持久

• U/T改了查不到 → 没落SQL、角色库字段溢出(U超21亿、T超8000字)

• Lua里中文变乱码 → 文件存成UTF-8,必须转GB2312/ANSI

• CallLua无响应 → 函数名@message与Lua function message不符、Lua文件不在Market_Def、NPC未重读

• 自定义N/S下线还在 → 误用 setplayvar 第五参=1 落了库,临时数据应用 setplaydef 的 N/S 前缀

• 跨服变量不同步 → 没发 Synzvar、没开996内置跨服变量通道

变量体系串起来就是:A/G/I管全服、U/T/Z/B管角色落库、S/P/D/N/M管临时会话、Lua侧用 getsysvar/setsysvar/getplaydef/setplaydef 桥接,复杂结构走 iniplayvar/setplayvar,排行走 sorthumvar,跨服走 Synzvar;TXT负责触发,Lua负责计算,编码与重载两步漏掉任一就全盘不生效。