From e1106bb20ab7525d19b99fbd052b337188b53c95 Mon Sep 17 00:00:00 2001 From: Artem Frolov Date: Tue, 20 Oct 2026 19:27:11 +0300 Subject: [PATCH 1/3] chore: data sync from 36 new own keys Data.lua: 23 rows changed, none added or removed. Shivan Punisher Demonic Frenzy loses its opener (support fell just under half), Chitigoth Insidious Aura bar 10s -> 8s, Overgrown Hydra Lightmaw Beams follow-up channel now verified, Brutok Head Bash hits 3 -> 2.5, damage/hits filled for six rows, the rest are held counters catching up. Traits.lua: Chitigoth channel 8s, Living Venom co-presence with 263109. --- Data.lua | 46 +++++++++++++++++++++++----------------------- Traits.lua | 4 ++-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Data.lua b/Data.lua index 78489c0..acd15f2 100644 --- a/Data.lua +++ b/Data.lua @@ -46,14 +46,14 @@ CastAheadData = { { spell = 1293464, npc = 136076, mob = "Agitated Nimbus", name = "Accumulate Charge", cast = 1.5, cd = { 9.7 }, first = 20.4, hits = nil, dmg = nil, kick = 0.0, cc = 0.04, n = 2431, firstN = 189, level = 91, offset = nil, targeted = false, }, { spell = 1293650, npc = 136076, mob = "Agitated Nimbus", name = "Call Lightning", cast = 1.5, cd = { 13.4, 20.6 }, first = 11.8, hits = nil, dmg = nil, kick = 0.0, cc = 0.02, n = 1658, firstN = 195, level = 91, offset = 6.1, }, { spell = 1302153, npc = 268491, mob = "Twisted Hexxer", name = "Latent Hex", cast = 2.0, cd = { 18.2 }, first = 3.3, hits = nil, dmg = nil, kick = 0.0, cc = 0.07, n = 947, firstN = 140, level = 91, offset = 0.0, targeted = true, }, - { spell = 1311980, npc = 136250, mob = "Twisted Hexxer", name = "Latent Hex", cast = 2.0, cd = { 24.3 }, first = 12.7, hits = nil, dmg = nil, kick = 0.0, cc = 0.03, n = 300, firstN = 41, level = 91, offset = 8.9, targeted = false, }, + { spell = 1311980, npc = 136250, mob = "Twisted Hexxer", name = "Latent Hex", cast = 2.0, cd = { 24.3 }, first = 12.7, hits = nil, dmg = nil, kick = 0.0, cc = 0.03, n = 300, firstN = 82, level = 91, offset = 8.9, targeted = false, }, { spell = 269116, npc = 134599, mob = "Imbued Stormcaller", name = "Draw Power", cast = 2.0, cd = { 42.1 }, first = -1.3, hits = nil, dmg = nil, kick = 0.0, cc = 0.01, n = 353, firstN = 9, level = 90, offset = 0.0, targeted = false, }, { spell = 1291262, npc = 134599, mob = "Imbued Stormcaller", name = "Lightning Bolt", cast = 2.5, cd = { 3.6 }, first = 0.0, hits = 1.0, dmg = 0.28, kick = 0.41, cc = 0.21, n = 5812, firstN = 358, level = 90, offset = nil, kickable = true, filler = true, targeted = true, }, { spell = 1291262, npc = 134990, mob = "Storm Adept", name = "Lightning Bolt", cast = 2.5, cd = { 3.6 }, first = 0.0, hits = 1.0, dmg = 0.278, kick = 0.41, cc = 0.22, n = 7671, firstN = 469, level = 90, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 1310683, npc = 139425, mob = "Brood Tender", name = "Venom Bolt", cast = 2.5, cd = { 3.6 }, first = 0.0, hits = 1.0, dmg = 0.27, kick = 0.4, cc = 0.2, n = 5351, firstN = 238, level = 90, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 1291622, npc = 134390, mob = "Storm Serpent", name = "Storm Catalyst", cast = 2.5, cd = { 8.5 }, first = 3.5, hits = 1.0, dmg = 0.383, kick = 0.0, cc = 0.07, n = 1015, firstN = 125, level = 91, offset = 0.0, targeted = false, }, { spell = 1300803, npc = 268344, mob = "Corrupted Guardian", name = "Tainted Strike", cast = 2.5, cd = { 10.9 }, first = 3.2, hits = 1.0, dmg = 0.17, kick = 0.0, cc = 0.13, n = 825, firstN = 184, level = 91, offset = 0.0, targeted = true, }, - { spell = 1303443, npc = 135007, mob = "Orb Watcher", name = "Venomous Slash", cast = 2.5, cd = { 24.3 }, first = 3.0, hits = 1.0, dmg = 0.193, kick = 0.0, cc = 0.04, n = 1069, firstN = 72, level = 91, offset = 0.0, targeted = true, }, + { spell = 1303443, npc = 135007, mob = "Orb Watcher", name = "Venomous Slash", cast = 2.5, cd = { 24.3 }, first = 3.0, hits = 1.0, dmg = 0.221, kick = 0.0, cc = 0.04, n = 1069, firstN = 72, level = 91, offset = 0.0, targeted = true, }, { spell = 1292990, npc = 134629, mob = "Sand-Sworn Rider", name = "Swarming Krolusks", cast = 2.5, cd = { 29.1 }, first = 19.4, hits = 1.0, dmg = 0.025, kick = 0.0, cc = 0.05, n = 1479, firstN = 102, level = 91, offset = 12.2, targeted = false, }, { spell = 1292990, npc = 139422, mob = "Dutiful Tamer", name = "Swarming Krolusks", cast = 2.5, cd = { 29.1 }, first = 5.9, hits = nil, dmg = nil, kick = 0.0, cc = 0.2, n = 349, firstN = 37, level = 90, offset = 0.0, targeted = false, }, { spell = 1291468, npc = 134991, mob = "Sandfury Stonefist", name = "Sunder Slam", cast = 3.0, cd = { 21.9 }, first = 5.7, hits = 1.0, dmg = 0.115, kick = 0.0, cc = 0.04, n = 1081, firstN = 62, level = 91, offset = 0.0, targeted = true, }, @@ -79,14 +79,14 @@ CastAheadData = { { spell = 384194, npc = 190207, mob = "Primalist Cinderweaver", name = "Cinderbolt", cast = 2.5, cd = { 3.6 }, first = 0.2, hits = 1.0, dmg = 0.331, kick = 0.41, cc = 0.23, n = 23434, firstN = 624, level = 90, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 385310, npc = 195119, mob = "Ruinous Stormbringer", name = "Storm Bolt", cast = 2.5, cd = { 3.6 }, first = 0.0, hits = 1.0, dmg = 0.295, kick = 0.39, cc = 0.07, n = 340, firstN = 9, level = 91, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 372730, npc = 188244, mob = "Primal Juggernaut", name = "Crushing Smash", cast = 2.5, cd = { 20.6 }, first = 3.6, hits = 1.0, dmg = 0.232, kick = 0.0, cc = 0.05, n = 1072, firstN = 99, level = 91, offset = nil, targeted = true, }, - { spell = 392394, npc = 197697, mob = "Flamegullet", name = "Fire Maw", cast = 2.5, cd = { 20.6 }, first = 11.1, hits = 1.0, dmg = 0.261, kick = 0.0, cc = 0.02, n = 744, firstN = 107, level = 91, offset = 7.6, targeted = true, }, + { spell = 392394, npc = 197697, mob = "Flamegullet", name = "Fire Maw", cast = 2.5, cd = { 20.6 }, first = 11.1, hits = 1.0, dmg = 0.261, kick = 0.0, cc = 0.02, n = 1494, firstN = 107, level = 91, offset = 7.6, targeted = true, }, { spell = 392395, npc = 197698, mob = "Thunderhead", name = "Thunder Jaw", cast = 2.5, cd = { 20.6 }, first = 13.0, hits = nil, dmg = nil, kick = 0.0, cc = 0.08, n = 192, firstN = 20, level = 91, offset = 8.2, targeted = true, }, { spell = 384823, npc = 189886, mob = "Blazebound Firestorm", name = "Inferno", cast = 3.0, cd = { 13.8 }, first = 2.4, hits = 5.0, dmg = 0.342, kick = 0.0, cc = 0.15, n = 1472, firstN = 503, level = 91, offset = 0.0, targeted = false, }, - { spell = 373017, npc = 189886, mob = "Blazebound Firestorm", name = "Blaze Volley", cast = 3.5, cd = { 3.6 }, first = 6.5, hits = nil, dmg = nil, kick = 0.9, cc = 0.08, n = 2105, firstN = 519, level = 91, offset = 4.1, kickable = true, filler = true, approx = true, targeted = true, }, + { spell = 373017, npc = 189886, mob = "Blazebound Firestorm", name = "Blaze Volley", cast = 3.5, cd = { 3.6 }, first = 6.5, hits = 5.0, dmg = 0.435, kick = 0.9, cc = 0.08, n = 2105, firstN = 519, level = 91, offset = 4.1, kickable = true, filler = true, approx = true, targeted = true, }, { spell = 1305201, npc = 188244, mob = "Primal Juggernaut", name = "Excavating Blast", cast = 3.5, cd = { 26.7 }, first = 8.8, hits = 5.0, dmg = 0.347, kick = 0.0, cc = 0.05, n = 824, firstN = 87, level = 91, offset = nil, targeted = false, }, - { spell = 373692, npc = 190034, mob = "Blazebound Destroyer", name = "Inferno", cast = 3.5, cd = { 26.7 }, first = 7.4, hits = 5.0, dmg = 0.325, kick = 0.0, cc = 0.05, n = 2005, firstN = 406, level = 91, offset = 7.3, targeted = false, }, + { spell = 373692, npc = 190034, mob = "Blazebound Destroyer", name = "Inferno", cast = 3.5, cd = { 26.7 }, first = 7.4, hits = 5.0, dmg = 0.325, kick = 0.0, cc = 0.05, n = 4025, firstN = 406, level = 91, offset = 7.3, targeted = false, }, { spell = 1305955, npc = 190034, mob = "Blazebound Destroyer", name = "Fiery Blast", cast = 4.0, cd = { 18.2 }, first = 0.0, hits = 1.0, dmg = 0.483, kick = 0.84, cc = 0.03, n = 3526, firstN = 322, level = 91, offset = 0.0, kickable = true, targeted = true, }, - { spell = 391723, npc = 197697, mob = "Flamegullet", name = "Flame Breath", cast = 4.0, cd = { 19.4 }, first = 3.7, hits = 5.0, dmg = 0.272, kick = 0.0, cc = 0.04, n = 871, firstN = 132, level = 91, offset = 0.0, follow = 3.0, targeted = true, }, + { spell = 391723, npc = 197697, mob = "Flamegullet", name = "Flame Breath", cast = 4.0, cd = { 19.4 }, first = 3.7, hits = 5.0, dmg = 0.272, kick = 0.0, cc = 0.04, n = 1745, firstN = 132, level = 91, offset = 0.0, follow = 3.0, targeted = true, }, { spell = 372087, npc = 187897, mob = "Defier Draghar", name = "Blazing Rush", cast = 4.0, cd = { 20.6 }, first = 12.3, hits = nil, dmg = nil, kick = 0.0, cc = 0.05, n = 867, firstN = 56, level = 91, offset = 4.0, targeted = false, }, { spell = 392576, npc = 198047, mob = "Tempest Channeler", name = "Thunder Blast", cast = 4.0, cd = { 23.0 }, first = 0.0, hits = 1.0, dmg = 0.419, kick = 0.92, cc = 0.02, n = 1089, firstN = 172, level = 91, offset = 0.0, kickable = true, targeted = true, }, { spell = 391726, npc = 197698, mob = "Thunderhead", name = "Storm Breath", cast = 4.0, cd = { 24.3 }, first = 20.8, hits = nil, dmg = nil, kick = 0.0, cc = 0.05, n = 152, firstN = 22, level = 91, offset = 15.8, follow = 3.0, followUnknown = true, targeted = true, }, @@ -95,11 +95,11 @@ CastAheadData = { { spell = 1306366, npc = 198047, mob = "Tempest Channeler", name = "Lightning Torrent", cast = 7.0, cd = { 24.3 }, first = 6.1, hits = 1.0, dmg = 0.206, kick = 0.0, cc = 0.0, n = 970, firstN = 100, level = 91, offset = 6.2, channel = true, }, { spell = 1306366, npc = 197535, mob = "High Channeler Ryvati", name = "Lightning Torrent", cast = 7.0, cd = { 32.8 }, first = 20.3, hits = 5.0, dmg = 0.208, kick = 0.0, cc = 0.0, n = 475, firstN = 74, level = 91, offset = 15.8, channel = true, }, { spell = 385536, npc = 190206, mob = "Ashseer Flamelasher", name = "Flaming Barrage", cast = 10.0, cd = { 26.7 }, first = 8.6, hits = 1.0, dmg = 0.1, kick = 0.0, cc = 0.0, n = 7187, firstN = 202, level = 90, offset = 0.0, channel = true, targeted = false, }, - { spell = 372743, npc = 188067, mob = "Flashfrost Chillweaver", name = "Ice Shield", cast = 15.0, cd = { 26.7 }, first = 6.7, hits = nil, dmg = nil, kick = 0.39, cc = 0.0, n = 4549, firstN = 121, level = 90, offset = nil, kickable = true, channel = true, targeted = true, }, + { spell = 372743, npc = 188067, mob = "Flashfrost Chillweaver", name = "Ice Shield", cast = 15.0, cd = { 26.7 }, first = 6.7, hits = 1.0, dmg = 0.398, kick = 0.39, cc = 0.0, n = 4549, firstN = 121, level = 90, offset = nil, kickable = true, channel = true, targeted = true, }, }, [2813] = { name = "Murder Row", { spell = 1258537, npc = 236902, mob = "Massive Felwyrm", name = "Summon Wyrms", cast = 1.0, cd = { 23.1 }, first = 7.5, hits = 4.0, dmg = 0.136, kick = 0.0, cc = 0.0, n = 424, firstN = 49, level = 91, offset = nil, channel = true, targeted = true, }, - { spell = 1294770, npc = 235465, mob = "Shivan Punisher", name = "Demonic Frenzy", cast = 1.0, cd = { 96.8 }, first = 24.1, hits = 4.0, dmg = 0.095, kick = 0.0, cc = 0.0, n = 604, firstN = 18, level = 91, offset = nil, approx = true, targeted = false, }, + { spell = 1294770, npc = 235465, mob = "Shivan Punisher", name = "Demonic Frenzy", cast = 1.0, cd = { 96.8 }, first = nil, hits = 4.0, dmg = 0.095, kick = 0.0, cc = 0.0, n = 604, firstN = 0, level = 91, offset = nil, approx = true, targeted = false, }, { spell = 1216589, npc = 236091, mob = "Street Sneak", name = "Heartstop Poison", cast = 1.5, cd = { 21.9 }, first = 8.5, hits = nil, dmg = nil, kick = 0.0, cc = 0.09, n = 3126, firstN = 162, level = 90, offset = 0.0, targeted = false, }, { spell = 1217973, npc = 235265, mob = "Corrupted Warlock", name = "Curse of Doom", cast = 1.5, cd = { 23.7 }, first = 16.8, hits = nil, dmg = nil, kick = 0.0, cc = 0.03, n = 982, firstN = 64, level = 91, offset = 9.7, targeted = true, }, { spell = 1297684, npc = 235265, mob = "Corrupted Warlock", name = "Dark Pact", cast = 1.5, cd = { 31.6 }, first = nil, hits = 2.0, dmg = 0.293, kick = 0.0, cc = 0.0, n = 468, firstN = 0, level = 91, offset = nil, targeted = false, }, @@ -111,7 +111,7 @@ CastAheadData = { { spell = 1215961, npc = 235322, mob = "Defiled Golem", name = "Fel Beam", cast = 2.0, cd = { 30.4 }, first = 22.4, hits = nil, dmg = nil, kick = 0.0, cc = 0.04, n = 536, firstN = 56, level = 91, offset = 16.0, follow = 4.0, targeted = false, }, { spell = 1294824, npc = 235322, mob = "Defiled Golem", name = "Defiled Slam", cast = 2.0, cd = { 30.4 }, first = 6.4, hits = 5.0, dmg = 0.479, kick = 0.0, cc = 0.03, n = 712, firstN = 45, level = 91, offset = 0.0, follow = 8.0, targeted = false, }, { spell = 1290779, npc = 264045, mob = "Doomscale Warden", name = "Malice", cast = 2.5, cd = { }, first = 9.7, hits = 9.0, dmg = 0.601, kick = 0.56, cc = 0.0, n = 18, firstN = 6, level = nil, offset = 7.2, kickable = true, filler = true, targeted = false, }, - { spell = 1258420, npc = 253278, mob = "Doomguard", name = "Doom Bolt", cast = 2.5, cd = { 3.6 }, first = 3.0, hits = nil, dmg = nil, kick = 0.4, cc = 0.04, n = 312, firstN = 1, level = nil, offset = 0.0, kickable = true, filler = true, targeted = true, }, + { spell = 1258420, npc = 253278, mob = "Doomguard", name = "Doom Bolt", cast = 2.5, cd = { 3.6 }, first = 3.0, hits = 1.0, dmg = 0.359, kick = 0.4, cc = 0.04, n = 312, firstN = 2, level = nil, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 1301800, npc = 261915, mob = "Blightscale Viper", name = "Acidic Burst", cast = 2.5, cd = { 9.7 }, first = 5.0, hits = 1.0, dmg = 0.223, kick = 0.0, cc = 0.29, n = 20, firstN = 9, level = nil, offset = 0.0, targeted = true, }, { spell = 1216954, npc = 236905, mob = "Felmaster Lucsei", name = "Eye Beam", cast = 2.5, cd = { 22.9 }, first = 10.3, hits = 1.0, dmg = 0.101, kick = 0.0, cc = 0.04, n = 487, firstN = 50, level = 91, offset = nil, follow = 2.5, targeted = true, }, { spell = 1216529, npc = 236071, mob = "Bribed Guard", name = "Shield Bash", cast = 3.0, cd = { 24.3 }, first = 13.3, hits = 1.0, dmg = 0.215, kick = 0.0, cc = 0.07, n = 859, firstN = 65, level = 91, offset = 6.1, targeted = true, }, @@ -123,7 +123,7 @@ CastAheadData = { { spell = 1302950, npc = 264045, mob = "Doomscale Warden", name = "Writhing Gestation", cast = 3.0, cd = { 44.7 }, first = 6.3, hits = nil, dmg = nil, kick = 0.0, cc = 0.0, n = 17, firstN = 7, level = nil, offset = 3.5, targeted = false, }, { spell = 1214922, npc = 235267, mob = "Wrathguard Flayer", name = "Fel Rage", cast = 3.5, cd = { 64.4 }, first = 8.2, hits = nil, dmg = nil, kick = 0.54, cc = 0.24, n = 3447, firstN = 92, level = 90, offset = nil, kickable = true, targeted = false, }, { spell = 1297691, npc = 235465, mob = "Shivan Punisher", name = "Whirlwind", cast = 4.0, cd = { 23.1 }, first = 7.2, hits = 5.0, dmg = 0.112, kick = 0.0, cc = 0.06, n = 1333, firstN = 77, level = 91, offset = 0.0, }, - { spell = 1266241, npc = 234852, mob = "Forbidden Freight", name = "Freight Explosion", cast = 5.0, cd = { }, first = 3.4, hits = 5.0, dmg = 0.206, kick = 0.0, cc = 0.02, n = 4784, firstN = 172, level = 90, offset = 0.0, filler = true, targeted = false, }, + { spell = 1266241, npc = 234852, mob = "Forbidden Freight", name = "Freight Explosion", cast = 5.0, cd = { }, first = 3.4, hits = 5.0, dmg = 0.206, kick = 0.0, cc = 0.02, n = 4784, firstN = 384, level = 90, offset = 0.0, filler = true, targeted = false, }, { spell = 1256300, npc = 236902, mob = "Massive Felwyrm", name = "Massive Fel Detonation", cast = 5.0, cd = { }, first = nil, hits = 1.0, dmg = 0.425, kick = 0.0, cc = 0.0, n = 368, firstN = 0, level = 91, offset = nil, filler = true, targeted = false, }, }, [2825] = { name = "Den of Nalorakk", @@ -148,8 +148,8 @@ CastAheadData = { [2859] = { name = "The Blinding Vale", { spell = 1263636, npc = 254850, mob = "Sporeblight Belcher", name = "Belch Spores", cast = 1.5, cd = { 31.6 }, first = 15.6, hits = 4.0, dmg = 0.342, kick = 0.0, cc = 0.02, n = 1714, firstN = 106, level = 91, offset = 9.7, follow = 3.0, targeted = false, }, { spell = 1240257, npc = 246367, mob = "Spirit Bear", name = "Pulverizing Strikes", cast = 1.9, cd = { 2.0 }, first = 0.0, hits = 1.0, dmg = 0.492, kick = 0.0, cc = 0.07, n = 759, firstN = 10, level = 90, offset = nil, filler = true, targeted = true, }, - { spell = 1250829, npc = 250202, mob = "Newborn Potadpole", name = "Potad-Toss", cast = 2.0, cd = { 11.5 }, first = 4.5, hits = nil, dmg = nil, kick = 0.0, cc = 0.2, n = 2765, firstN = 88, level = 90, offset = 0.0, targeted = true, }, - { spell = 1238368, npc = 245513, mob = "Overgrown Hydra", name = "Lightmaw Beams", cast = 2.0, cd = { 25.5 }, first = 5.8, hits = 3.0, dmg = 0.191, kick = 0.0, cc = 0.03, n = 497, firstN = 13, level = 91, offset = 0.0, follow = 6.0, followUnknown = true, targeted = false, }, + { spell = 1250829, npc = 250202, mob = "Newborn Potadpole", name = "Potad-Toss", cast = 2.0, cd = { 11.5 }, first = 4.5, hits = nil, dmg = nil, kick = 0.0, cc = 0.2, n = 2765, firstN = 177, level = 90, offset = 0.0, targeted = true, }, + { spell = 1238368, npc = 245513, mob = "Overgrown Hydra", name = "Lightmaw Beams", cast = 2.0, cd = { 25.5 }, first = 5.8, hits = 3.0, dmg = 0.191, kick = 0.0, cc = 0.03, n = 497, firstN = 13, level = 91, offset = 0.0, follow = 6.0, targeted = false, }, { spell = 1250100, npc = 249756, mob = "Potatoad Matriarch", name = "Tongue Toss", cast = 2.0, cd = { 26.7 }, first = 4.8, hits = 1.0, dmg = 0.143, kick = 0.0, cc = 0.02, n = 655, firstN = 19, level = 91, offset = 0.0, targeted = true, }, { spell = 1250937, npc = 249756, mob = "Potatoad Matriarch", name = "Toxic Spew", cast = 2.0, cd = { 26.7 }, first = 18.0, hits = 4.0, dmg = 0.237, kick = 0.0, cc = 0.04, n = 576, firstN = 36, level = 91, offset = 12.1, targeted = false, }, { spell = 1271385, npc = 254850, mob = "Sporeblight Belcher", name = "Spouting Floret", cast = 2.0, cd = { 32.8 }, first = 6.2, hits = 5.0, dmg = 0.31, kick = 0.0, cc = 0.02, n = 1999, firstN = 103, level = 91, offset = 0.0, targeted = false, }, @@ -168,9 +168,9 @@ CastAheadData = { { spell = 1238200, npc = 245336, mob = "Radiant Spellsower", name = "Frantic Blooming", cast = 8.0, cd = { 8.5 }, first = nil, hits = nil, dmg = nil, kick = 0.13, cc = 0.0, n = 198, firstN = 0, level = 90, offset = nil, kickable = true, approx = true, channel = true, }, }, [2923] = { name = "Voidscar Arena", - { spell = 1249661, npc = 249608, mob = "Raging Raptor", name = "Feral Rage", cast = 1.0, cd = { 21.9 }, first = 10.0, hits = nil, dmg = nil, kick = 0.0, cc = 0.04, n = 602, firstN = 28, level = 90, offset = 0.0, targeted = false, }, + { spell = 1249661, npc = 249608, mob = "Raging Raptor", name = "Feral Rage", cast = 1.0, cd = { 21.9 }, first = 10.0, hits = nil, dmg = nil, kick = 0.0, cc = 0.04, n = 1218, firstN = 28, level = 90, offset = 0.0, targeted = false, }, { spell = 1300243, npc = 268184, mob = "Devouring Brutalizer", name = "Brutalize", cast = 2.0, cd = { 27.7 }, first = 15.3, hits = 1.0, dmg = 0.247, kick = 0.0, cc = 0.04, n = 1390, firstN = 118, level = 91, offset = nil, follow = 6.0, targeted = true, }, - { spell = 1300138, npc = 245950, mob = "Watchful Harrower", name = "Void Beam", cast = 2.0, cd = { 27.9 }, first = 14.5, hits = 1.0, dmg = 0.119, kick = 0.0, cc = 0.03, n = 1196, firstN = 142, level = 91, offset = 7.7, follow = 4.0, targeted = true, }, + { spell = 1300138, npc = 245950, mob = "Watchful Harrower", name = "Void Beam", cast = 2.0, cd = { 27.9 }, first = 14.5, hits = 1.0, dmg = 0.119, kick = 0.0, cc = 0.03, n = 1196, firstN = 291, level = 91, offset = 7.7, follow = 4.0, targeted = true, }, { spell = 1311747, npc = 267546, mob = "Raj'kess the Spellstorm", name = "Orb of Disruption", cast = 2.0, cd = { 32.8 }, first = 10.6, hits = nil, dmg = nil, kick = 0.0, cc = 0.04, n = 393, firstN = 92, level = 91, offset = 10.9, targeted = false, }, { spell = 1298900, npc = 252053, mob = "Brutal Overseer", name = "Brutal Slams", cast = 2.0, cd = { 33.4 }, first = 8.4, hits = 5.0, dmg = 0.168, kick = 0.0, cc = 0.03, n = 508, firstN = 49, level = 91, offset = 0.0, follow = 30.0, targeted = false, }, { spell = 1298908, npc = 267545, mob = "Aegyra the Unyielding", name = "Champion's Spear", cast = 2.0, cd = { 35.2 }, first = 23.9, hits = nil, dmg = nil, kick = 0.0, cc = 0.08, n = 87, firstN = 10, level = 91, offset = 17.0, targeted = false, }, @@ -178,26 +178,26 @@ CastAheadData = { { spell = 1228176, npc = 241496, mob = "Enthralled Shaman", name = "Lava Bolt", cast = 2.5, cd = { 3.6 }, first = 0.0, hits = 1.0, dmg = 0.328, kick = 0.34, cc = 0.2, n = 17626, firstN = 417, level = 90, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 1311754, npc = 267546, mob = "Raj'kess the Spellstorm", name = "Forked Lightning", cast = 2.5, cd = { 3.6 }, first = -0.1, hits = 3.0, dmg = 0.256, kick = 0.0, cc = 0.05, n = 2121, firstN = 97, level = 91, offset = 0.0, filler = true, targeted = true, }, { spell = 1289265, npc = 263228, mob = "Agitated Voidscythe", name = "Corrosive Essence", cast = 2.5, cd = { 20.6 }, first = 7.6, hits = nil, dmg = nil, kick = 0.0, cc = 0.06, n = 285, firstN = 18, level = 91, offset = 0.0, targeted = false, }, - { spell = 1245186, npc = 244309, mob = "Brutok", name = "Head Bash", cast = 2.5, cd = { 23.1 }, first = 25.3, hits = 3.0, dmg = 0.415, kick = 0.0, cc = 0.07, n = 455, firstN = 123, level = 91, offset = 19.4, targeted = true, }, - { spell = 1311778, npc = 263228, mob = "Agitated Voidscythe", name = "Rip and Slice", cast = 2.5, cd = { 23.1 }, first = 15.0, hits = nil, dmg = nil, kick = 0.0, cc = 0.09, n = 227, firstN = 18, level = 91, offset = 7.9, targeted = false, }, + { spell = 1245186, npc = 244309, mob = "Brutok", name = "Head Bash", cast = 2.5, cd = { 23.1 }, first = 25.3, hits = 2.5, dmg = 0.415, kick = 0.0, cc = 0.07, n = 455, firstN = 123, level = 91, offset = 19.4, targeted = true, }, + { spell = 1311778, npc = 263228, mob = "Agitated Voidscythe", name = "Rip and Slice", cast = 2.5, cd = { 23.1 }, first = 15.0, hits = 1.0, dmg = 0.213, kick = 0.0, cc = 0.09, n = 227, firstN = 18, level = 91, offset = 7.9, targeted = false, }, { spell = 1253254, npc = 252354, mob = "Enraged Domanaar", name = "Vorpal Slam", cast = 3.0, cd = { 15.7 }, first = nil, hits = 1.0, dmg = 0.138, kick = 0.0, cc = 0.0, n = 18, firstN = 0, level = nil, offset = nil, targeted = false, }, - { spell = 1249621, npc = 249590, mob = "Angry Krolusk", name = "Violent Sand", cast = 3.0, cd = { 23.1 }, first = 8.4, hits = 5.0, dmg = 0.511, kick = 0.81, cc = 0.13, n = 460, firstN = 18, level = 90, offset = 0.0, kickable = true, targeted = false, }, + { spell = 1249621, npc = 249590, mob = "Angry Krolusk", name = "Violent Sand", cast = 3.0, cd = { 23.1 }, first = 8.4, hits = 5.0, dmg = 0.511, kick = 0.81, cc = 0.13, n = 460, firstN = 36, level = 90, offset = 0.0, kickable = true, targeted = false, }, { spell = 1299270, npc = 267546, mob = "Raj'kess the Spellstorm", name = "Thundering Storm", cast = 3.0, cd = { 32.8 }, first = 20.3, hits = 5.0, dmg = 0.252, kick = 0.0, cc = 0.01, n = 324, firstN = 87, level = 91, offset = 20.6, follow = 9.0, targeted = false, }, { spell = 1299145, npc = 267545, mob = "Aegyra the Unyielding", name = "Earthsplitter", cast = 3.0, cd = { 35.2 }, first = 10.6, hits = nil, dmg = nil, kick = 0.0, cc = 0.07, n = 104, firstN = 8, level = 91, offset = 3.6, targeted = false, }, { spell = 1234890, npc = 244309, mob = "Brutok", name = "Smashing Charge", cast = 3.5, cd = { 23.1 }, first = 5.8, hits = 4.0, dmg = 0.076, kick = 0.0, cc = 0.04, n = 649, firstN = 34, level = 91, offset = 0.0, targeted = false, }, - { spell = 1233398, npc = 243766, mob = "Kilivore Screamer", name = "Mad Shriek", cast = 3.5, cd = { 24.3 }, first = 9.6, hits = nil, dmg = nil, kick = 0.73, cc = 0.24, n = 1834, firstN = 68, level = 90, offset = 0.0, kickable = true, targeted = false, }, + { spell = 1233398, npc = 243766, mob = "Kilivore Screamer", name = "Mad Shriek", cast = 3.5, cd = { 24.3 }, first = 9.6, hits = nil, dmg = nil, kick = 0.73, cc = 0.24, n = 1834, firstN = 138, level = 90, offset = 0.0, kickable = true, targeted = false, }, { spell = 1299938, npc = 252072, mob = "Voidtouched Magi", name = "Shadowbolt Volley", cast = 4.0, cd = { 4.7, 9.7, 4.9 }, first = 0.0, hits = 4.0, dmg = 0.579, kick = 0.81, cc = 0.05, n = 2614, firstN = 122, level = 91, offset = 0.0, kickable = true, filler = true, targeted = false, }, { spell = 1298899, npc = 238883, mob = "Dominated Brawler", name = "Demoralizing Shout", cast = 4.0, cd = { 25.5 }, first = 8.4, hits = nil, dmg = nil, kick = 0.6, cc = 0.3, n = 2711, firstN = 75, level = 90, offset = 4.8, kickable = true, targeted = false, }, - { spell = 1299913, npc = 252072, mob = "Voidtouched Magi", name = "Null Eruption", cast = 4.0, cd = { 25.5 }, first = 10.2, hits = 1.0, dmg = 0.348, kick = 0.0, cc = 0.11, n = 377, firstN = 30, level = 91, offset = nil, targeted = true, }, - { spell = 1296963, npc = 254677, mob = "Ethereal Shade", name = "Umbral Rupture", cast = 4.0, cd = { 35.0 }, first = 2.6, hits = nil, dmg = nil, kick = 0.0, cc = 0.01, n = 4851, firstN = 62, level = 92, offset = 2.0, targeted = false, }, + { spell = 1299913, npc = 252072, mob = "Voidtouched Magi", name = "Null Eruption", cast = 4.0, cd = { 25.5 }, first = 10.2, hits = 1.0, dmg = 0.348, kick = 0.0, cc = 0.11, n = 757, firstN = 30, level = 91, offset = 11.1, targeted = true, }, + { spell = 1296963, npc = 254677, mob = "Ethereal Shade", name = "Umbral Rupture", cast = 4.0, cd = { 35.0 }, first = 2.6, hits = 1.0, dmg = 0.276, kick = 0.0, cc = 0.01, n = 4851, firstN = 62, level = 92, offset = 2.0, targeted = false, }, { spell = 1252406, npc = 268184, mob = "Devouring Brutalizer", name = "Dreadbellow", cast = 4.5, cd = { 28.5 }, first = 9.2, hits = nil, dmg = nil, kick = 0.0, cc = 0.09, n = 1394, firstN = 141, level = 91, offset = 0.0, targeted = false, }, - { spell = 1239856, npc = 245950, mob = "Watchful Harrower", name = "Sky Strike", cast = 5.0, cd = { 25.5 }, first = 6.5, hits = 4.0, dmg = 0.46, kick = 0.0, cc = 0.09, n = 1358, firstN = 120, level = 91, offset = 0.0, targeted = true, }, + { spell = 1239856, npc = 245950, mob = "Watchful Harrower", name = "Sky Strike", cast = 5.0, cd = { 25.5 }, first = 6.5, hits = 4.0, dmg = 0.46, kick = 0.0, cc = 0.09, n = 1358, firstN = 245, level = 91, offset = 0.0, targeted = true, }, { spell = 1310309, npc = 252053, mob = "Brutal Overseer", name = "Macestorm", cast = 6.0, cd = { 33.4 }, first = 22.9, hits = 1.5, dmg = 0.237, kick = 0.0, cc = 0.0, n = 448, firstN = 25, level = 91, offset = nil, channel = true, targeted = false, }, { spell = 1222100, npc = 254677, mob = "Ethereal Shade", name = "Nether Dash", cast = 7.0, cd = { 28.0, 35.0, 34.8, 35.0, 35.0, 34.5, 34.5, 34.5 }, first = 28.1, hits = nil, dmg = nil, kick = 0.0, cc = 0.02, n = 4965, firstN = 27, level = 92, offset = 0.0, targeted = true, }, + { spell = 1234855, npc = 244260, mob = "Chitigoth", name = "Insidious Aura", cast = 8.0, cd = { 20.6 }, first = 20.4, hits = 4.0, dmg = 0.343, kick = 0.0, cc = 0.0, n = 416, firstN = 120, level = 91, offset = 9.7, channel = true, targeted = false, }, { spell = 1298924, npc = 267545, mob = "Aegyra the Unyielding", name = "Savage Smash", cast = 8.0, cd = { 35.2 }, first = 27.3, hits = nil, dmg = nil, kick = 0.0, cc = 0.06, n = 77, firstN = 9, level = 91, offset = 20.6, targeted = false, }, { spell = 1300249, npc = 268184, mob = "Devouring Brutalizer", name = "Devour", cast = 9.0, cd = { 25.0 }, first = nil, hits = nil, dmg = nil, kick = 0.0, cc = 0.81, n = 380, firstN = 0, level = 91, offset = nil, targeted = false, }, - { spell = 1234855, npc = 244260, mob = "Chitigoth", name = "Insidious Aura", cast = 10.0, cd = { 20.6 }, first = 20.4, hits = 4.0, dmg = 0.343, kick = 0.0, cc = 0.0, n = 416, firstN = 120, level = 91, offset = 9.7, channel = true, targeted = false, }, - { spell = 1311730, npc = 272930, mob = "Orb of Disruption", name = "Disrupting Blast", cast = 13.0, cd = { 13.0 }, first = 11.1, hits = 5.0, dmg = 0.163, kick = 0.0, cc = 0.94, n = 7, firstN = 2, level = nil, offset = 0.0, targeted = false, }, + { spell = 1311730, npc = 272930, mob = "Orb of Disruption", name = "Disrupting Blast", cast = 13.0, cd = { 13.0 }, first = 11.1, hits = 5.0, dmg = 0.163, kick = 0.0, cc = 0.94, n = 17, firstN = 2, level = nil, offset = 0.0, targeted = false, }, { spell = 1310324, npc = 244708, mob = "Voidminder", name = "Mending Void", cast = 20.0, cd = { 23.1 }, first = 10.8, hits = 1.0, dmg = 0.177, kick = 0.28, cc = 0.0, n = 4343, firstN = 152, level = 90, offset = 0.0, kickable = true, channel = true, targeted = false, }, }, [2993] = { name = "Altar of Fangs", diff --git a/Traits.lua b/Traits.lua index 3670ce1..2eed602 100644 --- a/Traits.lua +++ b/Traits.lua @@ -111,7 +111,7 @@ CastAheadTraits = { { npc = 254850, level = 91, power = 1, elite = true, lieutenant = true, family = false, stage = { 1, 2, 3, 4 }, casts = { 1.5, 2 }, channels = { 3 } }, }, [2923] = { - { npc = 244260, level = 91, power = 1, elite = true, lieutenant = true, family = nil, stage = { 1 }, channels = { 10 } }, + { npc = 244260, level = 91, power = 1, elite = true, lieutenant = true, family = nil, stage = { 1 }, channels = { 8 } }, { npc = 244309, level = 91, power = 1, elite = true, lieutenant = true, family = nil, stage = { 1 }, casts = { 2.5, 3.5 } }, { npc = 245950, level = 91, power = 1, elite = true, lieutenant = false, family = nil, stage = { 2, 3 }, casts = { 2, 5 }, channels = { 4 } }, { npc = 252053, level = 91, power = 1, elite = true, lieutenant = false, family = nil, stage = { 1, 2, 3 }, casts = { 2 }, channels = { 6, 30 } }, @@ -129,7 +129,7 @@ CastAheadTraits = { { npc = 261573, level = 91, power = 1, elite = true, lieutenant = false, family = false, stage = { 3 }, casts = { 2, 3 }, channels = { 5 } }, { npc = 262011, level = 91, power = 1, elite = true, lieutenant = false, family = false, stage = { 2 }, casts = { 3 }, channels = { 5 } }, { npc = 263109, level = 91, power = 0, elite = true, lieutenant = false, family = false, stage = { 3 }, casts = { 2, 3.5 }, channels = { 9 } }, - { npc = 263112, level = 90, power = 1, elite = false, lieutenant = false, family = false, stage = { 3 } }, + { npc = 263112, level = 90, power = 1, elite = false, lieutenant = false, family = false, stage = { 3 }, co = { 263109 } }, { npc = 270306, level = 91, power = 1, elite = true, lieutenant = false, family = false, stage = { 1, 3 }, casts = { 3 }, channels = { 2 } }, }, } From 17587a5cd985299f3532ddbf2426c9d52999e392 Mon Sep 17 00:00:00 2001 From: Artem Frolov Date: Tue, 20 Oct 2026 20:00:31 +0300 Subject: [PATCH 2/3] fix(gen): hold AOE hits, openers and thin new damage near their lines Head Bash hits sat at a median of 2.5 between a 1-target and a 5-target hump and flipped across the AOE line every sync; hits now need to clear it by 0.5. An opening at 49.3% support dropped Demonic Frenzy's opener; an anchored opening now needs 48% to stay and 52% to come back. Damage on a row that had none needs 5 samples, because the payload window books any hit of the caster: Ethereal Shade got TANK from 3 hits over 775 casts. Data.lua rebuilt: 17 rows changed instead of 23. --- Data.lua | 12 ++++++------ tools/gen.py | 13 ++++++++++--- tools/test_gen.py | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/Data.lua b/Data.lua index acd15f2..1e040e7 100644 --- a/Data.lua +++ b/Data.lua @@ -82,7 +82,7 @@ CastAheadData = { { spell = 392394, npc = 197697, mob = "Flamegullet", name = "Fire Maw", cast = 2.5, cd = { 20.6 }, first = 11.1, hits = 1.0, dmg = 0.261, kick = 0.0, cc = 0.02, n = 1494, firstN = 107, level = 91, offset = 7.6, targeted = true, }, { spell = 392395, npc = 197698, mob = "Thunderhead", name = "Thunder Jaw", cast = 2.5, cd = { 20.6 }, first = 13.0, hits = nil, dmg = nil, kick = 0.0, cc = 0.08, n = 192, firstN = 20, level = 91, offset = 8.2, targeted = true, }, { spell = 384823, npc = 189886, mob = "Blazebound Firestorm", name = "Inferno", cast = 3.0, cd = { 13.8 }, first = 2.4, hits = 5.0, dmg = 0.342, kick = 0.0, cc = 0.15, n = 1472, firstN = 503, level = 91, offset = 0.0, targeted = false, }, - { spell = 373017, npc = 189886, mob = "Blazebound Firestorm", name = "Blaze Volley", cast = 3.5, cd = { 3.6 }, first = 6.5, hits = 5.0, dmg = 0.435, kick = 0.9, cc = 0.08, n = 2105, firstN = 519, level = 91, offset = 4.1, kickable = true, filler = true, approx = true, targeted = true, }, + { spell = 373017, npc = 189886, mob = "Blazebound Firestorm", name = "Blaze Volley", cast = 3.5, cd = { 3.6 }, first = 6.5, hits = nil, dmg = nil, kick = 0.9, cc = 0.08, n = 2105, firstN = 519, level = 91, offset = 4.1, kickable = true, filler = true, approx = true, targeted = true, }, { spell = 1305201, npc = 188244, mob = "Primal Juggernaut", name = "Excavating Blast", cast = 3.5, cd = { 26.7 }, first = 8.8, hits = 5.0, dmg = 0.347, kick = 0.0, cc = 0.05, n = 824, firstN = 87, level = 91, offset = nil, targeted = false, }, { spell = 373692, npc = 190034, mob = "Blazebound Destroyer", name = "Inferno", cast = 3.5, cd = { 26.7 }, first = 7.4, hits = 5.0, dmg = 0.325, kick = 0.0, cc = 0.05, n = 4025, firstN = 406, level = 91, offset = 7.3, targeted = false, }, { spell = 1305955, npc = 190034, mob = "Blazebound Destroyer", name = "Fiery Blast", cast = 4.0, cd = { 18.2 }, first = 0.0, hits = 1.0, dmg = 0.483, kick = 0.84, cc = 0.03, n = 3526, firstN = 322, level = 91, offset = 0.0, kickable = true, targeted = true, }, @@ -95,11 +95,11 @@ CastAheadData = { { spell = 1306366, npc = 198047, mob = "Tempest Channeler", name = "Lightning Torrent", cast = 7.0, cd = { 24.3 }, first = 6.1, hits = 1.0, dmg = 0.206, kick = 0.0, cc = 0.0, n = 970, firstN = 100, level = 91, offset = 6.2, channel = true, }, { spell = 1306366, npc = 197535, mob = "High Channeler Ryvati", name = "Lightning Torrent", cast = 7.0, cd = { 32.8 }, first = 20.3, hits = 5.0, dmg = 0.208, kick = 0.0, cc = 0.0, n = 475, firstN = 74, level = 91, offset = 15.8, channel = true, }, { spell = 385536, npc = 190206, mob = "Ashseer Flamelasher", name = "Flaming Barrage", cast = 10.0, cd = { 26.7 }, first = 8.6, hits = 1.0, dmg = 0.1, kick = 0.0, cc = 0.0, n = 7187, firstN = 202, level = 90, offset = 0.0, channel = true, targeted = false, }, - { spell = 372743, npc = 188067, mob = "Flashfrost Chillweaver", name = "Ice Shield", cast = 15.0, cd = { 26.7 }, first = 6.7, hits = 1.0, dmg = 0.398, kick = 0.39, cc = 0.0, n = 4549, firstN = 121, level = 90, offset = nil, kickable = true, channel = true, targeted = true, }, + { spell = 372743, npc = 188067, mob = "Flashfrost Chillweaver", name = "Ice Shield", cast = 15.0, cd = { 26.7 }, first = 6.7, hits = nil, dmg = nil, kick = 0.39, cc = 0.0, n = 4549, firstN = 121, level = 90, offset = nil, kickable = true, channel = true, targeted = true, }, }, [2813] = { name = "Murder Row", { spell = 1258537, npc = 236902, mob = "Massive Felwyrm", name = "Summon Wyrms", cast = 1.0, cd = { 23.1 }, first = 7.5, hits = 4.0, dmg = 0.136, kick = 0.0, cc = 0.0, n = 424, firstN = 49, level = 91, offset = nil, channel = true, targeted = true, }, - { spell = 1294770, npc = 235465, mob = "Shivan Punisher", name = "Demonic Frenzy", cast = 1.0, cd = { 96.8 }, first = nil, hits = 4.0, dmg = 0.095, kick = 0.0, cc = 0.0, n = 604, firstN = 0, level = 91, offset = nil, approx = true, targeted = false, }, + { spell = 1294770, npc = 235465, mob = "Shivan Punisher", name = "Demonic Frenzy", cast = 1.0, cd = { 96.8 }, first = 24.1, hits = 4.0, dmg = 0.095, kick = 0.0, cc = 0.0, n = 604, firstN = 18, level = 91, offset = nil, approx = true, targeted = false, }, { spell = 1216589, npc = 236091, mob = "Street Sneak", name = "Heartstop Poison", cast = 1.5, cd = { 21.9 }, first = 8.5, hits = nil, dmg = nil, kick = 0.0, cc = 0.09, n = 3126, firstN = 162, level = 90, offset = 0.0, targeted = false, }, { spell = 1217973, npc = 235265, mob = "Corrupted Warlock", name = "Curse of Doom", cast = 1.5, cd = { 23.7 }, first = 16.8, hits = nil, dmg = nil, kick = 0.0, cc = 0.03, n = 982, firstN = 64, level = 91, offset = 9.7, targeted = true, }, { spell = 1297684, npc = 235265, mob = "Corrupted Warlock", name = "Dark Pact", cast = 1.5, cd = { 31.6 }, first = nil, hits = 2.0, dmg = 0.293, kick = 0.0, cc = 0.0, n = 468, firstN = 0, level = 91, offset = nil, targeted = false, }, @@ -178,8 +178,8 @@ CastAheadData = { { spell = 1228176, npc = 241496, mob = "Enthralled Shaman", name = "Lava Bolt", cast = 2.5, cd = { 3.6 }, first = 0.0, hits = 1.0, dmg = 0.328, kick = 0.34, cc = 0.2, n = 17626, firstN = 417, level = 90, offset = 0.0, kickable = true, filler = true, targeted = true, }, { spell = 1311754, npc = 267546, mob = "Raj'kess the Spellstorm", name = "Forked Lightning", cast = 2.5, cd = { 3.6 }, first = -0.1, hits = 3.0, dmg = 0.256, kick = 0.0, cc = 0.05, n = 2121, firstN = 97, level = 91, offset = 0.0, filler = true, targeted = true, }, { spell = 1289265, npc = 263228, mob = "Agitated Voidscythe", name = "Corrosive Essence", cast = 2.5, cd = { 20.6 }, first = 7.6, hits = nil, dmg = nil, kick = 0.0, cc = 0.06, n = 285, firstN = 18, level = 91, offset = 0.0, targeted = false, }, - { spell = 1245186, npc = 244309, mob = "Brutok", name = "Head Bash", cast = 2.5, cd = { 23.1 }, first = 25.3, hits = 2.5, dmg = 0.415, kick = 0.0, cc = 0.07, n = 455, firstN = 123, level = 91, offset = 19.4, targeted = true, }, - { spell = 1311778, npc = 263228, mob = "Agitated Voidscythe", name = "Rip and Slice", cast = 2.5, cd = { 23.1 }, first = 15.0, hits = 1.0, dmg = 0.213, kick = 0.0, cc = 0.09, n = 227, firstN = 18, level = 91, offset = 7.9, targeted = false, }, + { spell = 1245186, npc = 244309, mob = "Brutok", name = "Head Bash", cast = 2.5, cd = { 23.1 }, first = 25.3, hits = 3.0, dmg = 0.415, kick = 0.0, cc = 0.07, n = 455, firstN = 123, level = 91, offset = 19.4, targeted = true, }, + { spell = 1311778, npc = 263228, mob = "Agitated Voidscythe", name = "Rip and Slice", cast = 2.5, cd = { 23.1 }, first = 15.0, hits = nil, dmg = nil, kick = 0.0, cc = 0.09, n = 227, firstN = 18, level = 91, offset = 7.9, targeted = false, }, { spell = 1253254, npc = 252354, mob = "Enraged Domanaar", name = "Vorpal Slam", cast = 3.0, cd = { 15.7 }, first = nil, hits = 1.0, dmg = 0.138, kick = 0.0, cc = 0.0, n = 18, firstN = 0, level = nil, offset = nil, targeted = false, }, { spell = 1249621, npc = 249590, mob = "Angry Krolusk", name = "Violent Sand", cast = 3.0, cd = { 23.1 }, first = 8.4, hits = 5.0, dmg = 0.511, kick = 0.81, cc = 0.13, n = 460, firstN = 36, level = 90, offset = 0.0, kickable = true, targeted = false, }, { spell = 1299270, npc = 267546, mob = "Raj'kess the Spellstorm", name = "Thundering Storm", cast = 3.0, cd = { 32.8 }, first = 20.3, hits = 5.0, dmg = 0.252, kick = 0.0, cc = 0.01, n = 324, firstN = 87, level = 91, offset = 20.6, follow = 9.0, targeted = false, }, @@ -189,7 +189,7 @@ CastAheadData = { { spell = 1299938, npc = 252072, mob = "Voidtouched Magi", name = "Shadowbolt Volley", cast = 4.0, cd = { 4.7, 9.7, 4.9 }, first = 0.0, hits = 4.0, dmg = 0.579, kick = 0.81, cc = 0.05, n = 2614, firstN = 122, level = 91, offset = 0.0, kickable = true, filler = true, targeted = false, }, { spell = 1298899, npc = 238883, mob = "Dominated Brawler", name = "Demoralizing Shout", cast = 4.0, cd = { 25.5 }, first = 8.4, hits = nil, dmg = nil, kick = 0.6, cc = 0.3, n = 2711, firstN = 75, level = 90, offset = 4.8, kickable = true, targeted = false, }, { spell = 1299913, npc = 252072, mob = "Voidtouched Magi", name = "Null Eruption", cast = 4.0, cd = { 25.5 }, first = 10.2, hits = 1.0, dmg = 0.348, kick = 0.0, cc = 0.11, n = 757, firstN = 30, level = 91, offset = 11.1, targeted = true, }, - { spell = 1296963, npc = 254677, mob = "Ethereal Shade", name = "Umbral Rupture", cast = 4.0, cd = { 35.0 }, first = 2.6, hits = 1.0, dmg = 0.276, kick = 0.0, cc = 0.01, n = 4851, firstN = 62, level = 92, offset = 2.0, targeted = false, }, + { spell = 1296963, npc = 254677, mob = "Ethereal Shade", name = "Umbral Rupture", cast = 4.0, cd = { 35.0 }, first = 2.6, hits = nil, dmg = nil, kick = 0.0, cc = 0.01, n = 4851, firstN = 62, level = 92, offset = 2.0, targeted = false, }, { spell = 1252406, npc = 268184, mob = "Devouring Brutalizer", name = "Dreadbellow", cast = 4.5, cd = { 28.5 }, first = 9.2, hits = nil, dmg = nil, kick = 0.0, cc = 0.09, n = 1394, firstN = 141, level = 91, offset = 0.0, targeted = false, }, { spell = 1239856, npc = 245950, mob = "Watchful Harrower", name = "Sky Strike", cast = 5.0, cd = { 25.5 }, first = 6.5, hits = 4.0, dmg = 0.46, kick = 0.0, cc = 0.09, n = 1358, firstN = 245, level = 91, offset = 0.0, targeted = true, }, { spell = 1310309, npc = 252053, mob = "Brutal Overseer", name = "Macestorm", cast = 6.0, cd = { 33.4 }, first = 22.9, hits = 1.5, dmg = 0.237, kick = 0.0, cc = 0.0, n = 448, firstN = 25, level = 91, offset = nil, channel = true, targeted = false, }, diff --git a/tools/gen.py b/tools/gen.py index e4e83c1..fcc1b5a 100644 --- a/tools/gen.py +++ b/tools/gen.py @@ -18,6 +18,7 @@ AOE_TARGETS = 3 # lands on this many players -> group damage HEAVY_DAMAGE = 0.20 # takes this share of the victim's health -> defensive MIN_DAMAGE_SAMPLES = 3 +AOE_MARGIN = 0.5 MIN_PER_POSITION = 3 # samples needed before a rotation slot is trusted MAX_ROTATION = 8 FLAT_SPREAD = 0.15 # rotation this tight collapses to a single value @@ -279,7 +280,7 @@ def hold(field, material): hold("first", moved(old["first"], new["first"], FIRST_STEP)) hold("firstN", count_moved(old["firstN"], new["firstN"], MIN_OPENING_SAMPLES)) hold("offset", moved(old["offset"], new["offset"], OFFSET_STEP)) - hold("hits", moved(old["hits"], new["hits"], 1.0) or crossed(old["hits"], new["hits"], AOE_TARGETS, 0)) + hold("hits", moved(old["hits"], new["hits"], 1.0) or crossed(old["hits"], new["hits"], AOE_TARGETS, AOE_MARGIN)) hold("dmg", moved(old["dmg"], new["dmg"], SHARE_STEP) or crossed(old["dmg"], new["dmg"], HEAVY_DAMAGE) or crossed(old["dmg"], new["dmg"], HEAVY_SINGLE)) hold("kick", moved(old["kick"], new["kick"], SHARE_STEP) or crossed(old["kick"], new["kick"], KICK_SHARE)) @@ -404,9 +405,12 @@ def main(casts_path, out_path, mdt_path=None, overrides_path=None, channels_path cast, is_channel = measured, False cdn = support(r["iv"], cd) if cd else 0 approx = bool(cd) and cdn < APPROX_SUPPORT * len(r["iv"]) + old = anchor.get((instance_id, int(spellid), int(npcid))) first, firstN = densest(r["first"], FIRST_WINDOW) + bar = OPENING_SUPPORT if old is None else \ + OPENING_SUPPORT - SHARE_MARGIN if old["first"] is not None else OPENING_SUPPORT + SHARE_MARGIN if first is not None and sum(1 for x in r["first"] if abs(x - first) <= FIRST_TOLERANCE) \ - < OPENING_SUPPORT * len(r["first"]): + < bar * len(r["first"]): first, firstN = None, 0 # Delay from the mob's very first cast to this spell's first. # Measured across all logs this is far tighter than anything @@ -420,12 +424,15 @@ def main(casts_path, out_path, mdt_path=None, overrides_path=None, channels_path if hi - lo <= OFFSET_SPREAD: offset = round(statistics.median(offsets), 1) t = threat(r) + if old is not None and old["dmg"] is None and len(r["dmg"]) < THIN_EVIDENCE: + # The payload window books any hit of the caster, so a few samples + # can be another spell's (Ethereal Shade: 3 of 775 casts). + t["hits"] = t["dmg"] = None forced = spellid in include if spellid in exclude and not forced: continue row_key = (instance_id, int(spellid), int(npcid)) seen.add(row_key) - old = anchor.get(row_key) row, changed = settle({ "spell": int(spellid), "npc": int(npcid), "cast": round(cast, 1), "cd": cd or [], "first": first, diff --git a/tools/test_gen.py b/tools/test_gen.py index fd662a1..37f5b9a 100644 --- a/tools/test_gen.py +++ b/tools/test_gen.py @@ -296,6 +296,41 @@ def test_damage_needs_three_samples(): assert t["dmg"] == 0.4 and t["hits"] == 2.0 +def test_hits_hovering_at_the_aoe_line_keep_the_anchor(): + _, changed = settle(row(hits=2.5), row(hits=3.0)) + assert changed == [] + _, changed = settle(row(hits=3.0), row(hits=2.5)) + assert changed == [] + _, changed = settle(row(hits=2.4), row(hits=3.0)) + assert changed == ["hits"] + + +def test_damage_new_to_an_anchored_row_needs_more_than_the_minimum(): + with tempfile.TemporaryDirectory() as tmp: + def row_with(dmg): + casts = {"1|Zone": {"10": {"1000": _base_cast_record(hits=[1] * len(dmg), dmg=dmg, starts=5)}}} + lua, _ = _run_gen(tmp, casts, overrides={"include": ["1000"]}) + return next(line for line in lua.splitlines() if "spell = 1000," in line) + assert "dmg = nil" in row_with([0.3, 0.3]) + assert "dmg = nil" in row_with([0.3] * 4) + assert "dmg = 0.3" in row_with([0.3] * 5) + + +def test_an_opening_needs_a_margin_to_flip(): + def firsts(tight, spread): + return [8.0] * tight + [20.0 + 3 * i for i in range(spread)] + with tempfile.TemporaryDirectory() as tmp: + def first_of(values): + casts = {"1|Zone": {"10": {"1000": _base_cast_record(first=values, starts=50)}}} + lua, _ = _run_gen(tmp, casts, overrides={"include": ["1000"]}) + return next(line for line in lua.splitlines() if "spell = 1000," in line) + assert "first = 8.0" in first_of(firsts(11, 9)) + assert "first = 8.0" in first_of(firsts(24, 25)) + assert "first = nil" in first_of(firsts(10, 11)) + assert "first = nil" in first_of(firsts(26, 25)) + assert "first = 8.0" in first_of(firsts(27, 23)) + + if __name__ == "__main__": for name, fn in list(globals().items()): if name.startswith("test_"): From d0be8283061cb8ec071c4679bda604152690d372 Mon Sep 17 00:00:00 2001 From: Artem Frolov Date: Tue, 20 Oct 2026 20:06:15 +0300 Subject: [PATCH 3/3] feat: a healer who can remove the debuff hears the dispel instead of the defensive Defensive debuff rows now carry the debuff's dispel type from client data. When it lands on a healer who knows a dispel for that type, the aura sound says "dispel magic" (or poison, curse, disease) instead of "defensive". Damage dealers, tanks and healers without that dispel still hear the defensive, and a healer gets nothing new on rows that never called healers. One sound per aura as before. Six rows have a dispel type; Living Bomb (Magic) is the only one that calls healers. --- Defensives.lua | 12 ++++++------ Match.lua | 12 ++++++++++++ Saves.lua | 2 +- test_core.lua | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/Defensives.lua b/Defensives.lua index 2d4037f..d3c3808 100644 --- a/Defensives.lua +++ b/Defensives.lua @@ -6,7 +6,7 @@ CastAheadDefensives = { [266237] = { TANK = true, ep = { TANK = 29 }, lead = 2.3, aura = false, name = "Debilitating Backhand", mob = "Aka'ali the Conqueror", boss = "The Council of Tribes", dungeon = 1762, bar = true, school = 1, aoe = false }, [266923] = { DAMAGER = true, HEALER = true, TANK = true, ep = { DAMAGER = 164, HEALER = 171, TANK = 43 }, lead = 2.2, aura = true, name = "Galvanized", mob = "Lightning Spire", boss = "Galvazzt", dungeon = 1877, bar = false, school = 8, aoe = false }, [267618] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 161, HEALER = 183 }, lead = 2.1, aura = false, name = "Drain Fluids", mob = "Mchimba the Embalmer", boss = "Mchimba the Embalmer", dungeon = 1762, bar = true, school = 8, aoe = true }, - [267763] = { DAMAGER = true, ep = { DAMAGER = 225 }, lead = 4.2, aura = false, name = "Wretched Discharge", mob = "Half-Finished Mummy", boss = "", dungeon = 1762, bar = false, school = 8, aoe = true }, + [267763] = { DAMAGER = true, ep = { DAMAGER = 225 }, lead = 4.2, aura = false, name = "Wretched Discharge", mob = "Half-Finished Mummy", boss = "", dungeon = 1762, bar = false, school = 8, aoe = true, dispel = "Disease" }, [268590] = { TANK = true, ep = { TANK = 18 }, lead = 4.4, aura = false, name = "Blade Combo", mob = "King Dazar", boss = "King Dazar", dungeon = 1762, bar = true, school = 1, aoe = false }, [268591] = { TANK = true, ep = { TANK = 22 }, lead = 3.9, aura = false, name = "Blade Combo", mob = "King Dazar", boss = "King Dazar", dungeon = 1762, bar = false, school = 1, aoe = false }, [270293] = { TANK = true, ep = { TANK = 60 }, lead = 3.3, aura = false, name = "Purification Strike", mob = "Purification Construct", boss = "", dungeon = 1762, bar = false, school = 4, aoe = true }, @@ -17,17 +17,17 @@ CastAheadDefensives = { [372860] = { TANK = true, ep = { TANK = 87 }, lead = 3.2, aura = true, name = "Searing Wounds", mob = "Kokia Blazehoof", boss = "Kokia Blazehoof", dungeon = 2521, bar = false, school = 4, aoe = false }, [373688] = { DAMAGER = true, HEALER = true, TANK = true, ep = { DAMAGER = 217, HEALER = 197, TANK = 83 }, lead = 4.4, aura = false, name = "Frost Overload", mob = "Melidrussa Chillworn", boss = "Melidrussa Chillworn", dungeon = 2521, bar = true, school = 16, aoe = true }, [373692] = { TANK = true, ep = { TANK = 41 }, lead = 4.4, aura = false, name = "Inferno", mob = "Blazebound Destroyer", boss = "", dungeon = 2521, bar = false, school = 4, aoe = true }, - [373693] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 119, HEALER = 136 }, lead = 2.5, aura = true, name = "Living Bomb", mob = "Primalist Cinderweaver", boss = "", dungeon = 2521, bar = false, school = 4, aoe = false }, + [373693] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 119, HEALER = 136 }, lead = 2.5, aura = true, name = "Living Bomb", mob = "Primalist Cinderweaver", boss = "", dungeon = 2521, bar = false, school = 4, aoe = false, dispel = "Magic" }, [381513] = { TANK = true, ep = { TANK = 27 }, lead = 4.0, aura = false, name = "Stormslam", mob = "Erkhart Stormvein", boss = "Kyrakka and Erkhart Stormvein", dungeon = 2521, bar = true, school = 8, aoe = false }, [381862] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 112, HEALER = 108 }, lead = 2.1, aura = false, name = "Inferno Spit", mob = "Kyrakka", boss = "Kyrakka and Erkhart Stormvein", dungeon = 2521, bar = true, school = 4, aoe = false }, [384823] = { HEALER = true, TANK = true, ep = { HEALER = 156, TANK = 56 }, lead = 1.9, aura = false, name = "Inferno", mob = "Blazebound Firestorm", boss = "Kokia Blazehoof", dungeon = 2521, bar = false, school = 4, aoe = true }, [385567] = { TANK = true, ep = { TANK = 21 }, lead = 4.1, aura = false, name = "Flaming Barrage", mob = "Ashseer Flamelasher", boss = "", dungeon = 2521, bar = true, school = 4, aoe = false }, [395292] = { TANK = true, ep = { TANK = 78 }, lead = 4.1, aura = false, name = "Fire Maw", mob = "Flamegullet", boss = "", dungeon = 2521, bar = false, school = 4, aoe = false }, [474483] = { DAMAGER = true, HEALER = true, TANK = true, ep = { DAMAGER = 119, HEALER = 105, TANK = 44 }, lead = 3.3, aura = false, name = "Killing Spree", mob = "Zaen Bladesorrow", boss = "Zaen Bladesorrow", dungeon = 2813, bar = true, school = 1, aoe = true }, - [474515] = { TANK = true, ep = { TANK = 18 }, lead = 5.0, aura = true, name = "Heartstop Poison", mob = "Zaen Bladesorrow", boss = "Zaen Bladesorrow", dungeon = 2813, bar = false, school = 8, aoe = false }, + [474515] = { TANK = true, ep = { TANK = 18 }, lead = 5.0, aura = true, name = "Heartstop Poison", mob = "Zaen Bladesorrow", boss = "Zaen Bladesorrow", dungeon = 2813, bar = false, school = 8, aoe = false, dispel = "Poison" }, [474740] = { TANK = true, ep = { TANK = 152 }, lead = 2.3, aura = false, name = "Murder in a Row", mob = "Zaen Bladesorrow", boss = "Zaen Bladesorrow", dungeon = 2813, bar = true, school = 1, aoe = false }, [1214959] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 364, HEALER = 311 }, lead = 4.0, aura = false, name = "Chaotic Burst", mob = "Kystia Manaheart", boss = "Kystia Manaheart", dungeon = 2813, bar = false, school = 124, aoe = true }, - [1216590] = { TANK = true, ep = { TANK = 12 }, lead = 5.0, aura = false, name = "Heartstop Poison", mob = "Street Sneak", boss = "", dungeon = 2813, bar = false, school = 8, aoe = false }, + [1216590] = { TANK = true, ep = { TANK = 12 }, lead = 5.0, aura = false, name = "Heartstop Poison", mob = "Street Sneak", boss = "", dungeon = 2813, bar = false, school = 8, aoe = false, dispel = "Poison" }, [1216945] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 1608, HEALER = 1612 }, lead = 3.7, aura = false, name = "Searing Fel Flame", mob = "Lithiel Cinderfury", boss = "Lithiel Cinderfury", dungeon = 2813, bar = false, school = 4, aoe = true }, [1222103] = { DAMAGER = true, HEALER = true, TANK = true, ep = { DAMAGER = 259, HEALER = 271, TANK = 123 }, lead = 2.7, aura = false, name = "Nether Dash", mob = "Ethereal Shade", boss = "Taz'Rah", dungeon = 2923, bar = true, school = 32, aoe = false }, [1222642] = { TANK = true, ep = { TANK = 123 }, lead = 2.3, aura = false, name = "Hulking Claw", mob = "Atroxus", boss = "Atroxus", dungeon = 2923, bar = true, school = 8, aoe = false }, @@ -41,7 +41,7 @@ CastAheadDefensives = { [1236731] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 134, HEALER = 119 }, lead = 2.0, aura = false, name = "Thorncaller Roar", mob = "Ikuzz the Light Hunter", boss = "Ikuzz the Light Hunter", dungeon = 2859, bar = true, school = 8, aoe = true }, [1237093] = { TANK = true, ep = { TANK = 13 }, lead = 5.6, aura = false, name = "Crushing Footfalls", mob = "Ikuzz the Light Hunter", boss = "Ikuzz the Light Hunter", dungeon = 2859, bar = false, school = 8, aoe = true }, [1237330] = { TANK = true, ep = { TANK = 52 }, lead = 3.8, aura = false, name = "Bloodthorn Roots", mob = "Ikuzz the Light Hunter", boss = "Ikuzz the Light Hunter", dungeon = 2859, bar = false, school = 8, aoe = false }, - [1238084] = { TANK = true, ep = { TANK = 40 }, lead = 5.0, aura = true, name = "Spore Spines", mob = "Lasher", boss = "", dungeon = 2859, bar = false, school = 8, aoe = false }, + [1238084] = { TANK = true, ep = { TANK = 40 }, lead = 5.0, aura = true, name = "Spore Spines", mob = "Lasher", boss = "", dungeon = 2859, bar = false, school = 8, aoe = false, dispel = "Magic" }, [1238439] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 181, HEALER = 176 }, lead = 2.9, aura = true, name = "Razor Dive", mob = "Keen-Eyed Striker", boss = "", dungeon = 2825, bar = false, school = 1, aoe = false }, [1238463] = { DAMAGER = true, ep = { DAMAGER = 133 }, lead = 2.6, aura = false, name = "Lightmaw Beams", mob = "Overgrown Hydra", boss = "", dungeon = 2859, bar = false, school = 2, aoe = true }, [1239825] = { DAMAGER = true, HEALER = true, TANK = true, ep = { DAMAGER = 141, HEALER = 145, TANK = 71 }, lead = 2.1, aura = false, name = "Lightfire", mob = "Lightwarden Ruia", boss = "Lightwarden Ruia", dungeon = 2859, bar = true, school = 6, aoe = false }, @@ -53,7 +53,7 @@ CastAheadDefensives = { [1247052] = { DAMAGER = true, ep = { DAMAGER = 106 }, lead = 5.2, aura = true, name = "Lightbloom's Might", mob = "Environment", boss = "Ziekett", dungeon = 2859, bar = false, school = 2, aoe = false }, [1247746] = { TANK = true, ep = { TANK = 55 }, lead = 5.1, aura = false, name = "Thornspike", mob = "Ziekket", boss = "Ziekett", dungeon = 2859, bar = true, school = 1, aoe = false }, [1250695] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 154, HEALER = 147 }, lead = 2.7, aura = false, name = "Insidious Aura", mob = "Chitigoth", boss = "", dungeon = 2923, bar = false, school = 8, aoe = true }, - [1250937] = { DAMAGER = true, ep = { DAMAGER = 138 }, lead = 2.9, aura = false, name = "Toxic Spew", mob = "Potatoad Matriarch", boss = "", dungeon = 2859, bar = false, school = 8, aoe = true }, + [1250937] = { DAMAGER = true, ep = { DAMAGER = 138 }, lead = 2.9, aura = false, name = "Toxic Spew", mob = "Potatoad Matriarch", boss = "", dungeon = 2859, bar = false, school = 8, aoe = true, dispel = "Poison" }, [1252406] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 162, HEALER = 162 }, lead = 4.1, aura = false, name = "Dreadbellow", mob = "Devouring Brutalizer", boss = "", dungeon = 2923, bar = false, school = 32, aoe = true }, [1263420] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 539, HEALER = 568 }, lead = 3.0, aura = false, name = "Lightcrazed Frenzy", mob = "Ikuzz the Light Hunter", boss = "Ikuzz the Light Hunter", dungeon = 2859, bar = false, school = 2, aoe = true }, [1263628] = { DAMAGER = true, HEALER = true, ep = { DAMAGER = 139, HEALER = 129 }, lead = 1.7, aura = false, name = "Spouting Floret", mob = "Sporeblight Belcher", boss = "", dungeon = 2859, bar = false, school = 2, aoe = true }, diff --git a/Match.lua b/Match.lua index 6117db5..36cc307 100644 --- a/Match.lua +++ b/Match.lua @@ -163,6 +163,18 @@ function M.SaveAdvice(row) return key and M.HasButton() and M.ADVICE[key] or nil end +-- A debuff landing on the player. A healer who can remove it is told to, and +-- does the defensive only when the dispel is not there; everyone else, and +-- the second of two bombs, still needs the defensive. +function M.AuraAdvice(row, prio) + local category = row.dispel and M.DISPEL_CATEGORY[row.dispel] + if category and category ~= "BLEED" and row.HEALER and M.SpecRole() == "HEALER" + and M.PlayerCanHandle and M.PlayerCanHandle(category) then + return M.ADVICE[category] + end + return M.SaveAdvice({ save = row, prio = prio }) +end + function M.IsSave(advice) return advice == M.ADVICE.DEFENSIVE end diff --git a/Saves.lua b/Saves.lua index ec1bd6d..0a63311 100644 --- a/Saves.lua +++ b/Saves.lua @@ -437,7 +437,7 @@ local function RegisterAuraSounds() if not (CastAheadConfig.SaveCalls() and CastAheadConfig.Enabled("sound")) then return end local voice = CastAheadConfig.Enabled("voice") for spellID, row in pairs(CastAheadDefensives and CastAheadDefensives.spells or {}) do - local advice = row.aura and M.SaveAdvice({ save = row, prio = CastAheadPriority and CastAheadPriority[spellID] }) + local advice = row.aura and M.AuraAdvice(row, CastAheadPriority and CastAheadPriority[spellID]) local file = advice and (PickedFile(advice) or voice and SOUND_ROOT .. advice.file .. ".ogg") if file then local ok, id = pcall(C_UnitAuras.AddAuraSound, Enum.UnitAuraSoundTrigger.Added, { diff --git a/test_core.lua b/test_core.lua index b80b289..93808b4 100644 --- a/test_core.lua +++ b/test_core.lua @@ -3139,6 +3139,27 @@ do CastAheadDB.saveButtons = nil C_UnitAuras.AddAuraSound = function() error("restricted") end check(pcall(CastAheadSaves.Refresh) and CastAheadSaves.AuraSoundCount() == 0, "a failing AddAuraSound is skipped") + C_UnitAuras.AddAuraSound = function(trigger, info) files[#files + 1] = info.soundFileName return #files end + CastAheadDefensives = { spells = { [373693] = { DAMAGER = true, HEALER = true, aura = true, dispel = "Magic" }, + [1238084] = { TANK = true, aura = true, dispel = "Magic" } }, alias = {} } + local magic = { [527] = true, [4987] = true, [77130] = true, [88423] = true, [115450] = true, [360823] = true, + [32375] = true } + local savedIsPlayerSpell, knowsDispel = IsPlayerSpell, true + IsPlayerSpell = function(id) + if magic[id] then return knowsDispel and id == 527 end + return savedIsPlayerSpell == nil or savedIsPlayerSpell(id) + end + role = "HEALER" + fire("SPELLS_CHANGED") + check(files[#files]:match("Sounds\\en\\MAGIC%.ogg$") and CastAheadSaves.AuraSoundCount() == 1, + "a healer who can remove the magic hears the dispel, and nothing on a tank's debuff") + knowsDispel = false + fire("SPELLS_CHANGED") + check(files[#files]:match("Sounds\\en\\DEFENSIVE%.ogg$"), "a healer without a magic dispel hears the defensive") + knowsDispel, role = true, "DAMAGER" + fire("PLAYER_SPECIALIZATION_CHANGED", "player") + check(files[#files]:match("Sounds\\en\\DEFENSIVE%.ogg$"), "a damage dealer with a magic dispel still hears the defensive") + IsPlayerSpell = savedIsPlayerSpell C_UnitAuras.AddAuraSound, C_UnitAuras.RemoveAuraSound = nil, nil C_ChatInfo, InCombatLockdown, Enum.UnitAuraSoundTrigger = nil, nil, nil CastAheadDefensives = { spells = {}, alias = {} }