有不少玩家询问“优先级高级用法”、“如何适用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 的开发进行整合时,您将在块级别控制这些。

举报/反馈

游戏没有圈儿

6.2万获赞 1.3万粉丝
玩什么安利什么,全平台游戏不固定。
关注
0
0
收藏
分享