mirror of
https://github.com/Relintai/Relintais-Enemy-Kooldown-Tracker-WotLK.git
synced 2024-11-12 10:25:14 +01:00
271 lines
7.3 KiB
Lua
271 lines
7.3 KiB
Lua
|
|
--TODOS:
|
|
--DR timers
|
|
--fix config for drs, add in displaying the number of drs, add in a config -> where to show them uncomment enableds
|
|
--fix libdrdata, its dr groups are bad
|
|
--spec detection
|
|
--Way to show pet cds on the master -> currently looks impossible
|
|
--add every version for arcane torrent (BE racial)
|
|
|
|
--"Globals"
|
|
local aceDB = LibStub("AceDB-3.0");
|
|
local aceCDialog = LibStub("AceConfigDialog-3.0");
|
|
local aceConfig = LibStub("AceConfig-3.0");
|
|
local libSharedMedia = LibStub("LibSharedMedia-3.0");
|
|
local libDRData = LibStub('DRData-1.0');
|
|
|
|
Vect.MovableFrames = nil
|
|
|
|
Vect.targets = {
|
|
["target"] = nil,
|
|
["focus"] = nil,
|
|
["self"] = nil
|
|
}
|
|
|
|
Vect.cds = {}
|
|
Vect.drs = {}
|
|
|
|
Vect.frames = {
|
|
["target"] = {},
|
|
["focus"] = {},
|
|
["targetdr"] = {},
|
|
["focusdr"] = {},
|
|
["selfdr"] = {}
|
|
}
|
|
|
|
Vect.defaults = {
|
|
profile = {
|
|
enabled = true,
|
|
locked = true,
|
|
debugLevel = 0,
|
|
spellCastDebug = false,
|
|
spellAuraDebug = false,
|
|
allCDebug = false,
|
|
selfCDRegister = false,
|
|
target = {
|
|
enabled = true,
|
|
size = 27,
|
|
xPos = 350,
|
|
yPos = 350,
|
|
growOrder = 2,
|
|
sortOrder = 5
|
|
},
|
|
focus = {
|
|
enabled = true,
|
|
size = 27,
|
|
xPos = 380,
|
|
yPos = 380,
|
|
growOrder = 2,
|
|
sortOrder = 5
|
|
},
|
|
targetdr = {
|
|
enabled = true,
|
|
size = 27,
|
|
xPos = 380,
|
|
yPos = 380,
|
|
growOrder = 2,
|
|
sortOrder = 5,
|
|
drnumsize = 14,
|
|
drnumposition = 1
|
|
},
|
|
focusdr = {
|
|
enabled = true,
|
|
size = 27,
|
|
xPos = 380,
|
|
yPos = 380,
|
|
growOrder = 2,
|
|
sortOrder = 5,
|
|
drnumsize = 14,
|
|
drnumposition = 1
|
|
},
|
|
selfdr = {
|
|
enabled = true,
|
|
size = 27,
|
|
xPos = 380,
|
|
yPos = 380,
|
|
growOrder = 2,
|
|
sortOrder = 5,
|
|
drnumsize = 14,
|
|
drnumposition = 1
|
|
}
|
|
}
|
|
}
|
|
|
|
function Vect:Reset()
|
|
Vect.cds = {}
|
|
Vect.drs = {}
|
|
Vect.target = {unitGUID = -1, timers = {}}
|
|
Vect.focus = {unitGUID = -1, timers = {}}
|
|
end
|
|
|
|
function Vect:OnInitialize()
|
|
self.db = aceDB:New("VectDB", self.defaults);
|
|
self.db.RegisterCallback(self, "OnProfileChanged", function() self:ApplySettings() end);
|
|
self.db.RegisterCallback(self, "OnProfileCopied", function() self:ApplySettings() end);
|
|
self.db.RegisterCallback(self, "OnProfileReset", function() self:ApplySettings() end);
|
|
aceConfig:RegisterOptionsTable("Vect", self:GetVectOptions());
|
|
aceCDialog:AddToBlizOptions("Vect");
|
|
self:RegisterChatCommand("vect", "ChatCommand");
|
|
end
|
|
|
|
function Vect:OnEnable()
|
|
self:Reset()
|
|
self:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
self:RegisterEvent("ZONE_CHANGED_NEW_AREA")
|
|
self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
|
self:RegisterEvent("PLAYER_TARGET_CHANGED")
|
|
self:RegisterEvent("PLAYER_FOCUS_CHANGED")
|
|
self:CreateFrames("target");
|
|
self:CreateFrames("focus");
|
|
self:CreateDRFrames("targetdr");
|
|
self:CreateDRFrames("focusdr");
|
|
self:CreateDRFrames("selfdr");
|
|
self:ApplySettings();
|
|
self.targets["self"] = UnitGUID("player");
|
|
end
|
|
|
|
|
|
function Vect:OnDisable()
|
|
self:UnregisterEvent("PLAYER_ENTERING_WORLD")
|
|
self:UnregisterEvent("ZONE_CHANGED_NEW_AREA")
|
|
self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
|
self:UnregisterEvent("PLAYER_TARGET_CHANGED")
|
|
self:UnregisterEvent("PLAYER_FOCUS_CHANGED")
|
|
self.Reset();
|
|
end
|
|
|
|
|
|
function Vect:ChatCommand(input)
|
|
if not input or input:trim() == "" then
|
|
aceCDialog:Open("Vect");
|
|
else
|
|
LibStub("AceConfigCmd-3.0").HandleCommand(Vect, "vect", "Vect", input);
|
|
end
|
|
end
|
|
|
|
local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
|
|
local COMBATLOG_OBJECT_REACTION_HOSTILE = COMBATLOG_OBJECT_REACTION_HOSTILE
|
|
local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER
|
|
|
|
|
|
function Vect:COMBAT_LOG_EVENT_UNFILTERED(_, timestamp, eventType, srcGUID, srcName, srcFlags,
|
|
dstGUID, dstName, dstFlags, spellID, spellName, spellSchool,
|
|
detail1, detail2, detail3)
|
|
local db = Vect.db.profile;
|
|
|
|
if not db["enabled"] then return end;
|
|
|
|
--debugAll
|
|
if db["allCDebug"] then
|
|
self:Print("eventType: " .. eventType .. " id: " .. spellID .. " spellName: " .. spellName);
|
|
end
|
|
|
|
--debugAura
|
|
if db["spellAuraDebug"] then
|
|
if eventType == "SPELL_AURA_APPLIED" or eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_APPLIED_DOSE" or
|
|
eventType == "SPELL_AURA_REMOVED_DOSE" or eventType == "SPELL_AURA_REFRESH" or eventType == "SPELL_AURA_BROKEN" or
|
|
eventType == "SPELL_AURA_BROKEN_SPELL" then
|
|
self:Print("eventType: " .. eventType .. " id: " .. spellID .. " spellName: " .. spellName);
|
|
end
|
|
end
|
|
|
|
if eventType == "SPELL_CAST_SUCCESS" or eventType == "SPELL_AURA_APPLIED" then
|
|
--debug spell
|
|
if db["spellCastDebug"] and eventType == "SPELL_CAST_SUCCESS" then
|
|
self:Print("id: " .. spellID .. " spellName: " .. spellName);
|
|
end
|
|
|
|
if Vect.spells[spellID] then
|
|
Vect:AddCd(srcGUID, spellID);
|
|
end
|
|
end
|
|
|
|
--DR stuff
|
|
if( eventType == "SPELL_AURA_APPLIED" ) then
|
|
if(detail1 == "DEBUFF" and libDRData:GetSpellCategory(spellID)) then
|
|
local isPlayer = (bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
|
|
|
|
if (not isPlayer and not libDRData:IsPVE(drCat)) then
|
|
return
|
|
end
|
|
|
|
local drCat = libDRData:GetSpellCategory(spellID);
|
|
Vect:DRDebuffGained(spellID, dstGUID, isPlayer);
|
|
end
|
|
|
|
-- Enemy had a debuff refreshed before it faded, so fade + gain it quickly
|
|
elseif(eventType == "SPELL_AURA_REFRESH" ) then
|
|
if(detail1 == "DEBUFF" and libDRData:GetSpellCategory(spellID)) then
|
|
local isPlayer = (bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
|
|
|
|
if (not isPlayer and not libDRData:IsPVE(drCat)) then
|
|
return
|
|
end
|
|
|
|
Vect:DRDebuffFaded(spellID, dstGUID, isPlayer);
|
|
Vect:DRDebuffGained(spellID, dstGUID, isPlayer);
|
|
end
|
|
|
|
-- Buff or debuff faded from an enemy
|
|
elseif(eventType == "SPELL_AURA_REMOVED" ) then
|
|
if(detail1 == "DEBUFF" and libDRData:GetSpellCategory(spellID)) then
|
|
local isPlayer = (bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
|
|
|
|
if (not isPlayer and not libDRData:IsPVE(drCat)) then
|
|
return
|
|
end
|
|
Vect:DRDebuffFaded(spellID, dstGUID, isPlayer);
|
|
end
|
|
end
|
|
end
|
|
|
|
function Vect:PLAYER_TARGET_CHANGED()
|
|
local unitGUID = UnitGUID("target");
|
|
self.targets["target"] = unitGUID;
|
|
self:ReassignCds("target");
|
|
self:ReassignDRs("targetdr");
|
|
end
|
|
|
|
function Vect:PLAYER_FOCUS_CHANGED()
|
|
local unitGUID = UnitGUID("focus");
|
|
self.targets["focus"] = unitGUID;
|
|
self:ReassignCds("focus");
|
|
self:ReassignDRs("focusdr");
|
|
end
|
|
|
|
function Vect:PLAYER_ENTERING_WORLD()
|
|
--DB cleanup
|
|
local t = GetTime();
|
|
for k, v in pairs(Vect.cds) do
|
|
for i, j in pairs(v) do
|
|
if j[2] < t then
|
|
--self:Print(Vect.cds[k][i][4]);
|
|
Vect.cds[k][i] = nil;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function Vect:ZONE_CHANGED_NEW_AREA()
|
|
local type = select(2, IsInInstance())
|
|
-- If we are entering an arena
|
|
if (type == "arena") then
|
|
self:Reset();
|
|
end
|
|
end
|
|
|
|
function Vect:ApplySettings()
|
|
local db = Vect.db.profile;
|
|
Vect:MoveTimersStop("target");
|
|
Vect:MoveTimersStop("focus");
|
|
Vect:ReassignCds("target");
|
|
Vect:ReassignCds("focus");
|
|
Vect:MoveDRTimersStop("targetdr");
|
|
Vect:MoveDRTimersStop("focusdr");
|
|
Vect:MoveDRTimersStop("selfdr");
|
|
Vect:ReassignDRs("targetdr");
|
|
Vect:ReassignDRs("focusdr");
|
|
Vect:ReassignDRs("selfdr");
|
|
if not db["locked"] then self:ShowMovableFrames() end;
|
|
end
|