#230 Lua 脚本空转(FakeQueue)没有上限
状态: 待审核 · 分类: 界面与插件 · 插件与API
有玩家通过宏让客户端空转循环来精确衔接引导法术,如精神鞭笞,这种做法没有上限且引发了公平性讨论。
当前表现
你好,魔兽世界无限服 团队,我想先简单介绍一下背景: 引导法术目前在 Forever 中无法被排队,其中包括暗影牧师的标志性法术“精神鞭笞”。人们普遍认为,在不浪费最后一跳伤害的前提下完美衔接精神鞭笞是一种技巧的体现。这同样适用于吸取灵魂/吸取生命,也将适用于折磨。然而,凡是有技巧发挥空间的地方,玩家都会借助插件和 WeakAura 来尽可能弥补这一差距。 在 WotLK 经典版的某个时期,出现了一个 WeakAura,声称可以解决这个问题。它通过计算下一跳的时间,并通过宏迫使客户端在 LUA 的 while 循环中空转来完美延迟输入,从而模拟出正确的排队行为。这个方法后来在 WotLK 经典版中被“修补”为一个针对 LUA 脚本空转的任意看门狗计时器。魔兽世界无限服 并不基于经典版客户端,所以没有这个补丁,因为后续资料片中的便利性改进消除了这个问题,使该方案变得过时。 尽管插件 API 发生了巨大变化,魔兽世界无限服 仍然提供了这些 FakeQueue 插件/光环运行所需的全部工具(主要是 UnitChannelInfo("player"))。 我附上了一段视频,展示我使用这些 WeakAura 的移植版本把客户端卡住接近 1 秒(整整一跳)。 while GetTimePreciseSec() * 1000 - start < waitFor do fakeQueue() end local function fakeQueue() -- do *nothing* end
预期表现
这在一定程度上带有主观色彩,取决于设计理念。 技巧表现立场:移除 API 中提供精确引导计时信息的工具,这可能会连带禁用一些自定义施法条功能。 (在我看来,一个干净的做法是限制在战斗中使用 GetTimePreciseSec(),也许可以把它变成保密值?) 便利性立场:为引导法术加入正确的排队机制,消除迫使人们采取这些手段的问题。这可能不符合重视“原版风格”机制和原有技巧表现的玩家的口味。 折中方案:像在 WotLK 经典版中那样,在客户端中加入看门狗空转计时器补丁,并容忍对技巧表现的轻微削弱。
复现步骤
1. 制作一个 weakaura/foreveraura/插件,用来测量任意时长,使客户端卡住这么长时间。这个值在战斗中可以是动态的,并在一个全局注册的 lua 函数(称之为 FQ)中使用如下代码模式
local function fakeQueue()
-- do *nothing*
end
local function FQChannel()
local start = GetTimePreciseSec() * 1000
local waitFor = 1000
while GetTimePreciseSec() * 1000 - start < waitFor do
fakeQueue()
end
end
setglobal("FQ", FQChannel)
2.制作一个宏来施加延迟:
`
/run FQ()
/use 精神鞭笞
`
3. 使用它,游戏会空转/卡住一段时间,表现为一个延长的定格画面,然后解除卡顿并施放法术。