
《12.0 正式服 至暗之夜 A 测 插件 API 改动》
![]()
以下是PIT的视频介绍:
小编简单总结:
暴雪确认禁用大部分插件API,将加密插件通讯,全面转向自带。
插件开发者社区震荡,有人停更有人观望,部分甚至尝试破解。虽暴雪开放 A 测供开发者测试反馈,但仍被视作开发者的 “至暗之夜”。
以下内容为暴雪官方发给插件作者关于正式服 12.0 战斗相关插件的 API 调整说明全文:
首先,让我们把几个重要问题先说清楚:
- 我们在过去几个月所讨论的插件 API 改动将会实装在至暗之夜版本,并会从公共
Alpha 的第一天就生效。
- 我们将向插件开发者开放 Alpha 测试资格,以便他们为这些 API 改动提供反馈。受邀
名单主要来自由 WoWUIDev 版主维护的插件开发者名单。如果你不确定自己是否在名单上,
或者希望被考虑加入,请联系服务器版主。
- 与以往资料片不同,在至暗之夜的 Alpha 和 Beta 阶段都会保持插件功能开启。
- 我们预计在 Alpha 和 Beta 阶段会对这些系统进行大量迭代,并会尽力在每次改动发
布时第一时间同步给大家。
免责声明
下面你即将阅读的所有内容都可能会变更。虽然我们有信心这里描述的核心系统与最终版
本差别不大,但细节部分可能会根据需要进行调整。
总体重点与目标
这些 API 改动的总体目标是 限制插件基于战斗信息执行复杂逻辑,避免插件能够最佳化
地解决那些本应由玩家思考和协作完成的问题。
但另一个次要目标(几乎同样重要)是 允许插件依然能够自定义 UI 的外观与体验(包
括与战斗相关的 UI)。
因此,尽管大多数与战斗相关的 API 都会受到影响,我们并没有彻底禁用 API,也没有
将更多的 UI 移入安全环境(secure environment)使插件完全无法访问。相反,我们引
入了一项新技术,称为 Secret Values(秘密值)。
新的 WoW Lua 构造:Secret Values(秘密值)
可以把秘密值(Secrets)理解为一个“黑盒子”,它里面包含了一个 Lua 值(数字、字
符串、布尔值等任何类型)。
- 不安全(tainted)的 Lua 代码可以从 API 接收秘密值,并将其传递给某些 API,但
不能直接看到黑盒子内部的值。
- 尝试将一个秘密值与另一个值(无论是否是秘密值)进行比较会导致 Lua 报错,尝试
对其进行算术运算也会报错。
- 未污染(untainted)的 Lua 代码没有这些限制,可以像处理普通值一样操作秘密值。
- 返回秘密值的 API 会在 Lua API 文档中明确标注,你也可以通过调用 issecretvalue API 来检测一个值是否是秘密值。
将秘密值传入脚本对象 API
如前所述,不安全代码可以将秘密值传入某些 API,包括脚本对象 API。
但这样做会导致对象被标记为 Secret。
对象被标记为 Secret 意味着:
- 该对象的一些 API 将开始返回秘密值。
- 另一些 API 将对不安全代码不可访问。
例子:
如果某个 API 返回了一个 spell icon 的 fileID(作为秘密值),插件可以将该秘密
fileID 传入 SetTexture API 设置纹理。但这样一来,调用 GetTexture 时就会返回秘
密值而不是明文 fileID。
你可以通过调用 HasSecretValues API 来检测一个对象是否被标记为 Secret。
Secret Aspects(秘密属性)
我们说过,对象被标记为 Secret 后会让“部分 API”返回秘密值,而不是“所有 API”。
原因之一是 Secret Aspects(秘密属性) 的存在。
可以把秘密属性理解为对象上一组相关 API 的集合。
当你向任何带有某个秘密属性的 API 传入秘密值时,对象就会被标记为该秘密属性,从
而导致该属性下的所有 API 都返回秘密值。
例子:
对象的显示状态相关 API:SetShown、IsShown、IsVisible。
它们都被标记为 Shown Secret Aspect。
如果你用秘密值调用了 SetShown,那么 IsShown 和 IsVisible 的返回值也都会变成秘
密值。
需要注意:
- 不同的秘密属性之间互不影响。
- 对象可以同时带有多个秘密属性。
- 被标记某个秘密属性并不会让对象整体被标记为 Secret,反之亦然。
- 你可以通过调用 HasSecretAspect API 来检测对象是否带有某个秘密属性。
Secret Anchors(秘密锚点)
当一个脚本对象被标记为 Secret 时,它也会被标记为拥有 Secret Anchors(秘密锚点)。
这意味着:
- 该对象的锚点与位置相关 API 将对不安全代码不可访问。
- 与其他 Secret 不同,秘密锚点的状态会沿着锚链向下传播。
例子:
如果框体 B 锚定在框体 A 上,而 A 被标记为拥有秘密锚点,那么 B 也会继承秘密锚点。
这种状态会一直沿着锚链往下传递,但不会反向向上传递(即如果 A 有秘密锚点并锚定
在 Z 上,Z 不会因此继承秘密锚点)。
你可以通过调用 IsAnchoringSecret API 来检测对象是否拥有秘密锚点。
移除对象的秘密状态
可以通过调用 SetToDefaults API 来清除对象上的 Secret 状态和秘密属性。
这样对象会恢复为默认状态,就像刚刚被创建时一样。
条件性秘密值
有些 API 只在特定条件下才会返回秘密值。
这些 API 会带有 Secret Predicate 标签,用来说明在什么条件下它们会返回秘密值
(例如:SecretWhenInCombat)。
这些条件也可能会应用在事件的 payload 上。
Lua API 文档
我们在 Lua API 文档文件中加入了与秘密相关的信息:
- 所有可能返回秘密值的 API 都会明确标注。
- 禁止接收秘密值的 API 也会标注。
- 属于某个秘密属性的 API 会标注该属性。
- 带有条件性秘密值的 API 也会标注对应的 predicate。
总体来说,我们尽可能公开了 API 与秘密值交互的全部信息,并会在微调时继续补充文
档。
战斗日志、聊天与插件通信的改动
秘密值并不是至暗之夜中唯一的改动:
- 战斗日志事件不再对插件开放。
- 战斗日志聊天频道的消息会转换为 KString,以防插件解析其中的信息。
- 在副本中: - 聊天消息传递到 Lua 时会作为秘密值。
- 插件禁止向其他玩家发送任何通讯(无论是插件通讯还是普通聊天)。
我们需要你的反馈!
正如本文开头提到的,我们将向插件开发者开放 Alpha 和 Beta,并且插件功能会全程保
持启用。
这能让你们有尽可能多的时间测试这些改动、调整插件,并向我们反馈问题和意见。
我们理解这些改动会对 WoW 插件的开发方式产生巨大影响,也理解失去某些功能可能会
让部分开发者感到沮丧。
但我们鼓励大家保持开放的心态,积极在 Alpha 中进行测试。我们相信大多数插件(包
括战斗相关的插件)依然能够提供有用的功能,只是实现方式可能会不同。
请把反馈和 bug 提交到 -restrictions-feedback 频道,我们会定期关注。
最后补充一点:
在 Alpha 初期,我们对“不安全代码可以向哪些 API 传递秘密值”的限制采取了非常严
格的态度。
这是有意为之,但并不代表是最终决定。
秘密值系统为我们提供了极大的灵活性,可以根据需要调整每个 API 能否接收秘密值。
我们会在 Alpha 和 Beta 全程评估每一个 API,并根据插件开发者的反馈逐步调整。
感谢大家,我们 Alpha 见!
![]()
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.