Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Rogue] T13 Updates for EPs and Vial of Shadows #1326

Merged
merged 6 commits into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
192 changes: 96 additions & 96 deletions sim/rogue/assassination/TestAssassination.results

Large diffs are not rendered by default.

192 changes: 96 additions & 96 deletions sim/rogue/combat/TestCombat.results

Large diffs are not rendered by default.

1,758 changes: 879 additions & 879 deletions sim/rogue/subtlety/TestSubtlety.results

Large diffs are not rendered by default.

30 changes: 18 additions & 12 deletions sim/rogue/subtlety/subtlety.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,27 @@ func (subRogue *SubtletyRogue) Initialize() {
subRogue.registerShadowstepCD()

// Apply Mastery
// From all I can find, Sub's Mastery is Additive. Will need to test.
masteryEffect := subRogue.GetMasteryBonusFromRating(subRogue.GetStat(stats.MasteryRating))

subRogue.Eviscerate.DamageMultiplierAdditive += masteryEffect
subRogue.Rupture.DamageMultiplierAdditive += masteryEffect
masteryMod := subRogue.AddDynamicMod(core.SpellModConfig{
Kind: core.SpellMod_DamageDone_Flat,
ClassMask: rogue.RogueSpellRupture | rogue.RogueSpellEviscerate,
})

subRogue.AddOnMasteryStatChanged(func(sim *core.Simulation, oldMastery, newMastery float64) {
masteryEffectOld := subRogue.GetMasteryBonusFromRating(oldMastery)
masteryEffectNew := subRogue.GetMasteryBonusFromRating(newMastery)

subRogue.Eviscerate.DamageMultiplierAdditive -= masteryEffectOld
subRogue.Eviscerate.DamageMultiplierAdditive += masteryEffectNew
subRogue.Rupture.DamageMultiplierAdditive -= masteryEffectOld
subRogue.Rupture.DamageMultiplierAdditive += masteryEffectNew
masteryMod.UpdateFloatValue(subRogue.GetMasteryBonus())
})

core.MakePermanent(subRogue.GetOrRegisterAura(core.Aura{
Label: "Executioner",
ActionID: core.ActionID{SpellID: 76808},
OnGain: func(aura *core.Aura, sim *core.Simulation) {
masteryMod.UpdateFloatValue(subRogue.GetMasteryBonus())
masteryMod.Activate()
},
OnExpire: func(aura *core.Aura, sim *core.Simulation) {
masteryMod.Deactivate()
},
}))

}

func NewSubtletyRogue(character *core.Character, options *proto.Player) *SubtletyRogue {
Expand Down
4 changes: 2 additions & 2 deletions ui/rogue/assassination/gear_sets/p4_assassination.gear.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
{"id":78388,"gems":[71879,71879,71879],"reforging":147},
{"id":78708,"enchant":4126,"gems":[71879,71879,71852],"reforging":147},
{"id":78462,"enchant":4076,"gems":[71879,71879],"reforging":161},
{"id":78489,"gems":[52212],"reforging":160},
{"id":78489,"gems":[71879],"reforging":160},
{"id":78413,"gems":[71879],"reforging":147},
{"id":77993},
{"id":77999},
{"id":77994},
{"id":77949,"enchant":4099,"gems":[71879],"reforging":147},
{"id":77950,"enchant":4099,"gems":[71879],"reforging":158},
Expand Down
22 changes: 22 additions & 0 deletions ui/rogue/assassination/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,28 @@ export const P1_EP_EXPERTISE_PRESET = PresetUtils.makePresetEpWeights(
),
);

export const P4_EP_LEGENDARY_PRESET = PresetUtils.makePresetEpWeights(
'Asn Legendary',
Stats.fromMap(
{
[Stat.StatAgility]: 2.71,
[Stat.StatStrength]: 1.05,
[Stat.StatAttackPower]: 1,
[Stat.StatCritRating]: 1.18,
[Stat.StatHitRating]: 2.62,
[Stat.StatHasteRating]: 1.39,
[Stat.StatMasteryRating]: 1.61,
[Stat.StatExpertiseRating]: 1.22,
},
{
[PseudoStat.PseudoStatMainHandDps]: 3.0,
[PseudoStat.PseudoStatOffHandDps]: 0.97,
[PseudoStat.PseudoStatSpellHitPercent]: 130.5,
[PseudoStat.PseudoStatPhysicalHitPercent]: 162.0,
},
),
);

// Default talents. Uses the wowhead calculator format, make the talents on
// https://wowhead.com/cata/talent-calc and copy the numbers in the url.

Expand Down
15 changes: 13 additions & 2 deletions ui/rogue/assassination/sim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecAssassinationRogue, {
},

presets: {
epWeights: [Presets.P1_EP_PRESET, Presets.P1_EP_EXPERTISE_PRESET],
epWeights: [Presets.P1_EP_PRESET, Presets.P1_EP_EXPERTISE_PRESET, Presets.P4_EP_LEGENDARY_PRESET],
// Preset talents that the user can quickly select.
talents: [Presets.AssassinationTalentsDefault],
// Preset rotations that the user can quickly select.
Expand Down Expand Up @@ -191,7 +191,18 @@ export class AssassinationRogueSimUI extends IndividualSimUI<Spec.SpecAssassinat
super(parentElem, player, SPEC_CONFIG);

player.sim.waitForInit().then(() => {
new ReforgeOptimizer(this);
new ReforgeOptimizer(this, {
getEPDefaults: (player: Player<Spec.SpecAssassinationRogue>) => {
const mhWepId = player.getEquippedItem(ItemSlot.ItemSlotMainHand)?.id;
const ohWepId = player.getEquippedItem(ItemSlot.ItemSlotOffHand)?.id;

if (mhWepId == 77949 && ohWepId == 77950) {
return Presets.P4_EP_LEGENDARY_PRESET.epWeights;
} else {
return Presets.P1_EP_PRESET.epWeights;
}
}
});
});

// Poison selection
Expand Down
2 changes: 1 addition & 1 deletion ui/rogue/combat/gear_sets/p4_combat.gear.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
{"id":78489,"gems":[71879],"reforging":160},
{"id":78413,"gems":[71879],"reforging":147},
{"id":77994},
{"id":77993},
{"id":77999},
{"id":77949,"enchant":4099,"gems":[71879],"reforging":147},
{"id":77950,"enchant":4099,"gems":[71879],"reforging":158},
{"id":78369,"reforging":153}
Expand Down
12 changes: 6 additions & 6 deletions ui/rogue/combat/presets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export const ROTATION_PRESET_COMBAT = PresetUtils.makePresetAPLRotation('Combat'

// Preset options for EP weights
export const CBAT_STANDARD_EP_PRESET = PresetUtils.makePresetEpWeights(
'Combat Low Gear',
'Combat Standard',
Stats.fromMap(
{
[Stat.StatAgility]: 2.85,
Expand Down Expand Up @@ -66,25 +66,25 @@ export const CBAT_4PT12_EP_PRESET = PresetUtils.makePresetEpWeights(
),
);

// By mostly-T12 gear or better, Haste+Mastery overtake capping Spell Hit, but Spell Hit retains enough value to not ignore (Trends towards 15%-ish)
// Legendary daggers push up Haste significantly. It effectively removes the need to balance Haste vs Mastery.
export const CBAT_T13_EP_PRESET = PresetUtils.makePresetEpWeights(
'Combat High Gear',
'Combat Legendary',
Stats.fromMap(
{
[Stat.StatAgility]: 2.85,
[Stat.StatStrength]: 1.05,
[Stat.StatAttackPower]: 1,
[Stat.StatCritRating]: 1.19,
[Stat.StatHitRating]: 2.5,
[Stat.StatHasteRating]: 1.86,
[Stat.StatMasteryRating]: 1.55,
[Stat.StatHasteRating]: 1.79,
[Stat.StatMasteryRating]: 1.48,
[Stat.StatExpertiseRating]: 2.1,
},
{
[PseudoStat.PseudoStatMainHandDps]: 4.31,
[PseudoStat.PseudoStatOffHandDps]: 1.32,
[PseudoStat.PseudoStatSpellHitPercent]: 52,
[PseudoStat.PseudoStatPhysicalHitPercent]: 230,
[PseudoStat.PseudoStatPhysicalHitPercent]: 249,
},
),
);
Expand Down
35 changes: 23 additions & 12 deletions ui/rogue/combat/sim.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,23 @@ const SPEC_CONFIG = registerSpecConfig(Spec.SpecCombatRogue, {
],
});

// Check if the player is wearing any combination of the legendary dagger stages in both MH and OH
const hasAnyLegendaryStage = (player: Player<Spec.SpecCombatRogue>): boolean => {
const mhWepId = player.getEquippedItem(ItemSlot.ItemSlotMainHand)?.id;
const ohWepId = player.getEquippedItem(ItemSlot.ItemSlotOffHand)?.id;

return (mhWepId == 77945 || mhWepId == 77947 || mhWepId == 77949) &&
(ohWepId == 77946 || ohWepId == 77948 || ohWepId == 77950);
}

// Check if the player is wearing the final legendary stage
const hasFinalLegendaryStage = (player: Player<Spec.SpecCombatRogue>): boolean => {
const mhWepId = player.getEquippedItem(ItemSlot.ItemSlotMainHand)?.id;
const ohWepId = player.getEquippedItem(ItemSlot.ItemSlotOffHand)?.id;

return mhWepId == 77949 && ohWepId == 77950;
}

const getActiveEPWeight = (player: Player<Spec.SpecCombatRogue>, sim: Sim): Stats => {
if (sim.getUseCustomEPValues()) {
return player.getEpWeights();
Expand All @@ -207,7 +224,7 @@ const getActiveEPWeight = (player: Player<Spec.SpecCombatRogue>, sim: Sim): Stat
return Presets.CBAT_NOKALED_EP_PRESET.epWeights;
} else if (playerGear.getItemSetCount("Vestments of the Dark Phoenix") >= 4) {
return Presets.CBAT_4PT12_EP_PRESET.epWeights;
} else if (playerGear.getItemSetCount("Blackfang Battleweave") || avgIlvl >= 400) { // T13, or high enough that Haste+Mastery overtake Spell Hit Cap
} else if (hasAnyLegendaryStage(player)) {
return Presets.CBAT_T13_EP_PRESET.epWeights;
} else {
return Presets.CBAT_STANDARD_EP_PRESET.epWeights;
Expand All @@ -223,12 +240,13 @@ export class CombatRogueSimUI extends IndividualSimUI<Spec.SpecCombatRogue> {
new ReforgeOptimizer(this, {
updateSoftCaps: (softCaps: StatCap[]) => {
const activeEPWeight = getActiveEPWeight(player, this.sim);
const mhWepId = player.getEquippedItem(ItemSlot.ItemSlotMainHand)?.id
const hasteEP = activeEPWeight.getStat(Stat.StatHasteRating);
const hasteSoftCap = softCaps.find(v => v.unitStat.equalsStat(Stat.StatHasteRating));
const hasAnyLego = hasAnyLegendaryStage(player)
const hasFinalLego = hasFinalLegendaryStage(player)
if (hasteSoftCap) {
// If wearing either Fear or Sleeper in MH, Haste EP is never overtaken by Mastery
if (mhWepId == 77945 || mhWepId == 77947)
if (hasAnyLego && !hasFinalLego)
hasteSoftCap.postCapEPs = [hasteEP, hasteEP, hasteEP, hasteEP, hasteEP]
else
hasteSoftCap.postCapEPs = [hasteEP - 0.1, hasteEP - 0.2, hasteEP - 0.3, hasteEP - 0.4, hasteEP - 0.5];
Expand All @@ -239,18 +257,11 @@ export class CombatRogueSimUI extends IndividualSimUI<Spec.SpecCombatRogue> {
const spellSoftCap = softCaps.find(v => v.unitStat.equalsPseudoStat(PseudoStat.PseudoStatSpellHitPercent));
if (meleeSoftCap) {
const initialEP = activeEPWeight.getPseudoStat(PseudoStat.PseudoStatPhysicalHitPercent);
// Any dagger MH inflates white hit EP - sufficient to force Spell Hit Cap
if (mhWepId == 77945 || mhWepId == 77947 || mhWepId == 77949) {
meleeSoftCap.postCapEPs = [initialEP/1.75, 0];
} else {
meleeSoftCap.postCapEPs = [initialEP/2, 0];
}

meleeSoftCap.postCapEPs = [initialEP/2, 0];
}
if (spellSoftCap) {
const initialEP = activeEPWeight.getPseudoStat(PseudoStat.PseudoStatSpellHitPercent);
player.getEpRatios
spellSoftCap.postCapEPs = [initialEP-5, initialEP/2, initialEP/4, initialEP/8, initialEP/16, initialEP/32, 0];
spellSoftCap.postCapEPs = [initialEP/1.25, initialEP/2, initialEP/4, initialEP/8, initialEP/16, initialEP/32, 0];
}

return softCaps
Expand Down
9 changes: 5 additions & 4 deletions ui/rogue/subtlety/apls/subtlety.apl.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@
],
"priorityList": [
{"action":{"autocastOtherCooldowns":{}}},
{"action":{"condition":{"or":{"vals":[{"auraIsActive":{"auraId":{"spellId":51713}}},{"cmp":{"op":"OpLe","lhs":{"currentTime":{}},"rhs":{"const":{"val":"1"}}}}]}},"autocastOtherCooldowns":{}}},
{"action":{"condition":{"and":{"vals":[{"not":{"val":{"auraIsActive":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":1943}}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10"}}}}]}},"castSpell":{"spellId":{"spellId":1943}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"6"}}}}]}},"castSpell":{"spellId":{"spellId":2098}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":73651}}},"rhs":{"const":{"val":"3"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10"}}}}]}},"castSpell":{"spellId":{"spellId":73651}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"4"}}}},{"cmp":{"op":"OpEq","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"8"}}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"30"}}}}]}}]}},"castSpell":{"spellId":{"spellId":5171}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"8"}}}}]}},"castSpell":{"spellId":{"spellId":2098}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"8"}}}},{"or":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":5171}}},"rhs":{"const":{"val":"3"}}}},{"cmp":{"op":"OpLe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"30"}}}}]}}]}},"castSpell":{"spellId":{"spellId":5171}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":73651}}},"rhs":{"const":{"val":"6"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10"}}}}]}},"castSpell":{"spellId":{"spellId":73651}}}},
{"action":{"condition":{"and":{"vals":[{"auraIsActive":{"auraId":{"spellId":109949}}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":51713}}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":8676}}}},
{"action":{"condition":{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},"castSpell":{"spellId":{"spellId":2098}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":89775}}},"rhs":{"const":{"val":"3"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1784}}}}},{"cmp":{"op":"OpGe","lhs":{"remainingTime":{}},"rhs":{"const":{"val":"10"}}}},{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"80"}}}},{"cmp":{"op":"OpGe","lhs":{"auraInternalCooldown":{"auraId":{"spellId":51701}}},"rhs":{"const":{"val":"1"}}}}]}}]}}]}}]}},"castSpell":{"spellId":{"spellId":16511}}}},
Expand All @@ -22,7 +23,7 @@
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023}}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"60"}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1784}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":58984}}}}},{"gcdIsReady":{}}]}},"castSpell":{"spellId":{"spellId":1856}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"sourceUnit":{"type":"CurrentTarget"},"auraId":{"spellId":91023}}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpLe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"60"}}}},{"not":{"val":{"spellIsReady":{"spellId":{"spellId":51713}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":1784}}}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713}}}}},{"gcdIsReady":{}}]}},"castSpell":{"spellId":{"spellId":58984}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"2"}}}},{"cmp":{"op":"OpGt","lhs":{"currentTime":{}},"rhs":{"const":{"val":"1"}}}}]}},"castSpell":{"spellId":{"spellId":14183}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"8"}}}},{"dotIsActive":{"spellId":{"spellId":1943}}}]}},"waitUntil":{"condition":{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"75"}}}}}}},
{"action":{"condition":{"and":{"vals":[{"cmp":{"op":"OpLe","lhs":{"dotRemainingTime":{"spellId":{"spellId":1943}}},"rhs":{"const":{"val":"8"}}}},{"dotIsActive":{"spellId":{"spellId":1943}}},{"not":{"val":{"auraIsActive":{"auraId":{"spellId":51713}}}}}]}},"waitUntil":{"condition":{"or":{"vals":[{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"75"}}}},{"cmp":{"op":"OpGe","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}}]}}}}},
{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"95"}}}}]}},{"cmp":{"op":"OpLe","lhs":{"auraRemainingTime":{"auraId":{"spellId":51713}}},"rhs":{"const":{"val":"1"}}}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"auraInternalCooldown":{"auraId":{"spellId":51701}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"60"}}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}}]}}]}},"castSpell":{"spellId":{"spellId":8676}}}},
{"action":{"condition":{"or":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"4"}}}},{"and":{"vals":[{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"95"}}}}]}},{"and":{"vals":[{"cmp":{"op":"OpGe","lhs":{"auraInternalCooldown":{"auraId":{"spellId":51701}}},"rhs":{"const":{"val":"1"}}}},{"cmp":{"op":"OpGe","lhs":{"currentEnergy":{}},"rhs":{"const":{"val":"60"}}}},{"cmp":{"op":"OpLt","lhs":{"currentComboPoints":{}},"rhs":{"const":{"val":"5"}}}}]}}]}},"castSpell":{"spellId":{"spellId":53}}}},
{"action":{"castSpell":{"spellId":{"spellId":57934}}}},
Expand Down
Loading
Loading