SuperAPI AI 工具集

wow-api-lua-environment

编程与开发

查看项目

更新于 10-16 09:07

技能介绍

用途

该技能是《魔兽世界》(Retail)Lua 运行时环境的参考文档,用于帮助开发者理解插件在 WoW 沙箱中的可用能力与安全限制。资料基于 Patch 12.0.0(Build 65655,2026 年 1 月 28 日),范围仅限 Retail。当需要判断哪些 Lua 函数可用或被屏蔽、排查 taint 问题、编写与安全/受保护帧交互的代码、使用计时器、安全地 hook 函数、理解战斗锁定限制、处理插件限制状态(12.0.0 副本限制)、记录调试日志,或处理 secret 值与 FrameScript 沙箱时,可使用该技能。

WoW Lua 5.1 沙箱

WoW 运行的是经过大幅修改的 Lua 5.1.4。被屏蔽或移除的标准函数包括:loadfile()、dofile()(无文件系统访问);io.(无文件系统);os.execute()(无 shell)、os.exit()(不能关闭客户端)、os.remove()、os.rename()、os.tmpname()(无文件系统)、os.getenv()(无环境访问);package.、require() 与 module()(无包/模块系统);newproxy()(已移除);getfenv()(受限,返回只读);setfenv()(严格受限);collectgarbage()(仅有限模式)。

可正常使用的标准函数包括所有 string.、table.、math.* 函数,type()、tostring()、tonumber()、rawget()、rawset()、rawequal()、rawlen(),pairs()、ipairs()、next()、select()、unpack(),pcall()、xpcall()、error()、assert(),setmetatable()、getmetatable(),coroutine.*(完整协程支持),os.time()、os.date()、os.clock()、os.difftime(),以及 print()(输出到默认聊天框)。

WoW 新增的全局函数包括 strsplit、strsplittable、strjoin、strtrim、tContains、tInsert、tDeleteItem、tInvert、wipe、CopyTable、MergeTable、Mixin、CreateFromMixins、CreateAndInitFromMixin、format、tostringall、DevTools_Dump。

Taint 系统

所有插件代码以“污染”(insecure)状态运行,暴雪 UI 代码为“安全”(secure)状态。taint 系统阻止插件调用受保护函数或修改安全帧。插件代码设置的任何变量都会被污染;污染值会传播,若污染数据流入暴雪代码,会污染该执行路径;受保护函数在执行前检查污染,若路径被污染则失败;安全帧从其创建上下文继承安全级别。可用 issecurevariable("SomeGlobalVar") 返回 (isTainted, source) 检查全局变量,也可检查表字段。资料给出了典型陷阱示例,例如直接赋值 Settings.RegisterAddOnCategory 会污染设置表,而使用 hooksecurefunc 观察则不会产生污染。

安全执行与受保护函数

标记为 #protected 的函数只能从安全(暴雪)代码、由硬件事件触发的安全点击处理器,或 SecureActionButtonTemplate 处理器内部调用。受保护函数包括所有战斗相关施法(CastSpellByName、CastSpellByID、UseAction)、物品使用(UseItemByName、战斗中 UseContainerItem)、目标切换(TargetUnit、AssistUnit、FocusUnit)、移动(MoveForwardStart、JumpOrAscendStart)、以及战斗中安全帧的 SetAttribute()。

战斗锁定(Combat Lockdown)

可用 InCombatLockdown() 判断。战斗中不能创建/销毁安全帧、修改安全属性、设置安全帧位置、更改安全帧的父级/可见性;可以读取属性、修改非安全帧、把改动排队到战斗后。资料给出了注册 PLAYER_REGEN_ENABLED 事件在战斗结束后执行安全帧改动的模式。

安全处理器与模板

SecureActionButtonTemplate 允许通过用户硬件点击执行受保护动作,例如设置 type 为 spell、spell 为 Fireball。SecureHandlerBaseTemplate 可运行安全片段,配合 RegisterStateDriver / UnregisterStateDriver 实现按状态自动更新安全属性,如 RegisterStateDriver(frame, "visibility", "[combat] hide; show")。

C_Timer 计时器

包括 C_Timer.After(seconds, callback)(一次性)、C_Timer.NewTimer(seconds, callback)(可取消的一次性计时器)、C_Timer.NewTicker(seconds, callback [, iterations])(重复计时器)。计时器对象可用 :Cancel() 取消。

钩子

hooksecurefunc 是主要的安全 hook 机制:hook 在原函数之后运行,不污染原函数;无法阻止原函数执行,也无法修改返回值。另有 securecallfunction(func, ...) 与 securecallmethod(object, "MethodName", ...) 用于在安全上下文中调用。

C_RestrictedActions(12.0.0 新增)

跟踪插件限制何时生效(如副本内)。函数包括 C_RestrictedActions.GetAddOnRestrictionState(type)、C_RestrictedActions.IsAddOnRestrictionActive(type)、C_RestrictedActions.CheckAllowProtectedFunctions(object [, silent]),以及 InCombatLockdown()。相关事件包括 ADDON_RESTRICTION_STATE_CHANGED、PLAYER_REGEN_DISABLED、PLAYER_REGEN_ENABLED。

C_Log 日志

包含 C_Log.LogMessage(message)、C_Log.LogWarningMessage(message)、C_Log.LogErrorMessage(message)、C_Log.LogMessageWithPriority(priority, message)。注意 ConsolePrint() 在 12.0.0 中已移除,改用 C_Log.LogMessage()。

FrameScript 函数

提供与安全/secret 值系统交互的函数:issecurevariable、issecretvalue、issecrettable、canaccessvalue、hasanysecretvalues、scrubsecretvalues、secretwrap、mapvalues、securecallfunction、securecallmethod、forceinsecure、seterrorhandler、geterrorhandler。

调试工具

包括 seterrorhandler、pcall、xpcall 错误处理,debugstack(获取调用栈)、debuglocals、debugprofilestart / debugprofilestop(性能计时,单位为微秒)。可用斜杠命令 /dump、/run、/script、/console 辅助调试。

常见模式

资料提供多个模式:通过 PLAYER_LOGIN 事件进行延迟初始化、OnUpdate 节流、战斗后行动队列(将战斗中无法执行的动作入队,PLAYER_REGEN_ENABLED 时执行)、以及 12.0.0 的 secret 值优雅处理(secret 值可直接传给 UI 组件,但不能比较或运算,需先用 issecretvalue 判断)。

注意事项与限制

没有 require(),WoW 无模块系统,需用 TOC 文件控制加载顺序,库需直接内嵌。setfenv() / getfenv() 严格受限,不要依赖环境操作。collectgarbage() 仅 "count" 模式可用,无法强制 GC。taint 具有粘性,即便设回原值污染依然存在。print() 输出到默认聊天框而非 stdout。WoW 额外增加了 strsplit、strjoin、strtrim、strmatch 等全局函数。没有 os.exit(),无法以编程方式终止客户端。协程可用且常用于异步模式。secret 值(12.0.0)为不透明值,不能检查、比较或用于算术。副本限制(12.0.0)中 SendAddonMessage() 在副本内被屏蔽,插件设计需考虑在副本内容中无玩家间通信也能工作。