当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇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"9961)(第三参=是否存库)

示例:
functionmain(self)
say(self"当前全服元宝汇率A0="..getsysvar("A0").."\\")
end
functionsetrate(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侧等价命令:MOVU11、INCU11、DECU31、#IFEQUALU15、#IFLARGEG0100

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

行会级:
guild=getmyguild(actor)
iniguildvar(guild"integer""N贡献值")
setguildvar(guild"N贡献值"50001)
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

CallLuascript@message
向Lua传参:
MOVS$lua文件script
MOVS$lua函数message
MOVS$发送数据1000
CallLua@
Lua侧签名:
functionmessage(playerss)
fori=1100doss=ss+1end
sendmsg(player1'{"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内置跨服同步:
Synzvar1G15996——将跨服G15置为996
UPGRIDEVARCACHEA81——强制刷缓存

排行排序:
localranking=sorthumvar("U1"010)——变量名0全服/1在线/2行会0升1降0取全部
fori=1#ranking2do
release_print("角色"ranking[i]"值"ranking[i+1])
end
取单名次:humvarrank(actor"U1"01)
清个人自定义: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部分):不支持INCT11这类数值运算,INCT11结果变"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与Luafunctionmessage不符、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负责计算,编码与重载两步漏掉任一就全盘不生效。
[顶部]