有不少玩家询问“优先级高级用法”、“如何适用if块”、“原版插件教程”之类的,这里抽时间整理魔兽GSE插件作者的解释,并翻译了下(部分技能翻译)供大家参考。
GSE3.0优先级
优先级基本上从序列的顶部开始,然后循环到宏的底部,直到它到达最后一行。在 7 行宏的情况下,第一行的尝试次数是最后一行的 7 倍,其中第 2 行是 6 倍,第 6 行是 2 倍。执行如下:
1 12 123 1234 12345 123456 1234567 我从这个序列开始,并分解它的行为方式
1.Action 1 '/cast [nochanneling] 轮回之触',
2.Action 2 '/cast [nochanneling] 旭日东升踢',
3.Action 3 '/cast [nochanneling] 怒雷破',
4.Action 4 '/cast [nochanneling] 升龙霸',
5.Action 5 '/castsequence [nochanneling] 猛虎掌, 幻灭踢',
6.Action 6 '/cast [nochanneling] 真气爆裂',
7.Action 7 '/castsequence [nochanneling] 幻灭踢, 猛虎掌',
假设你在初始区域施放了一个法术并且它保持冷却。这些弹出冷却中的任何一个都会重置。
执行1:
死亡之触(重置)
执行2:
死亡之触
旭日东升踢(重置)
执行3:
死亡之触 旭日东升踢
怒雷破 (重置)
执行4:
死亡之触
旭日东升踢
怒雷破 升龙霸 (重置)
执行5:
死亡之触 旭日东升踢 怒雷破 升龙霸 尝试 猛虎掌。如果这可行,则将此线设置为下次幻灭踢,否则将其保留为 TP(重置)
执行6 –(TP在5):
死亡之触 旭日东升踢 怒雷破 升龙霸 尝试 幻灭踢。如果这可行,则将此行设置为 TP 以备下次使用。真气爆裂(重置)
执行7 – (TP 5,BK 6):
死亡之触 旭日东升踢 怒雷破 升龙霸 尝试 重置。如果这行得通,则将此行设置为 BK 以备下次使用。真气爆裂 尝试 幻灭踢。如果这可行,则将此行设置为 TP 以备下次使用。(重置)
反向优先级
与 Priority 的工作方式相同,但使用以下顺序:
1 21 321 4321 54321 654321
GSE3.0块介绍
在以前版本的 GSE 中,每一行都是一个谨慎的操作,有人指出,有时您想要执行一个多行的操作。你有时也不想每次都做一些重复的任务。GSE3 已从单行转变为“块”的概念。
简而言之,块是在特定点击时执行的一系列命令。 每个块都有一个类型来定义它是什么类型的块。
目前有 5 种类型的块。
行动 - GSE 在此特定点击时执行的一系列正常宏命令
重复 - 动作块的变体,每n次在此主块内重复
暂停 - 在继续之前等待多次点击或几秒钟的指令
循环 - 在继续执行宏的其余部分之前要循环的一系列块
If - 块之间的选择
行动
Action 只是一个 Lua 表,由描述要做什么的字符串组成。这些指令形成了一个自上而下的“堆栈”。
{
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 53600',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
}
注意:在 GSE3 中没有 KeyPress 或 KeyRelease。这些已转换为 GSE 宏变量。您必须将它们包含在您希望它们出现的每个块中。
重复
重复块是在宏或当前循环块内重复的动作块。
{
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 53600',
[3] = '~~KeyRelease~~',
['Type'] = 'Repeat',
['Interval'] = 3
}
在这个例子中,如果宏有 6 行并且这是第一行,这个块将被自动插入到第 4 行,然后在第 7 行再次插入。
暂停
暂停块替换 GSE2 中的 `/click pause n'。它可以暂停多次点击或毫秒
暂停 3 秒:
{
['Type'] = 'Pause',
['MS'] = 3000
}
暂停 3 次单击
{
['Type'] = 'Pause',
['Clicks'] = 3
}
暂停 GCD
{
['Type'] = 'Pause',
['MS'] = "GCD"
}
环形
Loop Blocks 取代了 GSE2 中的 PreMacro、PostMacro 和 Internal Loop 函数。它们允许宏将执行类型从 Sequential 更改为 Priority,并包含一系列用于循环的 Action Block。
[1] = {
[1] = {
[1] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 24275',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[2] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 20271',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[3] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod,combat] 26573',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[4] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 35395',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[5] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod,combat] 31935',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[6] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 35395',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[7] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod,combat] 31884',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[8] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod,@player,combat] 316958',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[9] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 20271',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[10] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod,combat] 26573',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[11] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 35395',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
[12] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod,combat] 31935',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
}
},
['Type'] = 'Loop',
['Repeat'] = '3',
['StepFunction'] = 'Sequential'
},
[2] = {
[1] = '~~KeyPress~~',
[2] = '/cast [nomod] 31935',
[3] = '~~KeyRelease~~',
['Type'] = 'Action'
},
在本例中,末尾的“2”块是循环结束后要执行的块。这将 7 个动作重复 3 次。
注意:循环中可以有循环。每个 Block 都有一个 StepFunction。默认为顺序。
如果(if)
If 块是更复杂的块类型之一。与循环类似,它们包含其他块。If 块首先需要一个布尔变量。这意味着一个将字面意思return true或return false来自函数的变量。
function()
if UnitRace("player") == "Orc" then
return true
else
return false
end
end
Block 本身如下所示。第一组动作是 True 情况,而第二组动作是 False 情况。
{
[1] = { -- True Actions
[1] = {
[1] = "/say Variable returned True",
["Type"] = "Action"
}
},
[2] = { -- False Actions
[1] = {
[1] = "/say Variable returned False",
["Type"] = "Action"
}
},
["Variable"] = "MyBooleanVariable",
["Type"] = "If"
}
如果方块也有不能在战斗中更新的限制。当您为 PVP 等进行分区或输入地牢或标志时,您的宏模板将重新编译和更新。如果块只被评估然后。他们无法更新诸如“我的目标是什么?”之类的内容。然而,他们可以检查“我是否在特定区域?” “我有什么特别的天赋吗?” “我是一个特殊的人吗?”
GSE2.0用户角度理解GSE3.0
GSE2 已经使用了很多年,随着时间的推移,人们已经开始了解它。一大优势是GSE在幕后做了很多不明显的黑魔法。有许多一刀切的决定,最适合人们玩的方式。随着经典的发布和对多重拳击的改变,以及人们希望能够使用宏来更接近他们的模拟 DPS,目前的设计无法实现。我想通过一个相当复杂的宏来突出 GSE3 的工作原理。
在性能方面,我们正处于 GSE 可以处理的边缘,因为每个动作都是在战斗中编译的,这增加了人们正在经历的战斗滞后。这种滞后是不可持续的。在 GSE 2.6 中,我们引入了宏变量,并且能够将部分处理任务转移到非战斗时间。GSE3 将所有计算内容卸载到战斗时间之外,以便您的宏性能使用更少的资源并且更灵敏、更准确。
GSE2 中的 SAM_PROTGOD
此宏是一个示例 maco,已成为 GSE 的一部分。它是我个人日常使用的一个。
图片
它具有 A Premacro 和 PostMacro,其中 Sequence 内部循环 3 次。它还指定了 KeyPress、A KeyRelease 和一些默认使用选项。
这发生了什么
在执行级别上,宏将从 PreMacro 的第一行开始,并带有 Avenger's Shield 的演员表。现在,虽然这看起来是这样,但这并不是正在发生的事情。添加到此行的是 KeyPress、KeyRelease、宏底部的 Use 选项,以及一些用于抑制选项错误的内置内容。在我的情况下,这是一个看起来像这样的命令:
/run sfx=GetCVar("Sound_EnableSFX")
/run ers=GetCVar("Sound_EnableErrorSpeech");
/console Sound_EnableSFX 0
/console Sound_EnableErrorSpeech 0
/targetenemy [noharm][dead]
/cast [mod:lctrl] Hammer of Justice
/cast [mod:alt] Ardent Defender
/cast [nomod] Avenger's Shield
/use [@focus] 14
/use [combat,@player,nochanneling] 13
/run SetCVar("Sound_EnableSFX",sfx);
/run SetCVar("Sound_EnableErrorSpeech",ers);
那只是第一次点击。所有这些都是在战斗中编译的,然后发送到 WoW 执行。它将从该堆栈的顶部开始并向下工作。它会尝试执行它可以执行的第一个 GCD 能力,然后将忽略之后的所有其他 GCD 能力,但它会移动到堆栈处理非 GCD 能力的末尾。
下一步单击它将尝试下一行:
/run sfx=GetCVar("Sound_EnableSFX")
/run ers=GetCVar("Sound_EnableErrorSpeech");
/console Sound_EnableSFX 0
/console Sound_EnableErrorSpeech 0
/targetenemy [noharm][dead]
/cast [mod:lctrl] Hammer of Justice
/cast [mod:alt] Ardent Defender
/cast [nomod] Shield of the Righteous
/use [@focus] 14
/use [combat,@player,nochanneling] 13
/run SetCVar("Sound_EnableSFX",sfx);
/run SetCVar("Sound_EnableErrorSpeech",ers);
然后它将到达序列的第一行并对其执行相同的操作。然后它将使用优先级步进函数逐行处理序列框,完成该循环 3 次,然后移动到 PostMacro,然后返回到 PreMacro。每次单击它都会重新编译该操作堆栈。
但是,如果您不想执行整个堆栈怎么办?该命令堆栈长 402 个字符。每行几乎有 300 个字符,并且对于很长的转换序列,您的宏会中断,因为它可能会变得太长以至于它在该堆栈的中间截断。如果它因为太长而在正义之盾线的中间被切断,那么你的宏就会开始出错。
PreMacro、PostMacro 和 Inner Loop 也让人们感到困惑,他们对它的含义和作用做出了自己的猜测。我有人告诉我(模组作者和定义这些在 GSE 中如何工作的人)PostMacro 和 PreMacro 的工作方式与我对它们的编程方式不同,因为有人告诉他们它是如何工作的,这是基于他们的猜测。如果你想让几个循环工作或者想把一个循环放在一个循环中怎么办?你不能。
GSE3 更改
GSE3 没有 PreMacro、PostMacro、KeyPress 和 KeyRelease。相反,它会重新编写宏的整个方式。当您在 GSE3 中打开相同的宏时。你会注意到它非常不同。
这些盒子消失了,取而代之的是一个叫做块的东西。它有许多用于创建不同块的图标,然后是一些实用功能。这张图片显示了宏的 PreMacro 中的前两行。这是建立联系的重要因素。如果此宏没有 PreMacro,则此处显示的将是覆盖 GSE2 中序列框前几行的块。
此“操作”允许您准确指定单击此按钮时发生的情况。您不仅可以完全控制这条线,还可以完全控制构成这条线的堆栈。KeyPress 和 KeyRelease 已转换为 GSE 变量并插入到它们在操作堆栈中的特定位置。这个堆栈的输出仍然与上面显示的第一行相同,但是我可以通过从堆栈中删除该行来跳过整个 KeyPress 这个堆栈。如果我不想要一个,我什至不能在我的宏中使用 KeyPress 或 KeyRelease。
如果我们向下滚动一点,我们会看到 GSE2 中序列区域中的命令。这是一种不同类型的块,称为循环。它遵循优先级阶梯函数并重复 3 次。它本身有许多块,这些块缩进以表明它们是循环块的一部分。如果我们在其中添加另一个循环,它将再次缩进。
要在某个级别对块重新排序,您只需向上或向下单击它们。要在这个级别的末尾添加一个块,有一些图标可以做到这一点。X 从宏中删除该块。请注意,如果您删除一个循环,您将删除整个循环和其中的块。
随着我们继续滚动,我们到达变量部分。这些操作与 GSE2 一样,但它们附加到此版本的宏。
最后,我们有使用和重置快捷方式。目前,这些仍然适用于每个操作,但计划是当我们通过 GSE3 的开发进行整合时,您将在块级别控制这些。