Skip to content

Commit

Permalink
Merge pull request #1326 from TheBackstabi/master
Browse files Browse the repository at this point in the history
[Rogue] T13 Updates for EPs and Vial of Shadows
  • Loading branch information
TheBackstabi authored Jan 29, 2025
2 parents fc70a5e + d222161 commit bf50fb4
Show file tree
Hide file tree
Showing 15 changed files with 1,202 additions and 1,113 deletions.
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

0 comments on commit bf50fb4

Please sign in to comment.