From 484ca7ceaea5e661775dfe6daef01fbbf74e652f Mon Sep 17 00:00:00 2001 From: d87 Date: Sun, 25 Jul 2010 14:46:40 +0700 Subject: [PATCH] initial commit. v0.8.1.7, patch 3.3.5 --- ClearFont.ttf | Bin 0 -> 254296 bytes Injector.lua | 1256 ++++++++++++++++ Injector.toc | 12 + InjectorPet.lua | 171 +++ config.lua | 237 +++ gradient.tga | Bin 0 -> 12332 bytes helpers.lua | 223 +++ libs.xml | 9 + libs/CallbackHandler-1.0.lua | 239 +++ libs/ChatThrottleLib.lua | 503 +++++++ libs/LibHealComm-4.0.lua | 2752 ++++++++++++++++++++++++++++++++++ libs/LibQuickHealth-2.0.lua | 698 +++++++++ libs/LibStub.lua | 30 + loadables.lua | 99 ++ white.tga | Bin 0 -> 812 bytes 15 files changed, 6229 insertions(+) create mode 100644 ClearFont.ttf create mode 100644 Injector.lua create mode 100644 Injector.toc create mode 100644 InjectorPet.lua create mode 100644 config.lua create mode 100644 gradient.tga create mode 100644 helpers.lua create mode 100644 libs.xml create mode 100644 libs/CallbackHandler-1.0.lua create mode 100644 libs/ChatThrottleLib.lua create mode 100644 libs/LibHealComm-4.0.lua create mode 100644 libs/LibQuickHealth-2.0.lua create mode 100644 libs/LibStub.lua create mode 100644 loadables.lua create mode 100644 white.tga diff --git a/ClearFont.ttf b/ClearFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e955207f7b112e002c146148ee80c140ccd4d196 GIT binary patch literal 254296 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 literal 0 HcmV?d00001 diff --git a/Injector.lua b/Injector.lua new file mode 100644 index 0000000..db3104c --- /dev/null +++ b/Injector.lua @@ -0,0 +1,1256 @@ +Injector = CreateFrame("Frame","Injector",UIParent) + +Injector:SetScript("OnEvent", function(self, event, ...) + self[event](self, event, ...) +end) + +InjectorConfig.SetupIndicators = InjectorConfig.SetupIndicators or {} + +InjectorConfig.unitGap = InjectorConfig.unitGap or 10 +InjectorConfig.groupGap = InjectorConfig.groupGap or 10 +InjectorConfig.unitGrowth = InjectorConfig.unitGrowth or "RIGHT" +InjectorConfig.groupGrowth = InjectorConfig.groupGrowth or "TOP" +InjectorConfig.resize = InjectorConfig.resize or { after = 27, to = 0.8 } -- = if number of players in raid exeeds 27 then resize to 0.8 +InjectorConfig.anchorpoint = InjectorConfig.anchorpoint or "BOTTOMLEFT" +InjectorConfig.outOfRangeAlpha = InjectorConfig.outOfRangeAlpha or 0.4 +InjectorConfig.incomingHealTimeframe = InjectorConfig.incomingHealTimeframe or 1.5 +InjectorConfig.IndicatorAuras = InjectorConfig.IndicatorAuras or {} +local InjectorUnitInRange = InjectorConfig.UnitInRangeFunc or UnitInRange + +local auras = InjectorConfig.IndicatorAuras +local dtypes = InjectorConfig.DebuffTypes +local traceheals = InjectorConfig.TraceHeals +local colors = setmetatable(InjectorConfig.Colors or {},{ __index = function(t,k) return RAID_CLASS_COLORS[k] end }) +local OORUnits = setmetatable({},{__mode = 'k'}) +local inCL = setmetatable({},{__index = function (t,k) return 0 end}) +local buffer = {} +local loaded = {} + +if not ClickCastFrames then + ClickCastFrames = {} + end +local InjectorString = "|cffff7777Injector: |r" +local Roster = {} +local guidMap = {} +local group_headers = {} + +local UnitHealth = UnitHealth +local UnitHealthMax = UnitHealthMax +local UnitPower = UnitPower +local UnitPowerMax = UnitPowerMax +local UnitAura = UnitAura +local UnitAffectingCombat = UnitAffectingCombat +local bit_band = bit.band +local _, helpers = ... +local utf8sub = helpers.utf8sub +local reverse = helpers.Reverse +local UIFrameScale = helpers.UIFrameScale +local UIFrameScaleOut = helpers.UIFrameScaleOut +local InjectorDB = {} + +local QuickHealth +local HealComm + +Injector:RegisterEvent("ADDON_LOADED") +function Injector.ADDON_LOADED(self,event,arg1) + if arg1 == "Injector" then + + InjectorDB_Global = InjectorDB_Global or {} + InjectorDB_Char = InjectorDB_Char or {} + InjectorDB_Global.charspec = InjectorDB_Global.charspec or {} + user = UnitName("player").."@"..GetRealmName() + if InjectorDB_Global.charspec[user] then + setmetatable(InjectorDB,{ __index = function(t,k) return InjectorDB_Char[k] end, __newindex = function(t,k,v) rawset(InjectorDB_Char,k,v) end}) + else + setmetatable(InjectorDB,{ __index = function(t,k) return InjectorDB_Global[k] end, __newindex = function(t,k,v) rawset(InjectorDB_Global,k,v) end}) + end + + InjectorDB.pos = InjectorDB.pos or {} + InjectorDB.pos.x = InjectorDB.pos.x or 0 + InjectorDB.pos.y = InjectorDB.pos.y or 0 + InjectorDB.pos.point = InjectorDB.pos.point or "CENTER" + + InjectorDB.pet_pos = InjectorDB.pet_pos or {} + InjectorDB.pet_pos.x = InjectorDB.pet_pos.x or 0 + InjectorDB.pet_pos.y = InjectorDB.pet_pos.y or 0 + InjectorDB.pet_pos.point = InjectorDB.pet_pos.point or "CENTER" + + InjectorDB.scale = InjectorDB.scale or 1 + + if InjectorConfig.disableBlizzardParty then + helpers.DisableBlizzParty() + end + + if InjectorConfig.useHealComm then + HealComm = LibStub:GetLibrary("LibHealComm-4.0",true); + if HealComm then + if InjectorConfig.incomingHealIgnoreHots then + HealComm.InjectorHealType = HealComm.CASTED_HEALS + else + HealComm.InjectorHealType = HealComm.ALL_HEALS + HealComm.RegisterCallback(self, "HealComm_HealUpdated", "HealUpdated"); -- hots + end + HealComm.RegisterCallback(self, "HealComm_HealStarted", "HealUpdated"); + HealComm.RegisterCallback(self, "HealComm_HealStopped", "HealUpdated"); + end + end + if InjectorConfig.useQuickHealth then + QuickHealth = LibStub and LibStub("LibQuickHealth-2.0", true) + if QuickHealth then + UnitHealth = QuickHealth.UnitHealth + Injector.UnitHealthUpdated = function(self, event, unit, h, hm) + if Roster[unit] then + self:UNIT_HEALTH(nil, unit) + end + end + QuickHealth.RegisterCallback(self, "UnitHealthUpdated") + end + end + self:RegisterEvent("UNIT_HEALTH") + self:RegisterEvent("UNIT_MAXHEALTH") + Injector.UNIT_MAXHEALTH = Injector.UNIT_HEALTH + + if not InjectorConfig.disableManaBar then + self:RegisterEvent("UNIT_MANA") + self:RegisterEvent("UNIT_MAXMANA") + self:RegisterEvent("UNIT_DISPLAYPOWER") + Injector.UNIT_MAXMANA = Injector.UNIT_MANA + end + if InjectorConfig.AggroStatus then + self:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE") + end + if InjectorConfig.ReadyCheck then + self:RegisterEvent("READY_CHECK") + self:RegisterEvent("READY_CHECK_CONFIRM") + self:RegisterEvent("READY_CHECK_FINISHED") + end + if InjectorConfig.TargetStatus then + self.previousTarget = "player" + self:RegisterEvent("PLAYER_TARGET_CHANGED") + end + if InjectorConfig.MainTankStatus then + self:RegisterEvent("PLAYER_ROLES_ASSIGNED") + self:RegisterEvent("PARTY_MEMBERS_CHANGED") + self.PLAYER_ROLES_ASSIGNED = self.UpdateMainTanks + self.PARTY_MEMBERS_CHANGED = self.UpdateMainTanks + end + + self:RegisterEvent("UNIT_AURA") + + if InjectorConfig.TraceHeals then + self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") + end + + self:RegisterEvent("RAID_ROSTER_UPDATE") + + if not InjectorConfig.raidIcons or not InjectorConfig.SetupIcons.raidicon then + InjectorConfig.SetupIcons.raidicon = nil + else + self:RegisterEvent("RAID_TARGET_UPDATE") + end + + self:RegisterEvent("UNIT_ENTERED_VEHICLE") + self:RegisterEvent("UNIT_EXITED_VEHICLE") + + + self.anchor = self:CreateAnchor("pos") + + InjectorConfig.maxgroups = InjectorConfig.maxgroups or 8 + + + local arrangeHeaders = function(prv_group, notreverse) + local p1, p2 + local xgap = 0 + local ygap = InjectorConfig.groupGap + local point, direction = reverse(InjectorConfig.unitGrowth) + local grgrowth = notreverse and reverse(InjectorConfig.groupGrowth) or InjectorConfig.groupGrowth + if grgrowth == "TOP" then + if direction == "VERTICAL" then point = "" end + p1 = "BOTTOM"..point; p2 = "TOP"..point; + elseif grgrowth == "BOTTOM" then + if direction == "VERTICAL" then point = "" end + p2 = "BOTTOM"..point; p1 = "TOP"..point + ygap = -ygap + elseif grgrowth == "RIGHT" then + if direction == "HORIZONTAL" then point = "" end + p1 = point.."LEFT"; p2 = point.."RIGHT" + xgap, ygap = ygap, xgap + elseif grgrowth == "LEFT" then + if direction == "HORIZONTAL" then point = "" end + p2 = point.."LEFT"; p1 = point.."RIGHT" + xgap, ygap = -ygap, xgap + end + return p1, prv_group, p2, xgap, ygap + end + + local i = 1 + while (i <= InjectorConfig.maxgroups) do + local f = Injector:CreateHeader(i) + + + group_headers[i] = f + if i == 1 then + f:SetPoint(InjectorConfig.anchorpoint, self.anchor, reverse(InjectorConfig.anchorpoint), 0, 0) +--~ f:SetPoint(InjectorConfig.anchorpoint, self.backdrop, InjectorConfig.anchorpoint, 0, 0) + f:SetAttribute("showParty", true) + f:SetAttribute("showSolo", InjectorConfig.showSolo) + f:SetAttribute("showPlayer", true) + else + f:SetPoint(arrangeHeaders(group_headers[i-1])) + end + f:SetScale(InjectorDB.scale) + f:Show() + i = i + 1 + end + + --pet module + if InjectorPet then + local pets = InjectorPet:Init() + if InjectorConfig.petFramesSeparation then + self.petanchor = self:CreateAnchor("pet_pos") + pets:SetPoint(InjectorConfig.anchorpoint, self.petanchor, reverse(InjectorConfig.anchorpoint), 0, 0) + else + -- damn pets + pets:SetPoint(arrangeHeaders(group_headers[1], true)) + end + end + + Injector:SetScript("OnUpdate",Injector.OnRangeUpdate) + Injector:Show() + + SLASH_INJECTOR1= "/injector" + SLASH_INJECTOR2= "/inj" + SlashCmdList["INJECTOR"] = Injector.SlashCmd + end +end + +-- Incoming heal functions for HealComm +function Injector.HealUpdated(self, event, casterGUID, spellID, healType, endTime, ...) + for i=1,select('#', ...) do + local targetGUID = select(i, ...) + local unit = guidMap[targetGUID] + if unit then Injector.UpdateIncomingHeals(unit, targetGUID) end + end +end +local HealTextStatus = { name = "IncHealText", priority = 15 } +function Injector.UpdateIncomingHeals(unit, guid) + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + local heal = HealComm:GetHealAmount(guid, HealComm.InjectorHealType, GetTime()+InjectorConfig.incomingHealTimeframe) + self.incoming:SetValue( heal and self.hp:GetValue()+(heal/UnitHealthMax(unit)*100) or 0) + if InjectorConfig.incomingHealDisplayAmount then + if heal then + self.text2.jobs[HealTextStatus.name] = HealTextStatus + else + self.text2.jobs[HealTextStatus.name] = nil + end + Injector.UpdateStatus(self.text2, "text", heal and ("%.1fk"):format( heal / 1e3) ) + end + if InjectorConfig.IncomingHealStatus then + if heal then + Injector.UpdateAura(unit, InjectorConfig.IncomingHealStatus, true) + else + Injector.UpdateAura(unit, InjectorConfig.IncomingHealStatus, false) + end + end + end +end + +--Health Text string updates +function Injector.UpdateHealthText(self, h, hm) + if hm - h > 1000 then + self.text:SetText(("%.1fk"):format( (h-hm) / 1e3)) + else + self.text:SetText(self.name) + end +end + +local DeadStatus = { name = "DEAD", text = "DEAD", priority = 20} +local GhostStatus = { name = "GHOST", text = "GHOST", priority = 22} +local OfflineStatus = { name = "OFFLINE", text = "OFFLINE", priority = 30} +function Injector.UNIT_HEALTH(self, event, unit) + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + local h,hm = UnitHealth(unit), UnitHealthMax(unit) + Injector.UpdateHealthText(self, h, hm) + self.hp:SetValue(h/hm*100) + + if event then -- quickhealth calls this function without event + if UnitIsDeadOrGhost(unit) then + self.hp.bg:Hide() + Injector.UpdateAura(unit, InjectorConfig.AggroStatus, false) + local opts = UnitIsGhost(unit) and GhostStatus or DeadStatus + self.text:SetText(self.name) + self.text2.jobs[opts.name] = opts + else + if not self.hp.bg:IsVisible() then + self.hp.bg:Show() + Injector.ScanAuras(unit) + Injector.UpdateHealthText(self, h, hm) + self.text2.jobs[DeadStatus.name] = nil + self.text2.jobs[GhostStatus.name] = nil + end + end + if not UnitIsConnected(unit) then + self.text2.jobs[OfflineStatus.name] = OfflineStatus + else + self.text2.jobs[OfflineStatus.name] = nil + end + Injector.UpdateStatus(self.text2, "text") + end + + end +end + +function Injector.UNIT_MANA(self, event, unit) + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + if not self.mb:IsVisible() then return end + self.mb:SetValue(UnitPower(unit)/UnitPowerMax(unit)*100) + end +end + +local name, rank, icon, count, debuffType, duration, expirationTime, caster, isStealable +function Injector.ScanAuras(unit) + for auraname,opts in pairs(auras) do + name, rank, icon, count, debuffType, duration, expirationTime, caster = UnitAura(unit, auraname, nil, opts.type) + if name then + if opts.stackcolor then + opts.color = opts.stackcolor[count] + end + if opts.foreigncolor then + opts.isforeign = (caster ~= "player") + end + opts.start = expirationTime - duration + opts.duration = duration + opts.texture = opts.texture or icon + opts.stacks = count + Injector.UpdateAura(unit, opts, true) + else + Injector.UpdateAura(unit, opts, false) + end + end +end +function Injector.ScanDispels(unit) + if dtypes then + if UnitAura(unit, 1, "HARMFUL|RAID") then + for _,opts in pairs(dtypes) do + opts.gotone = false + end + for i = 1, 100 do + name, rank, icon, count, debuffType, duration, expirationTime, caster = UnitAura(unit, i, "HARMFUL|RAID") + if not name then break end + if dtypes[debuffType] then + local opts = dtypes[debuffType] + opts.gotone = true + opts.start = expirationTime - duration + opts.duration = duration + opts.stacks = count + opts.texture = icon + end + end + for _,opts in pairs(dtypes) do + Injector.UpdateAura(unit, opts, opts.gotone) + end + else + for _,opts in pairs(dtypes) do + Injector.UpdateAura(unit, opts, false) + end + end + end +end + +function Injector.UNIT_AURA(self, event, unit) + if not Roster[unit] then return end + Injector.ScanAuras(unit) + Injector.ScanDispels(unit) +end + +--~ local function VehicleHack(self, time) +--~ self.OnUpdateCounter = (self.OnUpdateCounter or 0) + time +--~ if self.OnUpdateCounter < 0.5 then return end +--~ self.OnUpdateCounter = 0 +--~ self.count = (self.count or 0) +1 +--~ +--~ if( self.count >= 6 or not UnitHasVehicleUI(self.unitOwner) ) then +--~ if self.unit ~= self.unitOwner then +--~ Roster[self.unitOwner] = Roster[self.unit] +--~ Injector:Colorize(nil, self.unitOwner) +--~ Roster[self.unit] = nil +--~ self.unit = self.unitOwner +--~ self.unitOwner = nil +--~ Injector:UNIT_HEALTH(nil,self.unit) +--~ self:SetScript("OnUpdate", nil) +--~ end +--~ Injector:UNIT_MANA(nil,self.unit) +--~ elseif( UnitIsConnected(self.unit) or UnitHealthMax(self.unit) > 0 ) then +--~ if self.unit ~= self.unitOwner then +--~ Injector:Colorize(nil, self.unitOwner) +--~ Roster[self.unit] = Roster[self.unitOwner] +--~ Roster[self.unitOwner] = nil +--~ Injector:UNIT_HEALTH(nil,self.unit) +--~ self:SetScript("OnUpdate", nil) +--~ end +--~ end +--~ end + +--~ local function TranslateModifiedUnit(unit) +--~ if unit == "player" then return "pet" end +--~ return gsub("raid1","(%w+)(%d+)","%1pet%2") +--~ end + +function Injector.UNIT_ENTERED_VEHICLE(self, event, unit) + if not Roster[unit] then return end + Injector:Colorize(nil, unit) +--~ for self in pairs(Roster[unit]) do +--~ self.unitOwner = unit +--~ self.unit = SecureButton_GetModifiedUnit(self) +--~ self:SetScript("OnUpdate",VehicleHack) +--~ end +end +function Injector.UNIT_EXITED_VEHICLE(self, event, unit) +--~ local modunit = TranslateModifiedUnit(unit) + if not Roster[unit] then return end + Injector:Colorize(nil, unit) +end +--Range check +Injector.OnRangeUpdate = function (self, time) + self.OnUpdateCounter = (self.OnUpdateCounter or 0) + time + if self.OnUpdateCounter < 0.5 then return end + self.OnUpdateCounter = 0 + + for unit, frames in pairs(Roster) do + for frame in pairs(frames) do +--~ local unit1 = frame.unit + if InjectorUnitInRange(unit) then + frame:SetAlpha(1) + OORUnits[unit] = nil + else + frame:SetAlpha(InjectorConfig.outOfRangeAlpha) + OORUnits[unit] = true + end + end + end +end + +--Aggro +function Injector.UNIT_THREAT_SITUATION_UPDATE(self, event, unit) + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + local sit = UnitThreatSituation(unit) + if sit and sit > 1 then + Injector.UpdateAura(unit, InjectorConfig.AggroStatus, true) + else + Injector.UpdateAura(unit, InjectorConfig.AggroStatus, false) + end + end +end + +-- maintanks, resize +function Injector.UpdateMainTanks( self ) + if InjectorConfig.MainTankStatus then + for unit in pairs(Roster) do + if UnitExists(unit) and (GetPartyAssignment("MAINTANK", unit) or UnitGroupRolesAssigned(unit)) then + Injector.UpdateAura(unit, InjectorConfig.MainTankStatus, true) + else + Injector.UpdateAura(unit, InjectorConfig.MainTankStatus, false) + end + end + end +end +function Injector.RAID_ROSTER_UPDATE(self,event,arg1) + if not InCombatLockdown() then + if InjectorConfig.resize then + if GetNumRaidMembers() > InjectorConfig.resize.after then + for i = 1, InjectorConfig.maxgroups do + group_headers[i]:SetScale(InjectorConfig.resize.to) + end + else + for i = 1, InjectorConfig.maxgroups do + group_headers[i]:SetScale(InjectorDB.scale) + end + end + end + end + self:UpdateMainTanks() +end + +--raid icons +function Injector.RAID_TARGET_UPDATE(self, event) + for unit, frames in pairs(Roster) do + for self in pairs(frames) do + local index = GetRaidTargetIndex(unit) + local icon = self.icons.raidicon + if index then + SetRaidTargetIconTexture(icon.texture, index) + icon:Show() + else + icon:Hide() + end + end + end +end + +function Injector.PLAYER_TARGET_CHANGED(self, event) + local newTargetUnit = guidMap[UnitGUID("target")] + if newTargetUnit and Roster[newTargetUnit] then + Injector.UpdateAura(Injector.previousTarget, InjectorConfig.TargetStatus, false) + Injector.UpdateAura(newTargetUnit, InjectorConfig.TargetStatus, true) + Injector.previousTarget = newTargetUnit + else + Injector.UpdateAura(Injector.previousTarget, InjectorConfig.TargetStatus, false) + end +end + +-- readycheck +function Injector.READY_CHECK(self, event) + for unit in pairs(Roster) do + self:READY_CHECK_CONFIRM(event, unit) + end +end +function Injector.READY_CHECK_CONFIRM(self, event, unit) + local rci = InjectorConfig.ReadyCheck + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + local status = GetReadyCheckStatus(unit) + if not status or not rci.stackcolor[status] then return end + rci.color = rci.stackcolor[status] + Injector.UpdateAura(unit, rci, true) + end +end +function Injector.READY_CHECK_FINISHED(self, event) + for unit in pairs(Roster) do + Injector.UpdateAura(unit, InjectorConfig.ReadyCheck, false) + end +end + +--power type changed +function Injector.UNIT_DISPLAYPOWER(self, event, unit) + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + local x,y,p1,p2 + if UnitPowerType(unit) == 0 then + self.mb:Show() + self.mb.bg:Show() + + self.hp:ClearAllPoints() + self.hp:SetPoint(InjectorConfig.mbst.p1,self,InjectorConfig.mbst.p1, -InjectorConfig.mbst.x, InjectorConfig.mbst.y) + self.hp:SetPoint(InjectorConfig.mbst.p3,self,InjectorConfig.mbst.p3, 0, 0) + self.hp.bg:ClearAllPoints() + self.hp.bg:SetAllPoints(self.hp) + self.text:SetPoint("CENTER",InjectorConfig.mbst.x/2,0) + else + + self.hp:ClearAllPoints() + self.hp:SetPoint("TOPRIGHT",self,"TOPRIGHT",0,0) + self.hp:SetPoint("BOTTOMLEFT",self,"BOTTOMLEFT",0,0) + self.hp.bg:ClearAllPoints() + self.hp.bg:SetAllPoints(self.hp) + self.text:SetPoint("CENTER",0,0) + + self.mb:Hide() + self.mb.bg:Hide() + end + end +end + +--applying UnitButton color +function Injector.Colorize(self, event, unit) + if not Roster[unit] then return end + for self in pairs(Roster[unit]) do + if UnitHasVehicleUI(unit) then + local color = colors["VEHICLE"] or { r = 0, g = 1, b = 0 } + self:SetColor(color.r,color.g,color.b) + else + local _,class = UnitClass(unit) + if class then + local color = colors[class] -- or { r = 1, g = 1, b = 0} + self:SetColor(color.r,color.g,color.b) + end + end + end +end + +--UnitButton initialization +local OnAttributeChanged = function(self, name, unit) + if name ~= "unit" then return end + + for unit, frames in pairs(Roster) do + if frames[self] and self:GetAttribute("unit") ~= unit then + frames[self] = nil + end + end + + if not unit then return end + + local name, realm = UnitName(unit) + self.name = utf8sub(name,1,InjectorConfig.cropNamesLen) + + self.guid = UnitGUID(unit) + self.unit = unit + Roster[unit] = Roster[unit] or {} + Roster[unit][self] = true + + guidMap[UnitGUID(unit)] = unit + for guid, gunit in pairs(guidMap) do + if not Roster[gunit] or guid ~= UnitGUID(gunit) then guidMap[guid] = nil end + end + + Injector:Colorize(nil, unit) + Injector.ScanAuras(unit) + Injector:UNIT_HEALTH("ONATTR", unit) + if not InjectorConfig.disableManaBar then + Injector:UNIT_DISPLAYPOWER(nil, unit) + Injector:UNIT_MANA(nil, unit) + end + + Injector:UNIT_THREAT_SITUATION_UPDATE(nil, unit) + if InjectorConfig.SetupIcons.raidicon then + Injector:RAID_TARGET_UPDATE() + end + Injector:UpdateMainTanks() + if InjectorConfig.useHealComm then Injector.UpdateIncomingHeals(unit, UnitGUID(unit)) end +end + +--building header, frame, anchor +function Injector.CreateHeader(self,group) + local frameName = "NR"..group + local xgap = InjectorConfig.unitGap + local ygap = InjectorConfig.unitGap + local unitgr = reverse(InjectorConfig.unitGrowth) + + local f = CreateFrame("Button",frameName, UIParent, "SecureGroupHeaderTemplate") + + f:SetAttribute("template", "SecureUnitButtonTemplate") + f:SetAttribute("templateType", "Button") + if unitgr == "RIGHT" then + xgap = -xgap + elseif unitgr == "TOP" then + ygap = -ygap + end + f:SetAttribute("point", unitgr) + f:SetAttribute("groupFilter", group) + f:SetAttribute("showRaid", true) + f:SetAttribute("xOffset", xgap) + f:SetAttribute("yOffset", ygap) + f.initialConfigFunction = Injector.CreateFrame + + return f +end +function Injector.CreateFrame(f) + local texture = InjectorConfig.texture + local font = InjectorConfig.font + local fontsize = InjectorConfig.fontsize + local manabar_width = InjectorConfig.manabarwidth + + f:SetAttribute("initial-width", InjectorConfig.width) + f:SetAttribute("initial-height", InjectorConfig.height) + f:SetAttribute("initial-scale", InjectorConfig.scale) + f:SetAttribute("toggleForVehicle", true) + + ClickCastFrames[f] = true + + f:SetAttribute("*type1", "target") + + local backdrop = { + bgFile = "Interface\\Addons\\Injector\\white", tile = true, tileSize = 0, + insets = {left = -2, right = -2, top = -2, bottom = -2}, + } + f:SetBackdrop(backdrop) + f:SetBackdropColor(0, 0, 0, 1) + + local hpi = CreateFrame("StatusBar", nil, f) + hpi:SetAllPoints(f) + hpi:SetOrientation(InjectorConfig.orientation) + hpi:SetStatusBarTexture("Interface\\Tooltips\\UI-Tooltip-Background") + hpi:SetStatusBarColor(0,0,0,0.3) + hpi:SetMinMaxValues(0,100) + hpi:SetValue(0) + f.incoming = hpi + + + local hp = CreateFrame("StatusBar", nil, f) + hp:SetAllPoints(f) + hp:SetOrientation(InjectorConfig.orientation) + hp:SetStatusBarTexture(texture) + + hp:SetStatusBarColor(1,1,1,1) + hp:SetMinMaxValues(0,100) + hp:SetValue(0) + + local hpbg = f:CreateTexture() + hpbg:SetAllPoints(hp) + hpbg:SetTexture(texture) + + hp.bg = hpbg + f.SetColor = function(self,r,g,b) + if not InjectorConfig.invertColor then + self.hp:SetStatusBarColor(0,0,0,0.8) + self.hp.bg:SetVertexColor(r,g,b,1) + self.text:SetTextColor(r,g,b) + else + self.hp:SetStatusBarColor(r,g,b,1) + self.hp.bg:SetVertexColor(r,g,b,0.2) + self.text:SetTextColor(r*0.75,g*0.75,b*0.75) + end + end + + + f.hp = hp + + --==< HEALTH BAR TEXT >==-- + local text = hp:CreateFontString(nil, "OVERLAY", "GameFontNormal") + text:SetPoint("CENTER",0,0) + text:SetJustifyH"CENTER" + text:SetFont(font, fontsize) + text:SetTextColor(1, 1, 1) + f.text = text + + --==< HEALTH BAR TEXT - SECOND LINE >==-- + local text2 = hp:CreateFontString(nil, "OVERLAY", "GameFontNormal") + text2:SetPoint("TOP",text,"BOTTOM",0,0) + text2:SetJustifyH"CENTER" + text2:SetFont(font, fontsize-3) + text2:SetTextColor(0.2, 1, 0.2) + text2.jobs = {} + f.text2 = text2 + + + --- mana bar + if not InjectorConfig.disableManaBar then + + local mb = CreateFrame("StatusBar",nil, f) + + if InjectorConfig.orientation == "VERTICAL" then + InjectorConfig.mbst = { + x = manabar_width, + y = 0, + p1 = "TOPRIGHT", + p2 = "BOTTOMRIGHT", + p3 = "BOTTOMLEFT", + } + else + InjectorConfig.mbst = { + x = 0, + y = manabar_width, + p1 = "BOTTOMLEFT", + p2 = "BOTTOMRIGHT", + p3 = "TOPRIGHT", + } + end + + mb:SetPoint(InjectorConfig.mbst.p1,f,InjectorConfig.mbst.p1,0,0) + mb:SetPoint(InjectorConfig.mbst.p3,f,InjectorConfig.mbst.p2, -InjectorConfig.mbst.x , InjectorConfig.mbst.y) +--~ mb:SetWidth(manabar_width) + mb:SetOrientation(InjectorConfig.orientation) + mb:SetStatusBarTexture(texture) + mb:SetStatusBarColor(0,0,0,0.7) + mb:SetMinMaxValues(0,100) + mb:SetValue(100) +--~ mb:SetFrameLevel(2) + local mbbg = f:CreateTexture() + mbbg:SetAllPoints(mb) + mbbg:SetTexture(texture) + mbbg:SetVertexColor(0.2, 0.45, 0.75) + + hp:ClearAllPoints() + hp:SetPoint("TOPRIGHT",f,"TOPRIGHT",-manabar_width,0) + hp:SetPoint("BOTTOMLEFT",f,"BOTTOMLEFT",0,0) + hp.bg:ClearAllPoints() + hp.bg:SetAllPoints(hp) + + + mb.bg = mbbg + mb.width = manabar_width + f.mb = mb + + + f.mb = mb + end + +--~ f:EnableMouse(true) -- taint + f:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight","ADD") + + if InjectorConfig.mouseoverTooltip and InjectorConfig.mouseoverTooltip ~= "disabled" then + if InjectorConfig.mouseoverTooltip == "always" then UnitAffectingCombat = function() return false end end + f:SetScript("OnEnter", function(self) + if UnitAffectingCombat("player") then return end + UnitFrame_OnEnter(self) + self:SetScript("OnUpdate", UnitFrame_OnUpdate) + end) + f:SetScript("OnLeave", function(self) + UnitFrame_OnLeave(self) + self:SetScript("OnUpdate", nil) + end) + end + + f:SetScript("OnAttributeChanged", OnAttributeChanged) + + f.indicators = {} + for name, opts in pairs(InjectorConfig.SetupIndicators) do + f.indicators[name] = Injector.CreateIndicator(f, name, opts) + f.indicators[name].jobs = {} + end + + f.icons = {} + for name, opts in pairs(InjectorConfig.SetupIcons) do + f.icons[name] = Injector.CreateIcon(f, name, opts) + if name == "raidicon" then f.icons[name].texture:SetTexture[[Interface\TargetingFrame\UI-RaidTargetingIcons]] end + f.icons[name].jobs = {} + end +end +function Injector.CreateAnchor(self, tbl) + local f = CreateFrame("Frame",nil,UIParent) + f:SetHeight(20) + f:SetWidth(20) + f.cols = cols + f.filter = filter + + f:RegisterForDrag("LeftButton") + f:EnableMouse(true) + f:SetMovable(true) + f:SetFrameStrata("HIGH") + f:SetFrameLevel(2) + if InjectorConfig.lockedOnStartUp then + f:Hide() + else + f:Show() + end + + local t = f:CreateTexture(nil,"BACKGROUND") + t:SetTexture("Interface\\Buttons\\UI-RadioButton") + t:SetTexCoord(0,0.25,0,1) + t:SetAllPoints(f) + + t = f:CreateTexture(nil,"BACKGROUND") + t:SetTexture("Interface\\Buttons\\UI-RadioButton") + t:SetTexCoord(0.25,0.49,0,1) + t:SetVertexColor(1, 0, 0) + t:SetAllPoints(f) + + f:SetScript("OnDragStart",function(self) self:StartMoving() end) + f:SetScript("OnDragStop",function(self) + self:StopMovingOrSizing(); + _,_, InjectorDB[tbl].point, InjectorDB[tbl].x, InjectorDB[tbl].y = self:GetPoint(1) + end) + + f.SetPos = function(self,point, x, y ) + InjectorDB[tbl].point = point + InjectorDB[tbl].x = x + InjectorDB[tbl].y = y + self:ClearAllPoints() + self:SetPoint(point, UIParent, point, x, y) + end + + f:SetPos(InjectorDB[tbl].point, InjectorDB[tbl].x, InjectorDB[tbl].y) + + return f +end + +function Injector.CreateIcon(f,name,opts) + local icon = CreateFrame("Frame", f:GetName()..name, f) + icon:SetPoint(opts.point, f, opts.point, opts.xOffset or 0, opts.yOffset or 0 ) + icon:SetWidth(opts.size) + icon:SetHeight(opts.size) + icon:SetAlpha(opts.alpha or 1) + icon:SetFrameLevel(10) + local texture = f:CreateTexture(f:GetName()..name,"ARTWORK")--CreateFrame("Frame", nil,f) + texture:SetAllPoints(icon) + texture:SetParent(icon) + texture:SetTexCoord(.07, .93, .07, .93) + + local cd = CreateFrame("Cooldown",nil,icon) + if not opts.omnicc then + cd.noCooldownCount = true -- for OmniCC + end + cd:SetReverse(true) + cd:SetAllPoints(icon) + + icon.texture = texture + icon.cd = cd + + if opts.stacktext then + local stacktext = icon:CreateFontString(nil, "OVERLAY") + if type(opts.stacktext) ~= "table" then opts.stacktext = {} end + local sfont = opts.stacktext.font or InjectorConfig.font + local ssize = opts.stacktext.size or InjectorConfig.fontsize - 2 + local sflags = opts.stacktext.flags or "OUTLINE" + stacktext:SetFont(sfont, ssize, sflags) + stacktext:SetWidth(icon:GetWidth()) + stacktext:SetJustifyH("RIGHT") + local color = opts.stacktext.color or {1,1,1} + stacktext:SetTextColor(unpack(color)) + stacktext:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT",0,0) + stacktext:SetPoint("BOTTOMLEFT", icon, "BOTTOMLEFT",0,0) + icon.stacktext = stacktext + end + + icon:Hide() + + return icon +end +--tonumber(string.sub(UnitGUID("target"),9,12),16) +function Injector.CreateIndicator(f, name, opts) + local ind = CreateFrame("Frame", f:GetName()..name, f) + if not opts.nobackdrop then + ind:SetBackdrop{ + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, + insets = {left = -2, right = -2, top = -2, bottom = -2}, + } + ind:SetBackdropColor(0, 0, 0, 1) + end + ind:SetPoint(opts.point, f, opts.point, opts.xOffset or 0, opts.yOffset or 0 ) + if opts.size then + ind:SetWidth(opts.size) + ind:SetHeight(opts.size) + else + ind:SetWidth(opts.width) + ind:SetHeight(opts.height) + end + ind:SetFrameLevel(10) + + local it = ind:CreateTexture(nil,"ARTWORK") + it:SetAllPoints(ind) + it:SetTexture("Interface\\Addons\\Injector\\white") + ind.color = it + + local cd = CreateFrame("Cooldown",nil,ind) + if not opts.omnicc then + cd.noCooldownCount = true -- for OmniCC + end + cd:SetReverse(true) + cd:SetAllPoints(ind) + ind.cd = cd + + ind.Pulse = function(frame) + UIFrameScale(frame,{ + mode = "IN", + timeToScale = 0.2, + finishedFunc = function(frame) frame.shining = false; UIFrameScaleOut(frame, 0.8, 2, 1); end, + finishedArg1 = frame, + startScale = 1, + endScale = 2, + }) + frame.shining = true + end + +--~ if opts.stacktext then +--~ local stacktext = icon:CreateFontString(nil, "OVERLAY") +--~ stacktext:SetFont(InjectorConfig.font, opts.size) +--~ stacktext:SetAllPoints(ind) +--~ stacktext:SetJustifyH("CENTER") +--~ ind.stacktext = stacktext +--~ end + + ind:Hide() + + return ind +end + +function Injector.UpdateAura(unit, opts, status) + if not Roster[unit] then return end + for frame in pairs(Roster[unit]) do + if opts.indicator then + for _, iname in ipairs(opts.indicator) do + local self = frame.indicators[iname] + if self then + if opts.isMissing then status = not status end + if status then + local n = opts.name + if opts.fade then n = n.."Fade" end + self.jobs[n] = opts + else + self.jobs[opts.name] = nil + end + Injector.UpdateStatus(self, "indicator") + end + end + end + if opts.icon then + local self = frame.icons[opts.icon] + if self then + self.jobs[opts.name] = status and opts or nil + Injector.UpdateStatus(self, "icon") + end + end +--~ if opts.textind then +--~ local self = frame.text2 +--~ if self then +--~ self.jobs[opts.name] = status and opts or nil +--~ Injector.UpdateStatus(self, "textind") +--~ end +--~ end + end +end + +function Injector.UpdateStatus(self, statustype, arg1) + if next(self.jobs) then -- if not empty + local max + --if self.currentJob and self.jobs[self.currentJob] then max = self.currentJob end + local max_priority = 0--max and self.jobs[max].priority + for name, opts in pairs(self.jobs) do + if not opts.priority then opts.priority = 80 end + if max_priority < opts.priority then + max_priority = opts.priority + max = name + end + end + local job = self.jobs[max] + if statustype == "indicator" then + local color + if job.foreigncolor and job.isforeign then + color = job.foreigncolor + else + color = job.color or { 1,1,1,1 } + end + self.color:SetVertexColor(color[1],color[2],color[3],color[4] or 1) + self:SetBackdropColor(0,0,0,color[4] or 1) + if job.pulse and self.currentPriority and job.priority > self.currentPriority then + self:Pulse() + end + self.currentPriority = job.priority + end + if statustype == "icon" then + local texture = job.texture + self.texture:SetTexture(texture) + if self.stacktext and job.stacks then self.stacktext:SetText(job.stacks > 1 and job.stacks or "") end + end + if statustype == "text" then + local text = arg1 or job.text + if text then + self:SetText(text) + self:Show() + end + return + end + + self:Show() + if job.fade and not self.fading then + self:SetAlpha(1); + self.fading = true + + UIFrameFade(self, { + mode = "OUT", + timeToFade = job.fade, + finishedFunc = function(self, name) + --print("hiding") + self:Hide(); + self:SetAlpha(1); + self.jobs[name] = nil; + self.fading = false; + Injector.UpdateStatus(self, "indicator"); + end, + finishedArg1 = self, + finishedArg2 = max, + }); + end + + if job.showDuration and job.start then + self.cd:SetCooldown(job.start, job.duration) + self.cd:Show() + else + self.cd:Hide() + end + else + self.currentPriority = 0 + self:Hide() + end +end + +local ParseOpts = function(str) + local fields = {} + for opt,args in string.gmatch(str,"(%w*)%s*=%s*([%w%,%-%_%.%:%\\%']+)") do + fields[opt:lower()] = tonumber(args) or args + end + return fields +end +function Injector.SlashCmd(msg) + k,v = string.match(msg, "([%w%+%-%=]+) ?(.*)") + if not k or k == "help" then print([[Usage: + |cff00ff00/injector lock|r + |cff00ff00/injector unlock|r + |cff00ff00/injector reset|r + |cff00ff00/injector scale <0-2+>|r + |cff00ff00/injector setpos |r + |cff00ff00/injector load + |cff00ff00/injector charspec|r + |cff00ff00/injector toggle | show | hide + |cff00ff00/injector togglegroup <1-8>]] + )end + if k == "unlock" then + Injector.anchor:Show() + if InjectorPet and Injector.petanchor then Injector.petanchor:Show() end + end + if k == "lock" then + Injector.anchor:Hide() + if InjectorPet and Injector.petanchor then Injector.petanchor:Hide() end + end + if k == "reset" then + Injector.anchor:SetPos("CENTER", 0, 0) + if InjectorPet then + Injector.petanchor:ClearAllPoints() + Injector.petanchor:SetPoint("CENTER",UIParent,"CENTER",0,0) + end + end + if k == "scale" then + local s = tonumber(v) + if not s then + print(InjectorString.."Current scale = "..InjectorDB.scale) + return + end + InjectorDB.scale = s + for i = 1, InjectorConfig.maxgroups do + group_headers[i]:SetScale(s) + end + end + if k == "togglegroup" then + local group = tonumber(v) + if group then + local hdr = group_headers[group] + if hdr:IsVisible() then + hdr:Hide() + else + hdr:Show() + end + end + end + if k == "toggle" then + if group_headers[1]:IsVisible() then k = "hide" else k = "show" end + end + if k == "show" then + for i=1,InjectorConfig.maxgroups do + group_headers[i]:Show() + end + end + if k == "hide" then + for i=1,InjectorConfig.maxgroups do + group_headers[i]:Hide() + end + end + if k == "load" then + local add = InjectorConfig.LoadableDebuffs[v] + if v == "" then + print("Spell sets:") + for k,v in pairs(InjectorConfig.LoadableDebuffs) do + print(k) + end return + end + if add then + if loaded[v] then return end + add() + print(InjectorString..v.." loaded.") + loaded[v] = true + else + print(InjectorString..v.." doesn't exist") + end + end + if k == "setpos" then + local fields = ParseOpts(v) + if not next(fields) then print("Usage: /inj setpos point=center x=0 y=0") return end + Injector.anchor:SetPos(string.upper(fields['point'] or "CENTER"), fields['x'] or 0, fields['y'] or 0) + end + if k == "charspec" then + local user = UnitName("player").."@"..GetRealmName() + if InjectorDB_Global.charspec[user] then InjectorDB_Global.charspec[user] = nil + else InjectorDB_Global.charspec[user] = true + end + print (InjectorString..(InjectorDB_Global.charspec[user] and "Enabled" or "Disabled").." character specific options for this toon. Will take effect after ui reload",0.7,1,0.7) + end +end + +if InjectorConfig.enableTraceHeals then + +--~ local TraceHealEvents = {} +--~ for name, opts in pairs(traceheals) do +--~ TraceHealEvents[opts.type] = true +--~ end + +function Injector.COMBAT_LOG_EVENT_UNFILTERED( self, event, timestamp, eventType, srcGUID, srcName, srcFlags, dstGUID, dstName, dstFlags, spellID, spellName, spellSchool, amount, overhealing, absorbed, critical) + if (bit_band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE) then + local opts = traceheals[spellName] + if opts and eventType == opts.type then + if guidMap[dstGUID] then + Injector.UpdateAura(guidMap[dstGUID],opts,true) + end + end + end +end + +end + +--raid/pvp debuffs loading +local loader = CreateFrame("Frame") +loader:RegisterEvent("ZONE_CHANGED_NEW_AREA") +loader:RegisterEvent("PLAYER_ENTERING_WORLD") +local mapIDs = { + [609] = "Ruby Sanctum", + [605] = "Icecrown Citadel", + [544] = "Trial of the Crusader", + [530] = "Ulduar", + [536] = "Naxxramas", +} +loader:SetScript("OnEvent",function (self,event) + local instance + local _, instanceType = GetInstanceInfo() + if instanceType == "arena" or instanceType == "pvp" then + instance = "PvP" + else + instance = mapIDs[GetCurrentMapAreaID()] + end + if not instance then return end + local add = InjectorConfig.LoadableDebuffs[instance] + if add and not loaded[instance] then + add() + print (InjectorString..instance.." debuffs loaded.") + loaded[instance] = true + end +end) + + +if InjectorConfig.useCombatLogFiltering then + +local timer = CreateFrame("Frame") +timer.OnUpdateCounter = 0 +timer:SetScript("OnUpdate",function(self, time) + self.OnUpdateCounter = self.OnUpdateCounter + time + if self.OnUpdateCounter < 1 then return end + self.OnUpdateCounter = 0 + + for unit in pairs(buffer) do + Injector.ScanAuras(unit) + buffer[unit] = nil + end +end) + +function Injector.UNIT_AURA(self, event, unit) + if not Roster[unit] then return end + Injector.ScanDispels(unit) + if OORUnits[unit] and inCL[unit] +5 < GetTime() then + buffer[unit] = true + end +end + +local auraUpdateEvents = { + ["SPELL_AURA_REFRESH"] = true, + ["SPELL_AURA_APPLIED"] = true, + ["SPELL_AURA_APPLIED_DOSE"] = true, + ["SPELL_AURA_REMOVED"] = true, + ["SPELL_AURA_REMOVED_DOSE"] = true, +} +local cleuEvent = CreateFrame("Frame") +cleuEvent:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") +cleuEvent:SetScript("OnEvent", +function( self, event, timestamp, eventType, srcGUID, srcName, srcFlags, dstGUID, dstName, dstFlags, spellID, spellName, spellSchool, auraType, amount) + if auras[spellName] then + if auraUpdateEvents[eventType] then + local unit = guidMap[dstGUID] + if unit then + buffer[unit] = nil + inCL[unit] = GetTime() + Injector.ScanAuras(unit) + end + end + end +end) + +end \ No newline at end of file diff --git a/Injector.toc b/Injector.toc new file mode 100644 index 0000000..ebc4200 --- /dev/null +++ b/Injector.toc @@ -0,0 +1,12 @@ +## Interface: 30300 +## Title: Injector +## Notes: raid frames +## Author: d87 +## SavedVariablesPerCharacter: InjectorDB_Char +## SavedVariables: InjectorDB_Global +libs.xml +helpers.lua +config.lua +loadables.lua +InjectorPet.lua +Injector.lua \ No newline at end of file diff --git a/InjectorPet.lua b/InjectorPet.lua new file mode 100644 index 0000000..cfab31e --- /dev/null +++ b/InjectorPet.lua @@ -0,0 +1,171 @@ +if InjectorConfig.petFrames then + +local _, helpers = ... +local reverse = helpers.Reverse + +InjectorPet = CreateFrame("Frame",nil,UIParent) +InjectorPet.Roster = {} + +function InjectorPet.OnEvent(self, event, unit) -- only UNIT_HEALTH (=MAXHEALTH) + if not InjectorPet.Roster[unit] then return end + for self in pairs(InjectorPet.Roster[unit]) do + local h,hm = UnitHealth(unit), UnitHealthMax(unit) + Injector.UpdateHealthText(self, h, hm) + self.hp:SetValue(h/hm*100) + +--~ if UnitIsDeadOrGhost(unit) then +--~ self.hp.bg:Hide() +--~ self.text:SetText(self.name) +--~ else +--~ if not self.hp.bg:IsVisible() then +--~ self.hp.bg:Show() +--~ Injector.UpdateHealthText(self, h, hm) +--~ end +--~ end + end +end + +local PetOnAttributeChanged = function(self, name, unit) +--~ print("pet attr changed: "..(name or "nil")..' '..(unit or "nil")) + if name ~= "unit" then return end + + for unit, frames in pairs(InjectorPet.Roster) do + if frames[self] and self:GetAttribute("unit") ~= unit then + frames[self] = nil + end + end + + if not unit then return end + + local name, realm = UnitName(unit) + self.name = helpers.utf8sub(name,1,InjectorConfig.cropNamesLen) +--~ self.text:SetText(self.name) + local ownerunit = string.gsub(unit,"pet","") + if ownerunit == "" then ownerunit = "player" end + local _, class = UnitClass(ownerunit) -- owner class + + if class then + local color = RAID_CLASS_COLORS[class] -- or { r = 1, g = 1, b = 0} + self.hp.bg:SetVertexColor(color.r,color.g,color.b) + self.text:SetTextColor(color.r,color.g,color.b) + end + + self.guid = UnitGUID(unit) + self.unit = unit + InjectorPet.Roster[unit] = InjectorPet.Roster[unit] or {} + InjectorPet.Roster[unit][self] = true + +--~ for guid, unit in pairs(guid_roster) do +--~ if guid ~= UnitGUID(unit) then +--~ guid_roster[guid] = nil +--~ end +--~ end +--~ guid_roster[UnitGUID(unit)] = unit +--~ InjectorPet:UNIT_MAXHEALTH(nil, unit) + InjectorPet:OnEvent(nil, unit) +end + +function InjectorPet.ConfigFunc(f) + local texture = InjectorConfig.texture + local font = InjectorConfig.font + local fontsize = InjectorConfig.fontsize + + + f:SetAttribute("initial-width", InjectorConfig.width) + f:SetAttribute("initial-height", InjectorConfig.height) + f:SetAttribute("initial-scale", InjectorConfig.petScale or InjectorConfig.scale*0.7 ) + + ClickCastFrames[f] = true + + f:SetAttribute("*type1", "target") + + local backdrop = { +--~ bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 0, + bgFile = "Interface\\Addons\\Injector\\white", tile = true, tileSize = 0, +--~ edgeFile = "Interface\\Addons\\Injector\\white", edgeSize = 2, + insets = {left = -2, right = -2, top = -2, bottom = -2}, + } + f:SetBackdrop(backdrop) + f:SetBackdropColor(0, 0, 0, 1) + + local hp = CreateFrame("StatusBar", nil, f) + hp:SetAllPoints(f) + hp:SetOrientation(InjectorConfig.orientation) + hp:SetStatusBarTexture(texture) + hp:SetStatusBarColor(0,0,0,0.8) + hp:SetMinMaxValues(0,100) + hp:SetValue(0) + + local hpbg = f:CreateTexture() + hpbg:SetAllPoints(hp) + hpbg:SetTexture(texture) + + + hp.bg = hpbg + f.hp = hp + + --==< HEALTH BAR TEXT >==-- + local text = hp:CreateFontString(nil, "OVERLAY", "GameFontNormal") + text:SetPoint("CENTER",0,0) + text:SetJustifyH"CENTER" + text:SetFont(font, fontsize) + text:SetTextColor(1, 1, 1) + f.text = text + +--~ f:EnableMouse(true) + f:SetHighlightTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight","ADD") + + f:SetScript("OnEnter", function(self) + if UnitAffectingCombat("player") then return end + UnitFrame_OnEnter(self) + self:SetScript("OnUpdate", UnitFrame_OnUpdate) + end) + f:SetScript("OnLeave", function(self) + UnitFrame_OnLeave(self) + self:SetScript("OnUpdate", nil) + end) + f:SetScript("OnAttributeChanged", PetOnAttributeChanged) +end + +function InjectorPet.Init(self) + local xgap = InjectorConfig.unitGap + local ygap = InjectorConfig.unitGap + local unitgr = InjectorConfig.petFramesSeparation and reverse(InjectorConfig.unitGrowth) or InjectorConfig.unitGrowth + + local f = CreateFrame("Button","InjectorPet", UIParent, "SecureGroupPetHeaderTemplate") + + f:SetAttribute("showParty", true) + f:SetAttribute("showSolo", true) + f:SetAttribute("showPlayer", true) + + f:SetAttribute("template", "SecureUnitButtonTemplate") + f:SetAttribute("templateType", "Button") + + if unitgr == "RIGHT" then + xgap = -xgap + elseif unitgr == "TOP" then + ygap = -ygap + end + f:SetAttribute("point", unitgr) +--~ f:SetAttribute("groupFilter", group) + f:SetAttribute("showRaid", true) + f:SetAttribute("xOffset", xgap) + f:SetAttribute("yOffset", ygap) + + f:SetAttribute("unitsPerColumn",5) + f.initialConfigFunction = InjectorPet.ConfigFunc +--~ f:SetPoint("BOTTOMRIGHT",UIParent,"BOTTOMRIGHT",0,0) + + + InjectorPet:RegisterEvent("UNIT_HEALTH") + InjectorPet:RegisterEvent("UNIT_MAXHEALTH") + InjectorPet:SetScript("OnEvent",InjectorPet.OnEvent) + + InjectorPet.header = f + + f:Show() + + return f +end + +end \ No newline at end of file diff --git a/config.lua b/config.lua new file mode 100644 index 0000000..bc69364 --- /dev/null +++ b/config.lua @@ -0,0 +1,237 @@ +local _, helpers = ... +local _, playerClass = UnitClass("player") +local isHealer = (playerClass == "PRIEST" or playerClass == "PALADIN" or playerClass == "SHAMAN" or playerClass == "DRUID") +local A = helpers.AddAura +local DT = helpers.AddDispellType +local Trace = helpers.AddTrace +InjectorConfig = {} + +-- size +InjectorConfig.width = 50 +InjectorConfig.height = 50 +InjectorConfig.scale = 1 + +-- frame config +InjectorConfig.texture = [[Interface\AddOns\Injector\gradient]] +InjectorConfig.font = [[Interface\AddOns\Injector\ClearFont.ttf]] +InjectorConfig.fontsize = 12 + +InjectorConfig.cropNamesLen = 7 -- maximum amount of characters in unit name +InjectorConfig.manabarwidth = 6 +InjectorConfig.orientation = "VERTICAL" -- HORIZONTAL / VERTICAL +InjectorConfig.outOfRangeAlpha = 0.4 +InjectorConfig.disableManaBar = false +InjectorConfig.invertColor = false -- if true hp lost becomes dark, current hp becomes bright +InjectorConfig.incomingHealTimeframe = 1.5 -- incoming in next 1.5 seconds heals are displayed, including hot ticks +InjectorConfig.incomingHealDisplayAmount = true -- on second line +InjectorConfig.incomingHealIgnoreHots = true +InjectorConfig.raidIcons = true +InjectorConfig.enableTraceHeals = true +InjectorConfig.mouseoverTooltip = "outofcombat" -- always / outofcombat / disabled + +-- layout +InjectorConfig.maxgroups = 8 +InjectorConfig.showSolo = true +InjectorConfig.unitGap = 10 -- gap between units +InjectorConfig.groupGap = 10 +InjectorConfig.unitGrowth = "RIGHT" -- direction for adding new players in group. LEFT / RIGHT / TOP / BOTTOM +InjectorConfig.groupGrowth = "TOP" -- new groups direction. LEFT / RIGHT / TOP / BOTTOM +InjectorConfig.resize = { after = 27, to = 0.8 } -- = if number of players in raid exeeds 27 then resize to 0.8. "InjectorConfig.resize = nil" disables it +InjectorConfig.anchorpoint = "BOTTOMLEFT" -- anchor position relative to 1st unit of 1st group. if you want to grow frames to TOP and RIGHT it better be BOTTOMLEFT. +InjectorConfig.lockedOnStartUp = true +InjectorConfig.disableBlizzardParty = true + +-- pets +-- petframes suck in this addon, i know. It's more like outdated plugin. +InjectorConfig.petFrames = false +InjectorConfig.petScale = 1 +InjectorConfig.petFramesSeparation = false + + +-- bells and whistles +InjectorConfig.useCombatLogFiltering = true +-- useCombatLogFiltering provides a huge perfomance boost over default behavior, which would be to listen only to UNIT_AURA event. +-- UNIT_AURA doesn't tell what exactly changed and every time addon had to scan current buffs/debuffs, +-- in raid combat unit_aura sometimes fired up to 8 times per second for each member with all the stacking trinkets and procs. +-- useCombatLogFiltering option moves this process mainly to combat log, where we can see what spell was updated. +-- Only if it's one of OUR spells from indicators it will update buff data for this unit. +-- The drawback is that it only works in combat log range, but it's big enough, and there's a fallback on throttled unit_aura (updates every 5s) for out of range units. +-- On lich king there was an issue, and maybe it's still present, that necrotic plague removal event didn't appear in combat log +-- and that caused glitches with boss debuff indicator. But that's a rare blizzard side bug. +-- Dispel idicators still work from unit_aura, so you'll see plague regardless as disease if you can dispel it. Necrotic plague removed from default loadables.lua setup. + +-- libs +InjectorConfig.useHealComm = true -- incoming heal library +InjectorConfig.useQuickHealth = isHealer -- combat log event faster than UNIT_HEALTH event. And that's what this lib does, allows you to see health updates sooner. + +InjectorConfig.SetupIndicators = { + ["topleft"] = { point = "TOPLEFT", size = 5, }, + ["topleft2"] = { point = "TOPLEFT", size = 5, xOffset = 7}, + ["topleft3"] = { point = "TOPLEFT", size = 5, yOffset = -7}, + ["topright"] = { point = "TOPRIGHT", size = 7 }, + ["bottomright"] = { point = "BOTTOMRIGHT", size = 8, }, + ["bottomleft"] = { point = "BOTTOMLEFT", size = 4, }, + ["bottom"] = { point = "BOTTOM", size = 7, }, + ["top"] = { point = "TOP", size = 10, }, + ["left"] = { point = "LEFT", size = 10, }, + + ["border_right"] = { point = "RIGHT", width = 2, height = InjectorConfig.height+8, xOffset = 4 , nobackdrop = true}, + ["border_left"] = { point = "LEFT", width = 2, height = InjectorConfig.height+8, xOffset = -4 , nobackdrop = true}, + ["border_top"] = { point = "TOP", width = InjectorConfig.width+4, height = 2, yOffset = 4 , nobackdrop = true}, + ["border_bottom"] = { point = "BOTTOM", width = InjectorConfig.width+4, height = 2, yOffset = -4 , nobackdrop = true }, +} +-- so border actually is built from 4 indicators, you can use them separately +local BORDER = { "border_left", "border_right", "border_top", "border_bottom" } -- shortcut, e.g. indicator = BORDER + +InjectorConfig.SetupIcons = { + ["raidicon"] = { point = "BOTTOMLEFT", size = 24, xOffset = -9, yOffset = -9, alpha = 0.6 }, --special icon for raid targets + ["center"] = { point = "CENTER", size = 24, alpha = 0.6, omnicc = false, stacktext = true }, +} +--customizing stack label: stacktext = { font = [[Interface\AddOns\Injector\ClearFont.ttf]], size = 10, flags = "OUTLINE", color = {1,0,0} }, + +--InjectorConfig.TargetStatus = { name = "Target", type = "HELPFUL", indicator = BORDER, color = {1,0.7,0.7}, priority = 65 } +InjectorConfig.IncomingHealStatus = nil --{ name = "IncomingHeal", type = "HELPFUL", indicator = { "bottomleft" }, color = { 0, 1, 0}, priority = 60 } +InjectorConfig.AggroStatus = { name = "Aggro", type = "HARMFUL", indicator = { "bottomleft" }, color = { 0.7, 0, 0} } -- InjectorConfig.AggroStatus = nil will disable aggro monitoring at all +InjectorConfig.ReadyCheck = { name = "Readycheck", type = "HELPFUL", priority = 90, indicator = { "top" }, stackcolor = { + ['ready'] = { 0, 1, 0}, + ['notready'] = { 1, 0, 0}, + ['waiting'] = { 1, 1, 0}, + }} +InjectorConfig.MainTankStatus = { name = "MainTank", type = "HELPFUL", priority = 60, indicator = BORDER, color = {0.6,0.6,0.6} } + + +InjectorConfig.Colors = { + --["PRIEST"] = { r = 1, g = 1, b = 1 }, + ["VEHICLE"] = { r = 1, g = 0.5, b = 0.5 }, +} + +--[[ +Spell parameters +================ + id - spell id to query localized spell name. + name - spell name + type - HELPFUL/HARMFUL for buffs/debuffs + priority - if multiple spells assigned to same indicator, the one with highest priority will be displayed. Default is 80. + showDuration - enables cooldownlike duration circle + isMine - only your spells +]] + +if playerClass == "PRIEST" then + -- long buffs + A{ id = 1243, type = "HELPFUL", indicator = { "topleft" }, pulse = true, color = { 1, 1, 1} } --Power Word: Fortitude + A{ id = 21562, type = "HELPFUL", indicator = { "topleft" }, color = { 0.8, 1, 0.8} } --Prayer of Fortitude + A{ id = 14752, type = "HELPFUL", indicator = { "topleft2" }, color = { .6 , .6, 1} } --Divine Spirit + A{ id = 27681, type = "HELPFUL", indicator = { "topleft2" }, color = { .6 , .6, 1} } --Prayer of Spirit + A{ id = 976, type = "HELPFUL", indicator = { "topleft3" }, color = { 102/255 , 0, 187/255 } } --Shadow Protection + A{ id = 27683, type = "HELPFUL", indicator = { "topleft3" }, color = { 102/255 , 0, 187/255 } } --Prayer of Shadow Protection + + --A{ id = 1706, type = "HELPFUL", indicator = { "topright" }, color = { 1, 1, 1}, priority = 60, showDuration = true } --Levitate + --A{ id = 552, type = "HELPFUL", indicator = { "topleft3" }, priority = 82, color = { 0, 1, 0 } } --Abolish Disease + + A{ id = 139, type = "HELPFUL", indicator = { "bottomright" }, pulse = true, color = { 0, 1, 0}, showDuration = true, isMine = true } --Renew + A{ id = 17, type = "HELPFUL", indicator = { "top" }, color = { 1, 1, 0}, showDuration = true } --Power Word: Shield + A{ id = 6788, type = "HARMFUL", indicator = { "top" }, color = { 0.6, 0, 0}, showDuration = true, priority = 40 } --Weakened Soul + A{ id = 33076, type = "HELPFUL", indicator = { "topright" }, stackcolor = { + [1] = { 0.4, 0, 0}, + [2] = { 0.7, 0, 0}, + [3] = { 1, 0, 0}, + [4] = { 1, 0.3, 0.3}, + [5] = { 1, 0.6, 0.6}, + [6] = { 1, 0.9, 0.9}, -- Tier7 set bonus + }} --Prayer of Mending + + Trace{id = 34861, type = "HEAL", indicator = { "topright" }, color = { 1, 1, 0}, fade = 0.7, priority = 96 } -- Circle of Healing + Trace{id = 33076, type = "HEAL", indicator = { "topright" }, color = { 1, 0.6, 0.6}, fade = 1.5, priority = 97 } -- PoM Trace + + --InjectorConfig.UnitInRangeFunc = function(unit) return (IsSpellInRange(GetSpellInfo(2061),unit) == 1) end + --// Use Flash Heal for range check. Usual UnitInRange is about 38yd, not 41, tho it's probably good to have that margin. Disabled by default. + + DT("Magic", { indicator = { "bottom" }, color = { 0.2, 0.6, 1}, priority = 81 }) + DT("Disease", { indicator = { "bottom" }, color = { 0.6, 0.4, 0} }) +end + +if playerClass == "WARLOCK" then + A{ id = 20707, type = "HELPFUL", indicator = { "topleft" }, color = { 180/255, 0, 1 }, priority = 81 } --Soulstone Resurrection +--~ A{ id = 6307, type = "HELPFUL", indicator = { "topleft" }, color = { 1, 0, 0 }, priority = 81 } --Blood Pact +--~ A{ id = 54424, type = "HELPFUL", indicator = { "topleft" }, color = { .6 , .6, 1 } } --Fel Intelligence +end +if playerClass == "PALADIN" then + --A{ id = 20217, type = "HELPFUL", indicator = { "topleft" }, color = { .6 , .3, 1} } --Blessing of Kings + --A{ id = 25898, type = "HELPFUL", indicator = { "topleft" }, color = { .6 , .3, 1} } --Greater Blessing of Kings + + --A{ id = 19740, type = "HELPFUL", indicator = { "topleft2" }, color = { 1 , 0.5, 0.3} } --Blessing of Might + --A{ id = 25782, type = "HELPFUL", indicator = { "topleft2" }, color = { 1 , 0.5, 0.3} } --Greater Blessing of Might + + --A{ id = 19742, type = "HELPFUL", indicator = { "topleft3" }, color = { 0.4, 1, 0.4} } --Blessing of Wisdom + --A{ id = 25894, type = "HELPFUL", indicator = { "topleft3" }, color = { 0.4, 1, 0.4} } --Greater Blessing of Wisdom + A{ id = 53563, type = "HELPFUL", indicator = { "top" }, showDuration = true, + isMine = true, + color = { 0,1,0 }, + --foreigncolor = { 0.96/2, 0.55/2, 0.73/2 }, + } + + Trace{id = 54968, type = "HEAL", indicator = { "topright" }, color = { 1, 1, 0}, fade = 0.7, priority = 96 } -- Glyph of Holy Light + + --InjectorConfig.UnitInRangeFunc = function(unit) return (IsSpellInRange(GetSpellInfo(635),unit) == 1) end + --// Use Holy Light for range check. Usual UnitInRange is about 38yd, not 41, tho it's probably good to have that margin. Disabled by default. + + DT("Magic", { indicator = { "bottom" }, color = { 0.2, 0.6, 1} }) + DT("Disease", { indicator = { "bottom" }, color = { 0.6, 0.4, 0} }) + DT("Poison", { indicator = { "bottom" }, color = { 0, 0.6, 0} }) +end +if playerClass == "SHAMAN" then + A{ id = 61295, type = "HELPFUL", indicator = { "bottomright" }, showDuration = true, isMine = true, color = { 0.2 , 0.2, 1} } --Riptide + A{ id = 974, type = "HELPFUL", indicator = { "top" }, showDuration = true, + --isMine = true, + stackcolor = { + [1] = { 0,.4, 0}, + [2] = { 0,.5, 0}, + [3] = { 0,.6, 0}, + [4] = { 0,.7, 0}, + [5] = { 0,.8, 0}, + [6] = { 0, 0.9, 0}, + [7] = {.1, 1, .1}, + [8] = {.2, 1, .2}, + }, + foreigncolor = {0,0,.5}, } --Earth Shield + + Trace{id = 1064, type = "HEAL", indicator = { "topright" }, color = { 1, 1, 0}, fade = 0.7, priority = 96 } -- Chain Heal + --Trace{id = 51558, type = "HEAL", indicator = { "topright" }, color = { 1, 0.6, 0.6 }, fade = 0.7, priority = 95 } -- Ancestral Awakening + + --InjectorConfig.UnitInRangeFunc = function(unit) return (IsSpellInRange(GetSpellInfo(331),unit) == 1) end + --// Use Healing Wave for range check. Usual UnitInRange is about 38yd, not 41, tho it's probably good to have that margin. Disabled by default. + + DT("Disease", { indicator = { "bottom" }, color = { 0.6, 0.4, 0} }) + DT("Poison", { indicator = { "bottom" }, color = { 0, 0.6, 0} }) + DT("Curse", { indicator = { "bottom" }, color = { 0.6, 0, 1} }) +end +if playerClass == "DRUID" then + A{ id = 1126, type = "HELPFUL", indicator = { "topleft" }, color = { 235/255 , 145/255, 199/255} } --Mark of the Wild + A{ id = 21849, type = "HELPFUL", indicator = { "topleft" }, color = { 235/255 , 145/255, 199/255} } --Gift of the Wild + A{ id = 467, type = "HELPFUL", indicator = { "topleft3" }, color = { 150/255, 100/255, 0 } } --Thorns + + A{ id = 774, type = "HELPFUL", indicator = { "bottomright" }, pulse = true, color = { 1, 0.2, 1}, showDuration = true, isMine = true } --Rejuvenation + A{ id = 8936, type = "HELPFUL", indicator = { "topright" }, priority = 82, color = { 198/255, 233/255, 80/255}, showDuration = true, isMine = true } --Regrowth + A{ id = 33763, type = "HELPFUL", indicator = { "top" }, showDuration = true, isMine = true, stackcolor = { + [1] = { 0, 0.8, 0}, + [2] = { 0.2, 1, 0.2}, + [3] = { 0.5, 1, 0.5}, + }} --Lifebloom + A{ id = 48438, type = "HELPFUL", indicator = { "topright" }, color = { 0.4, 1, 0.4}, showDuration = true, isMine = true } --Wild Growth + --A{ id = 2893, type = "HELPFUL", indicator = { "topleft3" }, priority = 82, color = { 0, 1, 0 } } --Abolish Poison + + --InjectorConfig.UnitInRangeFunc = function(unit) return (IsSpellInRange(GetSpellInfo(774),unit) == 1) end + --// Use Rejuvenation for range check. Usual UnitInRange is about 38yd, not 41, tho it's probably good to have that margin. Disabled by default. + + DT("Poison", { indicator = { "bottom" }, color = { 0, 0.6, 0} }) + DT("Curse", { indicator = { "bottom" }, color = { 0.6, 0, 1} }) +end +if playerClass == "MAGE" then + A{ id = 1459, type = "HELPFUL", indicator = { "topleft" }, color = { .4 , .4, 1} } --Arcane Intellect + A{ id = 23028, type = "HELPFUL", indicator = { "topleft" }, color = { .4 , .4, 1} } --Arcane Brilliance + A{ id = 61316, type = "HELPFUL", indicator = { "topleft" }, color = { .4 , .4, 1} } --Dalaran Brilliance + A{ id = 61024, type = "HELPFUL", indicator = { "topleft" }, color = { .4 , .4, 1} } --Dalaran Intellect + A{ id = 54648, type = "HELPFUL", indicator = { "topleft2" }, color = { 180/255, 0, 1 }, isMine = true } --Focus Magic + + DT("Curse", { indicator = { "bottom" }, color = { 0.6, 0, 1} }) +end \ No newline at end of file diff --git a/gradient.tga b/gradient.tga new file mode 100644 index 0000000000000000000000000000000000000000..0cc4e8852c7fdc349cf058e3631257457a35a0a2 GIT binary patch literal 12332 zcmeI3>5dgu6oorJg)gDcz#mOWj3!R;Efi4@P}Hc1s315YD2R;BAczAFpiGX;gTxpg z##QILweGHc>Q>)|q=m%wW8bycuunDrnVGq3rp2O}MKgEL{PREl(|>`#?{NHehvU!b zaO1{}7}S~+yS>(=uv)!&UmGCYyxzq%;rcae&DJ9FR_pm~E)>|SS6elS;mDm#;?*u1 z_v$rk&DJ9FR_pm~E)>|SS6elS;mDn|C?fGn7ftL+BVN9IS+fpc;WB-|mF7sfoB~eP zM9JPTcj`QfDwn!wu3Q?61RAj~scNrY;^QOT7dl&A@7U#jyjJHgc5y+tc)?n;-QGCg z#W~^pxvq8_ZTk02U-L)7?-eHL4mu!$XhkdBmRoa@cqE0RmG1vmfo>&_1qVb>t!RbY z8rSAx@kq)>%lCgNQ1aITDx#7#(cuJ`(p`j5sgusfCw$8HMc_;aILpd$0&vZryO3fr z^0Q~pDj2P9FK;BBkG4gT#Pv!PV+)QOKSun_nKMigpw&v`I^s1EukDTIrp1;vZvk6c z#ansoqSr+duADx7`qZgYOc9{fO3ksXL%g;(nwu6|+Pnp9X%%nfv5Q_8Nx1S;7bj1i zl%N?2Yf|V%F%}aijA-r*N8;)i^|i?*CLMC(#EBmRB(jNMi3o@ei@;@>I8)5gS#x5_ zSP}PSy3I@BEhW8D^t68b`0*bCRMEy0Sa6A2fjP-m9^L6(sc1r!f$Mm@>9-uSi{hyy z7c{>w_^tqss3}bfL|g=Jg6ruFF|QC!2rey7iObS7{Dg=^icGDD=-(E|0@_T>rNmg$ zormPg0}{PO@@SQ+o42dBQ{)aakZ% z%n2(%^6P@O(fmpnSP9gbr1*mM_+b)zby~O%NOTv=-|%G@UlpL4Lp7%&3y$@7sXcWiu;q$WBBtflraToyafoJ}L`2uzU(npy-|&V6;9BbBZDv6yGOIz{e%--Mg23BydfjKqOuz(nT@fvu6*MTd@*bNsleZ(veirTRaD0 z?%usyEprhmF%T`1y#b28CL%~2s1T^%ib^>%`X2FJEq3nQ2{rMW6zgqu7XeLy`%EiJ z!l}rOtM5!ADXf*G$c`4D1+?0ZpfyxFN+fVA3h*4qS!uazOD)4m6s;nuXobwD0aCVa z-!4H!6Rzo`I3VD>L@S7zKo&2w!uYZu;w>l1Bf?|X3SaU`i*4JsNznw7MVL;uX7ekH zJQ-UOZN-BQq`cOsurjG6m#2O0<1Q4o0JpMr>sE2YF%gMOWki@3A?VR^k}j7OFkFnu z=qjLf%a$z`ry;t=LBd|6C@ZbgT%K2k`yWk){;p_x6-k^miYg{Co=V(Bw;;W`Gq@iH ze9(m)3*wtMZ)SBvYvKfyL??jgX$vK;F8Zup5npi3%KHWHO@@++*w-pfE9wN$9Zn>< zafS1ix!>}gSV4Su3MlCmJSw(souspAP4_o#+O%=wMy3dEB(iWJ4#bwYAj=a%F;?Kx z2|LCbACff;pM58QiUbpzQs5@GqHZ@5b0y(PNvmQTHf%`u)2fQFe*JnS-!2db+Dzn% zN5vK`Ph!ebam<7yF~rDm>59uLmzpu~1lC)Vp+GWkqLMD8H6HYHh+bnQ=HD!k3(-tG zuE}*}PU0gbJ{6UCC+d;MjQAS`>(;GxdGyY}@0 zks1S59k!yD`G{0P48&L5g?JsvzczoYS+ho$dwa5^XIEMy-zqrH6+OW#uig}NWS}?f z4iu-i_$ywy!|~D-csYQ$geiIp5qWVkR(+BEWC?7LB8*0x>ijwo zTg#U(w{GH^U5IpLm^Dc*0iVKM) 0 and currentIndex <= #str do + local char = string.byte(str, currentIndex) + if char >= 240 then + currentIndex = currentIndex + 4 + elseif char >= 225 then + currentIndex = currentIndex + 3 + elseif char >= 192 then + currentIndex = currentIndex + 2 + else + currentIndex = currentIndex + 1 + end + numChars = numChars - 1 + end + return str:sub(start, currentIndex - 1) +end + +function helpers.DisableBlizzParty(self) + for i=1,4 do + local party = "PartyMemberFrame"..i + local frame = _G[party] + + frame:UnregisterAllEvents() + frame.Show = function()end + frame:Hide() + _G[party..'HealthBar']:UnregisterAllEvents() + _G[party..'ManaBar']:UnregisterAllEvents() + end +end + +function helpers.Reverse(p1) + local p2 = "" + local dir + if string.find(p1,"CENTER") then return "CENTER" end + if string.find(p1,"TOP") then p2 = p2.."BOTTOM" end + if string.find(p1,"BOTTOM") then p2 = p2.."TOP" end + if string.find(p1,"LEFT") then p2 = p2.."RIGHT" end + if string.find(p1,"RIGHT") then p2 = p2.."LEFT" end + if p2 == "RIGHT" or p2 == "LEFT" then + dir = "HORIZONTAL" + elseif p2 == "TOP" or p2 == "BOTTOM" then + dir = "VERTICAL" + end + return p2, dir +end + + + + + + + + + +-- UIFrameFade clone from defauilt UI + +local SCALEFRAMES = {} +local frameScaleManager = CreateFrame("FRAME"); +-- Function that actually performs the scale change +--[[ +Fading frame attribute listing +============================================================ +frame.timeToScale [Num] Time it takes to scale the frame in or out +frame.mode ["IN", "OUT"] Scale mode +frame.finishedFunc [func()] Function that is called when scaling is finished +frame.finishedArg1 [ANYTHING] Argument to the finishedFunc +frame.finishedArg2 [ANYTHING] Argument to the finishedFunc +frame.finishedArg3 [ANYTHING] Argument to the finishedFunc +frame.finishedArg4 [ANYTHING] Argument to the finishedFunc +frame.scaleHoldTime [Num] Time to hold the scaled state + ]] + +local function UIFrameScaleRemoveFrame(frame) + tDeleteItem(SCALEFRAMES, frame); +end + +local function UIFrameScale_OnUpdate(self, elapsed) + local index = 1; + local frame, scaleInfo; + while SCALEFRAMES[index] do + frame = SCALEFRAMES[index]; + scaleInfo = SCALEFRAMES[index].scaleInfo; + -- Reset the timer if there isn't one, this is just an internal counter + if ( not scaleInfo.scaleTimer ) then + scaleInfo.scaleTimer = 0; + end + scaleInfo.scaleTimer = scaleInfo.scaleTimer + elapsed; + + -- If the scaleTimer is less then the desired scale time then set the scale otherwise hold the scale state, call the finished function, or just finish the scale + if ( scaleInfo.scaleTimer < scaleInfo.timeToScale ) then + if ( scaleInfo.mode == "IN" ) then + frame:SetScale((scaleInfo.scaleTimer / scaleInfo.timeToScale) * (scaleInfo.endScale - scaleInfo.startScale) + scaleInfo.startScale); + elseif ( scaleInfo.mode == "OUT" ) then + frame:SetScale(((scaleInfo.timeToScale - scaleInfo.scaleTimer) / scaleInfo.timeToScale) * (scaleInfo.startScale - scaleInfo.endScale) + scaleInfo.endScale); + end + else + frame:SetScale(scaleInfo.endScale); + -- If there is a scaleHoldTime then wait until its passed to continue on + if ( scaleInfo.scaleHoldTime and scaleInfo.scaleHoldTime > 0 ) then + scaleInfo.scaleHoldTime = scaleInfo.scaleHoldTime - elapsed; + else + -- Complete the scale and call the finished function if there is one + UIFrameScaleRemoveFrame(frame); + if ( scaleInfo.finishedFunc ) then + scaleInfo.finishedFunc(scaleInfo.finishedArg1, scaleInfo.finishedArg2, scaleInfo.finishedArg3, scaleInfo.finishedArg4); + scaleInfo.finishedFunc = nil; + end + end + end + + index = index + 1; + end + + if ( #SCALEFRAMES == 0 ) then + self:SetScript("OnUpdate", nil); + end +end + + +-- Generic scale function +local function UIFrameScale(frame, scaleInfo) + if (not frame) then + return; + end + if ( not scaleInfo.mode ) then + scaleInfo.mode = "IN"; + end + local scale; + if ( scaleInfo.mode == "IN" ) then + if ( not scaleInfo.startScale ) then + scaleInfo.startScale = 0.01; + end + if ( not scaleInfo.endScale ) then + scaleInfo.endScale = 1.0; + end + scale = 0; + elseif ( scaleInfo.mode == "OUT" ) then + if ( not scaleInfo.startScale ) then + scaleInfo.startScale = 1.0; + end + if ( not scaleInfo.endScale ) then + scaleInfo.endScale = 0.01; + end + scale = 1.0; + end + frame:SetScale(scaleInfo.startScale); + + frame.scaleInfo = scaleInfo; + frame:Show(); + + local index = 1; + while SCALEFRAMES[index] do + -- If frame is already set to scale then return + if ( SCALEFRAMES[index] == frame ) then + return; + end + index = index + 1; + end + tinsert(SCALEFRAMES, frame); + frameScaleManager:SetScript("OnUpdate", UIFrameScale_OnUpdate); +end + +-- Convenience function to do a simple scale in +local function UIFrameScaleIn(frame, timeToScale, startScale, endScale) + local scaleInfo = {}; + scaleInfo.mode = "IN"; + scaleInfo.timeToScale = timeToScale; + scaleInfo.startScale = startScale; + scaleInfo.endScale = endScale; + UIFrameScale(frame, scaleInfo); +end + +-- Convenience function to do a simple scale out +local function UIFrameScaleOut(frame, timeToScale, startScale, endScale) + local scaleInfo = {}; + scaleInfo.mode = "OUT"; + scaleInfo.timeToScale = timeToScale; + scaleInfo.startScale = startScale; + scaleInfo.endScale = endScale; + UIFrameScale(frame, scaleInfo); +end + + +helpers.UIFrameScale = UIFrameScale +helpers.UIFrameScaleOut = UIFrameScaleOut +helpers.UIFrameScaleIn = UIFrameScaleIn \ No newline at end of file diff --git a/libs.xml b/libs.xml new file mode 100644 index 0000000..f05d6f1 --- /dev/null +++ b/libs.xml @@ -0,0 +1,9 @@ + + +