vanilla-wow-addons – Rev 1
?pathlinks?
----------------------
-- Loading Function --
----------------------
local XPerl_TargetHistory = {}
-- XPerl_TargetTarget_OnLoad
function XPerl_TargetTarget_OnLoad()
this.unitid = "targettarget"
if (this:GetName() == "XPerl_TargetTargetTarget") then
this.unitid = "targettargettarget"
else
XPerl_TargetTarget_Frame = XPerl_TargetTarget
end
-- Events
this:RegisterEvent("PLAYER_ENTERING_WORLD")
this:RegisterEvent("PLAYER_LEAVING_WORLD")
this.time = 0
this.targetname = ""
this.targethp = 0
this.targetmana = 0
this.lastUpdate = 0
this.SubFrame = function(this, a)
return getglobal(this:GetName().."_"..a)
end
XPerl_InitFadeFrame(this)
XPerl_RegisterHighlight(getglobal(this:GetName().."_CastClickOverlay"), 2)
XPerl_RegisterPerlFrames(this, {"NameFrame", "StatsFrame", "LevelFrame"})
end
-- XPerl_TargetTarget_RegisterSome
local function XPerl_TargetTarget_RegisterSome()
this:RegisterEvent("RAID_TARGET_UPDATE")
if (this == XPerl_TargetTarget) then
this:RegisterEvent("PLAYER_TARGET_CHANGED")
this:RegisterEvent("UNIT_HEALTH"); -- So health updates are more regular
this:RegisterEvent("UNIT_MAXHEALTH")
this:RegisterEvent("UNIT_AURA")
this:RegisterEvent("UNIT_FACTION")
end
end
-- XPerl_TargetTarget_UnregisterSome
local function XPerl_TargetTarget_UnregisterSome()
this:UnregisterEvent("RAID_TARGET_UPDATE")
if (this == XPerl_TargetTarget) then
this:UnregisterEvent("PLAYER_TARGET_CHANGED")
this:UnregisterEvent("UNIT_HEALTH")
this:UnregisterEvent("UNIT_MAXHEALTH")
this:UnregisterEvent("UNIT_AURA")
this:UnregisterEvent("UNIT_FACTION")
end
end
-------------------------
-- The Update Function --
-------------------------
function XPerl_TargetTarget_UpdatePVP(ttFrame)
local targetrankname, targetrank=GetPVPRankInfo(UnitPVPRank(ttFrame.unitid), ttFrame.unitid)
if (targetrank and XPerlConfig.ShowTargetPVPRank==1 and UnitIsPlayer(ttFrame.unitid)) then
ttFrame:SubFrame("NameFrame_PVPRankIcon"):Show()
if (targetrank==0) then
ttFrame:SubFrame("NameFrame_PVPRankIcon"):Hide()
else
ttFrame:SubFrame("NameFrame_PVPRankIcon"):SetTexture(string.format("Interface\\PVPRankBadges\\PVPRank%02d", targetrank))
end
else
ttFrame:SubFrame("NameFrame_PVPRankIcon"):Hide()
end
if (XPerlConfig.ShowTargetPVP == 1 and UnitIsPVP("targettarget")) then
ttFrame:SubFrame("NameFrame_PVPStatus"):SetTexture("Interface\\TargetingFrame\\UI-PVP-"..(UnitFactionGroup("targettarget") or "FFA"))
ttFrame:SubFrame("NameFrame_PVPStatus"):Show()
else
ttFrame:SubFrame("NameFrame_PVPStatus"):Hide()
end
end
-- XPerl_TargetTarget_Buff_UpdateAll
local function XPerl_TargetTarget_Buff_UpdateAll(ttFrame)
local show
if (ttFrame == XPerl_TargetTarget) then
show = XPerlConfig.TargetTargetBuffs
else
show = XPerlConfig.TargetTargetTargetBuffs
end
if (show == 1) then
ttFrame:SubFrame("BuffFrame"):Show()
XPerl_Targets_BuffUpdate(ttFrame.unitid, ttFrame:GetName().."_", ttFrame)
else
ttFrame:SubFrame("BuffFrame"):Hide()
end
end
-- XPerl_TargetTarget_RaidIconUpdate
local function XPerl_TargetTarget_RaidIconUpdate(unitid, frameRaidIcon, frameNameFrame)
XPerl_Update_RaidIcon(unitid, frameRaidIcon)
frameRaidIcon:ClearAllPoints()
if (XPerlConfig.AlternateRaidIcon == 1) then
frameRaidIcon:SetHeight(16)
frameRaidIcon:SetWidth(16)
frameRaidIcon:SetPoint("CENTER", frameNameFrame, "TOPRIGHT", -5, -4)
else
frameRaidIcon:SetHeight(32)
frameRaidIcon:SetWidth(32)
frameRaidIcon:SetPoint("CENTER", frameNameFrame, "CENTER", 0, 0)
end
end
-- XPerl_TargetTarget_UpdateDisplay
function XPerl_TargetTarget_UpdateDisplay(ttFrame,force)
local show
if (ttFrame == XPerl_TargetTarget) then
show = XPerlConfig.ShowTargetTarget
else
show = XPerlConfig.ShowTargetTargetTarget
if (show == 1 and XPerlConfig.ShowTargetTarget == 0) then
show = 0
end
end
if (UnitExists("target") and show == 1 and UnitIsConnected(ttFrame.unitid)) then -- (UnitName("target")~=nil) and (show==1) and (UnitIsConnected(ttFrame.unitid))) then
ttFrame.targetname = UnitName(ttFrame.unitid)
if (ttFrame.targetname ~= nil) then
local t = GetTime()
if (not force and t < ttFrame.lastUpdate + 0.3) then
return
end
ttFrame.lastUpdate = t
XPerl_CancelFade(ttFrame)
ttFrame:Show()
XPerl_TargetTarget_UpdatePVP(ttFrame)
-- Save these 2, so we know whether to update the frame later
ttFrame.targethp = UnitHealth(ttFrame.unitid)
ttFrame.targetmana = UnitMana(ttFrame.unitid)
XPerl_SetUnitNameColor(ttFrame.unitid, ttFrame:SubFrame("NameFrame_NameBarText"))
if (XPerlConfig.ShowTargetTargetLevel == 1) then
local TargetTargetlevel = UnitLevel(ttFrame.unitid)
local color = GetDifficultyColor(TargetTargetlevel)
if (TargetTargetLevel == -1) then
if (UnitClassification(ttFrame.unitid) == "worldboss") then
TargetTargetLevel = "Boss"
end
elseif (UnitIsPlusMob(ttFrame.unitid) or UnitClassification(ttFrame.unitid) == "elite") then
TargetTargetlevel = TargetTargetlevel.."+"
ttFrame:SubFrame("LevelFrame"):SetWidth(33)
else
ttFrame:SubFrame("LevelFrame"):SetWidth(27)
end
ttFrame:SubFrame("LevelFrameText"):SetText(TargetTargetlevel)
if (TargetTargetLevel == "Boss") then
ttFrame:SubFrame("LevelFrame"):SetWidth(ttFrame:SubFrame("LevelFrameText"):GetStringWidth() + 6)
color = {r = 1, g = 0, b = 0}
end
if (XPerlConfig.ShowTargetTargetPercent == 1) then
ttFrame:SubFrame("NameFrame"):SetWidth(163 - ttFrame:SubFrame("LevelFrame"):GetWidth())
else
ttFrame:SubFrame("NameFrame"):SetWidth(131 - ttFrame:SubFrame("LevelFrame"):GetWidth())
end
ttFrame:SubFrame("LevelFrameText"):SetTextColor(color.r, color.g, color.b)
end
-- Set name - Must do after level as the NameFrame can change size just above here.
local TargetTargetname = ttFrame.targetname
ttFrame:SubFrame("NameFrame_NameBarText"):SetText(TargetTargetname)
local remCount = 1
while ((ttFrame:SubFrame("NameFrame_NameBarText"):GetStringWidth() >= (ttFrame:SubFrame("NameFrame"):GetWidth() - 8)) and (string.len(TargetTargetname) > remCount)) do
TargetTargetname = string.sub(TargetTargetname, 1, string.len(TargetTargetname) - remCount)..".."
remCount = 3
ttFrame:SubFrame("NameFrame_NameBarText"):SetText(TargetTargetname)
end
-- Set health
XPerl_Target_SetHealth(ttFrame.unitid, ttFrame:SubFrame("StatsFrame_HealthBar"), ttFrame:SubFrame("StatsFrame_HealthBarBG"), ttFrame:SubFrame("StatsFrame_HealthBarPercent"), ttFrame:SubFrame("StatsFrame_HealthBarText"), ttFrame:SubFrame("StatsFrame_ManaBarPercent"), XPerlConfig.ShowTargetTargetPercent)
-- Set mana
XPerl_Target_SetManaType(ttFrame.unitid, ttFrame:SubFrame("StatsFrame_ManaBar"), ttFrame:SubFrame("StatsFrame_ManaBarText"), ttFrame:SubFrame("StatsFrame_ManaBarBG"), ttFrame:SubFrame("StatsFrame"), ttFrame)
XPerl_Target_SetMana(ttFrame.unitid, ttFrame:SubFrame("StatsFrame_ManaBar"), ttFrame:SubFrame("StatsFrame_HealthBarPercent"), ttFrame:SubFrame("StatsFrame_ManaBarPercent"), ttFrame:SubFrame("StatsFrame_ManaBarText"))
if (XPerlConfig.ShowTargetTargetValues == 1) then
ttFrame:SubFrame("StatsFrame_HealthBarText"):Show()
ttFrame:SubFrame("StatsFrame_ManaBarText"):Show()
else
ttFrame:SubFrame("StatsFrame_HealthBarText"):Hide()
ttFrame:SubFrame("StatsFrame_ManaBarText"):Hide()
end
XPerl_TargetTarget_RaidIconUpdate(ttFrame.unitid, ttFrame:SubFrame("NameFrame_RaidIcon"), ttFrame:SubFrame("NameFrame"))
XPerl_Targets_BuffPositions(ttFrame.unitid, ttFrame:GetName().."_", ttFrame)
XPerl_TargetTarget_Buff_UpdateAll(ttFrame)
return
else
ttFrame.targetname = ""
end
else
ttFrame.targetname = ""
end
XPerl_StartFade(ttFrame)
end
-- XPerl_TargetTarget_Update_Control
local function XPerl_TargetTarget_Update_Control(ttFrame)
if (UnitIsVisible(ttFrame.unitid) and UnitIsCharmed(ttFrame.unitid)) then
ttFrame:SubFrame("NameFrame_Warning"):Show()
else
ttFrame:SubFrame("NameFrame_Warning"):Hide()
end
end
-- XPerl_TargetTarget_Update_Combat
local function XPerl_TargetTarget_Update_Combat(ttFrame)
if (UnitAffectingCombat(ttFrame.unitid)) then
ttFrame:SubFrame("NameFrame_ActivityStatus"):Show()
else
ttFrame:SubFrame("NameFrame_ActivityStatus"):Hide()
end
end
-- XPerl_TargetTarget_AddHistory
local function XPerl_TargetTarget_AddHistory(newName, r, g, b)
if (getn(XPerl_TargetHistory) == 0 or newName ~= XPerl_TargetHistory[1].name) then
tinsert(XPerl_TargetHistory, 1, {["name"] = newName, ["r"] = r, ["g"] = g, ["b"] = b, ["time"] = GetTime()})
while (getn(XPerl_TargetHistory) > 10) do
tremove(XPerl_TargetHistory, 11)
end
XPerl_TargetTarget.FlashChangeStart = GetTime()
end
end
-- Process_HistoryFlash
local function Process_HistoryFlash()
if (not this.FlashChangeStart) then
return
end
local timer = (GetTime() - this.FlashChangeStart)
local r, g, b
if (timer > 1) then
this.FlashChangeStart = nil
r = XPerlConfig.BorderColour.r
g = XPerlConfig.BorderColour.g
b = XPerlConfig.BorderColour.b
else
r = XPerlConfig.BorderColour.r + 0.5 - (timer / 2)
g = XPerlConfig.BorderColour.g + 0.5 - (timer / 2)
b = XPerlConfig.BorderColour.b + 0.5 - (timer / 2)
if (r < 0) then r = 0; elseif (r > 1) then r = 1; end
if (g < 0) then g = 0; elseif (g > 1) then g = 1; end
if (b < 0) then b = 0; elseif (b > 1) then b = 1; end
end
this:SubFrame("NameFrame"):SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
this:SubFrame("StatsFrame"):SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
this:SubFrame("LevelFrame"):SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
if (this == XPerl_TargetTarget) then
if (XPerl_TargetTarget_History1) then
XPerl_TargetTarget_History1:SetBackdropBorderColor(r, g, b, XPerlConfig.Transparency)
end
end
end
-- XPerl_TargetTarget_OnUpdate
function XPerl_TargetTarget_OnUpdate(elapsed, ttFrame)
--if (not ttFrame.unitid) then
-- return
--end
local newName = UnitName(ttFrame.unitid)
local newHP = UnitHealth(ttFrame.unitid)
local newMana = UnitMana(ttFrame.unitid)
if (not newName) then
newName = ""
newHP = 0
newMana = 0
end
if (newName ~= ttFrame.targetname) then
if (ttFrame == XPerl_TargetTarget) then
if (not UnitIsUnit("player", "target")) then
if (ttFrame.targetname ~= "") then
if (newName ~= "") then
local r, g, b = ttFrame:SubFrame("NameFrame_NameBarText"):GetTextColor()
XPerl_TargetTarget_AddHistory(XPerl_TargetTarget.targetname, r, g, b)
end
end
end
end
XPerl_TargetTarget_UpdateDisplay(ttFrame,true)
elseif ((newHP ~= ttFrame.targethp) or (newMana ~= ttFrame.targetmana)) then
XPerl_TargetTarget_UpdateDisplay(ttFrame)
end
if (XPerlConfig.TargetTargetHistory == 1) then
if (ttFrame == XPerl_TargetTarget) then
XPerl_TargetTarget_Update()
end
else
Process_HistoryFlash()
if (ttFrame == XPerl_TargetTarget) then
XPerl_TargetTarget_HideHistory()
end
end
ttFrame.time = elapsed + ttFrame.time
if (ttFrame.time >= 0.3 and ttFrame.Fading == 0) then
if (newName ~= "") then
if (ttFrame:IsShown()) then
XPerl_TargetTarget_Update_Combat(ttFrame)
XPerl_TargetTarget_Update_Control(ttFrame)
XPerl_TargetTarget_UpdatePVP(ttFrame)
XPerl_TargetTarget_Buff_UpdateAll(ttFrame)
XPerl_SetUnitNameColor(ttFrame.unitid, ttFrame:SubFrame("NameFrame_NameBarText"))
end
end
ttFrame.time = 0
end
XPerl_ProcessFade(ttFrame)
end
-------------------
-- Event Handler --
-------------------
function XPerl_TargetTarget_OnEvent()
if (event == "PLAYER_ENTERING_WORLD") then
XPerl_TargetTarget_RegisterSome()
XPerl_TargetTarget_ClearHistory()
elseif (event == "PLAYER_LEAVING_WORLD") then
XPerl_TargetTarget_UnregisterSome()
XPerl_TargetTarget:Hide()
if (XPerl_TargetTargetTarget) then
XPerl_TargetTargetTarget:Hide()
end
return
elseif (event == "RAID_TARGET_UPDATE") then
XPerl_TargetTarget_RaidIconUpdate(XPerl_TargetTarget.unitid, XPerl_TargetTarget_NameFrame_RaidIcon, XPerl_TargetTarget_NameFrame)
if (XPerl_TargetTargetTarget) then
XPerl_TargetTarget_RaidIconUpdate(XPerl_TargetTargetTarget.unitid, XPerl_TargetTarget_NameFrame_RaidIcon, XPerl_TargetTarget_NameFrame)
end
elseif (event == "PLAYER_TARGET_CHANGED") then
XPerl_TargetTarget_ClearHistory()
end
if (unit) then
if (strfind(event, "UNIT_HEALTH UNIT_MAXHEALTH UNIT_AURA UNIT_FACTION")) then
if (UnitIsUnit(unit, "targettarget")) then
XPerl_TargetTarget_UpdateDisplay(XPerl_TargetTarget,true)
elseif (XPerl_TargetTargetTarget and UnitIsUnit(unit, "targettargettarget")) then
XPerl_TargetTarget_UpdateDisplay(XPerl_TargetTargetTarget,true)
end
end
end
end
--------------------
-- Target history --
--------------------
function XPerl_TargetTarget_ClearHistory()
XPerl_TargetHistory = {}
XPerl_TargetTarget_Update()
end
-- XPerl_TargetTarget_Update
function XPerl_TargetTarget_Update()
local alpha = XPerlConfig.Transparency
local time = GetTime()
Process_HistoryFlash()
local offset = -3
if (XPerlConfig.TargetTargetBuffs == 1) then
if (UnitExists("targettarget")) then
if (XPerl_UnitBuff("targettarget", 1)) then
if (offset == -3) then
offset = 0
end
offset = offset + 20
if (UnitBuff("targettarget", 9)) then
offset = offset + 20
end
end
if (XPerl_UnitDebuff("targettarget", 1)) then
if (offset == -3) then
offset = 0
end
offset = offset + 24
end
end
end
if (XPerl_TargetTarget_History1) then
XPerl_TargetTarget_History1:ClearAllPoints()
XPerl_TargetTarget_History1:SetPoint("TOPLEFT", XPerl_TargetTarget_StatsFrame, "BOTTOMLEFT", 0, -offset)
end
for i = 1,10 do
local frame = getglobal("XPerl_TargetTarget_History"..i)
local value = XPerl_TargetHistory[i]
if (value) then
if (not frame) then
frame = CreateFrame("Frame", "XPerl_TargetTarget_History"..i, UIParent, "XPerl_History_Template")
frame:SetID(i)
--XPerl_SetupFrame(frame)
XPerl_RegisterPerlFrames(frame)
frame:SetScale(XPerlConfig.Scale_TargetTargetFrame)
end
if (XPerlConfig.ShowTargetTargetPercent == 0) then
frame:SetWidth(128)
else
frame:SetWidth(160)
end
local frameText = getglobal("XPerl_TargetTarget_History"..i.."_NameBarText")
frameText:SetText(XPerl_TargetHistory[i].name)
frameText:SetTextColor(XPerl_TargetHistory[i].r, XPerl_TargetHistory[i].g, XPerl_TargetHistory[i].b)
frame:Show()
local minAlpha = 0.2
local fadeSeconds = 9
if (XPerl_TargetHistory[i].time < time - (fadeSeconds + 1)) then
frame:SetAlpha(minAlpha)
elseif (XPerl_TargetHistory[i].time < time - fadeSeconds) then
local fullRange = XPerlConfig.Transparency - minAlpha
local fade = (time - XPerl_TargetHistory[i].time) - fadeSeconds
local alphaItem = XPerlConfig.Transparency - (fullRange * fade)
frame:SetAlpha(alphaItem)
else
frame:SetAlpha(XPerlConfig.Transparency)
end
elseif (frame) then
frame:Hide()
end
end
end
-- XPerl_TargetTarget_ResetFade
function XPerl_TargetTarget_ResetFade()
local time = GetTime()
for i = 1,getn(XPerl_TargetHistory) do
XPerl_TargetHistory[i].time = time
end
end
-- XPerl_TargetTarget_History_OnEnter
function XPerl_TargetTarget_History_OnEnter()
local id = this:GetID()
if (id) then
XPerl_TargetHistory[id].time = GetTime()
end
end
-- XPerl_TargetTarget_History_OnMouseUp
function XPerl_TargetTarget_History_OnMouseUp()
local id = this:GetID()
if (id) then
if (XPerl_TargetHistory[id].name) then
TargetByName(XPerl_TargetHistory[id].name)
end
end
end
-- XPerl_TargetTarget_HideHistory
function XPerl_TargetTarget_HideHistory()
for i = 1,10 do
local f = getglobal("XPerl_TargetTarget_History"..i)
if (f) then
f:Hide()
end
end
end
-- XPerl_TargetTarget_Set_Bits
function XPerl_TargetTarget_Set_Bits()
if (not XPerl_TargetTarget) then
return
end
local function Set(frame)
local statsFrame = getglobal(frame:GetName().."_StatsFrame")
local statsFrameHealthBarPercent = getglobal(statsFrame:GetName().."_HealthBarPercent")
local statsFrameManaBarPercent = getglobal(statsFrame:GetName().."_ManaBarPercent")
local nameFrame = getglobal(frame:GetName().."_NameFrame")
local levelFrame = getglobal(frame:GetName().."_LevelFrame")
if (XPerlConfig.ShowTargetTargetLevel==0) then
--nameFrame:SetWidth(160)
levelFrame:Hide()
levelFrame:SetWidth(3)
else
--nameFrame:SetWidth(136)
levelFrame:Show()
levelFrame:SetWidth(27)
end
if (XPerlConfig.ShowTargetTargetPercent == 0) then
statsFrame:SetWidth(128)
statsFrameHealthBarPercent:Hide()
statsFrameManaBarPercent:Hide()
if (XPerlConfig.ShowTargetTargetLevel == 1) then
nameFrame:SetWidth(104)
else
nameFrame:SetWidth(128)
end
else
statsFrame:SetWidth(160)
statsFrameHealthBarPercent:Show()
statsFrameManaBarPercent:Show()
if (XPerlConfig.ShowTargetTargetLevel == 1) then
nameFrame:SetWidth(136)
else
nameFrame:SetWidth(160)
end
end
XPerlConfig.TargetBuffSize = tonumber(XPerlConfig.TargetBuffSize) or 20
XPerl_SetBuffSize(frame:GetName().."_", XPerlConfig.TargetBuffSize, XPerlConfig.TargetBuffSize * 1.2)
end
if (XPerlConfig.ShowTargetTargetTarget == 1) then
if (not XPerl_TargetTargetTarget) then
CreateFrame("Frame", "XPerl_TargetTargetTarget", UIParent, "XPerl_TargetTarget_Template")
XPerl_TargetTargetTarget:SetPoint("BOTTOMLEFT", XPerl_TargetTarget_StatsFrame, "BOTTOMRIGHT", 5, 0)
XPerl_RestorePosition(XPerl_TargetTargetTarget)
end
end
Set(XPerl_TargetTarget)
if (XPerl_TargetTargetTarget) then
Set(XPerl_TargetTargetTarget)
end
end
-- XPerl_ScaleTargetTarget
function XPerl_ScaleTargetTarget(num)
if (XPerl_TargetTarget) then
XPerl_TargetTarget:SetScale(num)
if (XPerl_TargetTargetTarget) then
XPerl_TargetTargetTarget:SetScale(num)
end
for i = 1,10 do
local f = getglobal("XPerl_TargetTarget_History"..i)
if (f) then
f:SetScale(num)
end
end
end
end