diff --git a/sim/common/mop/stat_bonus_procs_auto_gen.go b/sim/common/mop/stat_bonus_procs_auto_gen.go index 3b7bc2882a..c055f7cce1 100644 --- a/sim/common/mop/stat_bonus_procs_auto_gen.go +++ b/sim/common/mop/stat_bonus_procs_auto_gen.go @@ -1,14 +1,14 @@ package mop import ( + "github.com/wowsims/mop/sim/common/shared" "github.com/wowsims/mop/sim/core" - "github.com/wowsims/mop/sim/common/shared" ) func RegisterAllProcs() { // Procs - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -27,7 +27,7 @@ func RegisterAllProcs() { // {ItemID: 105173, ItemName: "Purified Bindings of Immerseus (Warforged)"}, // {ItemID: 105422, ItemName: "Purified Bindings of Immerseus (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -47,7 +47,7 @@ func RegisterAllProcs() { // {ItemID: 105300, ItemName: "Nazgrim's Burnished Insignia (Warforged)"}, // {ItemID: 105549, ItemName: "Nazgrim's Burnished Insignia (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -66,7 +66,7 @@ func RegisterAllProcs() { // {ItemID: 105210, ItemName: "Fusion-Fire Core (Warforged)"}, // {ItemID: 105459, ItemName: "Fusion-Fire Core (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -85,7 +85,7 @@ func RegisterAllProcs() { // {ItemID: 105225, ItemName: "Prismatic Prison of Pride (Warforged)"}, // {ItemID: 105474, ItemName: "Prismatic Prison of Pride (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -105,7 +105,7 @@ func RegisterAllProcs() { // {ItemID: 105291, ItemName: "Kardris' Toxic Totem (Warforged)"}, // {ItemID: 105540, ItemName: "Kardris' Toxic Totem (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -125,7 +125,7 @@ func RegisterAllProcs() { // {ItemID: 105278, ItemName: "Haromm's Talisman (Warforged)"}, // {ItemID: 105527, ItemName: "Haromm's Talisman (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -144,7 +144,7 @@ func RegisterAllProcs() { // {ItemID: 105331, ItemName: "Sigil of Rampage (Warforged)"}, // {ItemID: 105580, ItemName: "Sigil of Rampage (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -163,7 +163,7 @@ func RegisterAllProcs() { // {ItemID: 105323, ItemName: "Frenzied Crystal of Rage (Warforged)"}, // {ItemID: 105572, ItemName: "Frenzied Crystal of Rage (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -182,7 +182,7 @@ func RegisterAllProcs() { // {ItemID: 105358, ItemName: "Thok's Acid-Grooved Tooth (Warforged)"}, // {ItemID: 105607, ItemName: "Thok's Acid-Grooved Tooth (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -201,7 +201,7 @@ func RegisterAllProcs() { // {ItemID: 105360, ItemName: "Thok's Tail Tip (Warforged)"}, // {ItemID: 105609, ItemName: "Thok's Tail Tip (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -221,7 +221,7 @@ func RegisterAllProcs() { // {ItemID: 105366, ItemName: "Dysmorphic Samophlange of Discontinuity (Warforged)"}, // {ItemID: 105615, ItemName: "Dysmorphic Samophlange of Discontinuity (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -241,7 +241,7 @@ func RegisterAllProcs() { // {ItemID: 105363, ItemName: "Ticking Ebon Detonator (Warforged)"}, // {ItemID: 105612, ItemName: "Ticking Ebon Detonator (Heroic Warforged)"}, // }) - + // TODO: Manual implementation required // This can be ignored if the effect has already been implemented. // With next db run the item will be removed if implemented. @@ -255,7 +255,7 @@ func RegisterAllProcs() { // Outcome: core.OutcomeLanded, // Harmful: true // }) - + // Your melee attacks have a chance to grant Blessing of the Celestials, increasing your Strength by 3027 // for 15s. ( 20% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -266,7 +266,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deliver a melee or ranged critical strike, you have a chance to gain Blessing of the Celestials, // increasing your Agility by 3027 for 15s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -277,7 +277,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeCrit, Harmful: true, }) - + // When you cast healing spells, you have a chance to gain Blessing of the Celestials, increasing your Spirit // by 3027 for 20s. ( 20% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -288,7 +288,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal spell damage, you have a chance to gain Blessing of the Celestials, increasing your Intellect // by 3027 for 15s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -299,7 +299,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Windswept Pages (H)", @@ -309,7 +309,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing spells have a chance to grant 1926 Intellect for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Empty Fruit Barrel (H)", @@ -319,7 +319,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 critical strike for 30s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Carbonic Carbuncle (H)", @@ -329,7 +329,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your spells deal damage you have a chance to gain 2573 critical strike for 30s. ( 15% chance, 115 // sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -340,7 +340,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 dodge for 15s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -351,7 +351,7 @@ func RegisterAllProcs() { {ItemID: 81243, ItemName: "Iron Protector Talisman (H)"}, {ItemID: 85181, ItemName: "Iron Protector Talisman (N)"}, }) - + // When your attacks critical strike your target you have a chance to gain 2573 Agility for 25s. ( 45% chance, // 85 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -362,7 +362,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeCrit, Harmful: true, }) - + // Your healing and damaging spells have a chance to grant 1851 mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mark of the Catacombs", @@ -372,7 +372,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of the Catacombs", @@ -382,7 +382,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Emblem of the Catacombs", @@ -392,7 +392,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee attacks have a chance to grant 1851 parry for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Medallion of the Catacombs", @@ -402,7 +402,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 critical strike for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Symbol of the Catacombs", @@ -412,7 +412,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing and damaging spells have a chance to grant 1851 spirit for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of Compassion", @@ -422,7 +422,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1851 critical strike for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of Fidelity", @@ -432,7 +432,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of Grace", @@ -442,7 +442,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee attacks have a chance to grant 1851 mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of Patience", @@ -452,7 +452,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of Devotion", @@ -462,7 +462,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing and damaging spells have a chance to grant 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Fearwurm Relic", @@ -472,7 +472,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Charm of Ten Songs", @@ -482,7 +482,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Braid of Ten Songs", @@ -492,7 +492,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee attacks have a chance to grant 1851 parry for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Knot of Ten Songs", @@ -502,7 +502,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Fearwurm Badge", @@ -512,7 +512,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing and damaging spells have a chance to grant 1851 critical strike for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Relic of Kypari Zar", @@ -522,7 +522,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1851 mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sigil of Kypari Zar", @@ -532,7 +532,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 haste for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Emblem of Kypari Zar", @@ -542,7 +542,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee attacks have a chance to grant 1851 dodge for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Insignia of Kypari Zar", @@ -552,7 +552,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your melee and ranged attacks have a chance to grant 1851 critical strike for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Badge of Kypari Zar", @@ -562,7 +562,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Dreadful Gladiator's Insignia of Conquest (Season 12)", @@ -572,7 +572,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Dreadful Gladiator's Insignia of Dominance (Season 12)", @@ -582,7 +582,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Dreadful Gladiator's Insignia of Victory (Season 12)", @@ -592,7 +592,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -603,7 +603,7 @@ func RegisterAllProcs() { {ItemID: 84935, ItemName: "Malevolent Gladiator's Insignia of Conquest (Season 12)"}, {ItemID: 91457, ItemName: "Malevolent Gladiator's Insignia of Conquest (Season 13)"}, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -614,7 +614,7 @@ func RegisterAllProcs() { {ItemID: 84937, ItemName: "Malevolent Gladiator's Insignia of Victory (Season 12)"}, {ItemID: 91768, ItemName: "Malevolent Gladiator's Insignia of Victory (Season 13)"}, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt | core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, @@ -625,7 +625,7 @@ func RegisterAllProcs() { {ItemID: 84941, ItemName: "Malevolent Gladiator's Insignia of Dominance (Season 12)"}, {ItemID: 91754, ItemName: "Malevolent Gladiator's Insignia of Dominance (Season 13)"}, }) - + // Your attacks have a chance to grant you 963 dodge for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -637,7 +637,7 @@ func RegisterAllProcs() { {ItemID: 86790, ItemName: "Vial of Dragon's Blood (LFR) (Celestial)"}, {ItemID: 87063, ItemName: "Vial of Dragon's Blood (H)"}, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -649,7 +649,7 @@ func RegisterAllProcs() { {ItemID: 86791, ItemName: "Bottle of Infinite Stars (LFR) (Celestial)"}, {ItemID: 87057, ItemName: "Bottle of Infinite Stars (H)"}, }) - + // Each time you deal periodic damage you have a chance to gain 963 Intellect for 20s. ( 15% chance, 55 sec // cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -662,7 +662,7 @@ func RegisterAllProcs() { {ItemID: 86792, ItemName: "Light of the Cosmos (LFR) (Celestial)"}, {ItemID: 87065, ItemName: "Light of the Cosmos (H)"}, }) - + // Your attacks have a chance to grant you 963 Strength for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -674,7 +674,7 @@ func RegisterAllProcs() { {ItemID: 86802, ItemName: "Lei Shen's Final Orders (LFR) (Celestial)"}, {ItemID: 87072, ItemName: "Lei Shen's Final Orders (H)"}, }) - + // Each time your spells heal you have a chance to gain 963 Intellect for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, @@ -686,7 +686,7 @@ func RegisterAllProcs() { {ItemID: 86805, ItemName: "Qin-xi's Polarizing Seal (LFR) (Celestial)"}, {ItemID: 87075, ItemName: "Qin-xi's Polarizing Seal (H)"}, }) - + // Each time your attacks hit, you have a chance to gain 963 dodge for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -698,7 +698,7 @@ func RegisterAllProcs() { {ItemID: 86881, ItemName: "Stuff of Nightmares (LFR) (Celestial)"}, {ItemID: 87160, ItemName: "Stuff of Nightmares (H)"}, }) - + // Each time your spells heal you have a chance to gain 963 Spirit for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, @@ -710,7 +710,7 @@ func RegisterAllProcs() { {ItemID: 86885, ItemName: "Spirits of the Sun (LFR) (Celestial)"}, {ItemID: 87163, ItemName: "Spirits of the Sun (H)"}, }) - + // Each time your attacks hit, you have a chance to gain 963 critical strike for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -723,7 +723,7 @@ func RegisterAllProcs() { {ItemID: 86890, ItemName: "Terror in the Mists (LFR) (Celestial)"}, {ItemID: 87167, ItemName: "Terror in the Mists (H)"}, }) - + // Each time your attacks hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -735,7 +735,7 @@ func RegisterAllProcs() { {ItemID: 86894, ItemName: "Darkmist Vortex (LFR) (Celestial)"}, {ItemID: 87172, ItemName: "Darkmist Vortex (H)"}, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -748,7 +748,7 @@ func RegisterAllProcs() { {ItemID: 86907, ItemName: "Essence of Terror (LFR) (Celestial)"}, {ItemID: 87175, ItemName: "Essence of Terror (H)"}, }) - + // Your healing spells have a chance to grant 1926 spellpower for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Core of Decency", @@ -758,7 +758,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your harmful spells have a chance to increase your spell power by 2040 for 10s. ( 10% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mithril Wristwatch", @@ -768,7 +768,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your direct healing and heal over time spells have a chance to increase your haste by 2040 for 10s. ( // 10% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -779,7 +779,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Chance on melee and ranged critical strike to increase your attack power by 4000 for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Coren's Cold Chromium Coaster", @@ -789,7 +789,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeCrit, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -802,7 +802,7 @@ func RegisterAllProcs() { {ItemID: 99777, ItemName: "Tyrannical Gladiator's Insignia of Conquest (Season 14) (Alliance)"}, {ItemID: 100026, ItemName: "Tyrannical Gladiator's Insignia of Conquest (Season 14) (Horde)"}, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt | core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, @@ -815,7 +815,7 @@ func RegisterAllProcs() { {ItemID: 99938, ItemName: "Tyrannical Gladiator's Insignia of Dominance (Season 14) (Alliance)"}, {ItemID: 100152, ItemName: "Tyrannical Gladiator's Insignia of Dominance (Season 14) (Horde)"}, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -828,7 +828,7 @@ func RegisterAllProcs() { {ItemID: 99948, ItemName: "Tyrannical Gladiator's Insignia of Victory (Season 14) (Alliance)"}, {ItemID: 100085, ItemName: "Tyrannical Gladiator's Insignia of Victory (Season 14) (Horde)"}, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Crafted Dreadful Gladiator's Insignia of Conquest", @@ -838,7 +838,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Crafted Dreadful Gladiator's Insignia of Dominance", @@ -848,7 +848,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Crafted Dreadful Gladiator's Insignia of Victory", @@ -858,7 +858,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Strength for 15s. ( 15% chance, 85 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Brutal Talisman of the Shado-Pan Assault", @@ -868,7 +868,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 10s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Volatile Talisman of the Shado-Pan Assault", @@ -878,7 +878,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Vicious Talisman of the Shado-Pan Assault", @@ -888,7 +888,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your periodic damage spells have a chance to grant 1926 Intellect for 10s. (Approximately 1.10 procs per // minute) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -903,7 +903,7 @@ func RegisterAllProcs() { {ItemID: 96455, ItemName: "Breath of the Hydra (H)"}, {ItemID: 96827, ItemName: "Breath of the Hydra (Heroic Thunderforged)"}, }) - + // When your attacks hit you have a chance to gain 2573 Agility and summon 3 Voodoo Gnomes for 10s. (Approximately // 1.10 procs per minute) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -918,7 +918,7 @@ func RegisterAllProcs() { {ItemID: 96409, ItemName: "Bad Juju (H)"}, {ItemID: 96781, ItemName: "Bad Juju (Heroic Thunderforged)"}, }) - + // When your spells deal critical damage, you have a chance to gain 1926 Intellect for 10s. (Approximately // 0.85 procs per minute) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -933,7 +933,7 @@ func RegisterAllProcs() { {ItemID: 96516, ItemName: "Cha-Ye's Essence of Brilliance (H)"}, {ItemID: 96888, ItemName: "Cha-Ye's Essence of Brilliance (Heroic Thunderforged)"}, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Crafted Malevolent Gladiator's Insignia of Conquest", @@ -943,7 +943,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Crafted Malevolent Gladiator's Insignia of Dominance", @@ -953,7 +953,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Crafted Malevolent Gladiator's Insignia of Victory", @@ -963,7 +963,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -976,7 +976,7 @@ func RegisterAllProcs() { {ItemID: 102840, ItemName: "Grievous Gladiator's Insignia of Conquest (Season 15) (Horde)"}, {ItemID: 103150, ItemName: "Grievous Gladiator's Insignia of Conquest (Season 15) (Alliance)"}, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt | core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, @@ -989,7 +989,7 @@ func RegisterAllProcs() { {ItemID: 102963, ItemName: "Grievous Gladiator's Insignia of Dominance (Season 15) (Horde)"}, {ItemID: 103309, ItemName: "Grievous Gladiator's Insignia of Dominance (Season 15) (Alliance)"}, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -1002,7 +1002,7 @@ func RegisterAllProcs() { {ItemID: 102896, ItemName: "Grievous Gladiator's Insignia of Victory (Season 15) (Horde)"}, {ItemID: 103319, ItemName: "Grievous Gladiator's Insignia of Victory (Season 15) (Alliance)"}, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Heart-Lesion Stone of Battle", @@ -1012,7 +1012,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Strength for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Heart-Lesion Idol of Battle", @@ -1022,7 +1022,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 dodge for 15s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Heart-Lesion Defender Idol", @@ -1032,7 +1032,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Heart-Lesion Defender Stone", @@ -1042,7 +1042,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Springrain Idol of Rage", @@ -1052,7 +1052,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Springrain Stone of Rage", @@ -1062,7 +1062,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -1073,7 +1073,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Springrain Stone of Destruction", @@ -1083,7 +1083,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing spells have a chance to grant 1926 Intellect for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Springrain Stone of Wisdom", @@ -1093,7 +1093,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Trailseeker Idol of Rage", @@ -1103,7 +1103,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Trailseeker Stone of Rage", @@ -1113,7 +1113,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -1124,7 +1124,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mountainsage Stone of Destruction", @@ -1134,7 +1134,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mistdancer Defender Stone", @@ -1144,7 +1144,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 dodge for 15s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mistdancer Defender Idol", @@ -1154,7 +1154,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing spells have a chance to grant 1926 Intellect for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mistdancer Stone of Wisdom", @@ -1164,7 +1164,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mistdancer Idol of Rage", @@ -1174,7 +1174,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Mistdancer Stone of Rage", @@ -1184,7 +1184,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing spells have a chance to grant 1926 Intellect for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sunsoul Stone of Wisdom", @@ -1194,7 +1194,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sunsoul Stone of Battle", @@ -1204,7 +1204,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Strength for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sunsoul Idol of Battle", @@ -1214,7 +1214,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 dodge for 15s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sunsoul Defender Idol", @@ -1224,7 +1224,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Sunsoul Defender Stone", @@ -1234,7 +1234,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -1245,7 +1245,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Communal Stone of Destruction", @@ -1255,7 +1255,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing spells have a chance to grant 1926 Intellect for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Communal Stone of Wisdom", @@ -1265,7 +1265,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Lightdrinker Idol of Rage", @@ -1275,7 +1275,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Lightdrinker Stone of Rage", @@ -1285,7 +1285,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Agility for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Streamtalker Idol of Rage", @@ -1295,7 +1295,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Streamtalker Stone of Rage", @@ -1305,7 +1305,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -1316,7 +1316,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Streamtalker Stone of Destruction", @@ -1326,7 +1326,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your healing spells have a chance to grant 1926 Intellect for 10s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Streamtalker Stone of Wisdom", @@ -1336,7 +1336,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Each time your harmful spells hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec // cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ @@ -1347,7 +1347,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Felsoul Stone of Destruction", @@ -1357,7 +1357,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Oathsworn Stone of Battle", @@ -1367,7 +1367,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 Strength for 20s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Oathsworn Idol of Battle", @@ -1377,7 +1377,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // Your attacks have a chance to grant you 963 dodge for 15s. ( 15% chance, 55 sec cooldown) shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Oathsworn Defender Idol", @@ -1387,7 +1387,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. shared.NewProcStatBonusEffect(shared.ProcStatBonusEffect{ Name: "Oathsworn Defender Stone", @@ -1397,7 +1397,7 @@ func RegisterAllProcs() { Outcome: core.OutcomeLanded, Harmful: true, }) - + // When you deal damage you have a chance to gain 1287 Agility for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -1408,7 +1408,7 @@ func RegisterAllProcs() { {ItemID: 102643, ItemName: "Prideful Gladiator's Insignia of Conquest (Season 15) (Alliance)"}, {ItemID: 103347, ItemName: "Prideful Gladiator's Insignia of Conquest (Season 15) (Horde)"}, }) - + // When you deal damage you have a chance to gain 1287 Strength for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt, @@ -1419,7 +1419,7 @@ func RegisterAllProcs() { {ItemID: 102699, ItemName: "Prideful Gladiator's Insignia of Victory (Season 15) (Alliance)"}, {ItemID: 103516, ItemName: "Prideful Gladiator's Insignia of Victory (Season 15) (Horde)"}, }) - + // When you deal damage or heal a target you have a chance to gain 1287 Intellect for 20s. shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt | core.CallbackOnPeriodicDamageDealt | core.CallbackOnHealDealt | core.CallbackOnPeriodicHealDealt, @@ -1430,7 +1430,7 @@ func RegisterAllProcs() { {ItemID: 102766, ItemName: "Prideful Gladiator's Insignia of Dominance (Season 15) (Alliance)"}, {ItemID: 103506, ItemName: "Prideful Gladiator's Insignia of Dominance (Season 15) (Horde)"}, }) - + // When your attacks hit you have a chance to gain 2573 Mastery for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -1441,7 +1441,7 @@ func RegisterAllProcs() { {ItemID: 103686, ItemName: "Discipline of Xuen"}, {ItemID: 103986, ItemName: "Discipline of Xuen (Timeless)"}, }) - + // When your spells deal damage you have a chance to gain 2573 critical strike for 20s. ( 15% chance, 115 // sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ @@ -1453,7 +1453,7 @@ func RegisterAllProcs() { {ItemID: 103687, ItemName: "Yu'lon's Bite"}, {ItemID: 103987, ItemName: "Yu'lon's Bite (Timeless)"}, }) - + // Each time your melee attacks hit, you have a chance to gain 963 haste for 20s. ( 15% chance, 115 sec cooldown) shared.NewProcStatBonusEffectWithVariants(shared.ProcStatBonusEffect{ Callback: core.CallbackOnSpellHitDealt, @@ -1464,4 +1464,4 @@ func RegisterAllProcs() { {ItemID: 103689, ItemName: "Alacrity of Xuen"}, {ItemID: 103989, ItemName: "Alacrity of Xuen (Timeless)"}, }) -} \ No newline at end of file +} diff --git a/sim/core/apl.go b/sim/core/apl.go index 1041630d1d..62fbc88000 100644 --- a/sim/core/apl.go +++ b/sim/core/apl.go @@ -265,6 +265,11 @@ func (rot *APLRotation) reset(sim *Simulation) { rot.inLoop = false rot.interruptChannelIf = nil rot.allowChannelRecastOnInterrupt = false + + //rot.allowCastWhileChanneling = slices.ContainsFunc(rot.unit.Spellbook, func(spell *Spell) bool { + // return spell.Flags.Matches(SpellFlagCastWhileChanneling) + //}) + for _, action := range rot.allAPLActions() { action.impl.Reset(sim) } diff --git a/sim/core/pet.go b/sim/core/pet.go index ef362e5cdf..663c2895ab 100644 --- a/sim/core/pet.go +++ b/sim/core/pet.go @@ -313,7 +313,7 @@ func (pet *Pet) enableDynamicMeleeSpeed(sim *Simulation) { panic("Pet already present in dynamic melee speed pet list!") } - if math.Abs(pet.inheritedMeleeSpeedMultiplier - 1) > 1e-14 { + if math.Abs(pet.inheritedMeleeSpeedMultiplier-1) > 1e-14 { panic(fmt.Sprintf("Pet melee speed multiplier was not reset properly! Current inherited value = %.17f", pet.inheritedMeleeSpeedMultiplier)) } @@ -338,7 +338,7 @@ func (pet *Pet) resetDynamicMeleeSpeed(sim *Simulation) { panic("Pet not present in dynamic melee speed pet list!") } - pet.dynamicMeleeSpeedInheritance(sim, 1 / pet.inheritedMeleeSpeedMultiplier) + pet.dynamicMeleeSpeedInheritance(sim, 1/pet.inheritedMeleeSpeedMultiplier) pet.dynamicMeleeSpeedInheritance = nil } @@ -347,7 +347,7 @@ func (pet *Pet) enableDynamicCastSpeed(sim *Simulation) { panic("Pet already present in dynamic cast speed pet list!") } - if math.Abs(pet.inheritedCastSpeedMultiplier - 1) > 1e-14 { + if math.Abs(pet.inheritedCastSpeedMultiplier-1) > 1e-14 { panic(fmt.Sprintf("Pet cast speed multiplier was not reset properly! Current inherited value = %.17f", pet.inheritedCastSpeedMultiplier)) } @@ -371,7 +371,7 @@ func (pet *Pet) resetDynamicCastSpeed(sim *Simulation) { panic("Pet not present in dynamic cast speed pet list!") } - pet.dynamicCastSpeedInheritance(sim, 1 / pet.inheritedCastSpeedMultiplier) + pet.dynamicCastSpeedInheritance(sim, 1/pet.inheritedCastSpeedMultiplier) pet.dynamicCastSpeedInheritance = nil } diff --git a/sim/core/spell.go b/sim/core/spell.go index 1c3379686e..4974bcd68f 100644 --- a/sim/core/spell.go +++ b/sim/core/spell.go @@ -605,6 +605,7 @@ func (spell *Spell) CanCast(sim *Simulation, target *Unit) bool { //if sim.Log != nil { // sim.Log("Cant cast because already casting/channeling") //} + return false } diff --git a/sim/druid/druid.go b/sim/druid/druid.go index b1d0e458d0..fd4ebc6d98 100644 --- a/sim/druid/druid.go +++ b/sim/druid/druid.go @@ -74,7 +74,7 @@ type Druid struct { ProwlAura *core.Aura SurvivalInstinctsAura *core.Aura - form DruidForm + form DruidForm // Guardian leather specialization is form-specific GuardianLeatherSpecTracker *core.Aura diff --git a/sim/druid/feral/feral.go b/sim/druid/feral/feral.go index e69964a5f6..4827890fa0 100644 --- a/sim/druid/feral/feral.go +++ b/sim/druid/feral/feral.go @@ -157,11 +157,11 @@ func (cat *FeralDruid) applyMastery() { razorClaws := cat.AddDynamicMod(core.SpellModConfig{ ClassMask: druid.DruidSpellThrashCat | druid.DruidSpellRake | druid.DruidSpellRip, Kind: core.SpellMod_DamageDone_Pct, - FloatValue: baseMasteryMod + masteryModPerPoint * cat.GetMasteryPoints(), + FloatValue: baseMasteryMod + masteryModPerPoint*cat.GetMasteryPoints(), }) cat.AddOnMasteryStatChanged(func(_ *core.Simulation, _ float64, newMasteryRating float64) { - razorClaws.UpdateFloatValue(baseMasteryMod + masteryModPerPoint * core.MasteryRatingToMasteryPoints(newMasteryRating)) + razorClaws.UpdateFloatValue(baseMasteryMod + masteryModPerPoint*core.MasteryRatingToMasteryPoints(newMasteryRating)) }) razorClaws.Activate() diff --git a/sim/druid/feral/savage_roar.go b/sim/druid/feral/savage_roar.go index de11343e35..cd912378bd 100644 --- a/sim/druid/feral/savage_roar.go +++ b/sim/druid/feral/savage_roar.go @@ -15,7 +15,7 @@ func (cat *FeralDruid) registerSavageRoarSpell() { isGlyphed := cat.HasMajorGlyph(proto.DruidMajorGlyph_GlyphOfSavagery) cat.SavageRoarDurationTable = [6]time.Duration{ - core.TernaryDuration(isGlyphed, time.Second * 12, 0), + core.TernaryDuration(isGlyphed, time.Second*12, 0), time.Second * 18, time.Second * 24, time.Second * 30, @@ -78,8 +78,8 @@ func (cat *FeralDruid) registerSavageRoarSpell() { if !isGlyphed { aura.Deactivate(sim) - } else if aura.RemainingDuration(sim) > time.Second * 12 { - aura.UpdateExpires(sim.CurrentTime + time.Second * 12) + } else if aura.RemainingDuration(sim) > time.Second*12 { + aura.UpdateExpires(sim.CurrentTime + time.Second*12) } }, }, diff --git a/sim/druid/rip.go b/sim/druid/rip.go index 7e771f0cb2..bbcb1ddad1 100644 --- a/sim/druid/rip.go +++ b/sim/druid/rip.go @@ -16,7 +16,7 @@ func (druid *Druid) registerRipSpell() { const attackPowerCoeff = 0.0484 // Scaled parameters for spell code - baseDamage := coefficient * druid.ClassSpellScaling // 112.7582 + baseDamage := coefficient * druid.ClassSpellScaling // 112.7582 comboPointCoeff := resourceCoefficient * druid.ClassSpellScaling // 319.664 druid.Rip = druid.RegisterSpell(Cat, core.SpellConfig{ @@ -62,7 +62,7 @@ func (druid *Druid) registerRipSpell() { cp := float64(druid.ComboPoints()) ap := dot.Spell.MeleeAttackPower() - dot.SnapshotPhysical(target, baseDamage + comboPointCoeff*cp + attackPowerCoeff*cp*ap) + dot.SnapshotPhysical(target, baseDamage+comboPointCoeff*cp+attackPowerCoeff*cp*ap) // Store snapshot power parameters for later use. druid.UpdateBleedPower(druid.Rip, sim, target, true, true) diff --git a/sim/hunter/a_murder_of_crows.go b/sim/hunter/a_murder_of_crows.go index f36538cd09..05868bbd1b 100644 --- a/sim/hunter/a_murder_of_crows.go +++ b/sim/hunter/a_murder_of_crows.go @@ -74,7 +74,7 @@ func (hunter *Hunter) registerAMOCSpell() { ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { result := spell.CalcAndDealOutcome(sim, target, spell.OutcomeAlwaysHit) pa := sim.GetConsumedPendingActionFromPool() - pa.NextActionAt = sim.CurrentTime + time.Second * 2 + pa.NextActionAt = sim.CurrentTime + time.Second*2 pa.OnAction = func(sim *core.Simulation) { if result.Landed() { diff --git a/sim/monk/blackout_kick.go b/sim/monk/blackout_kick.go index 4518b74c8c..51a2ab12fe 100644 --- a/sim/monk/blackout_kick.go +++ b/sim/monk/blackout_kick.go @@ -68,6 +68,7 @@ func blackoutKickSpellConfig(monk *Monk, isSEFClone bool, overrides core.SpellCo func (monk *Monk) registerBlackoutKick() { chiMetrics := monk.NewChiMetrics(blackoutKickActionID) chiCost := int32(2) + manaMetrics := monk.NewManaMetrics(blackoutKickActionID) monk.RegisterSpell(blackoutKickSpellConfig(monk, false, core.SpellConfig{ Cast: core.CastConfig{ @@ -92,6 +93,11 @@ func (monk *Monk) registerBlackoutKick() { } else { monk.SpendChi(sim, chiCost, chiMetrics) } + + if monk.MuscleMemoryAura.IsActive() { + result.Damage += result.Damage * 1.5 + monk.AddMana(sim, monk.MaxMana()*0.04, manaMetrics) + } } spell.DealOutcome(sim, result) diff --git a/sim/monk/jab.go b/sim/monk/jab.go index c436a743c5..8124c21a7a 100644 --- a/sim/monk/jab.go +++ b/sim/monk/jab.go @@ -73,7 +73,7 @@ func (monk *Monk) registerJab() { Refund: 0.8, }, ManaCost: core.ManaCostOptions{ - BaseCostPercent: core.TernaryFloat64(monk.StanceMatches(WiseSerpent), 8, 0), + BaseCostPercent: 6, //Lowed from 8 based on patch notes }, Cast: core.CastConfig{ @@ -84,9 +84,9 @@ func (monk *Monk) registerJab() { }, ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + baseDamage := monk.CalculateMonkStrikeDamage(sim, spell) result := spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialHitAndCrit) - if result.Landed() { chiGain := core.TernaryInt32(monk.StanceMatches(FierceTiger), 2, 1) monk.AddChi(sim, spell, chiGain, chiMetrics) diff --git a/sim/monk/mistweaver/enveloping_mist.go b/sim/monk/mistweaver/enveloping_mist.go new file mode 100644 index 0000000000..d993269015 --- /dev/null +++ b/sim/monk/mistweaver/enveloping_mist.go @@ -0,0 +1,88 @@ +package mistweaver + +import ( + "fmt" + "time" + + "github.com/wowsims/mop/sim/core" + "github.com/wowsims/mop/sim/monk" +) + +func (mw *MistweaverMonk) registerEnvelopingMist() { + actionID := core.ActionID{SpellID: 124682} + chiMetrics := mw.NewChiMetrics(actionID) + spellCoeff := 0.45 + + mw.envelopingMist = mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful | core.SpellFlagAPL, // | core.SpellFlagCastWhileChanneling, + ClassSpellMask: monk.MonkSpellEnvelopingMist, + + ManaCost: core.ManaCostOptions{BaseCostPercent: 0}, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: core.GCDDefault, + CastTime: time.Millisecond * 2000, + }, + }, + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + + ExtraCastCondition: func(_ *core.Simulation, _ *core.Unit) bool { + return mw.GetChi() >= 3 + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + + mw.SpendChi(sim, 3, chiMetrics) + spell.RelatedDotSpell.Cast(sim, target) + + }, + }) + + mw.envelopingMist.RelatedDotSpell = mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful, + //ClassSpellMask: monk.MonkSpellEnvelopingMist, + + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + Hot: core.DotConfig{ + Aura: core.Aura{ + Label: "Enveloping Mist", + }, + NumberOfTicks: 6, + TickLength: 1 * time.Second, + AffectedByCastSpeed: true, + HasteReducesDuration: true, + OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, _ bool) { + dot.SnapshotBaseDamage = 0 + mw.CalcScalingSpellDmg(spellCoeff) + dot.SnapshotAttackerMultiplier = dot.Spell.CasterHealingMultiplier() + }, + + OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { + + dot.CalcAndDealPeriodicSnapshotHealing(sim, target, dot.OutcomeTick) + + }, + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + hot := spell.Hot(target) + //Will probably have to remove enemy units as options for friendly spells? + if target.Type == core.EnemyUnit { + fmt.Printf("Attemping to cast Enveloping mist on enemy: %v\n", target.Label) + return + } + + hot.Apply(sim) + + }, + }) +} diff --git a/sim/monk/mistweaver/mana_tea.go b/sim/monk/mistweaver/mana_tea.go new file mode 100644 index 0000000000..1878a91da2 --- /dev/null +++ b/sim/monk/mistweaver/mana_tea.go @@ -0,0 +1,101 @@ +package mistweaver + +import ( + "time" + + "github.com/wowsims/mop/sim/core" + "github.com/wowsims/mop/sim/core/stats" + "github.com/wowsims/mop/sim/monk" +) + +func (mw *MistweaverMonk) registerManaTea() { + + buffActionID := core.ActionID{SpellID: 115294} + stackActionID := core.ActionID{SpellID: 123766} + manaMetrics := mw.NewManaMetrics(buffActionID) + manaPerTick := 0.0 + //numerOFTicks := 6 + + mw.Monk.RegisterOnChiSpent(func(sim *core.Simulation, chiSpent int32) { + accumulatedChi := mw.outstandingChi + chiSpent + + for accumulatedChi >= 4 { + + mw.AddBrewStacks(sim, 1) + accumulatedChi -= 4 + } + + mw.outstandingChi = accumulatedChi + + }) + + mw.ManaTeaStackAura = mw.RegisterAura(core.Aura{ + Label: "Mana Tea Stacks" + mw.Label, + ActionID: stackActionID, + Duration: time.Hour, + MaxStacks: 20, + }) + + mw.Monk.RegisterOnNewBrewStacks(func(sim *core.Simulation, stacksToAdd int32) { + mw.ManaTeaStackAura.Activate(sim) + + procChance := mw.GetStat(stats.SpellCritPercent) + + if sim.Proc(procChance/100, "Mana Tea") { + stacksToAdd += 1 + } + + mw.ManaTeaStackAura.SetStacks(sim, mw.ManaTeaStackAura.GetStacks()+stacksToAdd) + }) + + mw.RegisterSpell(core.SpellConfig{ + ActionID: buffActionID, + Flags: core.SpellFlagAPL | core.SpellFlagNoOnCastComplete | core.SpellFlagHelpful | core.SpellFlagChanneled, + ClassSpellMask: monk.MonkSpellManaTea, + + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: time.Millisecond * 1000, + }, + }, + + Hot: core.DotConfig{ + SelfOnly: true, + Aura: core.Aura{ + Label: "Mana Tea", + Duration: 3 * time.Second, //Set at activation + }, + NumberOfTicks: 6, + TickLength: 500 * time.Millisecond, + AffectedByCastSpeed: false, //? + OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, isRollover bool) { + mw.manaTeaAura = dot.Aura + }, + OnTick: func(sim *core.Simulation, target *core.Unit, spell *core.Dot) { + mw.AddMana(sim, manaPerTick, manaMetrics) + + mw.ManaTeaStackAura.RemoveStack(sim) + + }, + }, + + ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { + + return mw.ManaTeaStackAura.GetStacks() > 0 + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + manaPerTick = mw.MaxMana() * 0.05 //Patched to restore 5% instead of original 4% + + hot := spell.SelfHot() + stacksToUse := min(mw.ManaTeaStackAura.GetStacks(), 6.0) + hot.Duration = time.Duration(stacksToUse) * 500 * time.Millisecond + hot.BaseTickCount = stacksToUse + hot.Activate(sim) + //mw.ManaTeaStackAura.SetStacks(sim, mw.ManaTeaStackAura.GetStacks()-1) + + //spell.SelfHot().Apply(sim) + + }, + }) +} diff --git a/sim/monk/mistweaver/mistweaver.go b/sim/monk/mistweaver/mistweaver.go index 7dbcd9f113..e24a4a945c 100644 --- a/sim/monk/mistweaver/mistweaver.go +++ b/sim/monk/mistweaver/mistweaver.go @@ -50,6 +50,17 @@ func NewMistweaverMonk(character *core.Character, options *proto.Player) *Mistwe type MistweaverMonk struct { *monk.Monk + + ManaTeaStackAura *core.Aura + + renewingMist *core.Spell + envelopingMist *core.Spell + + JadeSerpentAura *core.Aura + //May move this to monk as both ww and mw use this + outstandingChi int32 + + manaTeaAura *core.Aura } func (mw *MistweaverMonk) GetMonk() *monk.Monk { @@ -68,11 +79,21 @@ func (mw *MistweaverMonk) ApplyTalents() { } func (mw *MistweaverMonk) Reset(sim *core.Simulation) { + mw.outstandingChi = 0 mw.Monk.Reset(sim) } func (mw *MistweaverMonk) RegisterSpecializationEffects() { mw.RegisterMastery() + mw.registerRenewingMist() + mw.registerSurgingMist() + mw.registerSoothingMist() + mw.registerEnvelopingMist() + mw.registerUplift() + mw.registerRevival() + mw.registerSummonJadeSerpentStatue() + mw.registerManaTea() + mw.registerPassives() } func (mw *MistweaverMonk) RegisterMastery() { diff --git a/sim/monk/mistweaver/passives.go b/sim/monk/mistweaver/passives.go new file mode 100644 index 0000000000..828d18e1ae --- /dev/null +++ b/sim/monk/mistweaver/passives.go @@ -0,0 +1,143 @@ +package mistweaver + +import ( + "fmt" + "time" + + "github.com/wowsims/mop/sim/core" + "github.com/wowsims/mop/sim/monk" +) + +func (mw *MistweaverMonk) registerPassives() { + mw.registerMuscleMemory() + mw.registerSerpentsZeal() + mw.registerVitalMists() +} + +func (mw *MistweaverMonk) registerVitalMists() { + vmManaCostMod := mw.AddDynamicMod(core.SpellModConfig{ + ClassMask: monk.MonkSpellSurgingMist, + FloatValue: -0.2, + Kind: core.SpellMod_PowerCost_Pct, + }) + + vmCastTimeMod := mw.AddDynamicMod(core.SpellModConfig{ + ClassMask: monk.MonkSpellSurgingMist, + FloatValue: -0.2, + Kind: core.SpellMod_CastTime_Pct, + }) + + mw.VitalMistsAura = mw.RegisterAura(core.Aura{ + Label: "Vital Mists", + ActionID: core.ActionID{SpellID: 118674}, + Duration: time.Second * 30, + MaxStacks: 5, + OnStacksChange: func(aura *core.Aura, sim *core.Simulation, oldStacks int32, newStacks int32) { + vmCastTimeMod.UpdateFloatValue(float64(newStacks) * -0.2) + vmCastTimeMod.Activate() + vmManaCostMod.UpdateFloatValue(core.TernaryFloat64(newStacks == 5, -2.0, float64(newStacks)*-0.2)) + vmManaCostMod.Activate() + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + vmCastTimeMod.Deactivate() + vmManaCostMod.Deactivate() + }, + OnCastComplete: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell) { + if !spell.Matches(monk.MonkSpellSurgingMist) { + return + } + + mw.VitalMistsAura.Deactivate(sim) + }, + }) + + core.MakeProcTriggerAura(&mw.Unit, core.ProcTrigger{ + Name: "Vital Mists: Tiger Palm Trigger", + Callback: core.CallbackOnSpellHitDealt, + ClassSpellMask: monk.MonkSpellTigerPalm, + Outcome: core.OutcomeLanded, + ProcChance: 1, + + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + mw.VitalMistsAura.Activate(sim) + mw.VitalMistsAura.AddStack(sim) + }, + }) +} + +func (mw *MistweaverMonk) registerSerpentsZeal() { + + dmgDone := 0.0 + + serpentZealHeal := mw.RegisterSpell((core.SpellConfig{ + ActionID: core.ActionID{SpellID: 127722}, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagNoOnCastComplete | core.SpellFlagPassiveSpell, + + DamageMultiplier: 0.25, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + spell.CalcAndDealHealing(sim, target, dmgDone, spell.OutcomeHealing) + }, + })) + mw.SerpentZealAura = mw.RegisterAura(core.Aura{ + Label: "Serpent's Zeal", + ActionID: core.ActionID{SpellID: 127722}, + Duration: time.Second * 30, + OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + if result == nil || !result.Landed() || result.Damage == 0 || !spell.ProcMask.Matches(core.ProcMaskWhiteHit) { + return + } + + dmgDone = result.Damage + //Should be a smart heal + serpentZealHeal.Cast(sim, &mw.Unit) + + }, + }) + + core.MakeProcTriggerAura(&mw.Unit, core.ProcTrigger{ + Name: "Serpent Zeal: BlackoutKick Trigger", + Callback: core.CallbackOnSpellHitDealt, + ClassSpellMask: monk.MonkSpellBlackoutKick, + Outcome: core.OutcomeLanded, + ProcChance: 1, + + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + mw.SerpentZealAura.Activate(sim) + }, + }) + +} + +func (mw *MistweaverMonk) registerMuscleMemory() { + + mw.MuscleMemoryAura = mw.RegisterAura(core.Aura{ + Label: fmt.Sprintf("Muscle Memory %s", mw.Label), + ActionID: core.ActionID{SpellID: 139597}, + Duration: time.Second * 15, + + OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + if !spell.Matches(monk.MonkSpellBlackoutKick|monk.MonkSpellTigerPalm) || !result.Landed() { + return + } + aura.Deactivate(sim) + }, + }) + + core.MakeProcTriggerAura(&mw.Unit, core.ProcTrigger{ + Name: fmt.Sprintf("Muscle Memory: Trigger %s", mw.Label), + Callback: core.CallbackOnSpellHitDealt, + ClassSpellMask: monk.MonkSpellJab, + Outcome: core.OutcomeLanded, + ProcChance: 1, + + Handler: func(sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + mw.MuscleMemoryAura.Activate(sim) + }, + }) + +} diff --git a/sim/monk/mistweaver/renewing_mist.go b/sim/monk/mistweaver/renewing_mist.go new file mode 100644 index 0000000000..caf46639a1 --- /dev/null +++ b/sim/monk/mistweaver/renewing_mist.go @@ -0,0 +1,95 @@ +package mistweaver + +import ( + "time" + + "github.com/wowsims/mop/sim/core" +) + +func (mw *MistweaverMonk) registerRenewingMist() { + actionID := core.ActionID{SpellID: 115151} + chiMetrics := mw.NewChiMetrics(actionID) + spellCoeff := 0.19665 //Will have to verify this + //targets := mw.Env.Raid.GetFirstNPlayersOrPets(int32(mw.Env.Raid.NumTargetDummies)) + charges := 3 + + mistHandler := func(sim *core.Simulation, hot *core.Spell) bool { + success := false + for _, player := range sim.Raid.AllPlayerUnits { + hot := hot.Hot(player) + + if !hot.IsActive() { + + hot.Apply(sim) + hot.TakeSnapshot(sim, false) + success = true + break + } + } + return success + } + + mw.renewingMist = mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful, + //ClassSpellMask: monk.MonkSpellRenewingMist, + + ManaCost: core.ManaCostOptions{BaseCostPercent: 5.85}, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: core.GCDDefault, + }, + CD: core.Cooldown{ + Timer: mw.NewTimer(), + Duration: time.Second * 8, + }, + }, + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + + Hot: core.DotConfig{ + Aura: core.Aura{ + Label: "Renewing Mist", + }, + NumberOfTicks: 9, + TickLength: 2 * time.Second, + AffectedByCastSpeed: true, //Not sure + HasteReducesDuration: true, //Not sure + OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, _ bool) { + dot.SnapshotBaseDamage = 0 + mw.CalcScalingSpellDmg(spellCoeff) + dot.SnapshotAttackerMultiplier = dot.Spell.CasterHealingMultiplier() + }, + + OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { + dot.CalcAndDealPeriodicSnapshotHealing(sim, target, dot.OutcomeTick) + //Has to jump to two more targets after initial cast + + if charges > 1 && dot.RemainingTicks() > 1 { + + success := mistHandler(sim, dot.Spell) + + if success { + charges = charges - 1 + } + + } + }, + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + + success := mistHandler(sim, spell) + + if success { + charges = 3 + chiGain := int32(1) + mw.AddChi(sim, spell, chiGain, chiMetrics) + } + + }, + }) + +} diff --git a/sim/monk/mistweaver/revival.go b/sim/monk/mistweaver/revival.go new file mode 100644 index 0000000000..10e736b3d1 --- /dev/null +++ b/sim/monk/mistweaver/revival.go @@ -0,0 +1,40 @@ +package mistweaver + +import ( + "time" + + "github.com/wowsims/mop/sim/core" +) + +func (mw *MistweaverMonk) registerRevival() { + actionID := core.ActionID{SpellID: 115310} + + spellCoeff := 3.5 + + mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful | core.SpellFlagAPL, + ManaCost: core.ManaCostOptions{BaseCostPercent: 7.7}, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: core.GCDDefault, + }, + CD: core.Cooldown{ + Timer: mw.NewTimer(), + Duration: time.Minute * 3, + }, + }, + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + for _, player := range sim.Raid.AllPlayerUnits { + baseHealing := 0 + spellCoeff*spell.HealingPower(target) + spell.CalcAndDealHealing(sim, player, baseHealing, spell.OutcomeHealingCrit) + //Is it worth it to implement the magical, poison and disease dispel? Does that matter? + } + }, + }) +} diff --git a/sim/monk/mistweaver/soothing_mist.go b/sim/monk/mistweaver/soothing_mist.go new file mode 100644 index 0000000000..918ef1abc2 --- /dev/null +++ b/sim/monk/mistweaver/soothing_mist.go @@ -0,0 +1,105 @@ +package mistweaver + +import ( + "fmt" + "time" + + "github.com/wowsims/mop/sim/core" + "github.com/wowsims/mop/sim/monk" +) + +func (mw *MistweaverMonk) registerSoothingMist() { + actionID := core.ActionID{SpellID: 115175} + chiMetrics := mw.NewChiMetrics(actionID) + spellCoeff := 0.1792 + manaMetrics := mw.NewManaMetrics(actionID) + manaLoss := 0.0 + + mistCastTimeMod := mw.AddDynamicMod(core.SpellModConfig{ + Kind: core.SpellMod_CastTime_Pct, + FloatValue: -1, + ClassMask: monk.MonkSpellSurgingMist | monk.MonkSpellEnvelopingMist, + }) + + mistChannelMod := mw.AddDynamicMod(core.SpellModConfig{ + Kind: core.SpellMod_AllowCastWhileChanneling, + ClassMask: monk.MonkSpellSurgingMist | monk.MonkSpellEnvelopingMist, + }) + + mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful | core.SpellFlagAPL | core.SpellFlagChanneled | core.SpellFlagCastWhileChanneling, + + ManaCost: core.ManaCostOptions{ + BaseCostPercent: 1, + }, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: time.Millisecond * 1000, + }, + }, + + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + Hot: core.DotConfig{ + Aura: core.Aura{ + Label: "Soothing Mist", + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + mistCastTimeMod.Deactivate() + mistChannelMod.Deactivate() + }, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + mistCastTimeMod.Activate() + mistChannelMod.Activate() + + }, + }, + NumberOfTicks: 9, + TickLength: 1 * time.Second, + AffectedByCastSpeed: true, //Not sure + HasteReducesDuration: true, //Not sure + OnSnapshot: func(sim *core.Simulation, target *core.Unit, dot *core.Dot, _ bool) { + + dot.SnapshotBaseDamage = 0 + mw.CalcScalingSpellDmg(spellCoeff) + multiplier := dot.Spell.CasterHealingMultiplier() + + dot.SnapshotAttackerMultiplier = multiplier + }, + + OnTick: func(sim *core.Simulation, target *core.Unit, dot *core.Dot) { + envelopingActive := mw.envelopingMist.RelatedDotSpell.Hot(target).IsActive() + if envelopingActive { + dot.SnapshotAttackerMultiplier = 1.3 + } else { + dot.SnapshotAttackerMultiplier = 1 + } + dot.CalcAndDealPeriodicSnapshotHealing(sim, target, dot.OutcomeTick) + mw.SpendMana(sim, manaLoss, manaMetrics) + //Need to take 1% of mana on tick + if sim.Proc(0.3, "Soothing Mist Chi") { + mw.AddChi(sim, dot.Spell, 1, chiMetrics) + } + }, + }, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + //Currently target mistweaver only, will need to fix this + manaLoss = mw.MaxMana() * 0.01 + + hot := spell.Hot(target) + if target.Type == core.EnemyUnit { + fmt.Printf("Attemping to cast Enveloping mist on enemy: %v\n", target.Label) + return + } + hot.Apply(sim) + hot.TickOnce(sim) + expiresAt := hot.ExpiresAt() + mw.AutoAttacks.StopMeleeUntil(sim, expiresAt) + + }, + }) + +} diff --git a/sim/monk/mistweaver/surging_mist.go b/sim/monk/mistweaver/surging_mist.go new file mode 100644 index 0000000000..d3f96e167d --- /dev/null +++ b/sim/monk/mistweaver/surging_mist.go @@ -0,0 +1,42 @@ +package mistweaver + +import ( + "time" + + "github.com/wowsims/mop/sim/core" + "github.com/wowsims/mop/sim/monk" +) + +func (mw *MistweaverMonk) registerSurgingMist() { + actionID := core.ActionID{SpellID: 116694} + chiMetrics := mw.NewChiMetrics(actionID) + + mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful | core.SpellFlagAPL, + ClassSpellMask: monk.MonkSpellSurgingMist, + ManaCost: core.ManaCostOptions{ + BaseCostPercent: 7.65, //Changed based on patch notes + }, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: core.GCDDefault, + CastTime: time.Millisecond * 1500, + }, + }, + + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + BonusCoefficient: 1.8, + + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + spell.CalcAndDealHealing(sim, target, 17242, spell.OutcomeHealingCrit) + chiGain := int32(1) + mw.AddChi(sim, spell, chiGain, chiMetrics) + }, + }) + +} diff --git a/sim/monk/mistweaver/uplift.go b/sim/monk/mistweaver/uplift.go new file mode 100644 index 0000000000..7e3e036117 --- /dev/null +++ b/sim/monk/mistweaver/uplift.go @@ -0,0 +1,45 @@ +package mistweaver + +import ( + "github.com/wowsims/mop/sim/core" +) + +func (mw *MistweaverMonk) registerUplift() { + actionID := core.ActionID{SpellID: 116670} + chiMetrics := mw.NewChiMetrics(actionID) + + mw.RegisterSpell(core.SpellConfig{ + ActionID: actionID, + SpellSchool: core.SpellSchoolNature, + ProcMask: core.ProcMaskSpellHealing, + Flags: core.SpellFlagHelpful | core.SpellFlagAPL, + Cast: core.CastConfig{ + DefaultCast: core.Cast{ + GCD: core.GCDDefault, + }, + }, + DamageMultiplier: 1, + ThreatMultiplier: 1, + CritMultiplier: mw.DefaultCritMultiplier(), + BonusCoefficient: 0.68, + ExtraCastCondition: func(sim *core.Simulation, target *core.Unit) bool { + return mw.GetChi() >= 2 + }, + ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + success := false + for _, player := range sim.Raid.AllPlayerUnits { + hot := mw.renewingMist.Hot(player) + + if hot.IsActive() { + + spell.CalcAndDealHealing(sim, player, 0, spell.OutcomeHealingCrit) + success = true + } + } + + if success { + mw.SpendChi(sim, 2, chiMetrics) + } + }, + }) +} diff --git a/sim/monk/monk.go b/sim/monk/monk.go index fc903d9868..c465b95450 100644 --- a/sim/monk/monk.go +++ b/sim/monk/monk.go @@ -70,6 +70,12 @@ type Monk struct { ComboBreakerBlackoutKickAura *core.Aura ComboBreakerTigerPalmAura *core.Aura + // Mistweaver + MuscleMemoryAura *core.Aura + SerpentZealAura *core.Aura + VitalMistsAura *core.Aura + ThunderFocusTea *core.Aura + ChiSphereAura *core.Aura DampenHarmAura *core.Aura FortifyingBrewAura *core.Aura @@ -353,6 +359,16 @@ const ( MonkSpellPurifyingBrew MonkSpellGiftOfTheOx + //Mistweaver + MonkSpellRenewingMist + MonkSpellSoothingMist + MonkSpellSurgingMist + MonkSpellEnvelopingMist + MonkSpellUplift + MonkSpellRevival + MonkSpellSummonJadeSerpentStatue + MonkSpellManaTea + MonkSpellLast MonkSpellsAll = MonkSpellLast<<1 - 1 ) diff --git a/sim/monk/stances.go b/sim/monk/stances.go index ad78c7abf6..b4ebe62588 100644 --- a/sim/monk/stances.go +++ b/sim/monk/stances.go @@ -112,7 +112,7 @@ func (monk *Monk) registerStanceOfTheWiseSerpent(stanceCD *core.Timer) { ProcMask: core.ProcMaskSpellHealing, Flags: core.SpellFlagNoOnCastComplete | core.SpellFlagPassiveSpell, - DamageMultiplier: 0.25, + DamageMultiplier: 0.42, //Changed from 25% to 42% based on patch notes ThreatMultiplier: 1, CritMultiplier: monk.DefaultCritMultiplier(), diff --git a/sim/monk/tiger_palm.go b/sim/monk/tiger_palm.go index 8f28014ac9..a16593c8e6 100644 --- a/sim/monk/tiger_palm.go +++ b/sim/monk/tiger_palm.go @@ -85,6 +85,7 @@ func (monk *Monk) registerTigerPalm() { chiMetrics := monk.NewChiMetrics(tigerPalmActionID) isBrewmaster := monk.Spec == proto.Spec_SpecBrewmasterMonk chiCost := int32(1) + manaMetrics := monk.NewManaMetrics(tigerPalmActionID) tigerPowerBuff := core.BlockPrepull(monk.RegisterAura(tigerPowerBuffConfig(monk, false))) @@ -124,6 +125,11 @@ func (monk *Monk) registerTigerPalm() { } else { monk.SpendChi(sim, chiCost, chiMetrics) } + + if monk.MuscleMemoryAura.IsActive() { + result.Damage += result.Damage * 1.5 + monk.AddMana(sim, monk.MaxMana()*0.04, manaMetrics) + } } } diff --git a/sim/shaman/items_mop.go b/sim/shaman/items_mop.go index ac701cc573..0361303ad9 100644 --- a/sim/shaman/items_mop.go +++ b/sim/shaman/items_mop.go @@ -48,7 +48,7 @@ var ItemSetRegaliaOfTheWitchDoctor = core.NewItemSet(core.ItemSet{ ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { baseDamage := sim.RollWithLabel(32375, 37625, "Lighting Strike 2pT14") nTargets := shaman.Env.ActiveTargetCount() - spell.CalcAoeDamage(sim, baseDamage / float64(nTargets), spell.OutcomeMagicHitAndCrit) + spell.CalcAoeDamage(sim, baseDamage/float64(nTargets), spell.OutcomeMagicHitAndCrit) spell.WaitTravelTime(sim, func(sim *core.Simulation) { spell.DealBatchedAoeDamage(sim) diff --git a/ui/core/launched_sims.ts b/ui/core/launched_sims.ts index cb760fb063..f166dd4373 100755 --- a/ui/core/launched_sims.ts +++ b/ui/core/launched_sims.ts @@ -91,7 +91,7 @@ export const simLaunchStatuses: Record = { }, [Spec.SpecMistweaverMonk]: { phase: Phase.Phase1, - status: LaunchStatus.Unlaunched, + status: LaunchStatus.Alpha, }, [Spec.SpecWindwalkerMonk]: { phase: Phase.Phase1,