You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

404 lines
12 KiB

--- ============================ HEADER ============================
--- ======= LOCALIZE =======
-- Addon
local addonName, addonTable = ...
-- HeroLib
local HL = HeroLib
local HR = HeroRotation
local Cache = HeroCache
local Unit = HL.Unit
local Player = Unit.Player
local Target = Unit.Target
local Spell = HL.Spell
local Item = HL.Item
-- Lua
local find = string.find
local GetTime = GetTime
-- WoW API
local UnitGUID = UnitGUID
-- File Locals
HR.Commons.Warlock = {}
local Warlock = HR.Commons.Warlock
--- ============================ CONTENT ============================
--- ======= NON-COMBATLOG =======
--- ======= COMBATLOG =======
--- Combat Log Arguments
------- Base -------
-- 1 2 3 4 5 6 7 8 9 10 11
-- TimeStamp, Event, HideCaster, SourceGUID, SourceName, SourceFlags, SourceRaidFlags, DestGUID, DestName, DestFlags, DestRaidFlags
------- Prefixes -------
--- SWING
-- N/A
--- SPELL & SPELL_PACIODIC
-- 12 13 14
-- SpellID, SpellName, SpellSchool
------- Suffixes -------
--- _CAST_START & _CAST_SUCCESS & _SUMMON & _RESURRECT
-- N/A
--- _CAST_FAILED
-- 15
-- FailedType
--- _AURA_APPLIED & _AURA_REMOVED & _AURA_REFRESH
-- 15
-- AuraType
--- _AURA_APPLIED_DOSE
-- 15 16
-- AuraType, Charges
--- _INTERRUPT
-- 15 16 17
-- ExtraSpellID, ExtraSpellName, ExtraSchool
--- _HEAL
-- 15 16 17 18
-- Amount, Overhealing, Absorbed, Critical
--- _DAMAGE
-- 15 16 17 18 19 20 21 22 23
-- Amount, Overkill, School, Resisted, Blocked, Absorbed, Critical, Glancing, Crushing
--- _MISSED
-- 15 16 17
-- MissType, IsOffHand, AmountMissed
------- Special -------
--- UNIT_DIED, UNIT_DESTROYED
-- N/A
--- End Combat Log Arguments
-- Arguments Variables
HL.ImmolationTable = {
Destruction = {
ImmolationDebuff = {},
}
}
HL.GuardiansTable = {
--{ID, name, spawnTime, ImpCasts, Duration, despawnTime}
Pets = {
},
ImpCount = 0,
FelguardDuration = 0,
DreadstalkerDuration = 0,
DemonicTyrantDuration = 0,
VilefiendDuration = 0,
PitLordDuration = 0,
Infernal = 0,
Blasphemy = 0,
DarkglareDuration = 0,
-- Used for Wild Imps spawn prediction
InnerDemonsNextCast = 0,
ImpsSpawnedFromHoG = 0
}
local PetsData = {
[98035] = {
name = "Dreadstalker",
duration = 12.25
},
[55659] = {
name = "Wild Imp",
duration = 20
},
[143622] = {
name = "Wild Imp",
duration = 20
},
[17252] = {
name = "Felguard",
duration = 17
},
[135002] = {
name = "Demonic Tyrant",
duration = 15
},
[135816] = {
name = "Vilefiend",
duration = 15
},
[196111] = {
name = "Pit Lord",
duration = 10
},
[89] = {
name = "Infernal",
duration = 30
},
[185584] = {
name = "Blasphemy",
duration = 8
},
[103673] = {
name = "Darkglare",
duration = 25
},
}
--------------------------
----- Destruction --------
--------------------------
-- Immolate OnApply/OnRefresh Listener
HL:RegisterForSelfCombatEvent(
function (...)
DestGUID, _, _, _, SpellID = select(8, ...)
--- Record the Immolate
if SpellID == 157736 then
HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] = 0
end
end
, "SPELL_AURA_APPLIED"
, "SPELL_AURA_REFRESH"
)
-- Immolate OnRemove Listener
HL:RegisterForSelfCombatEvent(
function (...)
DestGUID, _, _, _, SpellID = select(8, ...)
-- Removes the Unit from Immolate Table
if SpellID == 157736 then
if HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] then
HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] = nil
end
end
end
, "SPELL_AURA_REMOVED"
)
-- Immolate OnUnitDeath Listener
HL:RegisterForCombatEvent(
function (...)
DestGUID = select(8, ...)
-- Removes the Unit from Immolate Table
if HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] then
HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] = nil
end
end
, "UNIT_DIED"
, "UNIT_DESTROYED"
)
-- Conflagrate Listener
HL:RegisterForSelfCombatEvent(
function (...)
DestGUID, _, _, _, SpellID = select(8, ...)
-- Add a stack to the table
if SpellID == 17962 then
if HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] then
HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID] = HL.ImmolationTable.Destruction.ImmolationDebuff[DestGUID]+1
end
end
end
, "SPELL_CAST_SUCCESS"
)
--------------------------
----- Demonology ---------
--------------------------
-- Update the GuardiansTable
function Warlock.UpdatePetTable()
for key, petTable in pairs(HL.GuardiansTable.Pets) do
if petTable then
-- Remove expired pets
if GetTime() >= petTable.despawnTime then
if petTable.name == "Wild Imp" then
HL.GuardiansTable.ImpCount = HL.GuardiansTable.ImpCount - 1
end
if petTable.name == "Felguard" then
HL.GuardiansTable.FelguardDuration = 0
elseif petTable.name == "Dreadstalker" then
HL.GuardiansTable.DreadstalkerDuration = 0
elseif petTable.name == "Demonic Tyrant" then
HL.GuardiansTable.DemonicTyrantDuration = 0
elseif petTable.name == "Vilefiend" then
HL.GuardiansTable.VilefiendDuration = 0
elseif petTable.name == "Pit Lord" then
HL.GuardiansTable.PitLordDuration = 0
elseif petTable.name == "Infernal" then
HL.GuardiansTable.InfernalDuration = 0
elseif petTable.name == "Blasphemy" then
HL.GuardiansTable.BlasphemyDuration = 0
elseif petTable.name == "Darkglare" then
HL.GuardiansTable.DarkglareDuration = 0
end
HL.GuardiansTable.Pets[key] = nil
end
end
-- Remove any imp that has casted all of its bolts
if petTable.ImpCasts <= 0 then
HL.GuardiansTable.ImpCount = HL.GuardiansTable.ImpCount - 1
HL.GuardiansTable.Pets[key] = nil
end
-- Update Durations
if GetTime() <= petTable.despawnTime then
petTable.Duration = petTable.despawnTime - GetTime()
if petTable.name == "Felguard" then
HL.GuardiansTable.FelguardDuration = petTable.Duration
elseif petTable.name == "Dreadstalker" then
HL.GuardiansTable.DreadstalkerDuration = petTable.Duration
elseif petTable.name == "Demonic Tyrant" then
HL.GuardiansTable.DemonicTyrantDuration = petTable.Duration
elseif petTable.name == "Vilefiend" then
HL.GuardiansTable.VilefiendDuration = petTable.Duration
elseif petTable.name == "Pit Lord" then
HL.GuardiansTable.PitLordDuration = petTable.Duration
elseif petTable.name == "Infernal" then
HL.GuardiansTable.InfernalDuration = petTable.Duration
elseif petTable.name == "Blasphy" then
HL.GuardiansTable.BlasphemyDuration = petTable.Duration
elseif petTable.name == "Darkglare" then
HL.GuardiansTable.DarkglareDuration = petTable.Duration
end
end
end
end
-- Add demon to table
HL:RegisterForSelfCombatEvent(
function (...)
local timestamp,Event,_,SourceGUID,_,_,_,UnitPetGUID,_,_,_,SpellID=select(1,...)
local _, _, _, _, _, _, _, UnitPetID = find(UnitPetGUID, "(%S+)-(%d+)-(%d+)-(%d+)-(%d+)-(%d+)-(%S+)")
UnitPetID = tonumber(UnitPetID)
-- Add pet
if (UnitPetGUID ~= UnitGUID("pet") and Event == "SPELL_SUMMON" and PetsData[UnitPetID]) then
local summonedPet = PetsData[UnitPetID]
local petDuration
if summonedPet.name == "Wild Imp" then
HL.GuardiansTable.ImpCount = HL.GuardiansTable.ImpCount + 1
petDuration = summonedPet.duration
elseif summonedPet.name == "Felguard" then
HL.GuardiansTable.FelguardDuration = summonedPet.duration
petDuration = summonedPet.duration
elseif summonedPet.name == "Dreadstalker" then
HL.GuardiansTable.DreadstalkerDuration = summonedPet.duration
petDuration = summonedPet.duration
elseif summonedPet.name == "Demonic Tyrant" then
if (SpellID == 265187) then
HL.GuardiansTable.DemonicTyrantDuration = summonedPet.duration
petDuration = summonedPet.duration
end
elseif summonedPet.name == "Vilefiend" then
HL.GuardiansTable.VilefiendDuration = summonedPet.duration
petDuration = summonedPet.duration
elseif summonedPet.name == "Pit Lord" then
HL.GuardiansTable.PitLordDuration = summonedPet.duration
petDuration = summonedPet.duration
elseif summonedPet.name == "Infernal" then
HL.GuardiansTable.InfernalDuration = summonedPet.duration
petDuration = summonedPet.duration
elseif summonedPet.name == "Blasphemy" then
HL.GuardiansTable.BlasphemyDuration = summonedPet.duration
petDuration = summonedPet.duration
elseif summonedPet.name == "Darkglare" then
HL.GuardiansTable.DarkglareDuration = summonedPet.duration
petDuration = summonedPet.duration
end
local petTable = {
ID = UnitPetGUID,
name = summonedPet.name,
spawnTime = GetTime(),
ImpCasts = 5,
Duration = petDuration,
despawnTime = GetTime() + tonumber(petDuration)
}
table.insert(HL.GuardiansTable.Pets,petTable)
end
-- Add 15 seconds and 7 casts to all pets when Tyrant is cast
if PetsData[UnitPetID] and PetsData[UnitPetID].name == "Demonic Tyrant" then
for key, petTable in pairs(HL.GuardiansTable.Pets) do
if (petTable and petTable.name ~= "Demonic Tyrant" and petTable.name ~= "Pit Lord") then
petTable.despawnTime = petTable.despawnTime + 15
petTable.ImpCasts = petTable.ImpCasts + 7
end
end
end
-- Update when next Wild Imp will spawn from Inner Demons talent
if UnitPetID == 143622 then
HL.GuardiansTable.InnerDemonsNextCast = GetTime() + 12
end
-- Updates how many Wild Imps have yet to spawn from HoG cast
if UnitPetID == 55659 and HL.GuardiansTable.ImpsSpawnedFromHoG > 0 then
HL.GuardiansTable.ImpsSpawnedFromHoG = HL.GuardiansTable.ImpsSpawnedFromHoG - 1
end
-- Update the pet table
Warlock.UpdatePetTable()
end
, "SPELL_SUMMON"
, "SPELL_CAST_SUCCESS"
)
-- Decrement ImpCasts and Implosion Listener
HL:RegisterForCombatEvent(
function (...)
local SourceGUID,_,_,_,UnitPetGUID,_,_,_,SpellID = select(4, ...)
-- Check for imp bolt casts
if SpellID == 104318 then
for key, petTable in pairs(HL.GuardiansTable.Pets) do
if SourceGUID == petTable.ID then
petTable.ImpCasts = petTable.ImpCasts - 1
end
end
end
-- Clear the imp table upon Implosion cast
if SourceGUID == Player:GUID() and SpellID == 196277 then
for key, petTable in pairs(HL.GuardiansTable.Pets) do
if petTable.name == "Wild Imp" then
HL.GuardiansTable.Pets[key] = nil
end
end
HL.GuardiansTable.ImpCount = 0
end
-- Update the imp table
Warlock.UpdatePetTable()
end
, "SPELL_CAST_SUCCESS"
)
-- Track when we last received PI
Warlock.LastPI = 0
HL:RegisterForCombatEvent(
function (...)
DestGUID, _, _, _, SpellID = select(8, ...)
--- Record the Immolate
if SpellID == 10060 and DestGUID == Player:GUID() then
Warlock.LastPI = GetTime()
end
end
, "SPELL_AURA_APPLIED"
, "SPELL_AURA_REFRESH"
)
-- Keep track how many Soul Shards we have
Warlock.SoulShards = 0
function Warlock.UpdateSoulShards()
Warlock.SoulShards = Player:SoulShards()
end
-- On Successful HoG cast add how many Imps will spawn
HL:RegisterForSelfCombatEvent(
function(_, event, _, _, _, _, _, _, _, _, _, SpellID)
if SpellID == 105174 then
HL.GuardiansTable.ImpsSpawnedFromHoG = HL.GuardiansTable.ImpsSpawnedFromHoG + (Warlock.SoulShards >= 3 and 3 or Warlock.SoulShards)
end
end
, "SPELL_CAST_SUCCESS"
)