diff --git a/assets/database/db.bin b/assets/database/db.bin index e63ed43b7e..6fa4579ae9 100644 Binary files a/assets/database/db.bin and b/assets/database/db.bin differ diff --git a/assets/database/db.json b/assets/database/db.json index 0b7c31d64b..d705fe8bbd 100644 --- a/assets/database/db.json +++ b/assets/database/db.json @@ -9763,24 +9763,43 @@ {"id":49634,"name":"Drums of the Wild","icon":"inv_misc_drum_07"} ], "spellIcons":[ +{"id":71,"name":"Defensive Stance","icon":"ability_warrior_defensivestance"}, +{"id":379,"name":"Earth Shield","icon":"spell_nature_skinofearth"}, +{"id":498,"name":"Divine Protection","icon":"spell_holy_restoration"}, {"id":724,"name":"Lightwell","icon":"spell_holy_summonlightwell"}, +{"id":768,"name":"Cat Form","icon":"ability_druid_catform"}, {"id":770,"name":"Faerie Fire","icon":"spell_nature_faeriefire"}, {"id":974,"name":"Earth Shield","icon":"spell_nature_skinofearth"}, +{"id":1122,"name":"Inferno","icon":"spell_shadow_summoninfernal"}, {"id":1329,"name":"Mutilate","icon":"ability_rogue_shadowstrikes"}, +{"id":1680,"name":"Whirlwind","icon":"ability_whirlwind"}, +{"id":2457,"name":"Battle Stance","icon":"ability_warrior_offensivestance"}, +{"id":2458,"name":"Berserker Stance","icon":"ability_racial_avatar"}, +{"id":2565,"name":"Shield Block","icon":"ability_defend"}, +{"id":2687,"name":"Bloodrage","icon":"ability_racial_bloodrage"}, {"id":2825,"name":"Bloodlust","icon":"spell_nature_bloodlust"}, {"id":3043,"name":"Scorpid Sting","icon":"ability_hunter_criticalshot"}, +{"id":3045,"name":"Rapid Fire","icon":"ability_hunter_runningshot"}, {"id":3674,"name":"Black Arrow","icon":"spell_shadow_painspike"}, {"id":3738,"name":"Wrath of Air Totem","icon":"spell_nature_slowingtotem"}, +{"id":5229,"name":"Enrage","icon":"ability_druid_enrage"}, {"id":5570,"name":"Insect Swarm","icon":"spell_nature_insectswarm"}, {"id":5923,"name":"Holy Power","icon":"spell_holy_power"}, {"id":5924,"name":"Holy Power","icon":"spell_holy_power"}, {"id":5925,"name":"Holy Power","icon":"spell_holy_power"}, {"id":5926,"name":"Holy Power","icon":"spell_holy_power"}, +{"id":5938,"name":"Shiv","icon":"inv_throwingknife_04"}, {"id":5952,"name":"Throwing Specialization","icon":"ability_rogue_throwingspecialization"}, {"id":6562,"name":"Heroic Presence","icon":"inv_helmet_21"}, +{"id":6774,"name":"Slice and Dice","icon":"ability_rogue_slicedice"}, +{"id":6788,"name":"Weakened Soul","icon":"spell_holy_ashestoashes"}, +{"id":7384,"name":"Overpower","icon":"ability_meleedamage"}, +{"id":8143,"name":"Tremor Totem","icon":"spell_nature_tremortotem"}, +{"id":8512,"name":"Windfury Totem","icon":"spell_nature_windfury"}, {"id":8647,"name":"Expose Armor","icon":"ability_warrior_riposte"}, {"id":9452,"name":"Vindication","icon":"spell_holy_vindication"}, {"id":9453,"name":"Unyielding Faith","icon":"spell_holy_unyieldingfaith"}, +{"id":9634,"name":"Dire Bear Form","icon":"ability_racial_bearform"}, {"id":9799,"name":"Eye for an Eye","icon":"spell_holy_eyeforaneye"}, {"id":10060,"name":"Power Infusion","icon":"spell_holy_powerinfusion"}, {"id":10621,"name":"Wolfshead Helm","icon":"inv_helmet_04"}, @@ -9824,9 +9843,11 @@ {"id":11368,"name":"Critical Mass","icon":"spell_nature_wispheal"}, {"id":11374,"name":"Gift of Arthas","icon":"spell_nature_nullifydisease"}, {"id":11426,"name":"Ice Barrier","icon":"spell_ice_lament"}, +{"id":11719,"name":"Curse of Tongues","icon":"spell_shadow_curseoftounges"}, {"id":11958,"name":"Cold Snap","icon":"spell_frost_wizardmark"}, {"id":12042,"name":"Arcane Power","icon":"spell_nature_lightning"}, {"id":12043,"name":"Presence of Mind","icon":"spell_nature_enchantarmor"}, +{"id":12051,"name":"Evocation","icon":"spell_nature_purge"}, {"id":12163,"name":"Two-Handed Weapon Specialization","icon":"inv_axe_09"}, {"id":12281,"name":"Sword Specialization","icon":"inv_sword_27"}, {"id":12282,"name":"Improved Heroic Strike","icon":"ability_rogue_ambush"}, @@ -9891,6 +9912,7 @@ {"id":12503,"name":"Arcane Mind","icon":"spell_shadow_charm"}, {"id":12518,"name":"Frost Channeling","icon":"spell_frost_stun"}, {"id":12519,"name":"Frost Channeling","icon":"spell_frost_stun"}, +{"id":12536,"name":"Clearcasting","icon":"spell_shadow_manaburn"}, {"id":12569,"name":"Permafrost","icon":"spell_frost_wisp"}, {"id":12571,"name":"Permafrost","icon":"spell_frost_wisp"}, {"id":12574,"name":"Arcane Concentration","icon":"spell_shadow_manaburn"}, @@ -10165,7 +10187,9 @@ {"id":15058,"name":"Arcane Instability","icon":"spell_shadow_teleport"}, {"id":15059,"name":"Arcane Instability","icon":"spell_shadow_teleport"}, {"id":15060,"name":"Arcane Instability","icon":"spell_shadow_teleport"}, +{"id":15235,"name":"Crystal Yield","icon":"inv_misc_gem_amethyst_01"}, {"id":15257,"name":"Shadow Weaving","icon":"spell_shadow_blackplague"}, +{"id":15258,"name":"Shadow Weaving","icon":"spell_shadow_blackplague"}, {"id":15259,"name":"Darkness","icon":"spell_shadow_twilight"}, {"id":15260,"name":"Shadow Focus","icon":"spell_shadow_burningspirit"}, {"id":15270,"name":"Spirit Tap","icon":"spell_shadow_requiem"}, @@ -10271,6 +10295,7 @@ {"id":16232,"name":"Healing Focus","icon":"spell_nature_healingwavelesser"}, {"id":16235,"name":"Ancestral Healing","icon":"spell_nature_undyingstrength"}, {"id":16236,"name":"Ancestral Fortitude","icon":"spell_nature_undyingstrength"}, +{"id":16246,"name":"Clearcasting","icon":"spell_shadow_manaburn"}, {"id":16252,"name":"Toughness","icon":"spell_holy_devotion"}, {"id":16254,"name":"Anticipation","icon":"spell_nature_mirrorimage"}, {"id":16255,"name":"Thundering Strikes","icon":"ability_thunderbolt"}, @@ -10283,6 +10308,7 @@ {"id":16268,"name":"Spirit Weapons","icon":"ability_parry"}, {"id":16271,"name":"Anticipation","icon":"spell_nature_mirrorimage"}, {"id":16272,"name":"Anticipation","icon":"spell_nature_mirrorimage"}, +{"id":16280,"name":"Flurry","icon":"ability_ghoulfrenzy"}, {"id":16281,"name":"Flurry","icon":"ability_ghoulfrenzy"}, {"id":16282,"name":"Flurry","icon":"ability_ghoulfrenzy"}, {"id":16283,"name":"Flurry","icon":"ability_ghoulfrenzy"}, @@ -10350,13 +10376,16 @@ {"id":16846,"name":"Moonglow","icon":"spell_nature_sentinal"}, {"id":16847,"name":"Moonglow","icon":"spell_nature_sentinal"}, {"id":16850,"name":"Celestial Focus","icon":"spell_arcane_starfire"}, +{"id":16857,"name":"Faerie Fire (Feral)","icon":"spell_nature_faeriefire"}, {"id":16858,"name":"Feral Aggression","icon":"classic_ability_druid_demoralizingroar"}, {"id":16859,"name":"Feral Aggression","icon":"classic_ability_druid_demoralizingroar"}, {"id":16860,"name":"Feral Aggression","icon":"classic_ability_druid_demoralizingroar"}, {"id":16861,"name":"Feral Aggression","icon":"classic_ability_druid_demoralizingroar"}, {"id":16862,"name":"Feral Aggression","icon":"classic_ability_druid_demoralizingroar"}, {"id":16864,"name":"Omen of Clarity","icon":"spell_nature_crystalball"}, +{"id":16870,"name":"Clearcasting","icon":"spell_shadow_manaburn"}, {"id":16880,"name":"Nature's Grace","icon":"spell_nature_naturesblessing"}, +{"id":16886,"name":"Nature's Grace","icon":"spell_nature_naturesblessing"}, {"id":16896,"name":"Moonfury","icon":"spell_nature_moonglow"}, {"id":16897,"name":"Moonfury","icon":"spell_nature_moonglow"}, {"id":16899,"name":"Moonfury","icon":"spell_nature_moonglow"}, @@ -10471,6 +10500,7 @@ {"id":17927,"name":"Improved Searing Pain","icon":"spell_fire_soulburn"}, {"id":17929,"name":"Improved Searing Pain","icon":"spell_fire_soulburn"}, {"id":17930,"name":"Improved Searing Pain","icon":"spell_fire_soulburn"}, +{"id":17941,"name":"Shadow Trance","icon":"spell_shadow_twilight"}, {"id":17954,"name":"Emberstorm","icon":"spell_fire_selfdestruct"}, {"id":17955,"name":"Emberstorm","icon":"spell_fire_selfdestruct"}, {"id":17956,"name":"Emberstorm","icon":"spell_fire_selfdestruct"}, @@ -10516,6 +10546,7 @@ {"id":18462,"name":"Arcane Meditation","icon":"spell_shadow_siphonmana"}, {"id":18463,"name":"Arcane Meditation","icon":"spell_shadow_siphonmana"}, {"id":18464,"name":"Arcane Meditation","icon":"spell_shadow_siphonmana"}, +{"id":18499,"name":"Berserker Rage","icon":"spell_nature_ancestralguardian"}, {"id":18530,"name":"Divine Fury","icon":"spell_holy_sealofwrath"}, {"id":18531,"name":"Divine Fury","icon":"spell_holy_sealofwrath"}, {"id":18533,"name":"Divine Fury","icon":"spell_holy_sealofwrath"}, @@ -10702,6 +10733,7 @@ {"id":20121,"name":"Conviction","icon":"spell_holy_retributionaura"}, {"id":20127,"name":"Redoubt","icon":"ability_defend"}, {"id":20130,"name":"Redoubt","icon":"ability_defend"}, +{"id":20132,"name":"Redoubt","icon":"ability_defend"}, {"id":20135,"name":"Redoubt","icon":"ability_defend"}, {"id":20138,"name":"Improved Devotion Aura","icon":"spell_holy_devotionaura"}, {"id":20139,"name":"Improved Devotion Aura","icon":"spell_holy_devotionaura"}, @@ -10711,6 +10743,7 @@ {"id":20145,"name":"Toughness","icon":"spell_holy_devotion"}, {"id":20146,"name":"Toughness","icon":"spell_holy_devotion"}, {"id":20147,"name":"Toughness","icon":"spell_holy_devotion"}, +{"id":20154,"name":"Seal of Righteousness","icon":"ability_thunderbolt"}, {"id":20174,"name":"Guardian's Favor","icon":"spell_holy_sealofprotection"}, {"id":20175,"name":"Guardian's Favor","icon":"spell_holy_sealofprotection"}, {"id":20177,"name":"Reckoning","icon":"spell_holy_blessingofstrength"}, @@ -10718,6 +10751,7 @@ {"id":20180,"name":"Reckoning","icon":"spell_holy_blessingofstrength"}, {"id":20181,"name":"Reckoning","icon":"spell_holy_blessingofstrength"}, {"id":20182,"name":"Reckoning","icon":"spell_holy_blessingofstrength"}, +{"id":20187,"name":"Judgement of Righteousness","icon":"ability_thunderbolt"}, {"id":20196,"name":"One-Handed Weapon Specialization","icon":"inv_sword_20"}, {"id":20197,"name":"One-Handed Weapon Specialization","icon":"inv_sword_20"}, {"id":20198,"name":"One-Handed Weapon Specialization","icon":"inv_sword_20"}, @@ -10766,6 +10800,8 @@ {"id":20360,"name":"Sanctified Light","icon":"spell_holy_healingaura"}, {"id":20361,"name":"Sanctified Light","icon":"spell_holy_healingaura"}, {"id":20375,"name":"Seal of Command","icon":"ability_warrior_innerrage"}, +{"id":20424,"name":"Seal of Command","icon":"ability_warrior_innerrage"}, +{"id":20467,"name":"Judgement of Command","icon":"ability_warrior_innerrage"}, {"id":20468,"name":"Improved Righteous Fury","icon":"spell_holy_sealoffury"}, {"id":20469,"name":"Improved Righteous Fury","icon":"spell_holy_sealoffury"}, {"id":20470,"name":"Improved Righteous Fury","icon":"spell_holy_sealoffury"}, @@ -10783,7 +10819,10 @@ {"id":20895,"name":"Spirit Bond","icon":"classic_ability_druid_demoralizingroar"}, {"id":20911,"name":"Blessing of Sanctuary","icon":"spell_nature_lightningshield"}, {"id":20925,"name":"Holy Shield","icon":"classic_spell_holy_blessingofprotection"}, +{"id":21084,"name":"Seal of Righteousness","icon":"ability_thunderbolt"}, {"id":22779,"name":"Biznicks 247x128 Accurascope","icon":"trade_engineering"}, +{"id":22812,"name":"Barkskin","icon":"spell_nature_stoneclawtotem"}, +{"id":22842,"name":"Frenzied Regeneration","icon":"ability_bullrush"}, {"id":23145,"name":"Dive","icon":"spell_shadow_burningspirit"}, {"id":23584,"name":"Dual Wield Specialization","icon":"ability_dualwield"}, {"id":23585,"name":"Dual Wield Specialization","icon":"ability_dualwield"}, @@ -10823,7 +10862,10 @@ {"id":25080,"name":"Enchant Gloves - Superior Agility","icon":"inv_enchant_formulasuperior_01"}, {"id":25084,"name":"Enchant Cloak - Subtlety","icon":"inv_enchant_formulasuperior_01"}, {"id":25086,"name":"Enchant Cloak - Dodge","icon":"inv_enchant_formulasuperior_01"}, +{"id":25203,"name":"Demoralizing Shout","icon":"ability_warrior_warcry"}, {"id":25618,"name":"Jade Pendant of Blasting","icon":"inv_jewelry_necklace_01"}, +{"id":25771,"name":"Forbearance","icon":"spell_holy_removecurse"}, +{"id":25780,"name":"Righteous Fury","icon":"spell_holy_sealoffury"}, {"id":25829,"name":"Holy Power","icon":"spell_holy_power"}, {"id":25836,"name":"Unyielding Faith","icon":"spell_holy_unyieldingfaith"}, {"id":25898,"name":"Greater Blessing of Kings","icon":"spell_magic_greaterblessingofkings"}, @@ -10836,6 +10878,7 @@ {"id":26023,"name":"Pursuit of Justice","icon":"spell_holy_persuitofjustice"}, {"id":26279,"name":"Stormshroud Gloves","icon":"inv_gauntlets_05"}, {"id":26982,"name":"Rejuvenation","icon":"spell_nature_rejuvenation"}, +{"id":27013,"name":"Insect Swarm","icon":"spell_nature_insectswarm"}, {"id":27789,"name":"Holy Reach","icon":"spell_holy_purify"}, {"id":27790,"name":"Holy Reach","icon":"spell_holy_purify"}, {"id":27811,"name":"Blessed Recovery","icon":"spell_holy_blessedrecovery"}, @@ -10988,6 +11031,7 @@ {"id":30678,"name":"Lightning Overload","icon":"spell_nature_lightningoverload"}, {"id":30679,"name":"Lightning Overload","icon":"spell_nature_lightningoverload"}, {"id":30706,"name":"Totem of Wrath","icon":"spell_fire_totemofwrath"}, +{"id":30708,"name":"Totem of Wrath","icon":"spell_fire_totemofwrath"}, {"id":30798,"name":"Dual Wield","icon":"ability_dualwield"}, {"id":30802,"name":"Unleashed Rage","icon":"spell_nature_unleashedrage"}, {"id":30808,"name":"Unleashed Rage","icon":"spell_nature_unleashedrage"}, @@ -11101,6 +11145,9 @@ {"id":31683,"name":"Empowered Frostbolt","icon":"spell_frost_frostbolt02"}, {"id":31687,"name":"Summon Water Elemental","icon":"spell_frost_summonwaterelemental_2"}, {"id":31785,"name":"Spiritual Attunement","icon":"spell_holy_revivechampion"}, +{"id":31801,"name":"Seal of Vengeance","icon":"spell_holy_sealofvengeance"}, +{"id":31803,"name":"Holy Vengeance","icon":"spell_holy_sealofvengeance"}, +{"id":31804,"name":"Judgement of Vengeance","icon":"spell_holy_sealofvengeance"}, {"id":31821,"name":"Aura Mastery","icon":"spell_holy_auramastery"}, {"id":31822,"name":"Pure of Heart","icon":"spell_holy_pureofheart"}, {"id":31823,"name":"Pure of Heart","icon":"spell_holy_pureofheart"}, @@ -11140,6 +11187,7 @@ {"id":31879,"name":"Fanaticism","icon":"spell_holy_fanaticism"}, {"id":31880,"name":"Fanaticism","icon":"spell_holy_fanaticism"}, {"id":31881,"name":"Fanaticism","icon":"spell_holy_fanaticism"}, +{"id":31884,"name":"Avenging Wrath","icon":"spell_holy_avenginewrath"}, {"id":31935,"name":"Avenger's Shield","icon":"spell_holy_avengersshield"}, {"id":32043,"name":"Sanctity of Battle","icon":"spell_holy_holysmite"}, {"id":32381,"name":"Empowered Corruption","icon":"spell_shadow_abominationexplosion"}, @@ -11212,7 +11260,6 @@ {"id":33867,"name":"Predatory Instincts","icon":"ability_druid_predatoryinstincts"}, {"id":33872,"name":"Nurturing Instinct","icon":"ability_druid_healinginstincts"}, {"id":33873,"name":"Nurturing Instinct","icon":"ability_druid_healinginstincts"}, -{"id":33876,"name":"Mangle (Cat)","icon":"ability_druid_mangle2"}, {"id":33879,"name":"Empowered Touch","icon":"ability_druid_empoweredtouch"}, {"id":33880,"name":"Empowered Touch","icon":"ability_druid_empoweredtouch"}, {"id":33881,"name":"Natural Perfection","icon":"ability_druid_naturalperfection"}, @@ -11240,6 +11287,7 @@ {"id":34007,"name":"Enchant Boots - Cat's Swiftness","icon":"inv_enchant_formulasuperior_01"}, {"id":34008,"name":"Enchant Boots - Boar's Speed","icon":"inv_enchant_formulasuperior_01"}, {"id":34009,"name":"Enchant Shield - Major Stamina","icon":"inv_misc_note_01"}, +{"id":34074,"name":"Aspect of the Viper","icon":"ability_hunter_aspectoftheviper"}, {"id":34151,"name":"Living Spirit","icon":"spell_nature_giftofthewaterspirit"}, {"id":34152,"name":"Living Spirit","icon":"spell_nature_giftofthewaterspirit"}, {"id":34153,"name":"Living Spirit","icon":"spell_nature_giftofthewaterspirit"}, @@ -11343,6 +11391,7 @@ {"id":35691,"name":"Demonic Knowledge","icon":"spell_shadow_improvedvampiricembrace"}, {"id":35692,"name":"Demonic Knowledge","icon":"spell_shadow_improvedvampiricembrace"}, {"id":35693,"name":"Demonic Knowledge","icon":"spell_shadow_improvedvampiricembrace"}, +{"id":36032,"name":"Arcane Blast","icon":"spell_arcane_blast"}, {"id":36256,"name":"Embrace of the Twisting Nether","icon":"inv_chest_chain_17"}, {"id":36257,"name":"Bulwark of the Ancient Kings","icon":"inv_chest_plate16"}, {"id":36390,"name":"Red Belt of Battle","icon":"inv_belt_13"}, @@ -11366,7 +11415,19 @@ {"id":41206,"name":"Mantle of Nimble Thought","icon":"inv_shoulder_02"}, {"id":41207,"name":"Swiftheal Wraps","icon":"inv_bracer_13"}, {"id":41208,"name":"Swiftheal Mantle","icon":"inv_shoulder_25"}, +{"id":42463,"name":"Seal of Vengeance","icon":"spell_holy_sealofvengeance"}, {"id":42620,"name":"Enchant Weapon - Greater Agility","icon":"inv_misc_note_01"}, +{"id":42650,"name":"Army of the Dead","icon":"spell_deathknight_armyofthedead"}, +{"id":42833,"name":"Fireball","icon":"spell_fire_flamebolt"}, +{"id":42842,"name":"Frostbolt","icon":"spell_frost_frostbolt02"}, +{"id":42846,"name":"Arcane Missiles","icon":"spell_nature_starfall"}, +{"id":42859,"name":"Scorch","icon":"spell_fire_soulburn"}, +{"id":42873,"name":"Fire Blast","icon":"spell_fire_fireball"}, +{"id":42897,"name":"Arcane Blast","icon":"spell_arcane_blast"}, +{"id":42914,"name":"Ice Lance","icon":"spell_frost_frostblast"}, +{"id":42921,"name":"Arcane Explosion","icon":"spell_nature_wispsplode"}, +{"id":42926,"name":"Flamestrike","icon":"spell_fire_selfdestruct"}, +{"id":42939,"name":"Blizzard","icon":"spell_frost_icestorm"}, {"id":42974,"name":"Enchant Weapon - Executioner","icon":"inv_enchant_formulasuperior_01"}, {"id":43002,"name":"Arcane Brilliance","icon":"spell_holy_arcaneintellect"}, {"id":43338,"name":"Shamanistic Focus","icon":"spell_nature_elementalabsorption"}, @@ -11380,6 +11441,7 @@ {"id":44398,"name":"Student of the Mind","icon":"ability_mage_studentofthemind"}, {"id":44399,"name":"Student of the Mind","icon":"ability_mage_studentofthemind"}, {"id":44400,"name":"Netherwind Presence","icon":"ability_mage_netherwindpresence"}, +{"id":44401,"name":"Missile Barrage","icon":"ability_mage_missilebarrage"}, {"id":44402,"name":"Netherwind Presence","icon":"ability_mage_netherwindpresence"}, {"id":44403,"name":"Netherwind Presence","icon":"ability_mage_netherwindpresence"}, {"id":44404,"name":"Missile Barrage","icon":"ability_mage_missilebarrage"}, @@ -11454,6 +11516,7 @@ {"id":45234,"name":"Focused Will","icon":"spell_arcane_focusedpower"}, {"id":45243,"name":"Focused Will","icon":"spell_arcane_focusedpower"}, {"id":45244,"name":"Focused Will","icon":"spell_arcane_focusedpower"}, +{"id":45529,"name":"Blood Tap","icon":"spell_deathknight_bloodtap"}, {"id":46106,"name":"Wonderheal XT68 Shades","icon":"inv_gizmo_newgoggles"}, {"id":46107,"name":"Justicebringer 3000 Specs","icon":"inv_gizmo_newgoggles"}, {"id":46108,"name":"Powerheal 9000 Lens","icon":"inv_gizmo_newgoggles"}, @@ -11488,6 +11551,7 @@ {"id":46142,"name":"Sunblessed Breastplate","icon":"inv_chest_plate02"}, {"id":46144,"name":"Hard Khorium Battleplate","icon":"inv_chest_plate11"}, {"id":46578,"name":"Enchant Weapon - Deathfrost","icon":"inv_enchant_formulasuperior_01"}, +{"id":46584,"name":"Raise Dead","icon":"spell_shadow_animatedead"}, {"id":46594,"name":"Enchant Chest - Defense","icon":"inv_misc_note_01"}, {"id":46854,"name":"Trauma","icon":"ability_warrior_bloodnova"}, {"id":46855,"name":"Trauma","icon":"ability_warrior_bloodnova"}, @@ -11503,6 +11567,7 @@ {"id":46913,"name":"Bloodsurge","icon":"ability_warrior_bloodsurge"}, {"id":46914,"name":"Bloodsurge","icon":"ability_warrior_bloodsurge"}, {"id":46915,"name":"Bloodsurge","icon":"ability_warrior_bloodsurge"}, +{"id":46916,"name":"Slam!","icon":"ability_warrior_bloodsurge"}, {"id":46917,"name":"Titan's Grip","icon":"ability_warrior_titansgrip"}, {"id":46924,"name":"Bladestorm","icon":"ability_warrior_bladestorm"}, {"id":46945,"name":"Safeguard","icon":"ability_warrior_safeguard"}, @@ -11551,7 +11616,13 @@ {"id":47436,"name":"Battle Shout","icon":"ability_warrior_battleshout"}, {"id":47437,"name":"Demoralizing Shout","icon":"ability_warrior_warcry"}, {"id":47440,"name":"Commanding Shout","icon":"ability_warrior_rallyingcry"}, +{"id":47450,"name":"Heroic Strike","icon":"ability_rogue_ambush"}, +{"id":47465,"name":"Rend","icon":"ability_gouge"}, {"id":47467,"name":"Sunder Armor","icon":"ability_warrior_sunder"}, +{"id":47471,"name":"Execute","icon":"inv_sword_48"}, +{"id":47475,"name":"Slam","icon":"ability_warrior_decisivestrike"}, +{"id":47488,"name":"Shield Slam","icon":"inv_shield_05"}, +{"id":47498,"name":"Devastate","icon":"inv_sword_11"}, {"id":47502,"name":"Thunder Clap","icon":"spell_nature_thunderclap"}, {"id":47507,"name":"Aspiration","icon":"spell_holy_aspiration"}, {"id":47508,"name":"Aspiration","icon":"spell_holy_aspiration"}, @@ -11560,6 +11631,7 @@ {"id":47515,"name":"Divine Aegis","icon":"spell_holy_devineaegis"}, {"id":47516,"name":"Grace","icon":"spell_holy_hopeandgrace"}, {"id":47517,"name":"Grace","icon":"spell_holy_hopeandgrace"}, +{"id":47528,"name":"Mind Freeze","icon":"spell_deathknight_mindfreeze"}, {"id":47535,"name":"Rapture","icon":"spell_holy_rapture"}, {"id":47536,"name":"Rapture","icon":"spell_holy_rapture"}, {"id":47537,"name":"Rapture","icon":"spell_holy_rapture"}, @@ -11572,6 +11644,7 @@ {"id":47565,"name":"Divine Providence","icon":"spell_holy_divineprovidence"}, {"id":47566,"name":"Divine Providence","icon":"spell_holy_divineprovidence"}, {"id":47567,"name":"Divine Providence","icon":"spell_holy_divineprovidence"}, +{"id":47568,"name":"Empower Rune Weapon","icon":"inv_sword_62"}, {"id":47569,"name":"Improved Shadowform","icon":"spell_shadow_summonvoidwalker"}, {"id":47570,"name":"Improved Shadowform","icon":"spell_shadow_summonvoidwalker"}, {"id":47573,"name":"Twisted Faith","icon":"spell_shadow_mindtwisting"}, @@ -11584,20 +11657,47 @@ {"id":47586,"name":"Twin Disciplines","icon":"spell_holy_sealofvengeance"}, {"id":47587,"name":"Twin Disciplines","icon":"spell_holy_sealofvengeance"}, {"id":47588,"name":"Twin Disciplines","icon":"spell_holy_sealofvengeance"}, +{"id":47610,"name":"Frostfire Bolt","icon":"ability_mage_frostfirebolt"}, {"id":47672,"name":"Enchant Cloak - Mighty Armor","icon":"inv_enchant_formulagood_01"}, {"id":47766,"name":"Enchant Chest - Greater Defense","icon":"inv_enchant_formulagood_01"}, {"id":47788,"name":"Guardian Spirit","icon":"spell_holy_guardianspirit"}, +{"id":47809,"name":"Shadow Bolt","icon":"spell_shadow_shadowbolt"}, +{"id":47811,"name":"Immolate","icon":"spell_fire_immolation"}, +{"id":47813,"name":"Corruption","icon":"spell_shadow_abominationexplosion"}, +{"id":47815,"name":"Searing Pain","icon":"spell_fire_soulburn"}, +{"id":47825,"name":"Soul Fire","icon":"spell_fire_fireball02"}, +{"id":47836,"name":"Seed of Corruption","icon":"spell_shadow_seedofdestruction"}, +{"id":47838,"name":"Incinerate","icon":"spell_fire_burnout"}, +{"id":47843,"name":"Unstable Affliction","icon":"spell_shadow_unstableaffliction_3"}, +{"id":47855,"name":"Drain Soul","icon":"spell_shadow_haunting"}, +{"id":47864,"name":"Curse of Agony","icon":"spell_shadow_curseofsargeras"}, {"id":47865,"name":"Curse of the Elements","icon":"spell_shadow_chilltouch"}, +{"id":47867,"name":"Curse of Doom","icon":"spell_shadow_auraofdarkness"}, {"id":47898,"name":"Enchant Cloak - Greater Speed","icon":"inv_enchant_formulagood_01"}, {"id":47899,"name":"Enchant Cloak - Wisdom","icon":"inv_enchant_formulagood_01"}, {"id":47900,"name":"Enchant Chest - Super Health","icon":"trade_engraving"}, {"id":47901,"name":"Enchant Boots - Tuskarr's Vitality","icon":"inv_enchant_formulagood_01"}, {"id":47982,"name":"Blood Pact","icon":"spell_shadow_bloodboil"}, +{"id":48063,"name":"Greater Heal","icon":"spell_holy_greaterheal"}, +{"id":48066,"name":"Power Word: Shield","icon":"spell_holy_powerwordshield"}, +{"id":48068,"name":"Renew","icon":"spell_holy_renew"}, +{"id":48071,"name":"Flash Heal","icon":"spell_holy_flashheal"}, +{"id":48072,"name":"Prayer of Healing","icon":"spell_holy_prayerofhealing02"}, {"id":48073,"name":"Divine Spirit","icon":"spell_holy_divinespirit"}, +{"id":48113,"name":"Prayer of Mending","icon":"spell_holy_prayerofmendingtga"}, +{"id":48120,"name":"Binding Heal","icon":"spell_holy_blindingheal"}, +{"id":48125,"name":"Shadow Word: Pain","icon":"spell_shadow_shadowwordpain"}, +{"id":48127,"name":"Mind Blast","icon":"spell_shadow_unholyfrenzy"}, +{"id":48156,"name":"Mind Flay","icon":"spell_shadow_siphonmana"}, +{"id":48158,"name":"Shadow Word: Death","icon":"spell_shadow_demonicfortitude"}, {"id":48160,"name":"Vampiric Touch","icon":"spell_holy_stoicism"}, {"id":48161,"name":"Power Word: Fortitude","icon":"spell_holy_wordfortitude"}, {"id":48170,"name":"Prayer of Shadow Protection","icon":"spell_holy_prayerofshadowprotection"}, {"id":48181,"name":"Haunt","icon":"ability_warlock_haunt"}, +{"id":48263,"name":"Frost Presence","icon":"spell_deathknight_frostpresence"}, +{"id":48265,"name":"Unholy Presence","icon":"spell_deathknight_unholypresence"}, +{"id":48300,"name":"Devouring Plague","icon":"spell_shadow_devouringplague"}, +{"id":48301,"name":"Mind Trauma","icon":"spell_shadow_unholyfrenzy"}, {"id":48384,"name":"Improved Moonkin Form","icon":"ability_druid_improvedmoonkinform"}, {"id":48389,"name":"Owlkin Frenzy","icon":"ability_druid_owlkinfrenzy"}, {"id":48392,"name":"Owlkin Frenzy","icon":"ability_druid_owlkinfrenzy"}, @@ -11612,7 +11712,14 @@ {"id":48433,"name":"Rend and Tear","icon":"ability_druid_primalagression"}, {"id":48434,"name":"Rend and Tear","icon":"ability_druid_primalagression"}, {"id":48438,"name":"Wild Growth","icon":"ability_druid_flourish"}, +{"id":48461,"name":"Wrath","icon":"spell_nature_abolishmagic"}, +{"id":48463,"name":"Moonfire","icon":"spell_nature_starfall"}, +{"id":48465,"name":"Starfire","icon":"spell_arcane_starfire"}, +{"id":48467,"name":"Hurricane","icon":"spell_nature_cyclone"}, +{"id":48468,"name":"Insect Swarm","icon":"spell_nature_insectswarm"}, {"id":48470,"name":"Gift of the Wild","icon":"spell_nature_giftofthewild"}, +{"id":48477,"name":"Rebirth","icon":"spell_nature_reincarnation"}, +{"id":48480,"name":"Maul","icon":"ability_druid_maul"}, {"id":48483,"name":"Infected Wounds","icon":"ability_druid_infectedwound"}, {"id":48484,"name":"Infected Wounds","icon":"ability_druid_infectedwound"}, {"id":48485,"name":"Infected Wounds","icon":"ability_druid_infectedwound"}, @@ -11631,6 +11738,8 @@ {"id":48511,"name":"Earth and Moon","icon":"ability_druid_earthandsky"}, {"id":48514,"name":"Gale Winds","icon":"ability_druid_galewinds"}, {"id":48516,"name":"Eclipse","icon":"ability_druid_eclipse"}, +{"id":48517,"name":"Eclipse (Solar)","icon":"ability_druid_eclipseorange"}, +{"id":48518,"name":"Eclipse (Lunar)","icon":"ability_druid_eclipse"}, {"id":48521,"name":"Eclipse","icon":"ability_druid_eclipse"}, {"id":48525,"name":"Eclipse","icon":"ability_druid_eclipse"}, {"id":48532,"name":"Improved Mangle","icon":"ability_druid_mangle2"}, @@ -11641,9 +11750,36 @@ {"id":48544,"name":"Revitalize","icon":"ability_druid_replenish"}, {"id":48545,"name":"Revitalize","icon":"ability_druid_replenish"}, {"id":48560,"name":"Demoralizing Roar","icon":"classic_ability_druid_demoralizingroar"}, +{"id":48562,"name":"Swipe (Bear)","icon":"inv_misc_monsterclaw_03"}, +{"id":48564,"name":"Mangle (Bear)","icon":"ability_druid_mangle2"}, +{"id":48566,"name":"Mangle (Cat)","icon":"ability_druid_mangle2"}, +{"id":48568,"name":"Lacerate","icon":"ability_druid_lacerate"}, +{"id":48572,"name":"Shred","icon":"spell_shadow_vampiricaura"}, +{"id":48574,"name":"Rake","icon":"ability_druid_disembowel"}, +{"id":48577,"name":"Ferocious Bite","icon":"ability_druid_ferociousbite"}, +{"id":48638,"name":"Sinister Strike","icon":"spell_shadow_ritualofsacrifice"}, +{"id":48657,"name":"Backstab","icon":"ability_backstab"}, +{"id":48659,"name":"Feint","icon":"ability_rogue_feint"}, +{"id":48660,"name":"Hemorrhage","icon":"spell_shadow_lifedrain"}, +{"id":48664,"name":"Mutilate","icon":"ability_dualwield"}, +{"id":48665,"name":"Mutilate","icon":"ability_dualwield"}, +{"id":48666,"name":"Mutilate","icon":"ability_rogue_shadowstrikes"}, +{"id":48668,"name":"Eviscerate","icon":"ability_rogue_eviscerate"}, +{"id":48672,"name":"Rupture","icon":"ability_rogue_rupture"}, +{"id":48676,"name":"Garrote","icon":"ability_rogue_garrote"}, +{"id":48691,"name":"Ambush","icon":"ability_rogue_ambush"}, +{"id":48707,"name":"Anti-Magic Shell","icon":"spell_shadow_antimagicshell"}, +{"id":48743,"name":"Death Pact","icon":"spell_shadow_deathpact"}, +{"id":48792,"name":"Icebound Fortitude","icon":"spell_deathknight_iceboundfortitude"}, +{"id":48801,"name":"Exorcism","icon":"spell_holy_excorcism_02"}, +{"id":48806,"name":"Hammer of Wrath","icon":"ability_thunderclap"}, +{"id":48817,"name":"Holy Wrath","icon":"spell_holy_excorcism"}, +{"id":48819,"name":"Consecration","icon":"spell_holy_innerfire"}, +{"id":48827,"name":"Avenger's Shield","icon":"spell_holy_avengersshield"}, {"id":48934,"name":"Greater Blessing of Might","icon":"spell_holy_greaterblessingofkings"}, {"id":48938,"name":"Greater Blessing of Wisdom","icon":"spell_holy_greaterblessingofwisdom"}, {"id":48942,"name":"Devotion Aura","icon":"spell_holy_devotionaura"}, +{"id":48952,"name":"Holy Shield","icon":"classic_spell_holy_blessingofprotection"}, {"id":48962,"name":"Virulence","icon":"spell_shadow_burningspirit"}, {"id":48963,"name":"Morbidity","icon":"spell_shadow_deathanddecay"}, {"id":48965,"name":"Ravenous Dead","icon":"spell_deathknight_gnaw_ghoul"}, @@ -11654,7 +11790,9 @@ {"id":48985,"name":"Improved Rune Tap","icon":"spell_deathknight_runetap"}, {"id":48987,"name":"Dark Conviction","icon":"spell_deathknight_darkconviction"}, {"id":48988,"name":"Bloody Vengeance","icon":"ability_backstab"}, +{"id":48996,"name":"Raptor Strike","icon":"ability_meleedamage"}, {"id":48997,"name":"Subversion","icon":"spell_deathknight_subversion"}, +{"id":49001,"name":"Serpent Sting","icon":"ability_hunter_quickshot"}, {"id":49004,"name":"Scent of Blood","icon":"ability_rogue_bloodyeye"}, {"id":49005,"name":"Mark of Blood","icon":"ability_hunter_rapidkilling"}, {"id":49006,"name":"Veteran of the Third War","icon":"spell_misc_warsongfocus"}, @@ -11670,6 +11808,12 @@ {"id":49036,"name":"Epidemic","icon":"spell_shadow_shadowwordpain"}, {"id":49039,"name":"Lichborne","icon":"spell_shadow_raisedead"}, {"id":49042,"name":"Toughness","icon":"spell_holy_devotion"}, +{"id":49045,"name":"Arcane Shot","icon":"ability_impalingbolt"}, +{"id":49048,"name":"Multi-Shot","icon":"ability_upgrademoonglaive"}, +{"id":49050,"name":"Aimed Shot","icon":"inv_spear_07"}, +{"id":49052,"name":"Steady Shot","icon":"ability_hunter_steadyshot"}, +{"id":49067,"name":"Explosive Trap","icon":"spell_fire_selfdestruct"}, +{"id":49071,"name":"Aspect of the Wild","icon":"spell_nature_protectionformnature"}, {"id":49137,"name":"Endless Winter","icon":"spell_shadow_twilight"}, {"id":49140,"name":"Black Ice","icon":"spell_shadow_darkritual"}, {"id":49143,"name":"Frost Strike","icon":"spell_deathknight_empowerruneblade2"}, @@ -11696,6 +11840,14 @@ {"id":49223,"name":"Dirge","icon":"spell_shadow_shadesofdarkness"}, {"id":49224,"name":"Magic Suppression","icon":"spell_shadow_antimagicshell"}, {"id":49226,"name":"Nerves of Cold Steel","icon":"ability_dualwield"}, +{"id":49231,"name":"Earth Shock","icon":"spell_nature_earthshock"}, +{"id":49233,"name":"Flame Shock","icon":"spell_fire_flameshock"}, +{"id":49236,"name":"Frost Shock","icon":"spell_frost_frostshock"}, +{"id":49238,"name":"Lightning Bolt","icon":"spell_nature_lightning"}, +{"id":49271,"name":"Chain Lightning","icon":"spell_nature_chainlightning"}, +{"id":49273,"name":"Healing Wave","icon":"spell_nature_magicimmunity"}, +{"id":49276,"name":"Lesser Healing Wave","icon":"spell_nature_healingwavelesser"}, +{"id":49284,"name":"Earth Shield","icon":"spell_nature_skinofearth"}, {"id":49377,"name":"Feral Charge","icon":"ability_hunter_pet_bear"}, {"id":49390,"name":"Bladed Armor","icon":"inv_shoulder_36"}, {"id":49391,"name":"Bladed Armor","icon":"inv_shoulder_36"}, @@ -11765,6 +11917,13 @@ {"id":49790,"name":"Glacier Rot","icon":"spell_nature_removedisease"}, {"id":49791,"name":"Glacier Rot","icon":"spell_nature_removedisease"}, {"id":49796,"name":"Deathchill","icon":"spell_shadow_soulleech_2"}, +{"id":49800,"name":"Rip","icon":"ability_ghoulfrenzy"}, +{"id":49895,"name":"Death Coil","icon":"spell_shadow_deathcoil"}, +{"id":49921,"name":"Plague Strike","icon":"spell_deathknight_empowerruneblade"}, +{"id":49924,"name":"Death Strike","icon":"spell_deathknight_butcher2"}, +{"id":49930,"name":"Blood Strike","icon":"spell_deathknight_deathstrike"}, +{"id":49938,"name":"Death and Decay","icon":"spell_shadow_deathanddecay"}, +{"id":49941,"name":"Blood Boil","icon":"spell_deathknight_bloodboil"}, {"id":50029,"name":"Veteran of the Third War","icon":"spell_misc_warsongfocus"}, {"id":50031,"name":"Improved Icy Touch","icon":"spell_deathknight_icetouch"}, {"id":50033,"name":"Death Rune Mastery","icon":"inv_sword_62"}, @@ -11793,6 +11952,7 @@ {"id":50187,"name":"Guile of Gorefiend","icon":"inv-sword_53"}, {"id":50190,"name":"Guile of Gorefiend","icon":"inv-sword_53"}, {"id":50191,"name":"Guile of Gorefiend","icon":"inv-sword_53"}, +{"id":50213,"name":"Tiger's Fury","icon":"ability_mount_jungletiger"}, {"id":50334,"name":"Berserk","icon":"ability_druid_berserk"}, {"id":50365,"name":"Improved Blood Presence","icon":"spell_deathknight_bloodpresence"}, {"id":50371,"name":"Improved Blood Presence","icon":"spell_deathknight_bloodpresence"}, @@ -11800,13 +11960,19 @@ {"id":50385,"name":"Improved Frost Presence","icon":"spell_deathknight_frostpresence"}, {"id":50391,"name":"Improved Unholy Presence","icon":"spell_deathknight_unholypresence"}, {"id":50392,"name":"Improved Unholy Presence","icon":"spell_deathknight_unholypresence"}, +{"id":50449,"name":"Bloody Vengeance","icon":"spell_deathknight_butcher"}, +{"id":50463,"name":"Blood-Caked Strike","icon":"ability_creature_poison_01"}, {"id":50511,"name":"Curse of Weakness","icon":"spell_shadow_curseofmannoroth"}, {"id":50516,"name":"Typhoon","icon":"ability_druid_typhoon"}, +{"id":50526,"name":"Wandering Plague","icon":"spell_shadow_callofbone"}, +{"id":50536,"name":"Unholy Blight","icon":"spell_shadow_contagion"}, {"id":50685,"name":"Incite","icon":"ability_warrior_incite"}, {"id":50686,"name":"Incite","icon":"ability_warrior_incite"}, {"id":50687,"name":"Incite","icon":"ability_warrior_incite"}, +{"id":50689,"name":"Blood Presence","icon":"spell_deathknight_bloodpresence"}, {"id":50720,"name":"Vigilance","icon":"ability_warrior_vigilance"}, {"id":50796,"name":"Chaos Bolt","icon":"ability_warlock_chaosbolt"}, +{"id":50842,"name":"Pestilence","icon":"spell_shadow_plaguecloud"}, {"id":50880,"name":"Icy Talons","icon":"spell_deathknight_icytalons"}, {"id":50884,"name":"Icy Talons","icon":"spell_deathknight_icytalons"}, {"id":50885,"name":"Icy Talons","icon":"spell_deathknight_icytalons"}, @@ -11844,8 +12010,10 @@ {"id":51268,"name":"Rend and Tear","icon":"ability_druid_primalagression"}, {"id":51269,"name":"Rend and Tear","icon":"ability_druid_primalagression"}, {"id":51271,"name":"Unbreakable Armor","icon":"inv_armor_helm_plate_naxxramas_raidwarrior_c_01"}, +{"id":51425,"name":"Obliterate","icon":"spell_deathknight_classicon"}, {"id":51456,"name":"Improved Icy Touch","icon":"spell_deathknight_icetouch"}, {"id":51459,"name":"Necrosis","icon":"inv_weapon_shortblade_60"}, +{"id":51460,"name":"Necrosis","icon":"spell_shadow_blackplague"}, {"id":51462,"name":"Necrosis","icon":"inv_weapon_shortblade_60"}, {"id":51463,"name":"Necrosis","icon":"inv_weapon_shortblade_60"}, {"id":51464,"name":"Necrosis","icon":"inv_weapon_shortblade_60"}, @@ -11932,6 +12100,7 @@ {"id":51711,"name":"Slaughter from the Shadows","icon":"ability_rogue_slaughterfromtheshadows"}, {"id":51712,"name":"Slaughter from the Shadows","icon":"ability_rogue_slaughterfromtheshadows"}, {"id":51713,"name":"Shadow Dance","icon":"ability_rogue_shadowdance"}, +{"id":51723,"name":"Fan of Knives","icon":"ability_rogue_fanofknives"}, {"id":51745,"name":"Vicious Strikes","icon":"spell_deathknight_plaguestrike"}, {"id":51746,"name":"Vicious Strikes","icon":"spell_deathknight_plaguestrike"}, {"id":51881,"name":"Improved Shields","icon":"spell_nature_lightningshield"}, @@ -11939,14 +12108,18 @@ {"id":51884,"name":"Mental Dexterity","icon":"spell_nature_bloodlust"}, {"id":51885,"name":"Mental Dexterity","icon":"spell_nature_bloodlust"}, {"id":51886,"name":"Cleanse Spirit","icon":"ability_shaman_cleansespirit"}, +{"id":52042,"name":"Healing Stream Totem","icon":"spell_holy_stoicism"}, {"id":52143,"name":"Master of Ghouls","icon":"spell_shadow_animatedead"}, {"id":52234,"name":"Cornered","icon":"ability_hunter_survivalinstincts"}, {"id":52456,"name":"Enhancing Totems","icon":"spell_nature_earthbindtotem"}, +{"id":52610,"name":"Savage Roar","icon":"ability_druid_skinteeth"}, +{"id":52752,"name":"Ancestral Awakening","icon":"spell_shaman_ancestralawakening"}, {"id":52783,"name":"Improved Tracking","icon":"ability_hunter_improvedtracking"}, {"id":52785,"name":"Improved Tracking","icon":"ability_hunter_improvedtracking"}, {"id":52786,"name":"Improved Tracking","icon":"ability_hunter_improvedtracking"}, {"id":52787,"name":"Improved Tracking","icon":"ability_hunter_improvedtracking"}, {"id":52788,"name":"Improved Tracking","icon":"ability_hunter_improvedtracking"}, +{"id":52789,"name":"Visual Dummy","icon":"spell_deathknight_icetouch"}, {"id":52795,"name":"Borrowed Time","icon":"spell_holy_borrowedtime"}, {"id":52797,"name":"Borrowed Time","icon":"spell_holy_borrowedtime"}, {"id":52798,"name":"Borrowed Time","icon":"spell_holy_borrowedtime"}, @@ -11955,6 +12128,8 @@ {"id":52802,"name":"Twin Disciplines","icon":"spell_holy_sealofvengeance"}, {"id":52803,"name":"Twin Disciplines","icon":"spell_holy_sealofvengeance"}, {"id":52858,"name":"Culling the Herd","icon":"inv_misc_monsterhorn_06"}, +{"id":53007,"name":"Penance","icon":"spell_holy_penance"}, +{"id":53023,"name":"Mind Sear","icon":"spell_shadow_mindshear"}, {"id":53137,"name":"Abomination's Might","icon":"ability_warrior_intensifyrage"}, {"id":53138,"name":"Abomination's Might","icon":"ability_warrior_intensifyrage"}, {"id":53175,"name":"Pet Barding","icon":"inv_helmet_94"}, @@ -11968,6 +12143,8 @@ {"id":53184,"name":"Spiked Collar","icon":"inv_jewelry_necklace_22"}, {"id":53186,"name":"Bloodthirsty","icon":"ability_druid_primaltenacity"}, {"id":53187,"name":"Bloodthirsty","icon":"ability_druid_primaltenacity"}, +{"id":53190,"name":"Starfall","icon":"ability_druid_starfall"}, +{"id":53201,"name":"Starfall","icon":"ability_druid_starfall"}, {"id":53203,"name":"Spider's Bite","icon":"ability_hunter_pet_spider"}, {"id":53204,"name":"Spider's Bite","icon":"ability_hunter_pet_spider"}, {"id":53205,"name":"Spider's Bite","icon":"ability_hunter_pet_spider"}, @@ -12025,6 +12202,7 @@ {"id":53381,"name":"Righteous Vengeance","icon":"ability_paladin_righteousvengeance"}, {"id":53382,"name":"Righteous Vengeance","icon":"ability_paladin_righteousvengeance"}, {"id":53385,"name":"Divine Storm","icon":"ability_paladin_divinestorm"}, +{"id":53390,"name":"Tidal Waves","icon":"spell_shaman_tidalwaves"}, {"id":53401,"name":"Rabid","icon":"ability_druid_berserk"}, {"id":53408,"name":"Judgement of Wisdom","icon":"ability_paladin_judgementblue"}, {"id":53409,"name":"Lionhearted","icon":"inv_bannerpvp_02"}, @@ -12091,6 +12269,7 @@ {"id":53711,"name":"Shield of the Templar","icon":"ability_paladin_shieldofthetemplar"}, {"id":53754,"name":"Improved Fear","icon":"spell_shadow_possession"}, {"id":53759,"name":"Improved Fear","icon":"spell_shadow_possession"}, +{"id":53817,"name":"Maelstrom Weapon","icon":"spell_shaman_maelstromweapon"}, {"id":54037,"name":"Improved Felhunter","icon":"spell_shadow_summonfelhunter"}, {"id":54038,"name":"Improved Felhunter","icon":"spell_shadow_summonfelhunter"}, {"id":54043,"name":"Retribution Aura","icon":"spell_holy_auraoflight"}, @@ -12105,6 +12284,7 @@ {"id":54349,"name":"Improved Demonic Tactics","icon":"ability_warlock_improveddemonictactics"}, {"id":54353,"name":"Mark \"S\" Boomstick","icon":"inv_weapon_rifle_08"}, {"id":54354,"name":"Prismatic Cloak","icon":"spell_arcane_prismaticcloak"}, +{"id":54428,"name":"Divine Plea","icon":"spell_holy_aspiration"}, {"id":54446,"name":"Rune of Swordbreaking","icon":"ability_parry"}, {"id":54447,"name":"Rune of Spellbreaking","icon":"spell_shadow_antimagicshell"}, {"id":54486,"name":"Missile Barrage","icon":"ability_mage_missilebarrage"}, @@ -12159,6 +12339,7 @@ {"id":55061,"name":"Icy Reach","icon":"spell_frost_manarecharge"}, {"id":55062,"name":"Icy Reach","icon":"spell_frost_manarecharge"}, {"id":55076,"name":"Sun Scope","icon":"trade_engineering"}, +{"id":55078,"name":"Blood Plague","icon":"spell_deathknight_bloodplague"}, {"id":55090,"name":"Scourge Strike","icon":"spell_deathknight_scourgestrike"}, {"id":55091,"name":"Cold as Ice","icon":"ability_mage_coldasice"}, {"id":55092,"name":"Cold as Ice","icon":"ability_mage_coldasice"}, @@ -12195,6 +12376,7 @@ {"id":55236,"name":"Outbreak","icon":"spell_shadow_plaguecloud"}, {"id":55237,"name":"Outbreak","icon":"spell_shadow_plaguecloud"}, {"id":55243,"name":"Bracers of Deflection","icon":"inv_bracer_10"}, +{"id":55268,"name":"Frost Strike","icon":"spell_deathknight_empowerruneblade2"}, {"id":55298,"name":"Vengeance Bindings","icon":"inv_bracer_09"}, {"id":55300,"name":"Righteous Gauntlets","icon":"inv_gauntlets_26"}, {"id":55301,"name":"Daunting Handguards","icon":"inv_gauntlets_26"}, @@ -12211,6 +12393,7 @@ {"id":55312,"name":"Savage Saronite Skullshield","icon":"inv_helmet_130"}, {"id":55339,"name":"Torment the Weak","icon":"ability_mage_tormentoftheweak"}, {"id":55340,"name":"Torment the Weak","icon":"ability_mage_tormentoftheweak"}, +{"id":55342,"name":"Mirror Image","icon":"spell_magic_lesserinvisibilty"}, {"id":55369,"name":"Titansteel Destroyer","icon":"inv_mace_84"}, {"id":55370,"name":"Titansteel Bonecrusher","icon":"inv_mace_87"}, {"id":55371,"name":"Titansteel Guardian","icon":"inv_mace_87"}, @@ -12220,6 +12403,7 @@ {"id":55375,"name":"Spiked Titansteel Treads","icon":"inv_boots_plate_08"}, {"id":55376,"name":"Tempered Titansteel Treads","icon":"inv_boots_plate_08"}, {"id":55377,"name":"Brilliant Titansteel Treads","icon":"inv_boots_plate_08"}, +{"id":55459,"name":"Chain Heal","icon":"spell_nature_healingwavegreater"}, {"id":55487,"name":"Demoralizing Screech","icon":"ability_hunter_pet_vulture"}, {"id":55610,"name":"Improved Icy Talons","icon":"spell_deathknight_icytalons"}, {"id":55620,"name":"Night of the Dead","icon":"spell_deathknight_armyofthedead"}, @@ -12325,6 +12509,7 @@ {"id":56636,"name":"Taste for Blood","icon":"ability_rogue_hungerforblood"}, {"id":56637,"name":"Taste for Blood","icon":"ability_rogue_hungerforblood"}, {"id":56638,"name":"Taste for Blood","icon":"ability_rogue_hungerforblood"}, +{"id":56815,"name":"Rune Strike","icon":"spell_deathknight_darkconviction"}, {"id":56822,"name":"Rime","icon":"spell_frost_freezingbreath"}, {"id":56834,"name":"Reaping","icon":"spell_shadow_shadetruesight"}, {"id":56835,"name":"Reaping","icon":"spell_shadow_shadetruesight"}, @@ -12338,8 +12523,10 @@ {"id":57470,"name":"Renewed Hope","icon":"spell_holy_holyprotection"}, {"id":57472,"name":"Renewed Hope","icon":"spell_holy_holyprotection"}, {"id":57499,"name":"Warbringer","icon":"ability_warrior_warbringer"}, +{"id":57516,"name":"Enrage","icon":"spell_shadow_unholyfrenzy"}, {"id":57567,"name":"Fel Intelligence","icon":"spell_shadow_brainwash"}, {"id":57623,"name":"Horn of Winter","icon":"inv_misc_horn_02"}, +{"id":57669,"name":"Replenishment","icon":"spell_magic_managain"}, {"id":57683,"name":"Fur Lining - Attack Power","icon":"trade_leatherworking"}, {"id":57690,"name":"Fur Lining - Stamina","icon":"trade_leatherworking"}, {"id":57691,"name":"Fur Lining - Spell Power","icon":"trade_leatherworking"}, @@ -12354,6 +12541,7 @@ {"id":57812,"name":"Genesis","icon":"spell_arcane_arcane03"}, {"id":57813,"name":"Genesis","icon":"spell_arcane_arcane03"}, {"id":57814,"name":"Genesis","icon":"spell_arcane_arcane03"}, +{"id":57823,"name":"Revenge","icon":"ability_warrior_revenge"}, {"id":57849,"name":"Improved Insect Swarm","icon":"spell_nature_insectswarm"}, {"id":57850,"name":"Improved Insect Swarm","icon":"spell_nature_insectswarm"}, {"id":57851,"name":"Improved Insect Swarm","icon":"spell_nature_insectswarm"}, @@ -12365,6 +12553,12 @@ {"id":57880,"name":"Natural Reaction","icon":"ability_bullrush"}, {"id":57881,"name":"Natural Reaction","icon":"ability_bullrush"}, {"id":57933,"name":"Tricks of the Trade","icon":"ability_rogue_tricksofthetrade"}, +{"id":57934,"name":"Tricks of the Trade","icon":"ability_rogue_tricksofthetrade"}, +{"id":57946,"name":"Life Tap","icon":"spell_shadow_burningspirit"}, +{"id":57965,"name":"Instant Poison IX","icon":"ability_poisons"}, +{"id":57970,"name":"Deadly Poison IX","icon":"ability_rogue_dualweild"}, +{"id":57975,"name":"Wound Poison VII","icon":"inv_misc_herb_16"}, +{"id":57993,"name":"Envenom","icon":"ability_rogue_disembowel"}, {"id":58143,"name":"Earthshadow Ring","icon":"inv_jewelry_ring_35"}, {"id":58144,"name":"Jade Ring of Slaying","icon":"inv_jewelry_ring_34"}, {"id":58145,"name":"Stoneguard Band","icon":"inv_jewelry_ring_02"}, @@ -12382,19 +12576,28 @@ {"id":58424,"name":"Relentless Strikes","icon":"ability_warrior_decisivestrike"}, {"id":58425,"name":"Relentless Strikes","icon":"ability_warrior_decisivestrike"}, {"id":58426,"name":"Overkill","icon":"ability_hunter_rapidkilling"}, +{"id":58434,"name":"Volley","icon":"ability_marksmanship"}, {"id":58435,"name":"Pandemic","icon":"spell_shadow_unstableaffliction_2"}, {"id":58492,"name":"Savage Titanium Ring","icon":"inv_jewelry_ring_38"}, {"id":58507,"name":"Savage Titanium Band","icon":"inv_jewelry_ring_38"}, {"id":58643,"name":"Strength of Earth Totem","icon":"spell_nature_earthbindtotem"}, {"id":58656,"name":"Flametongue Totem","icon":"spell_nature_guardianward"}, +{"id":58704,"name":"Searing Totem","icon":"spell_fire_searingtotem"}, +{"id":58734,"name":"Magma Totem","icon":"spell_fire_selfdestruct"}, +{"id":58749,"name":"Nature Resistance Totem","icon":"spell_nature_natureresistancetotem"}, {"id":58753,"name":"Stoneskin Totem","icon":"spell_nature_stoneskintotem"}, +{"id":58757,"name":"Healing Stream Totem","icon":"inv_spear_04"}, {"id":58774,"name":"Mana Spring Totem","icon":"spell_nature_manaregentotem"}, {"id":58872,"name":"Damage Shield","icon":"inv_shield_31"}, {"id":58874,"name":"Damage Shield","icon":"inv_shield_31"}, {"id":58954,"name":"Titanium Frostguard Ring","icon":"inv_jewelry_ring_57"}, +{"id":59000,"name":"Improved Spirit Tap","icon":"spell_shadow_requiem"}, {"id":59057,"name":"Rime","icon":"spell_frost_freezingbreath"}, {"id":59088,"name":"Improved Spell Reflection","icon":"ability_warrior_shieldreflection"}, {"id":59089,"name":"Improved Spell Reflection","icon":"ability_warrior_shieldreflection"}, +{"id":59131,"name":"Icy Touch","icon":"spell_deathknight_icetouch"}, +{"id":59159,"name":"Thunderstorm","icon":"spell_shaman_thunderstorm"}, +{"id":59164,"name":"Haunt","icon":"ability_warlock_haunt"}, {"id":59436,"name":"Brilliant Saronite Belt","icon":"inv_belt_20"}, {"id":59438,"name":"Brilliant Saronite Bracers","icon":"inv_bracer_17"}, {"id":59440,"name":"Brilliant Saronite Pauldrons","icon":"inv_shoulder_71"}, @@ -12441,6 +12644,9 @@ {"id":59955,"name":"Arcanum of the Stalwart Protector","icon":"ability_warrior_swordandboard"}, {"id":59960,"name":"Arcanum of Blissful Mending","icon":"ability_warrior_shieldmastery"}, {"id":59970,"name":"Arcanum of Burning Mysteries","icon":"spell_fire_masterofelements"}, +{"id":60043,"name":"Lava Burst","icon":"spell_shaman_lavaburst"}, +{"id":60052,"name":"Explosive Shot","icon":"ability_hunter_explosiveshot"}, +{"id":60053,"name":"Explosive Shot","icon":"ability_hunter_explosiveshot"}, {"id":60103,"name":"Lava Lash","icon":"ability_shaman_lavalash"}, {"id":60184,"name":"Elemental Fury","icon":"spell_fire_volcano"}, {"id":60185,"name":"Elemental Fury","icon":"spell_fire_volcano"}, @@ -12546,6 +12752,7 @@ {"id":60999,"name":"Icy Scale Chestguard","icon":"inv_chest_plate09"}, {"id":61000,"name":"Icy Scale Belt","icon":"inv_belt_13"}, {"id":61002,"name":"Icy Scale Boots","icon":"inv_boots_chain_11"}, +{"id":61006,"name":"Kill Shot","icon":"ability_hunter_assassinate2"}, {"id":61008,"name":"Icebane Chestguard","icon":"inv_chest_chain_11"}, {"id":61009,"name":"Icebane Girdle","icon":"inv_belt_33"}, {"id":61010,"name":"Icebane Treads","icon":"inv_boots_plate_08"}, @@ -12563,13 +12770,17 @@ {"id":61222,"name":"Armored to the Teeth","icon":"inv_shoulder_22"}, {"id":61271,"name":"Arcanum of the Savage Gladiator","icon":"trade_engineering"}, {"id":61295,"name":"Riptide","icon":"spell_nature_riptide"}, +{"id":61301,"name":"Riptide","icon":"spell_nature_riptide"}, {"id":61329,"name":"Vitality","icon":"ability_warrior_revenge"}, {"id":61330,"name":"Aggression","icon":"ability_racial_avatar"}, {"id":61331,"name":"Aggression","icon":"ability_racial_avatar"}, {"id":61336,"name":"Survival Instincts","icon":"ability_druid_tigersroar"}, {"id":61345,"name":"Nature's Grace","icon":"spell_nature_naturesblessing"}, {"id":61346,"name":"Nature's Grace","icon":"spell_nature_naturesblessing"}, +{"id":61384,"name":"Typhoon","icon":"ability_druid_typhoon"}, +{"id":61411,"name":"Shield of Righteousness","icon":"ability_paladin_shieldofvengeance"}, {"id":61468,"name":"Diamond-cut Refractor Scope","icon":"trade_engineering"}, +{"id":61657,"name":"Fire Nova","icon":"spell_fire_sealoffire"}, {"id":61680,"name":"Culling the Herd","icon":"inv_misc_monsterhorn_06"}, {"id":61681,"name":"Culling the Herd","icon":"inv_misc_monsterhorn_06"}, {"id":61682,"name":"Cobra Reflexes","icon":"spell_nature_guardianward"}, @@ -12580,6 +12791,10 @@ {"id":61688,"name":"Great Stamina","icon":"spell_nature_unyeildingstamina"}, {"id":61689,"name":"Natural Armor","icon":"spell_nature_spiritarmor"}, {"id":61690,"name":"Natural Armor","icon":"spell_nature_spiritarmor"}, +{"id":61792,"name":"Shadowy Insight","icon":"spell_arcane_blink"}, +{"id":61840,"name":"Righteous Vengeance","icon":"ability_paladin_righteousvengeance"}, +{"id":61847,"name":"Aspect of the Dragonhawk","icon":"ability_hunter_pet_dragonhawk"}, +{"id":62078,"name":"Swipe (Cat)","icon":"inv_misc_monsterclaw_03"}, {"id":62097,"name":"Shamanism","icon":"spell_unused2"}, {"id":62098,"name":"Shamanism","icon":"spell_unused2"}, {"id":62099,"name":"Shamanism","icon":"spell_unused2"}, @@ -12593,6 +12808,7 @@ {"id":62271,"name":"Unbreakable Healing Amplifiers","icon":"inv_gizmo_newgoggles"}, {"id":62384,"name":"Greater Inscription of the Gladiator","icon":"trade_engineering"}, {"id":62447,"name":"Earthen Leg Armor","icon":"trade_leatherworking"}, +{"id":62606,"name":"Savage Defense","icon":"ability_racial_cannibalize"}, {"id":62758,"name":"Wild Hunt","icon":"inv_misc_horn_04"}, {"id":62759,"name":"Shark Attack","icon":"inv_misc_fish_35"}, {"id":62760,"name":"Shark Attack","icon":"inv_misc_fish_35"}, @@ -12657,6 +12873,8 @@ {"id":63648,"name":"Divinity","icon":"spell_holy_blindingheal"}, {"id":63649,"name":"Divinity","icon":"spell_holy_blindingheal"}, {"id":63650,"name":"Divinity","icon":"spell_holy_blindingheal"}, +{"id":63672,"name":"Black Arrow","icon":"spell_shadow_painspike"}, +{"id":63675,"name":"Improved Devouring Plague","icon":"spell_shadow_devouringplague"}, {"id":63730,"name":"Serendipity","icon":"spell_holy_serendipity"}, {"id":63733,"name":"Serendipity","icon":"spell_holy_serendipity"}, {"id":63737,"name":"Serendipity","icon":"spell_holy_serendipity"}, @@ -12671,22 +12889,28 @@ {"id":64205,"name":"Divine Sacrifice","icon":"spell_holy_powerwordbarrier"}, {"id":64353,"name":"Fiery Payback","icon":"ability_mage_fierypayback"}, {"id":64357,"name":"Fiery Payback","icon":"ability_mage_fierypayback"}, +{"id":64371,"name":"Eradication","icon":"ability_warlock_eradication"}, {"id":64382,"name":"Shattering Throw","icon":"ability_warrior_shatteringthrow"}, {"id":64579,"name":"Enchant Weapon - Blood Draining","icon":"inv_misc_note_01"}, +{"id":64701,"name":"Elemental Mastery","icon":"spell_nature_wispheal"}, {"id":64725,"name":"Emerald Choker","icon":"inv_jewelry_necklace_24"}, {"id":64726,"name":"Sky Sapphire Amulet","icon":"inv_jewelry_necklace_16"}, {"id":64727,"name":"Runed Mana Band","icon":"inv_jewelry_ring_34"}, {"id":64728,"name":"Scarlet Signet","icon":"inv_jewelry_ring_72"}, {"id":64729,"name":"Frostguard Drape","icon":"inv_misc_cape_19"}, {"id":64730,"name":"Cloak of Crimson Snow","icon":"inv_misc_cape_19"}, +{"id":64901,"name":"Hymn of Hope","icon":"spell_holy_symbolofhope"}, {"id":64976,"name":"Juggernaut","icon":"ability_warrior_bullrush"}, {"id":65139,"name":"Tree of Life","icon":"ability_druid_treeoflife"}, {"id":65661,"name":"Threat of Thassarian","icon":"ability_dualwieldspecialization"}, {"id":65855,"name":"Insect Swarm","icon":"spell_nature_insectswarm"}, +{"id":65861,"name":"Force of Nature","icon":"ability_druid_forceofnature"}, {"id":65990,"name":"Windfury Totem","icon":"spell_nature_windfury"}, {"id":66191,"name":"Threat of Thassarian","icon":"ability_dualwieldspecialization"}, {"id":66192,"name":"Threat of Thassarian","icon":"ability_dualwieldspecialization"}, +{"id":66233,"name":"Ardent Defender","icon":"spell_holy_ardentdefender"}, {"id":66799,"name":"Desolation","icon":"spell_shadow_unholyfrenzy"}, +{"id":66803,"name":"Desolation","icon":"spell_shadow_shadowworddominate"}, {"id":66814,"name":"Desolation","icon":"spell_shadow_unholyfrenzy"}, {"id":66815,"name":"Desolation","icon":"spell_shadow_unholyfrenzy"}, {"id":66816,"name":"Desolation","icon":"spell_shadow_unholyfrenzy"}, @@ -12728,6 +12952,7 @@ {"id":67146,"name":"Merlin's Robe","icon":"inv_chest_cloth_64"}, {"id":67147,"name":"Royal Moonshroud Bracers","icon":"inv_bracer_24b"}, {"id":67839,"name":"Mind Amplification Dish","icon":"trade_engineering"}, +{"id":68051,"name":"Overpower Ready!","icon":"ability_rogue_hungerforblood"}, {"id":70164,"name":"Rune of the Nerubian Carapace","icon":"inv_sword_61"}, {"id":70550,"name":"Leggings of Woven Death","icon":"inv_pants_cloth_34"}, {"id":70551,"name":"Deathfrost Boots","icon":"inv_boots_cloth_25"}, diff --git a/proto/apl.proto b/proto/apl.proto index 93ebde7504..9108945531 100644 --- a/proto/apl.proto +++ b/proto/apl.proto @@ -44,6 +44,7 @@ message APLAction { // Misc APLActionAutocastOtherCooldowns autocast_other_cooldowns = 7; APLActionChangeTarget change_target = 9; + APLActionActivateAura activate_aura = 13; APLActionCancelAura cancel_aura = 10; APLActionTriggerICD trigger_icd = 11; APLActionWait wait = 4; @@ -162,6 +163,10 @@ message APLActionCancelAura { ActionID aura_id = 1; } +message APLActionActivateAura { + ActionID aura_id = 1; +} + message APLActionTriggerICD { ActionID aura_id = 1; } diff --git a/proto/ui.proto b/proto/ui.proto index ce163ecd3b..32b3e1e367 100644 --- a/proto/ui.proto +++ b/proto/ui.proto @@ -249,6 +249,7 @@ message SimSettings { bool show_threat_metrics = 4; bool show_healing_metrics = 7; bool show_experimental = 5; + bool show_ep_values = 11; string language = 9; Faction faction = 6; DatabaseFilters filters = 10; diff --git a/sim/core/apl_action.go b/sim/core/apl_action.go index a29d8dfad8..6fccfeb735 100644 --- a/sim/core/apl_action.go +++ b/sim/core/apl_action.go @@ -101,6 +101,8 @@ func (rot *APLRotation) newAPLActionImpl(config *proto.APLAction) APLActionImpl return rot.newActionAutocastOtherCooldowns(config.GetAutocastOtherCooldowns()) case *proto.APLAction_ChangeTarget: return rot.newActionChangeTarget(config.GetChangeTarget()) + case *proto.APLAction_ActivateAura: + return rot.newActionActivateAura(config.GetActivateAura()) case *proto.APLAction_CancelAura: return rot.newActionCancelAura(config.GetCancelAura()) case *proto.APLAction_TriggerIcd: diff --git a/sim/core/apl_actions_misc.go b/sim/core/apl_actions_misc.go index d62ad032cb..1bafa79308 100644 --- a/sim/core/apl_actions_misc.go +++ b/sim/core/apl_actions_misc.go @@ -2,7 +2,6 @@ package core import ( "fmt" - "github.com/wowsims/wotlk/sim/core/proto" ) @@ -39,6 +38,11 @@ type APLActionCancelAura struct { aura *Aura } +type APLActionActivateAura struct { + defaultAPLActionImpl + aura *Aura +} + func (rot *APLRotation) newActionCancelAura(config *proto.APLActionCancelAura) APLActionImpl { aura := rot.aplGetAura(rot.getSourceUnit(&proto.UnitReference{Type: proto.UnitReference_Self}), config.AuraId) if aura.Get() == nil { @@ -48,6 +52,17 @@ func (rot *APLRotation) newActionCancelAura(config *proto.APLActionCancelAura) A aura: aura.Get(), } } + +func (rot *APLRotation) newActionActivateAura(config *proto.APLActionActivateAura) APLActionImpl { + aura := rot.aplGetAura(rot.getSourceUnit(&proto.UnitReference{Type: proto.UnitReference_Self}), config.AuraId) + if aura.Get() == nil { + return nil + } + return &APLActionActivateAura{ + aura: aura.Get(), + } +} + func (action *APLActionCancelAura) IsReady(sim *Simulation) bool { return action.aura.IsActive() } @@ -61,6 +76,21 @@ func (action *APLActionCancelAura) String() string { return fmt.Sprintf("Cancel Aura(%s)", action.aura.ActionID) } +func (action *APLActionActivateAura) IsReady(sim *Simulation) bool { + return true +} + +func (action *APLActionActivateAura) Execute(sim *Simulation) { + if sim.Log != nil { + action.aura.Unit.Log(sim, "Activating aura %s", action.aura.ActionID) + } + action.aura.Activate(sim) +} + +func (action *APLActionActivateAura) String() string { + return fmt.Sprintf("Activate Aura(%s)", action.aura.ActionID) +} + type APLActionTriggerICD struct { defaultAPLActionImpl aura *Aura diff --git a/sim/core/aura.go b/sim/core/aura.go index da704ae456..c6aefab02e 100644 --- a/sim/core/aura.go +++ b/sim/core/aura.go @@ -325,6 +325,9 @@ func (at *auraTracker) GetAura(label string) *Aura { } return nil } +func (at *auraTracker) GetAuras() []*Aura { + return at.auras +} func (at *auraTracker) GetAuraByID(actionID ActionID) *Aura { for _, aura := range at.auras { if aura.ActionID.SameAction(actionID) { diff --git a/sim/core/debuffs.go b/sim/core/debuffs.go index 6d089a6008..0d631f6341 100644 --- a/sim/core/debuffs.go +++ b/sim/core/debuffs.go @@ -429,7 +429,7 @@ func GiftOfArthasAura(target *Unit) *Aura { func MangleAura(target *Unit) *Aura { return bleedDamageAura(target, Aura{ Label: "Mangle", - ActionID: ActionID{SpellID: 33876}, + ActionID: ActionID{SpellID: 48566}, Duration: time.Minute, }, 1.3) } diff --git a/sim/deathknight/deathknight.go b/sim/deathknight/deathknight.go index df2ac6bb04..63913bb9e9 100644 --- a/sim/deathknight/deathknight.go +++ b/sim/deathknight/deathknight.go @@ -305,7 +305,6 @@ func (dk *Deathknight) Initialize() { dk.registerArmyOfTheDeadCD() dk.registerDancingRuneWeaponCD() dk.registerDeathPactSpell() - dk.registerUnholyFrenzyCD() dk.RegisterAura(core.Aura{ @@ -470,6 +469,8 @@ func NewDeathknight(character core.Character, inputs DeathknightInputs, talents } dk.RotationSequence = &Sequence{} + // done here so enchants that modify stats are applied before stats are calculated + dk.registerItems() return dk } diff --git a/sim/deathknight/dps/TestBlood.results b/sim/deathknight/dps/TestBlood.results index df390981fb..88f4076174 100644 --- a/sim/deathknight/dps/TestBlood.results +++ b/sim/deathknight/dps/TestBlood.results @@ -207,13 +207,6 @@ dps_results: { tps: 3056.65868 } } -dps_results: { - key: "TestBlood-AllItems-DeadlyGladiator'sSigilofStrife-42620" - value: { - dps: 7310.694 - tps: 3614.97286 - } -} dps_results: { key: "TestBlood-AllItems-Death'sChoice-47464" value: { @@ -368,13 +361,6 @@ dps_results: { tps: 3595.99061 } } -dps_results: { - key: "TestBlood-AllItems-FuriousGladiator'sSigilofStrife-42621" - value: { - dps: 7312.07604 - tps: 3615.45198 - } -} dps_results: { key: "TestBlood-AllItems-FuryoftheFiveFlights-40431" value: { @@ -410,13 +396,6 @@ dps_results: { tps: 3551.08226 } } -dps_results: { - key: "TestBlood-AllItems-HatefulGladiator'sSigilofStrife-42619" - value: { - dps: 7305.81839 - tps: 3613.64772 - } -} dps_results: { key: "TestBlood-AllItems-IllustrationoftheDragonSoul-40432" value: { @@ -572,13 +551,6 @@ dps_results: { tps: 3671.42095 } } -dps_results: { - key: "TestBlood-AllItems-RelentlessGladiator'sSigilofStrife-42622" - value: { - dps: 7313.68843 - tps: 3616.01095 - } -} dps_results: { key: "TestBlood-AllItems-RevitalizingSkyflareDiamond" value: { @@ -593,13 +565,6 @@ dps_results: { tps: 3475.9395 } } -dps_results: { - key: "TestBlood-AllItems-SavageGladiator'sSigilofStrife-42618" - value: { - dps: 7305.58806 - tps: 3613.52654 - } -} dps_results: { key: "TestBlood-AllItems-ScourgeborneBattlegear" value: { @@ -649,55 +614,6 @@ dps_results: { tps: 3475.9395 } } -dps_results: { - key: "TestBlood-AllItems-SigilofDeflection-45144" - value: { - dps: 7303.78378 - tps: 3612.57727 - } -} -dps_results: { - key: "TestBlood-AllItems-SigilofHauntedDreams-40715" - value: { - dps: 7331.86443 - tps: 3628.1546 - } -} -dps_results: { - key: "TestBlood-AllItems-SigilofInsolence-47672" - value: { - dps: 7303.78378 - tps: 3612.57727 - } -} -dps_results: { - key: "TestBlood-AllItems-SigilofVirulence-47673" - value: { - dps: 7637.06987 - tps: 3780.59019 - } -} -dps_results: { - key: "TestBlood-AllItems-SigiloftheBoneGryphon-50462" - value: { - dps: 7303.78378 - tps: 3612.57727 - } -} -dps_results: { - key: "TestBlood-AllItems-SigiloftheHangedMan-50459" - value: { - dps: 7641.29245 - tps: 3785.73995 - } -} -dps_results: { - key: "TestBlood-AllItems-SigiloftheUnfalteringKnight-40714" - value: { - dps: 7303.78378 - tps: 3612.57727 - } -} dps_results: { key: "TestBlood-AllItems-Sindragosa'sFlawlessFang-50361" value: { @@ -894,13 +810,6 @@ dps_results: { tps: 3475.9395 } } -dps_results: { - key: "TestBlood-AllItems-WrathfulGladiator'sSigilofStrife-51417" - value: { - dps: 7315.53115 - tps: 3616.64977 - } -} dps_results: { key: "TestBlood-Average-Default" value: { diff --git a/sim/deathknight/items.go b/sim/deathknight/items.go index 50d2332258..f6967b00cc 100644 --- a/sim/deathknight/items.go +++ b/sim/deathknight/items.go @@ -300,8 +300,21 @@ func (dk *Deathknight) sigilOfTheVengefulHeartFrostStrike() float64 { return core.TernaryFloat64(dk.Equip[proto.ItemSlot_ItemSlotRanged].ID == 45254, 218, 0) // (1 / 0.55) * 120 } -func init() { +func addEnchantEffect(id int32, effect func(core.Agent)) { + if core.HasEnchantEffect(id) { + return + } + core.NewEnchantEffect(id, effect) +} +func addItemEffect(id int32, effect func(core.Agent)) { + if core.HasItemEffect(id) { + return + } + core.NewItemEffect(id, effect) +} + +func (dk *Deathknight) registerItems() { // Rune of Razorice newRazoriceHitSpell := func(character *core.Character, isMH bool) *core.Spell { dmg := 0.0 @@ -328,7 +341,7 @@ func init() { }) } - core.NewEnchantEffect(3370, func(agent core.Agent) { + addEnchantEffect(3370, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3370 oh := character.HasOHWeapon() && character.Equip[proto.ItemSlot_ItemSlotOffHand].HandType != proto.HandType_HandTypeTwoHand && character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3370 @@ -399,7 +412,7 @@ func init() { // ApplyRuneOfTheFallenCrusader will be applied twice if there is two weapons with this enchant. // However it will automatically overwrite one of them so it should be ok. // A single application of the aura will handle both mh and oh procs. - core.NewEnchantEffect(3368, func(agent core.Agent) { + addEnchantEffect(3368, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3368 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3368 @@ -430,7 +443,7 @@ func init() { }) // Rune of the Nerubian Carapace - core.NewEnchantEffect(3883, func(agent core.Agent) { + addEnchantEffect(3883, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3883 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3883 @@ -443,7 +456,7 @@ func init() { }) // Rune of the Stoneskin Gargoyle - core.NewEnchantEffect(3847, func(agent core.Agent) { + addEnchantEffect(3847, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3847 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3847 @@ -460,7 +473,7 @@ func init() { }) // Rune of the Swordbreaking - core.NewEnchantEffect(3594, func(agent core.Agent) { + addEnchantEffect(3594, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3594 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3594 @@ -472,7 +485,7 @@ func init() { }) // Rune of Swordshattering - core.NewEnchantEffect(3365, func(agent core.Agent) { + addEnchantEffect(3365, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3365 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3365 @@ -488,7 +501,7 @@ func init() { }) // Rune of the Spellbreaking - core.NewEnchantEffect(3595, func(agent core.Agent) { + addEnchantEffect(3595, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3595 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3595 @@ -501,7 +514,7 @@ func init() { }) // Rune of Spellshattering - core.NewEnchantEffect(3367, func(agent core.Agent) { + addEnchantEffect(3367, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3367 oh := character.Equip[proto.ItemSlot_ItemSlotOffHand].Enchant.EffectID == 3367 @@ -517,8 +530,65 @@ func init() { // Add 4% magic deflection }) + cinderBonusCoeff := 1.2 + + consumeSpells := [5]core.ActionID{ + BloodBoilActionID, + DeathCoilActionID, + FrostStrikeMHActionID, + HowlingBlastActionID, + IcyTouchActionID, + } + + cinderProcAura := dk.GetOrRegisterAura(core.Aura{ + ActionID: core.ActionID{SpellID: 53386}, + Label: "Cinderglacier", + Duration: time.Second * 30, + MaxStacks: 2, + OnGain: func(aura *core.Aura, sim *core.Simulation) { + aura.SetStacks(sim, aura.MaxStacks) + aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] *= cinderBonusCoeff + aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexFrost] *= cinderBonusCoeff + dk.modifyShadowDamageModifier(0.2) + }, + OnExpire: func(aura *core.Aura, sim *core.Simulation) { + aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] /= cinderBonusCoeff + aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexFrost] /= cinderBonusCoeff + dk.modifyShadowDamageModifier(-0.2) + }, + OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { + if spell.ActionID == HowlingBlastActionID || spell.ActionID == BloodBoilActionID { + if result.Target.Index == sim.GetNumTargets()-1 { + // Last target, consume a stack for every target hit + for i := int32(0); i < dk.AoESpellNumTargetsHit; i++ { + if aura.IsActive() { + aura.RemoveStack(sim) + } + } + } + return + } + + if !result.Outcome.Matches(core.OutcomeLanded) { + return + } + + shouldConsume := false + for _, consumeSpell := range consumeSpells { + if spell.ActionID == consumeSpell { + shouldConsume = true + break + } + } + + if shouldConsume { + aura.RemoveStack(sim) + } + }, + }) + // Rune of Cinderglacier - core.NewEnchantEffect(3369, func(agent core.Agent) { + addEnchantEffect(3369, func(agent core.Agent) { character := agent.GetCharacter() mh := character.Equip[proto.ItemSlot_ItemSlotMainHand].Enchant.EffectID == 3369 @@ -530,65 +600,6 @@ func init() { procMask := core.GetMeleeProcMaskForHands(mh, oh) ppmm := character.AutoAttacks.NewPPMManager(1.0, procMask) - cinderBonusCoeff := 1.2 - - consumeSpells := [5]core.ActionID{ - BloodBoilActionID, - DeathCoilActionID, - FrostStrikeMHActionID, - HowlingBlastActionID, - IcyTouchActionID, - } - - dk := agent.(DeathKnightAgent).GetDeathKnight() - - cinderProcAura := character.GetOrRegisterAura(core.Aura{ - ActionID: core.ActionID{SpellID: 53386}, - Label: "Cinderglacier", - Duration: time.Second * 30, - MaxStacks: 2, - OnGain: func(aura *core.Aura, sim *core.Simulation) { - aura.SetStacks(sim, aura.MaxStacks) - aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] *= cinderBonusCoeff - aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexFrost] *= cinderBonusCoeff - dk.modifyShadowDamageModifier(0.2) - }, - OnExpire: func(aura *core.Aura, sim *core.Simulation) { - aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexShadow] /= cinderBonusCoeff - aura.Unit.PseudoStats.SchoolDamageDealtMultiplier[stats.SchoolIndexFrost] /= cinderBonusCoeff - dk.modifyShadowDamageModifier(-0.2) - }, - OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { - if spell.ActionID == HowlingBlastActionID || spell.ActionID == BloodBoilActionID { - if result.Target.Index == sim.GetNumTargets()-1 { - // Last target, consume a stack for every target hit - for i := int32(0); i < dk.AoESpellNumTargetsHit; i++ { - if aura.IsActive() { - aura.RemoveStack(sim) - } - } - } - return - } - - if !result.Outcome.Matches(core.OutcomeLanded) { - return - } - - shouldConsume := false - for _, consumeSpell := range consumeSpells { - if spell.ActionID == consumeSpell { - shouldConsume = true - break - } - } - - if shouldConsume { - aura.RemoveStack(sim) - } - }, - }) - core.MakePermanent(character.GetOrRegisterAura(core.Aura{ Label: "Rune of Cinderglacier", OnSpellHitDealt: func(aura *core.Aura, sim *core.Simulation, spell *core.Spell, result *core.SpellResult) { @@ -619,7 +630,7 @@ func init() { // Sigils - core.NewItemEffect(40714, func(agent core.Agent) { + addItemEffect(40714, func(agent core.Agent) { dk := agent.(DeathKnightAgent).GetDeathKnight() procAura := dk.NewTemporaryStatsAura("Sigil of the Unfaltering Knight Proc", core.ActionID{SpellID: 62146}, stats.Stats{stats.Defense: 53.0 / core.DefenseRatingPerDefense}, time.Second*30) @@ -635,7 +646,7 @@ func init() { })) }) - core.NewItemEffect(40715, func(agent core.Agent) { + addItemEffect(40715, func(agent core.Agent) { dk := agent.(DeathKnightAgent).GetDeathKnight() procAura := dk.NewTemporaryStatsAura("Sigil of Haunted Dreams Proc", core.ActionID{SpellID: 60828}, stats.Stats{stats.MeleeCrit: 173.0, stats.SpellCrit: 173.0}, time.Second*10) @@ -660,7 +671,7 @@ func init() { })) }) - core.NewItemEffect(45144, func(agent core.Agent) { + addItemEffect(45144, func(agent core.Agent) { dk := agent.(DeathKnightAgent).GetDeathKnight() procAura := dk.NewTemporaryStatsAura("Sigil of Deflection Proc", core.ActionID{SpellID: 64963}, stats.Stats{stats.Dodge: 144.0}, time.Second*5) @@ -676,7 +687,7 @@ func init() { })) }) - core.NewItemEffect(47672, func(agent core.Agent) { + addItemEffect(47672, func(agent core.Agent) { dk := agent.(DeathKnightAgent).GetDeathKnight() procAura := dk.NewTemporaryStatsAura("Sigil of Insolence Proc", core.ActionID{SpellID: 67380}, stats.Stats{stats.Dodge: 200.0}, time.Second*20) @@ -701,7 +712,7 @@ func init() { })) }) - core.NewItemEffect(47673, func(agent core.Agent) { + addItemEffect(47673, func(agent core.Agent) { dk := agent.(DeathKnightAgent).GetDeathKnight() procAura := dk.NewTemporaryStatsAura("Sigil of Virulence Proc", core.ActionID{SpellID: 67383}, stats.Stats{stats.Strength: 200.0}, time.Second*20) @@ -726,7 +737,7 @@ func init() { })) }) - core.NewItemEffect(50459, func(agent core.Agent) { + addItemEffect(50459, func(agent core.Agent) { character := agent.GetCharacter() dk := agent.(DeathKnightAgent).GetDeathKnight() @@ -753,7 +764,7 @@ func init() { })) }) - core.NewItemEffect(50462, func(agent core.Agent) { + addItemEffect(50462, func(agent core.Agent) { character := agent.GetCharacter() dk := agent.(DeathKnightAgent).GetDeathKnight() @@ -789,7 +800,7 @@ func init() { } func CreateGladiatorsSigil(id int32, name string, ap float64, seconds time.Duration) { - core.NewItemEffect(id, func(agent core.Agent) { + addItemEffect(id, func(agent core.Agent) { dk := agent.(DeathKnightAgent).GetDeathKnight() procAura := dk.NewTemporaryStatsAura(name+" Gladiator's Sigil of Strife Proc", core.ActionID{ItemID: id}, stats.Stats{stats.AttackPower: ap}, time.Second*seconds) diff --git a/sim/deathknight/tank/TestBloodTank.results b/sim/deathknight/tank/TestBloodTank.results index 28a058bff6..37e04946ba 100644 --- a/sim/deathknight/tank/TestBloodTank.results +++ b/sim/deathknight/tank/TestBloodTank.results @@ -207,13 +207,6 @@ dps_results: { tps: 4356.70782 } } -dps_results: { - key: "TestBloodTank-AllItems-DeadlyGladiator'sSigilofStrife-42620" - value: { - dps: 1417.87206 - tps: 4345.70673 - } -} dps_results: { key: "TestBloodTank-AllItems-Death'sChoice-47464" value: { @@ -368,13 +361,6 @@ dps_results: { tps: 4318.30535 } } -dps_results: { - key: "TestBloodTank-AllItems-FuriousGladiator'sSigilofStrife-42621" - value: { - dps: 1419.70666 - tps: 4349.60478 - } -} dps_results: { key: "TestBloodTank-AllItems-FuryoftheFiveFlights-40431" value: { @@ -410,13 +396,6 @@ dps_results: { tps: 4474.7743 } } -dps_results: { - key: "TestBloodTank-AllItems-HatefulGladiator'sSigilofStrife-42619" - value: { - dps: 1414.054 - tps: 4337.31999 - } -} dps_results: { key: "TestBloodTank-AllItems-IllustrationoftheDragonSoul-40432" value: { @@ -572,13 +551,6 @@ dps_results: { tps: 4366.21973 } } -dps_results: { - key: "TestBloodTank-AllItems-RelentlessGladiator'sSigilofStrife-42622" - value: { - dps: 1421.84704 - tps: 4354.15251 - } -} dps_results: { key: "TestBloodTank-AllItems-RevitalizingSkyflareDiamond" value: { @@ -593,13 +565,6 @@ dps_results: { tps: 4326.21647 } } -dps_results: { - key: "TestBloodTank-AllItems-SavageGladiator'sSigilofStrife-42618" - value: { - dps: 1413.44778 - tps: 4336.06299 - } -} dps_results: { key: "TestBloodTank-AllItems-ScourgeborneBattlegear" value: { @@ -649,55 +614,6 @@ dps_results: { tps: 4326.21647 } } -dps_results: { - key: "TestBloodTank-AllItems-SigilofDeflection-45144" - value: { - dps: 1408.69904 - tps: 4326.21647 - } -} -dps_results: { - key: "TestBloodTank-AllItems-SigilofHauntedDreams-40715" - value: { - dps: 1409.88631 - tps: 4328.67828 - } -} -dps_results: { - key: "TestBloodTank-AllItems-SigilofInsolence-47672" - value: { - dps: 1408.69904 - tps: 4326.21647 - } -} -dps_results: { - key: "TestBloodTank-AllItems-SigilofVirulence-47673" - value: { - dps: 1408.69904 - tps: 4326.21647 - } -} -dps_results: { - key: "TestBloodTank-AllItems-SigiloftheBoneGryphon-50462" - value: { - dps: 1408.69904 - tps: 4326.21647 - } -} -dps_results: { - key: "TestBloodTank-AllItems-SigiloftheHangedMan-50459" - value: { - dps: 1408.69904 - tps: 4326.21647 - } -} -dps_results: { - key: "TestBloodTank-AllItems-SigiloftheUnfalteringKnight-40714" - value: { - dps: 1408.69904 - tps: 4326.21647 - } -} dps_results: { key: "TestBloodTank-AllItems-Sindragosa'sFlawlessFang-50361" value: { @@ -894,13 +810,6 @@ dps_results: { tps: 4326.21647 } } -dps_results: { - key: "TestBloodTank-AllItems-WrathfulGladiator'sSigilofStrife-51417" - value: { - dps: 1424.29318 - tps: 4359.34991 - } -} dps_results: { key: "TestBloodTank-Average-Default" value: { diff --git a/sim/shaman/enhancement/TestEnhancement.results b/sim/shaman/enhancement/TestEnhancement.results index 0cc470746a..f63f2cad11 100644 --- a/sim/shaman/enhancement/TestEnhancement.results +++ b/sim/shaman/enhancement/TestEnhancement.results @@ -46,1173 +46,1173 @@ character_stats_results: { dps_results: { key: "TestEnhancement-AllItems-Althor'sAbacus-50359" value: { - dps: 7176.18661 - tps: 4071.2665 + dps: 7173.83466 + tps: 4069.95467 } } dps_results: { key: "TestEnhancement-AllItems-Althor'sAbacus-50366" value: { - dps: 7194.78741 - tps: 4082.96154 + dps: 7192.43547 + tps: 4081.64971 } } dps_results: { key: "TestEnhancement-AllItems-AustereEarthsiegeDiamond" value: { - dps: 7084.52743 - tps: 4014.17733 + dps: 7085.31992 + tps: 4014.58632 } } dps_results: { key: "TestEnhancement-AllItems-Bandit'sInsignia-40371" value: { - dps: 7200.69493 - tps: 4079.23005 + dps: 7199.00151 + tps: 4078.40304 } } dps_results: { key: "TestEnhancement-AllItems-BaubleofTrueBlood-50354" value: { - dps: 7024.67042 - tps: 3975.99009 + dps: 7022.31847 + tps: 3974.67825 hps: 95.25776 } } dps_results: { key: "TestEnhancement-AllItems-BaubleofTrueBlood-50726" value: { - dps: 7024.67042 - tps: 3975.99009 + dps: 7022.31847 + tps: 3974.67825 hps: 95.25776 } } dps_results: { key: "TestEnhancement-AllItems-BeamingEarthsiegeDiamond" value: { - dps: 7116.93611 - tps: 4032.67513 + dps: 7116.97524 + tps: 4032.65341 } } dps_results: { key: "TestEnhancement-AllItems-Beast-tamer'sShoulders-30892" value: { - dps: 6855.62167 - tps: 3868.17817 + dps: 6857.30921 + tps: 3869.15427 } } dps_results: { key: "TestEnhancement-AllItems-Bizuri'sTotemofShatteredIce-50458" value: { - dps: 7460.54608 - tps: 4239.36826 + dps: 7460.04517 + tps: 4239.05978 } } dps_results: { key: "TestEnhancement-AllItems-BlackBruise-50035" value: { - dps: 7102.49372 - tps: 3996.21803 + dps: 7106.14594 + tps: 3997.23961 } } dps_results: { key: "TestEnhancement-AllItems-BlackBruise-50692" value: { - dps: 7162.21755 - tps: 4028.18981 + dps: 7172.94774 + tps: 4034.37966 } } dps_results: { key: "TestEnhancement-AllItems-BlessedGarboftheUndeadSlayer" value: { - dps: 5766.23467 - tps: 3245.04602 + dps: 5768.05711 + tps: 3246.62799 } } dps_results: { key: "TestEnhancement-AllItems-BlessedRegaliaofUndeadCleansing" value: { - dps: 5708.05507 - tps: 3224.12193 + dps: 5704.18478 + tps: 3221.68061 } } dps_results: { key: "TestEnhancement-AllItems-BracingEarthsiegeDiamond" value: { - dps: 7105.85343 - tps: 3915.85412 + dps: 7106.64592 + tps: 3916.25143 } } dps_results: { key: "TestEnhancement-AllItems-Bryntroll,theBoneArbiter-50415" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-AllItems-Bryntroll,theBoneArbiter-50709" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-AllItems-ChaoticSkyflareDiamond" value: { - dps: 7268.58667 - tps: 4121.72018 + dps: 7268.52678 + tps: 4121.65403 } } dps_results: { key: "TestEnhancement-AllItems-CorpseTongueCoin-50349" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-CorpseTongueCoin-50352" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-CorrodedSkeletonKey-50356" value: { - dps: 7024.8405 - tps: 3976.1114 + dps: 7022.48856 + tps: 3974.79956 hps: 64 } } dps_results: { key: "TestEnhancement-AllItems-DarkmoonCard:Berserker!-42989" value: { - dps: 7151.87215 - tps: 4048.17836 + dps: 7152.26813 + tps: 4048.32773 } } dps_results: { key: "TestEnhancement-AllItems-DarkmoonCard:Death-42990" value: { - dps: 7174.2527 - tps: 4066.92632 + dps: 7174.87653 + tps: 4067.25288 } } dps_results: { key: "TestEnhancement-AllItems-DarkmoonCard:Greatness-44255" value: { - dps: 7204.17021 - tps: 4076.73371 + dps: 7203.37787 + tps: 4076.40064 } } dps_results: { key: "TestEnhancement-AllItems-DeadlyGladiator'sTotemofSurvival-42602" value: { - dps: 7244.46026 - tps: 4104.34296 + dps: 7246.52719 + tps: 4105.94279 } } dps_results: { key: "TestEnhancement-AllItems-Death'sChoice-47464" value: { - dps: 7384.24023 - tps: 4175.93566 + dps: 7381.4786 + tps: 4174.56566 } } dps_results: { key: "TestEnhancement-AllItems-DeathKnight'sAnguish-38212" value: { - dps: 7123.28006 - tps: 4033.868 + dps: 7121.63341 + tps: 4032.94502 } } dps_results: { key: "TestEnhancement-AllItems-Deathbringer'sWill-50362" value: { - dps: 7336.67616 - tps: 4147.5736 + dps: 7336.78699 + tps: 4147.64606 } } dps_results: { key: "TestEnhancement-AllItems-Deathbringer'sWill-50363" value: { - dps: 7391.98639 - tps: 4186.53623 + dps: 7393.42847 + tps: 4187.31304 } } dps_results: { key: "TestEnhancement-AllItems-Defender'sCode-40257" value: { - dps: 7024.8496 - tps: 3976.1114 + dps: 7022.49766 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-DestructiveSkyflareDiamond" value: { - dps: 7113.18621 - tps: 4032.99678 + dps: 7112.83565 + tps: 4032.77292 } } dps_results: { key: "TestEnhancement-AllItems-DislodgedForeignObject-50348" value: { - dps: 7407.91836 - tps: 4209.28718 + dps: 7408.04306 + tps: 4209.34978 } } dps_results: { key: "TestEnhancement-AllItems-DislodgedForeignObject-50353" value: { - dps: 7366.03934 - tps: 4191.48666 + dps: 7367.65631 + tps: 4192.37935 } } dps_results: { key: "TestEnhancement-AllItems-EarthshatterBattlegear" value: { - dps: 6455.52862 - tps: 3633.34923 + dps: 6454.65216 + tps: 3632.88408 } } dps_results: { key: "TestEnhancement-AllItems-EarthshatterGarb" value: { - dps: 6047.17262 - tps: 3431.15416 + dps: 6045.52068 + tps: 3429.51927 } } dps_results: { key: "TestEnhancement-AllItems-EffulgentSkyflareDiamond" value: { - dps: 7084.52743 - tps: 4014.17733 + dps: 7085.31992 + tps: 4014.58632 } } dps_results: { key: "TestEnhancement-AllItems-EmberSkyflareDiamond" value: { - dps: 7106.26818 - tps: 4025.55658 + dps: 7105.42578 + tps: 4025.03951 } } dps_results: { key: "TestEnhancement-AllItems-EnigmaticSkyflareDiamond" value: { - dps: 7104.73235 - tps: 4026.2532 + dps: 7104.67206 + tps: 4026.18802 } } dps_results: { key: "TestEnhancement-AllItems-EnigmaticStarflareDiamond" value: { - dps: 7102.62199 - tps: 4024.18658 + dps: 7102.11412 + tps: 4023.86041 } } dps_results: { key: "TestEnhancement-AllItems-EphemeralSnowflake-50260" value: { - dps: 7164.63065 - tps: 4057.39393 + dps: 7164.5604 + tps: 4057.37828 } } dps_results: { key: "TestEnhancement-AllItems-EssenceofGossamer-37220" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-EternalEarthsiegeDiamond" value: { - dps: 7084.52743 - tps: 4014.17733 + dps: 7085.31992 + tps: 4014.58632 } } dps_results: { key: "TestEnhancement-AllItems-ExtractofNecromanticPower-40373" value: { - dps: 7185.92918 - tps: 4072.35554 + dps: 7186.82231 + tps: 4072.94779 } } dps_results: { key: "TestEnhancement-AllItems-EyeoftheBroodmother-45308" value: { - dps: 7247.02945 - tps: 4108.71939 + dps: 7247.32667 + tps: 4108.9349 } } dps_results: { key: "TestEnhancement-AllItems-Figurine-SapphireOwl-42413" value: { - dps: 7056.30522 - tps: 3997.09747 + dps: 7055.21948 + tps: 3996.54055 } } dps_results: { key: "TestEnhancement-AllItems-ForethoughtTalisman-40258" value: { - dps: 7118.69322 - tps: 4035.11819 + dps: 7116.34127 + tps: 4033.80636 } } dps_results: { key: "TestEnhancement-AllItems-ForgeEmber-37660" value: { - dps: 7180.98002 - tps: 4068.70452 + dps: 7181.93055 + tps: 4069.26741 } } dps_results: { key: "TestEnhancement-AllItems-ForlornSkyflareDiamond" value: { - dps: 7105.85343 - tps: 4027.61591 + dps: 7106.64592 + tps: 4028.02491 } } dps_results: { key: "TestEnhancement-AllItems-ForlornStarflareDiamond" value: { - dps: 7101.58823 - tps: 4024.9282 + dps: 7102.38072 + tps: 4025.33719 } } dps_results: { key: "TestEnhancement-AllItems-FrostWitch'sBattlegear" value: { - dps: 7166.37879 - tps: 4026.32518 + dps: 7164.43666 + tps: 4025.22902 } } dps_results: { key: "TestEnhancement-AllItems-FrostWitch'sRegalia" value: { - dps: 6743.7409 - tps: 3835.7299 + dps: 6742.18323 + tps: 3835.2366 } } dps_results: { key: "TestEnhancement-AllItems-FuriousGladiator'sTotemofSurvival-42603" value: { - dps: 7256.32363 - tps: 4111.79147 + dps: 7258.39061 + tps: 4113.39229 } } dps_results: { key: "TestEnhancement-AllItems-FuryoftheFiveFlights-40431" value: { - dps: 7221.98288 - tps: 4084.94896 + dps: 7219.63093 + tps: 4083.64629 } } dps_results: { key: "TestEnhancement-AllItems-FuturesightRune-38763" value: { - dps: 7077.26121 - tps: 4009.07015 + dps: 7074.90927 + tps: 4007.75831 } } dps_results: { key: "TestEnhancement-AllItems-Gladiator'sEarthshaker" value: { - dps: 6785.47175 - tps: 3822.02098 + dps: 6785.08661 + tps: 3821.55356 } } dps_results: { key: "TestEnhancement-AllItems-Gladiator'sWartide" value: { - dps: 5835.87441 - tps: 3315.25703 + dps: 5834.60191 + tps: 3314.49756 } } dps_results: { key: "TestEnhancement-AllItems-GlowingTwilightScale-54573" value: { - dps: 7185.48701 - tps: 4077.11402 + dps: 7183.13506 + tps: 4075.80219 } } dps_results: { key: "TestEnhancement-AllItems-GlowingTwilightScale-54589" value: { - dps: 7206.62429 - tps: 4090.40384 + dps: 7204.27234 + tps: 4089.09201 } } dps_results: { key: "TestEnhancement-AllItems-GnomishLightningGenerator-41121" value: { - dps: 7157.77328 - tps: 4054.96391 + dps: 7158.92193 + tps: 4055.57314 } } dps_results: { key: "TestEnhancement-AllItems-HatefulGladiator'sTotemofSurvival-42601" value: { - dps: 7221.98359 - tps: 4089.6548 + dps: 7224.07169 + tps: 4091.26582 } } dps_results: { key: "TestEnhancement-AllItems-Heartpierce-49982" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-AllItems-Heartpierce-50641" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-AllItems-IllustrationoftheDragonSoul-40432" value: { - dps: 7185.88045 - tps: 4077.21791 + dps: 7183.5285 + tps: 4075.90608 } } dps_results: { key: "TestEnhancement-AllItems-ImpassiveSkyflareDiamond" value: { - dps: 7104.73235 - tps: 4026.2532 + dps: 7104.67206 + tps: 4026.18802 } } dps_results: { key: "TestEnhancement-AllItems-ImpassiveStarflareDiamond" value: { - dps: 7102.62199 - tps: 4024.18658 + dps: 7102.11412 + tps: 4023.86041 } } dps_results: { key: "TestEnhancement-AllItems-IncisorFragment-37723" value: { - dps: 7151.90242 - tps: 4045.39739 + dps: 7149.52129 + tps: 4044.08017 } } dps_results: { key: "TestEnhancement-AllItems-InsightfulEarthsiegeDiamond" value: { - dps: 7099.43794 - tps: 4024.96998 + dps: 7098.27178 + tps: 4025.21678 } } dps_results: { key: "TestEnhancement-AllItems-InvigoratingEarthsiegeDiamond" value: { - dps: 7111.04637 - tps: 4028.76152 + dps: 7111.83886 + tps: 4029.17051 hps: 11.01073 } } dps_results: { key: "TestEnhancement-AllItems-Lavanthor'sTalisman-37872" value: { - dps: 7024.84077 - tps: 3976.1114 + dps: 7022.48882 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-MajesticDragonFigurine-40430" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.48588 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-NevermeltingIceCrystal-50259" value: { - dps: 7194.2806 - tps: 4079.05067 + dps: 7191.6292 + tps: 4077.59637 } } dps_results: { key: "TestEnhancement-AllItems-OfferingofSacrifice-37638" value: { - dps: 7024.84666 - tps: 3976.1114 + dps: 7022.49471 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-PersistentEarthshatterDiamond" value: { - dps: 7105.99515 - tps: 4025.98256 + dps: 7106.78763 + tps: 4026.39155 } } dps_results: { key: "TestEnhancement-AllItems-PersistentEarthsiegeDiamond" value: { - dps: 7111.04637 - tps: 4028.76152 + dps: 7111.83886 + tps: 4029.17051 } } dps_results: { key: "TestEnhancement-AllItems-PetrifiedScarab-21685" value: { - dps: 7024.83782 - tps: 3976.1114 + dps: 7022.48588 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-PetrifiedTwilightScale-54571" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-PetrifiedTwilightScale-54591" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-PowerfulEarthshatterDiamond" value: { - dps: 7084.52743 - tps: 4014.17733 + dps: 7085.31992 + tps: 4014.58632 } } dps_results: { key: "TestEnhancement-AllItems-PowerfulEarthsiegeDiamond" value: { - dps: 7084.52743 - tps: 4014.17733 + dps: 7085.31992 + tps: 4014.58632 } } dps_results: { key: "TestEnhancement-AllItems-PurifiedShardoftheGods" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-ReignoftheDead-47316" value: { - dps: 7451.10335 - tps: 4269.75794 + dps: 7450.9307 + tps: 4269.65785 } } dps_results: { key: "TestEnhancement-AllItems-ReignoftheDead-47477" value: { - dps: 7501.08661 - tps: 4303.67184 + dps: 7500.91396 + tps: 4303.57176 } } dps_results: { key: "TestEnhancement-AllItems-RelentlessEarthsiegeDiamond" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-AllItems-RelentlessGladiator'sTotemofSurvival-42604" value: { - dps: 7270.72915 - tps: 4120.83608 + dps: 7272.7962 + tps: 4122.43811 } } dps_results: { key: "TestEnhancement-AllItems-RevitalizingSkyflareDiamond" value: { - dps: 7077.53665 - tps: 4009.62878 + dps: 7077.06685 + tps: 4009.32391 } } dps_results: { key: "TestEnhancement-AllItems-RuneofRepulsion-40372" value: { - dps: 7024.8496 - tps: 3976.1114 + dps: 7022.49766 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-SavageGladiator'sTotemofSurvival-42594" value: { - dps: 7216.04163 - tps: 4086.017 + dps: 7218.12627 + tps: 4087.62541 } } dps_results: { key: "TestEnhancement-AllItems-SealofthePantheon-36993" value: { - dps: 7024.8496 - tps: 3976.1114 + dps: 7022.49766 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-Shadowmourne-49623" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-AllItems-ShinyShardoftheGods" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-Sindragosa'sFlawlessFang-50361" value: { - dps: 7024.82833 - tps: 3976.1114 + dps: 7022.47638 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-SkycallTotem-33506" value: { - dps: 7180.2359 - tps: 4066.75658 + dps: 7184.17223 + tps: 4069.14985 } } dps_results: { key: "TestEnhancement-AllItems-SkyshatterHarness" value: { - dps: 5118.93071 - tps: 2880.34334 + dps: 5120.71735 + tps: 2880.51172 } } dps_results: { key: "TestEnhancement-AllItems-SkyshatterRegalia" value: { - dps: 5097.1185 - tps: 2885.66105 + dps: 5097.51935 + tps: 2885.75611 } } dps_results: { key: "TestEnhancement-AllItems-SliverofPureIce-50339" value: { - dps: 7172.21252 - tps: 4071.74022 + dps: 7169.60558 + tps: 4070.2605 } } dps_results: { key: "TestEnhancement-AllItems-SliverofPureIce-50346" value: { - dps: 7177.73832 - tps: 4076.28958 + dps: 7175.99824 + tps: 4075.38807 } } dps_results: { key: "TestEnhancement-AllItems-SoulPreserver-37111" value: { - dps: 7088.25554 - tps: 4015.98086 + dps: 7085.90359 + tps: 4014.66902 } } dps_results: { key: "TestEnhancement-AllItems-SouloftheDead-40382" value: { - dps: 7144.81031 - tps: 4044.76039 + dps: 7143.46507 + tps: 4044.08768 } } dps_results: { key: "TestEnhancement-AllItems-SparkofLife-37657" value: { - dps: 7111.75454 - tps: 4021.71483 + dps: 7115.48326 + tps: 4024.74138 } } dps_results: { key: "TestEnhancement-AllItems-SphereofRedDragon'sBlood-37166" value: { - dps: 7159.94709 - tps: 4051.1926 + dps: 7161.71969 + tps: 4052.23044 } } dps_results: { key: "TestEnhancement-AllItems-Stonebreaker'sTotem-33507" value: { - dps: 7219.32877 - tps: 4086.16478 + dps: 7219.93803 + tps: 4086.44886 } } dps_results: { key: "TestEnhancement-AllItems-StormshroudArmor" value: { - dps: 5386.69606 - tps: 3034.86848 + dps: 5382.64114 + tps: 3032.52024 } } dps_results: { key: "TestEnhancement-AllItems-SwiftSkyflareDiamond" value: { - dps: 7111.04637 - tps: 4028.76152 + dps: 7111.83886 + tps: 4029.17051 } } dps_results: { key: "TestEnhancement-AllItems-SwiftStarflareDiamond" value: { - dps: 7105.99515 - tps: 4025.98256 + dps: 7106.78763 + tps: 4026.39155 } } dps_results: { key: "TestEnhancement-AllItems-SwiftWindfireDiamond" value: { - dps: 7097.1555 - tps: 4021.11848 + dps: 7097.94799 + tps: 4021.52747 } } dps_results: { key: "TestEnhancement-AllItems-TalismanofTrollDivinity-37734" value: { - dps: 7024.84077 - tps: 3976.1114 + dps: 7022.48882 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-TearsoftheVanquished-47215" value: { - dps: 7110.33378 - tps: 4020.15519 + dps: 7109.1538 + tps: 4019.48013 } } dps_results: { key: "TestEnhancement-AllItems-TheFistsofFury" value: { - dps: 5634.29273 - tps: 3120.48114 + dps: 5612.31419 + tps: 3096.34017 } } dps_results: { key: "TestEnhancement-AllItems-TheGeneral'sHeart-45507" value: { - dps: 7024.84371 - tps: 3976.1114 + dps: 7022.49177 + tps: 3974.79956 } } dps_results: { key: "TestEnhancement-AllItems-Thrall'sBattlegear" value: { - dps: 6976.84418 - tps: 3965.26514 + dps: 6975.19817 + tps: 3964.40307 } } dps_results: { key: "TestEnhancement-AllItems-Thrall'sRegalia" value: { - dps: 6570.46158 - tps: 3760.10771 + dps: 6572.18057 + tps: 3760.94078 } } dps_results: { key: "TestEnhancement-AllItems-ThunderingSkyflareDiamond" value: { - dps: 7155.02702 - tps: 4059.55255 + dps: 7153.30922 + tps: 4058.61127 } } dps_results: { key: "TestEnhancement-AllItems-TidefuryRaiment" value: { - dps: 5101.10568 - tps: 2877.28132 + dps: 5102.11905 + tps: 2877.79462 } } dps_results: { key: "TestEnhancement-AllItems-TinyAbominationinaJar-50351" value: { - dps: 7275.69936 - tps: 4127.16788 + dps: 7271.02754 + tps: 4124.02512 } } dps_results: { key: "TestEnhancement-AllItems-TinyAbominationinaJar-50706" value: { - dps: 7272.75589 - tps: 4128.78007 + dps: 7271.25757 + tps: 4128.28233 } } dps_results: { key: "TestEnhancement-AllItems-TirelessSkyflareDiamond" value: { - dps: 7105.85343 - tps: 4027.61591 + dps: 7106.64592 + tps: 4028.02491 } } dps_results: { key: "TestEnhancement-AllItems-TirelessStarflareDiamond" value: { - dps: 7101.58823 - tps: 4024.9282 + dps: 7102.38072 + tps: 4025.33719 } } dps_results: { key: "TestEnhancement-AllItems-TomeofArcanePhenomena-36972" value: { - dps: 7142.42463 - tps: 4053.51878 + dps: 7143.43879 + tps: 4054.12371 } } dps_results: { key: "TestEnhancement-AllItems-TotemofElectrifyingWind-47666" value: { - dps: 7418.99303 - tps: 4218.47288 + dps: 7423.11182 + tps: 4219.62624 } } dps_results: { key: "TestEnhancement-AllItems-TotemofQuakingEarth-47667" value: { - dps: 7340.54089 - tps: 4152.6666 + dps: 7332.80599 + tps: 4148.19124 } } dps_results: { key: "TestEnhancement-AllItems-TotemoftheAvalanche-50463" value: { - dps: 7455.87013 - tps: 4216.47711 + dps: 7466.24909 + tps: 4221.73461 } } dps_results: { key: "TestEnhancement-AllItems-TotemoftheElementalPlane-40708" value: { - dps: 7264.1887 - tps: 4116.20382 + dps: 7261.95956 + tps: 4114.96868 } } dps_results: { key: "TestEnhancement-AllItems-TrenchantEarthshatterDiamond" value: { - dps: 7101.58823 - tps: 4024.9282 + dps: 7102.38072 + tps: 4025.33719 } } dps_results: { key: "TestEnhancement-AllItems-TrenchantEarthsiegeDiamond" value: { - dps: 7105.85343 - tps: 4027.61591 + dps: 7106.64592 + tps: 4028.02491 } } dps_results: { key: "TestEnhancement-AllItems-UndeadSlayer'sBlessedArmor" value: { - dps: 5678.20583 - tps: 3197.209 + dps: 5673.51614 + tps: 3194.28001 } } dps_results: { key: "TestEnhancement-AllItems-Val'anyr,HammerofAncientKings-46017" value: { - dps: 7326.88401 - tps: 4145.46032 + dps: 7363.70382 + tps: 4180.68675 } } dps_results: { key: "TestEnhancement-AllItems-WingedTalisman-37844" value: { - dps: 7088.39617 - tps: 4016.46558 + dps: 7086.04422 + tps: 4015.15374 } } dps_results: { key: "TestEnhancement-AllItems-WorldbreakerBattlegear" value: { - dps: 6952.38872 - tps: 3957.28535 + dps: 6951.06284 + tps: 3956.5625 } } dps_results: { key: "TestEnhancement-AllItems-WorldbreakerGarb" value: { - dps: 6574.15832 - tps: 3758.24536 + dps: 6572.59394 + tps: 3757.36135 } } dps_results: { key: "TestEnhancement-AllItems-WrathfulGladiator'sTotemofSurvival-51513" value: { - dps: 7285.98205 - tps: 4130.41273 + dps: 7288.04918 + tps: 4132.01603 } } dps_results: { key: "TestEnhancement-Average-Default" value: { - dps: 7241.08592 - tps: 4105.19573 + dps: 7240.29712 + tps: 4104.75861 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-Basic-FullBuffs-LongMultiTarget" value: { - dps: 21347.58064 - tps: 12319.07361 + dps: 21343.89024 + tps: 12317.3181 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-Basic-FullBuffs-LongSingleTarget" value: { - dps: 7232.84825 - tps: 4085.41826 + dps: 7231.49581 + tps: 4084.76367 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-Basic-FullBuffs-ShortSingleTarget" value: { - dps: 8573.81708 - tps: 4438.57955 + dps: 8570.33925 + tps: 4436.9868 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-Basic-NoBuffs-LongMultiTarget" value: { - dps: 10985.50414 - tps: 6739.87218 + dps: 10961.56862 + tps: 6741.17597 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-Basic-NoBuffs-LongSingleTarget" value: { - dps: 3901.68386 - tps: 2194.01029 + dps: 3899.89611 + tps: 2191.14532 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-Basic-NoBuffs-ShortSingleTarget" value: { - dps: 5206.71544 - tps: 2732.00879 + dps: 5207.61093 + tps: 2732.45458 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-FullBuffs-LongMultiTarget" value: { - dps: 21633.17642 - tps: 12049.82864 + dps: 21634.81174 + tps: 12050.52727 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-FullBuffs-LongSingleTarget" value: { - dps: 7595.0263 - tps: 4094.14424 + dps: 7594.86656 + tps: 4094.18733 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-FullBuffs-ShortSingleTarget" value: { - dps: 9366.39512 - tps: 4458.55594 + dps: 9362.72653 + tps: 4456.68532 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-NoBuffs-LongMultiTarget" value: { - dps: 12043.17386 - tps: 7304.85574 + dps: 12004.03637 + tps: 7267.21224 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-NoBuffs-LongSingleTarget" value: { - dps: 4210.35154 - tps: 2217.44588 + dps: 4206.52691 + tps: 2215.97544 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhFireElemental-NoBuffs-ShortSingleTarget" value: { - dps: 5784.60652 - tps: 2739.11819 + dps: 5788.95484 + tps: 2741.86651 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-FullBuffs-LongMultiTarget" value: { - dps: 21185.67058 - tps: 12025.44915 + dps: 21182.74697 + tps: 12024.55815 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-FullBuffs-LongSingleTarget" value: { - dps: 7433.63263 - tps: 4051.42136 + dps: 7431.69128 + tps: 4050.29413 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-FullBuffs-ShortSingleTarget" value: { - dps: 8993.147 - tps: 4330.97476 + dps: 8993.78668 + tps: 4331.14202 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-NoBuffs-LongMultiTarget" value: { - dps: 11403.19254 - tps: 7073.58621 + dps: 11394.15856 + tps: 7070.10117 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-NoBuffs-LongSingleTarget" value: { - dps: 4132.60636 - tps: 2225.21443 + dps: 4129.56508 + tps: 2223.912 } } dps_results: { key: "TestEnhancement-Settings-Orc-P1-EnhItemSwap-NoBuffs-ShortSingleTarget" value: { - dps: 5518.27912 - tps: 2669.97693 + dps: 5522.59628 + tps: 2672.27214 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-Basic-FullBuffs-LongMultiTarget" value: { - dps: 21303.69803 - tps: 12356.53743 + dps: 21299.66134 + tps: 12354.79994 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-Basic-FullBuffs-LongSingleTarget" value: { - dps: 7264.70208 - tps: 4118.19395 + dps: 7265.50906 + tps: 4118.61063 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-Basic-FullBuffs-ShortSingleTarget" value: { - dps: 8687.94982 - tps: 4548.74269 + dps: 8693.93986 + tps: 4551.66407 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-Basic-NoBuffs-LongMultiTarget" value: { - dps: 10995.24155 - tps: 6723.85676 + dps: 10906.94572 + tps: 6665.37099 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-Basic-NoBuffs-LongSingleTarget" value: { - dps: 3850.29626 - tps: 2167.90231 + dps: 3850.06573 + tps: 2167.81689 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-Basic-NoBuffs-ShortSingleTarget" value: { - dps: 5204.88445 - tps: 2757.94551 + dps: 5206.19619 + tps: 2758.37653 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-FullBuffs-LongMultiTarget" value: { - dps: 21259.37746 - tps: 11988.36035 + dps: 21265.28868 + tps: 11989.7054 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-FullBuffs-LongSingleTarget" value: { - dps: 7570.52618 - tps: 4134.64977 + dps: 7571.99365 + tps: 4135.03886 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-FullBuffs-ShortSingleTarget" value: { - dps: 9290.95886 - tps: 4532.83784 + dps: 9298.01192 + tps: 4535.76948 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-NoBuffs-LongMultiTarget" value: { - dps: 11798.24583 - tps: 7278.13941 + dps: 11856.49092 + tps: 7329.55183 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-NoBuffs-LongSingleTarget" value: { - dps: 4201.92494 - tps: 2252.22197 + dps: 4207.67891 + tps: 2253.7082 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhFireElemental-NoBuffs-ShortSingleTarget" value: { - dps: 5709.94632 - tps: 2762.56308 + dps: 5710.34251 + tps: 2762.17982 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-FullBuffs-LongMultiTarget" value: { - dps: 20787.67158 - tps: 11881.3297 + dps: 20789.92507 + tps: 11882.05555 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-FullBuffs-LongSingleTarget" value: { - dps: 7395.8183 - tps: 4069.93059 + dps: 7392.86738 + tps: 4068.18877 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-FullBuffs-ShortSingleTarget" value: { - dps: 8909.34363 - tps: 4387.55321 + dps: 8903.92823 + tps: 4384.7103 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-NoBuffs-LongMultiTarget" value: { - dps: 11351.4559 - tps: 7157.95937 + dps: 11298.08581 + tps: 7126.64241 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-NoBuffs-LongSingleTarget" value: { - dps: 4032.482 - tps: 2195.44612 + dps: 4035.18662 + tps: 2195.83015 } } dps_results: { key: "TestEnhancement-Settings-Troll-P1-EnhItemSwap-NoBuffs-ShortSingleTarget" value: { - dps: 5366.42365 - tps: 2635.85077 + dps: 5364.90393 + tps: 2635.1115 } } dps_results: { key: "TestEnhancement-SwitchInFrontOfTarget-Default" value: { - dps: 6866.96268 - tps: 3870.8582 + dps: 6869.12693 + tps: 3872.32717 } } diff --git a/sim/shaman/fire_elemental_totem.go b/sim/shaman/fire_elemental_totem.go index 0e597fb613..e119b2a5bb 100644 --- a/sim/shaman/fire_elemental_totem.go +++ b/sim/shaman/fire_elemental_totem.go @@ -75,6 +75,8 @@ func (shaman *Shaman) registerFireElementalTotem() { if enhTier10Aura != nil && shaman.Totems.EnhTierTenBonus { if enhTier10Aura.IsActive() { success = shaman.fireElementalSnapShot.CanSnapShot(sim, castWindow) + } else if sim.CurrentTime+fireTotemDuration > sim.Encounter.Duration { + success = true } } else if sim.CurrentTime > 1*time.Second && shaman.fireElementalSnapShot == nil { success = true diff --git a/sim/shaman/stormstrike.go b/sim/shaman/stormstrike.go index a6334a7d45..0c6efab4bc 100644 --- a/sim/shaman/stormstrike.go +++ b/sim/shaman/stormstrike.go @@ -40,7 +40,7 @@ func (shaman *Shaman) StormstrikeDebuffAura(target *core.Unit) *core.Aura { }) } -func (shaman *Shaman) newStormstrikeHitSpell(isMH bool) *core.Spell { +func (shaman *Shaman) newStormstrikeHitSpell(isMH bool) func(*core.Simulation, *core.Unit, *core.Spell) { var flatDamageBonus float64 = 0 if shaman.Equip[core.ItemSlotRanged].ID == TotemOfTheDancingFlame { flatDamageBonus += 155 @@ -53,31 +53,21 @@ func (shaman *Shaman) newStormstrikeHitSpell(isMH bool) *core.Spell { procMask = core.ProcMaskMeleeOHSpecial } - return shaman.RegisterSpell(core.SpellConfig{ - ActionID: StormstrikeActionID, - SpellSchool: core.SpellSchoolPhysical, - ProcMask: procMask, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagIncludeTargetBonusDamage, - - DamageMultiplier: core.TernaryFloat64(shaman.HasSetBonus(ItemSetWorldbreakerBattlegear, 2), 1.2, 1), - CritMultiplier: shaman.DefaultMeleeCritMultiplier(), - ThreatMultiplier: 1, - - ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { - var baseDamage float64 - if isMH { - baseDamage = flatDamageBonus + - spell.Unit.MHWeaponDamage(sim, spell.MeleeAttackPower()) + - spell.BonusWeaponDamage() - } else { - baseDamage = flatDamageBonus + - spell.Unit.OHWeaponDamage(sim, spell.MeleeAttackPower()) + - spell.BonusWeaponDamage() - } - - spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialCritOnly) - }, - }) + return func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { + var baseDamage float64 + spell.ProcMask = procMask + if isMH { + baseDamage = flatDamageBonus + + spell.Unit.MHWeaponDamage(sim, spell.MeleeAttackPower()) + + spell.BonusWeaponDamage() + } else { + baseDamage = flatDamageBonus + + spell.Unit.OHWeaponDamage(sim, spell.MeleeAttackPower()) + + spell.BonusWeaponDamage() + } + + spell.CalcAndDealDamage(sim, target, baseDamage, spell.OutcomeMeleeSpecialCritOnly) + } } func (shaman *Shaman) registerStormstrikeSpell() { @@ -105,7 +95,7 @@ func (shaman *Shaman) registerStormstrikeSpell() { ActionID: StormstrikeActionID, SpellSchool: core.SpellSchoolPhysical, ProcMask: core.ProcMaskMeleeMHSpecial, - Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL, + Flags: core.SpellFlagMeleeMetrics | core.SpellFlagAPL | core.SpellFlagIncludeTargetBonusDamage, ManaCost: core.ManaCostOptions{ BaseCost: 0.08, @@ -122,6 +112,8 @@ func (shaman *Shaman) registerStormstrikeSpell() { }, ThreatMultiplier: 1, + DamageMultiplier: core.TernaryFloat64(shaman.HasSetBonus(ItemSetWorldbreakerBattlegear, 2), 1.2, 1), + CritMultiplier: shaman.DefaultMeleeCritMultiplier(), ApplyEffects: func(sim *core.Simulation, target *core.Unit, spell *core.Spell) { result := spell.CalcOutcome(sim, target, spell.OutcomeMeleeSpecialHit) @@ -140,15 +132,12 @@ func (shaman *Shaman) registerStormstrikeSpell() { totemOfDuelingAura.Activate(sim) } - mhHit.Cast(sim, target) - casts := int32(1) + mhHit(sim, target, spell) if shaman.AutoAttacks.IsDualWielding { - ohHit.Cast(sim, target) - casts++ + ohHit(sim, target, spell) } - shaman.Stormstrike.SpellMetrics[target.UnitIndex].Casts -= casts shaman.Stormstrike.SpellMetrics[target.UnitIndex].Hits-- } spell.DealOutcome(sim, result) diff --git a/tools/database/gen_db/main.go b/tools/database/gen_db/main.go index 7bbb0ab166..d3c834c53b 100644 --- a/tools/database/gen_db/main.go +++ b/tools/database/gen_db/main.go @@ -9,6 +9,7 @@ import ( "os" "strings" + "github.com/wowsims/wotlk/sim" "github.com/wowsims/wotlk/sim/core" "github.com/wowsims/wotlk/sim/core/proto" _ "github.com/wowsims/wotlk/sim/encounters" // Needed for preset encounters. @@ -133,6 +134,12 @@ func main() { } } + for _, spellIds := range GetAllRotationSpellIds() { + for _, spellId := range spellIds { + db.AddSpellIcon(spellId, spellTooltips) + } + } + atlasDBProto := atlaslootDB.ToUIProto() db.MergeZones(atlasDBProto.Zones) db.MergeNpcs(atlasDBProto.Npcs) @@ -393,3 +400,144 @@ func getGlyphIDsFromJson(infile string) []*proto.GlyphID { } }) } + +func CreateTempAgent(r *proto.Raid) core.Agent { + encounter := core.MakeSingleTargetEncounter(0.0) + env, _, _ := core.NewEnvironment(r, encounter) + return env.Raid.Parties[0].Players[0] +} + +type RotContainer struct { + Name string + Raid *proto.Raid +} + +func GetAllRotationSpellIds() map[string][]int32 { + sim.RegisterAll() + + rotMapping := []RotContainer{ + {Name: "feral", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassDruid, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "-503202132322010053120230310511-205503012", + }, &proto.Player_FeralDruid{FeralDruid: &proto.FeralDruid{Options: &proto.FeralDruid_Options{}, Rotation: &proto.FeralDruid_Rotation{}}}), nil, nil, nil)}, + {Name: "balance", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassDruid, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "5102233115331303213305311031--205003002", + }, &proto.Player_BalanceDruid{BalanceDruid: &proto.BalanceDruid{Options: &proto.BalanceDruid_Options{}, Rotation: &proto.BalanceDruid_Rotation{}}}), nil, nil, nil)}, + {Name: "guardian", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassDruid, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "-503232132322010353120300313511-20350001", + }, &proto.Player_FeralTankDruid{FeralTankDruid: &proto.FeralTankDruid{Options: &proto.FeralTankDruid_Options{}, Rotation: &proto.FeralTankDruid_Rotation{}}}), nil, nil, nil)}, + {Name: "restodruid", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassDruid, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "05320031103--230023312131502331050313051", + }, &proto.Player_RestorationDruid{RestorationDruid: &proto.RestorationDruid{Options: &proto.RestorationDruid_Options{}, Rotation: &proto.RestorationDruid_Rotation{}}}), nil, nil, nil)}, + {Name: "elemental", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassShaman, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "0532001523212351322301351-005052031", + }, &proto.Player_ElementalShaman{ElementalShaman: &proto.ElementalShaman{Options: &proto.ElementalShaman_Options{}, Rotation: &proto.ElementalShaman_Rotation{}}}), nil, nil, nil)}, + {Name: "enhance", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassShaman, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "053030152-30405003105021333031131031051", + }, &proto.Player_EnhancementShaman{EnhancementShaman: &proto.EnhancementShaman{Options: &proto.EnhancementShaman_Options{}, Rotation: &proto.EnhancementShaman_Rotation{}}}), nil, nil, nil)}, + {Name: "restosham", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassShaman, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "-3020503-50005331335310501122331251", + }, &proto.Player_RestorationShaman{RestorationShaman: &proto.RestorationShaman{Options: &proto.RestorationShaman_Options{}, Rotation: &proto.RestorationShaman_Rotation{}}}), nil, nil, nil)}, + {Name: "hunter", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassHunter, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "-015305101-5000032500033330532135301311", + }, &proto.Player_Hunter{Hunter: &proto.Hunter{Options: &proto.Hunter_Options{}, Rotation: &proto.Hunter_Rotation{}}}), nil, nil, nil)}, + {Name: "mage", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassMage, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "23000513310033015032310250532-03-023303001", + }, &proto.Player_Mage{Mage: &proto.Mage{Options: &proto.Mage_Options{}, Rotation: &proto.Mage_Rotation{}}}), nil, nil, nil)}, + {Name: "healingpriest", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassPriest, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "0503203130300512301313231251-2351010303", + }, &proto.Player_HealingPriest{HealingPriest: &proto.HealingPriest{Options: &proto.HealingPriest_Options{}, Rotation: &proto.HealingPriest_Rotation{}}}), nil, nil, nil)}, + {Name: "shadow", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassPriest, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "05032031--325023051223010323151301351", + }, &proto.Player_ShadowPriest{ShadowPriest: &proto.ShadowPriest{Options: &proto.ShadowPriest_Options{}, Rotation: &proto.ShadowPriest_Rotation{}}}), nil, nil, nil)}, + {Name: "rogue", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassRogue, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "00532000523-0252051050035010223100501251", + }, &proto.Player_Rogue{Rogue: &proto.Rogue{Options: &proto.Rogue_Options{}, Rotation: &proto.Rogue_Rotation{}}}), nil, nil, nil)}, + {Name: "warrior", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassWarrior, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "302023102331-305053000520310053120500351", + }, &proto.Player_Warrior{Warrior: &proto.Warrior{Options: &proto.Warrior_Options{}, Rotation: &proto.Warrior_Rotation{}}}), nil, nil, nil)}, + {Name: "protwarrior", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassWarrior, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "2500030023-302-053351225000012521030113321", + }, &proto.Player_ProtectionWarrior{ProtectionWarrior: &proto.ProtectionWarrior{Options: &proto.ProtectionWarrior_Options{}, Rotation: &proto.ProtectionWarrior_Rotation{}}}), nil, nil, nil)}, + {Name: "holypally", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassPaladin, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "50350151020013053100515221-50023131203", + }, &proto.Player_HolyPaladin{HolyPaladin: &proto.HolyPaladin{Options: &proto.HolyPaladin_Options{}, Rotation: &proto.HolyPaladin_Rotation{}}}), nil, nil, nil)}, + {Name: "protpally", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassPaladin, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "-05005135200132311333312321-511302012003", + }, &proto.Player_ProtectionPaladin{ProtectionPaladin: &proto.ProtectionPaladin{Options: &proto.ProtectionPaladin_Options{}, Rotation: &proto.ProtectionPaladin_Rotation{}}}), nil, nil, nil)}, + {Name: "ret", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassPaladin, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "050501-05-05232051203331302133231331", + }, &proto.Player_RetributionPaladin{RetributionPaladin: &proto.RetributionPaladin{Options: &proto.RetributionPaladin_Options{}, Rotation: &proto.RetributionPaladin_Rotation{}}}), nil, nil, nil)}, + {Name: "warlock", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassWarlock, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "2350002030023510253500331151--550000051", + }, &proto.Player_Warlock{Warlock: &proto.Warlock{Options: &proto.Warlock_Options{}, Rotation: &proto.Warlock_Rotation{}}}), nil, nil, nil)}, + {Name: "dk", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassDeathknight, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "-320043500002-2300303050032152000150013133051", + }, &proto.Player_Deathknight{Deathknight: &proto.Deathknight{Options: &proto.Deathknight_Options{}, Rotation: &proto.Deathknight_Rotation{}}}), nil, nil, nil)}, + {Name: "tankdk", Raid: core.SinglePlayerRaidProto(core.WithSpec(&proto.Player{ + Class: proto.Class_ClassDeathknight, + Equipment: &proto.EquipmentSpec{}, + TalentsString: "005510153330330220102013-3050505100023101-002", + }, &proto.Player_TankDeathknight{TankDeathknight: &proto.TankDeathknight{Options: &proto.TankDeathknight_Options{}, Rotation: &proto.TankDeathknight_Rotation{}}}), nil, nil, nil)}, + } + + ret_db := make(map[string][]int32, 0) + + for _, r := range rotMapping { + f := CreateTempAgent(r.Raid).GetCharacter() + + spells := make([]int32, 0, len(f.Spellbook)) + + for _, s := range f.Spellbook { + if s.SpellID != 0 { + spells = append(spells, s.SpellID) + } + } + + for _, s := range f.GetAuras() { + if s.ActionID.SpellID != 0 { + spells = append(spells, s.ActionID.SpellID) + } + } + + ret_db[r.Name] = spells + } + return ret_db +} diff --git a/tools/database/overrides.go b/tools/database/overrides.go index 0b313f6835..ebca73ca82 100644 --- a/tools/database/overrides.go +++ b/tools/database/overrides.go @@ -545,7 +545,7 @@ var SharedSpellsIcons = []int32{ 16862, 55487, - 33876, + 48566, 46855, 57393, @@ -579,6 +579,14 @@ var SharedSpellsIcons = []int32{ 53408, 11374, + 15235, + + 27013, + + 58749, + 49071, + + 30708, } // If any of these match the item name, don't include it. diff --git a/ui/core/components/character_stats.ts b/ui/core/components/character_stats.ts index b8f828d8f0..8ddac00d72 100644 --- a/ui/core/components/character_stats.ts +++ b/ui/core/components/character_stats.ts @@ -76,8 +76,8 @@ export class CharacterStats extends Component { const debuffStats = this.getDebuffStats(); const bonusStats = player.getBonusStats(); - const baseDelta = baseStats.subtract(bonusStats); - const gearDelta = gearStats.subtract(baseStats); + const baseDelta = baseStats; + const gearDelta = gearStats.subtract(baseStats).subtract(bonusStats); const talentsDelta = talentsStats.subtract(gearStats).add(statMods.talents); const buffsDelta = buffsStats.subtract(talentsStats); const consumesDelta = consumesStats.subtract(buffsStats); diff --git a/ui/core/components/gear_picker.ts b/ui/core/components/gear_picker.ts index 0954d1fd81..f64509db9b 100644 --- a/ui/core/components/gear_picker.ts +++ b/ui/core/components/gear_picker.ts @@ -7,6 +7,7 @@ import { makePhaseSelector, makeShow1hWeaponsSelector, makeShow2hWeaponsSelector, + makeShowEPValuesSelector, makeShowMatchingGemsSelector, } from './other_inputs'; @@ -745,6 +746,7 @@ export class SelectorModal extends BaseModal { let invokeUpdate = () => { ilist.updateSelected() } let applyFilter = () => { ilist.applyFilters() } + let hideOrShowEPValues = () => { ilist.hideOrShowEPValues() } // Add event handlers gearData.changeEvent.on(invokeUpdate); @@ -752,11 +754,13 @@ export class SelectorModal extends BaseModal { this.player.sim.phaseChangeEmitter.on(applyFilter); this.player.sim.filtersChangeEmitter.on(applyFilter); + this.player.sim.showEPValuesChangeEmitter.on(hideOrShowEPValues); gearData.changeEvent.on(applyFilter); this.addOnDisposeCallback(() => { this.player.sim.phaseChangeEmitter.off(applyFilter); this.player.sim.filtersChangeEmitter.off(applyFilter); + this.player.sim.showEPValuesChangeEmitter.off(hideOrShowEPValues); gearData.changeEvent.off(applyFilter); }); @@ -865,6 +869,7 @@ export class ItemList { const selected = label === config.selectedTab; const tabContentFragment = document.createElement('fragment'); + const showEPValues = simUI.sim.getShowEPValues(); tabContentFragment.innerHTML = `
{
+
Item - EP(+/-) + EP(+/-)
@@ -900,6 +906,8 @@ export class ItemList { (tabContent.getElementsByClassName('selector-modal-show-2h-weapons')[0] as HTMLElement).style.display = 'none'; } + makeShowEPValuesSelector(tabContent.getElementsByClassName('selector-modal-show-ep-values')[0] as HTMLElement, player.sim); + const showMatchingGemsSelector = makeShowMatchingGemsSelector(tabContent.getElementsByClassName('selector-modal-show-matching-gems')[0] as HTMLElement, player.sim); if (!label.startsWith('Gem')) { (tabContent.getElementsByClassName('selector-modal-show-matching-gems')[0] as HTMLElement).style.display = 'none'; @@ -1147,6 +1155,7 @@ export class ItemList { } this.applyFilters(); + this.hideOrShowEPValues(); } public updateSelected() { @@ -1167,10 +1176,12 @@ export class ItemList { } const epDeltaElem = elem.getElementsByClassName('selector-modal-list-item-ep-delta')[0] as HTMLSpanElement; - epDeltaElem.textContent = ''; - if (listItem) { - const listItemEP = this.computeEP(listItem); - formatDeltaTextElem(epDeltaElem, newEP, listItemEP, 0); + if (epDeltaElem) { + epDeltaElem.textContent = ''; + if (listItem) { + const listItemEP = this.computeEP(listItem); + formatDeltaTextElem(epDeltaElem, newEP, listItemEP, 0); + } } }); }; @@ -1238,6 +1249,18 @@ export class ItemList { }); } + public hideOrShowEPValues() { + const epItems = document.getElementsByClassName("selector-modal-list-item-ep") + const display = this.player.sim.getShowEPValues() ? "block" : "none" + + for (let i = 0; i < epItems.length; i++) { + const epItem = epItems.item(i) as HTMLElement; + epItem.style.display = display + } + + document.getElementById("ep-delta-label")!.style.display = display + } + private fillSourceInfo(item: Item, container: HTMLDivElement, sim: Sim) { if (!item.sources || item.sources.length == 0) { return; @@ -1291,5 +1314,4 @@ export class ItemList { `; } } - } \ No newline at end of file diff --git a/ui/core/components/icon_inputs.ts b/ui/core/components/icon_inputs.ts index cd4603ede8..c7511a21aa 100644 --- a/ui/core/components/icon_inputs.ts +++ b/ui/core/components/icon_inputs.ts @@ -206,7 +206,7 @@ export const AttackPowerDebuff = InputHelpers.makeMultiIconInput([ ], 'Atk Pwr'); export const BleedDebuff = InputHelpers.makeMultiIconInput([ - makeBooleanDebuffInput(ActionId.fromSpellId(33876), 'mangle'), + makeBooleanDebuffInput(ActionId.fromSpellId(48564), 'mangle'), makeBooleanDebuffInput(ActionId.fromSpellId(46855), 'trauma'), makeBooleanDebuffInput(ActionId.fromSpellId(57393), 'stampede'), ], 'Bleed'); diff --git a/ui/core/components/icon_picker.ts b/ui/core/components/icon_picker.ts index 32fbca3148..13e2448cd5 100644 --- a/ui/core/components/icon_picker.ts +++ b/ui/core/components/icon_picker.ts @@ -186,8 +186,12 @@ export class IconPicker extends Input= 4 && this.config.improvedId2) { if (this.currentValue > 2) { this.improvedAnchor2.classList.add('active'); + this.improvedAnchor.hidden = true; + this.improvedAnchor2.hidden = false; } else { this.improvedAnchor2.classList.remove('active'); + this.improvedAnchor.hidden = false; + this.improvedAnchor2.hidden = true; } } diff --git a/ui/core/components/individual_sim_ui/apl_actions.ts b/ui/core/components/individual_sim_ui/apl_actions.ts index 780b322503..22eb131bdc 100644 --- a/ui/core/components/individual_sim_ui/apl_actions.ts +++ b/ui/core/components/individual_sim_ui/apl_actions.ts @@ -7,6 +7,7 @@ import { APLActionMultidot, APLActionAutocastOtherCooldowns, APLActionChangeTarget, + APLActionActivateAura, APLActionCancelAura, APLActionTriggerICD, APLActionWait, @@ -415,6 +416,16 @@ const actionKindFactories: {[f in NonNullable]: ActionKindConfig< AplHelpers.unitFieldConfig('newTarget', 'targets'), ], }), + ['activateAura']: inputBuilder({ + label: 'Activate Aura', + submenu: ['Misc'], + shortDescription: 'Activates an aura', + includeIf: (player: Player, isPrepull: boolean) => isPrepull, + newValue: () => APLActionActivateAura.create(), + fields: [ + AplHelpers.actionIdFieldConfig('auraId', 'auras'), + ], + }), ['cancelAura']: inputBuilder({ label: 'Cancel Aura', submenu: ['Misc'], diff --git a/ui/core/components/other_inputs.ts b/ui/core/components/other_inputs.ts index 3865d2ee49..cc262704c7 100644 --- a/ui/core/components/other_inputs.ts +++ b/ui/core/components/other_inputs.ts @@ -51,6 +51,19 @@ export function makeShowMatchingGemsSelector(parent: HTMLElement, sim: Sim): Boo }); } +export function makeShowEPValuesSelector(parent: HTMLElement, sim: Sim): BooleanPicker { + return new BooleanPicker(parent, sim, { + extraCssClasses: ['show-ep-values-selector', 'input-inline', 'mb-0'], + label: 'Show EP', + inline: true, + changedEvent: (sim: Sim) => sim.showEPValuesChangeEmitter, + getValue: (sim: Sim) => sim.getShowEPValues(), + setValue: (eventID: EventID, sim: Sim, newValue: boolean) => { + sim.setShowEPValues(eventID, newValue); + }, + }); +} + export function makePhaseSelector(parent: HTMLElement, sim: Sim): EnumPicker { return new EnumPicker(parent, sim, { extraCssClasses: ['phase-selector'], diff --git a/ui/core/sim.ts b/ui/core/sim.ts index 334bcabb80..afa3eb9e53 100644 --- a/ui/core/sim.ts +++ b/ui/core/sim.ts @@ -55,6 +55,7 @@ export class Sim { private showThreatMetrics: boolean = false; private showHealingMetrics: boolean = false; private showExperimental: boolean = false; + private showEPValues: boolean = false; private language: string = ''; readonly raid: Raid; @@ -72,6 +73,7 @@ export class Sim { readonly showThreatMetricsChangeEmitter = new TypedEvent(); readonly showHealingMetricsChangeEmitter = new TypedEvent(); readonly showExperimentalChangeEmitter = new TypedEvent(); + readonly showEPValuesChangeEmitter = new TypedEvent(); readonly languageChangeEmitter = new TypedEvent(); readonly crashEmitter = new TypedEvent(); @@ -116,6 +118,7 @@ export class Sim { this.showThreatMetricsChangeEmitter, this.showHealingMetricsChangeEmitter, this.showExperimentalChangeEmitter, + this.showEPValuesChangeEmitter, this.languageChangeEmitter, ]); @@ -481,6 +484,16 @@ export class Sim { } } + getShowEPValues(): boolean { + return this.showEPValues; + } + setShowEPValues(eventID: EventID, newShowEPValues: boolean) { + if (newShowEPValues != this.showEPValues) { + this.showEPValues = newShowEPValues; + this.showEPValuesChangeEmitter.emit(eventID); + } + } + getLanguage(): string { return this.language; } @@ -535,6 +548,7 @@ export class Sim { showThreatMetrics: this.getShowThreatMetrics(), showHealingMetrics: this.getShowHealingMetrics(), showExperimental: this.getShowExperimental(), + showEpValues: this.getShowEPValues(), language: this.getLanguage(), faction: this.getFaction(), filters: filters, @@ -550,6 +564,7 @@ export class Sim { this.setShowThreatMetrics(eventID, proto.showThreatMetrics); this.setShowHealingMetrics(eventID, proto.showHealingMetrics); this.setShowExperimental(eventID, proto.showExperimental); + this.setShowEPValues(eventID, proto.showEpValues); this.setLanguage(eventID, proto.language); this.setFaction(eventID, proto.faction || Faction.Alliance) @@ -583,6 +598,7 @@ export class Sim { showHealingMetrics: isHealingSim, language: this.getLanguage(), // Don't change language. filters: Sim.defaultFilters(), + showEpValues: false, })); } diff --git a/ui/protection_warrior/inputs.ts b/ui/protection_warrior/inputs.ts index d05140ba08..5c51790c84 100644 --- a/ui/protection_warrior/inputs.ts +++ b/ui/protection_warrior/inputs.ts @@ -29,7 +29,7 @@ export const ShoutPicker = InputHelpers.makeSpecOptionsEnumIconInput