Relintais-Enemy-Kooldown-Tr.../Vect.lua

367 lines
9.0 KiB
Lua

--TODOS:
--Option to show pet cds on possible master (eg spell lock on all locks)
--document the db these will be needed:
--silence, gapcloser, defensive, potion, nuke, anticc, cc, stun, disarm, cdreset, shield, uncategorized
--db-> class, type, isPet
--"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,
specdetection = false,
target = {
enabled = true,
size = 27,
xPos = 350,
yPos = 350,
growOrder = 2,
sortOrder = 5,
colorframeenabled = true,
colorframesize = 4
},
focus = {
enabled = true,
size = 27,
xPos = 380,
yPos = 380,
growOrder = 2,
sortOrder = 5,
colorframeenabled = true,
colorframesize = 4
},
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
},
colors = {
["gapcloser"] = {
["a"] = 1,
["b"] = 0,
["g"] = 0.8117647058823529,
["r"] = 1,
},
["anticc"] = {
["a"] = 1,
["b"] = 0.796078431372549,
["g"] = 1,
["r"] = 0,
},
["disarm"] = {
["a"] = 1,
["b"] = 0.9647058823529412,
["g"] = 1,
["r"] = 0,
},
["defensive"] = {
["a"] = 1,
["b"] = 0.08627450980392157,
["g"] = 1,
["r"] = 0.2,
},
["nuke"] = {
["a"] = 1,
["b"] = 0,
["g"] = 0,
["r"] = 1,
},
["shield"] = {
["a"] = 1,
["b"] = 0.3333333333333333,
["g"] = 1,
["r"] = 0.8901960784313725,
},
["potion"] = {
["a"] = 1,
["b"] = 0.6313725490196078,
["g"] = 0.7372549019607844,
["r"] = 1,
},
["cdreset"] = {
["a"] = 1,
["b"] = 1,
["g"] = 0,
["r"] = 0.6274509803921569,
},
["silence"] = {
["a"] = 1,
["b"] = 1,
["g"] = 0.03529411764705882,
["r"] = 0.1882352941176471,
},
["stun"] = {
["a"] = 1,
["b"] = 1,
["g"] = 0.07450980392156863,
["r"] = 0.9137254901960784,
},
["uncategorized"] = {
["a"] = 1,
["b"] = 1,
["g"] = 0.9058823529411765,
["r"] = 0.9607843137254902,
},
["cc"] = {
["a"] = 1,
["b"] = 0.3686274509803922,
["g"] = 0.3568627450980392,
["r"] = 0.3764705882352941,
},
},
cdtypesortorder = {
enabled = true,
silence = 1,
gapcloser = 2,
defensive = 3,
potion = 4,
nuke = 5,
anticc = 6,
cc = 7,
stun = 8,
disarm = 9,
cdreset = 10,
shield = 11,
uncategorized = 12
}
}
}
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 not (i == "spec") then
if j[2] < t then
--self:Print(Vect.cds[k][i][4]);
Vect.cds[k][i] = nil;
end
end
end
end
Vect.drs = {}
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