mirror of
https://github.com/parnic/ice-hud.git
synced 2025-06-16 06:40:13 -05:00
- fixed a bug causing TargetInfo lines to be forced to contain data. now any of the lines can be empty if the user chooses
1065 lines
28 KiB
Lua
1065 lines
28 KiB
Lua
local AceOO = AceLibrary("AceOO-2.0")
|
|
|
|
local TargetInfo = AceOO.Class(IceElement)
|
|
|
|
local DogTag = nil
|
|
|
|
local target = "target"
|
|
local internal = "internal"
|
|
|
|
TargetInfo.prototype.buffSize = nil
|
|
TargetInfo.prototype.ownBuffSize = nil
|
|
TargetInfo.prototype.width = nil
|
|
|
|
TargetInfo.prototype.name = nil
|
|
TargetInfo.prototype.guild = nil
|
|
TargetInfo.prototype.realm = nil
|
|
TargetInfo.prototype.classLocale = nil
|
|
TargetInfo.prototype.classEnglish = nil
|
|
TargetInfo.prototype.leader = nil
|
|
|
|
TargetInfo.prototype.targetCombat = nil
|
|
TargetInfo.prototype.pvp = nil
|
|
TargetInfo.prototype.level = nil
|
|
TargetInfo.prototype.classification = nil
|
|
TargetInfo.prototype.reaction = nil
|
|
TargetInfo.prototype.tapped = nil
|
|
|
|
TargetInfo.prototype.isPlayer = nil
|
|
|
|
|
|
-- Constructor --
|
|
function TargetInfo.prototype:init()
|
|
TargetInfo.super.prototype.init(self, "TargetInfo")
|
|
|
|
self.scalingEnabled = true
|
|
end
|
|
|
|
|
|
|
|
-- 'Public' methods -----------------------------------------------------------
|
|
|
|
-- OVERRIDE
|
|
function TargetInfo.prototype:Enable(core)
|
|
TargetInfo.super.prototype.Enable(self, core)
|
|
|
|
if IceHUD.IceCore:ShouldUseDogTags() then
|
|
DogTag = AceLibrary("LibDogTag-3.0")
|
|
AceLibrary("LibDogTag-Unit-3.0")
|
|
end
|
|
|
|
self:RegisterEvent("UNIT_AURA", "AuraChanged")
|
|
|
|
self:RegisterEvent("UNIT_NAME_UPDATE", "TargetName")
|
|
self:RegisterEvent("UNIT_FACTION", "TargetFaction")
|
|
self:RegisterEvent("UNIT_LEVEL", "TargetLevel")
|
|
|
|
self:RegisterEvent("UNIT_FLAGS", "TargetFlags")
|
|
self:RegisterEvent("UNIT_DYNAMIC_FLAGS", "TargetFlags")
|
|
|
|
self:RegisterEvent("RAID_TARGET_UPDATE", "UpdateRaidTargetIcon")
|
|
|
|
RegisterUnitWatch(self.frame)
|
|
|
|
if self.moduleSettings.myTagVersion < IceHUD.CurrTagVersion then
|
|
local origDefaults = self:GetDefaultSettings()
|
|
|
|
self.moduleSettings.line1tag = origDefaults["line1tag"]
|
|
self.moduleSettings.line2tag = origDefaults["line2tag"]
|
|
self.moduleSettings.line3tag = origDefaults["line3tag"]
|
|
self.moduleSettings.myTagVersion = IceHUD.CurrTagVersion
|
|
end
|
|
|
|
self:RegisterFontStrings()
|
|
end
|
|
|
|
|
|
-- OVERRIDE
|
|
function TargetInfo.prototype:Disable(core)
|
|
TargetInfo.super.prototype.Disable(self, core)
|
|
|
|
UnregisterUnitWatch(self.frame)
|
|
|
|
self:UnregisterFontStrings()
|
|
end
|
|
|
|
|
|
-- OVERRIDE
|
|
function TargetInfo.prototype:GetOptions()
|
|
local opts = TargetInfo.super.prototype.GetOptions(self)
|
|
|
|
opts["vpos"] = {
|
|
type = "range",
|
|
name = "Vertical Position",
|
|
desc = "Vertical Position",
|
|
get = function()
|
|
return self.moduleSettings.vpos
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.vpos = v
|
|
self:Redraw()
|
|
end,
|
|
min = -300,
|
|
max = 600,
|
|
step = 10,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 31
|
|
}
|
|
|
|
opts["hpos"] = {
|
|
type = "range",
|
|
name = "Horizontal Position",
|
|
desc = "Horizontal Position",
|
|
get = function()
|
|
return self.moduleSettings.hpos
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.hpos = v
|
|
self:Redraw()
|
|
end,
|
|
min = -500,
|
|
max = 500,
|
|
step = 10,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 31
|
|
}
|
|
|
|
opts["fontSize"] = {
|
|
type = 'range',
|
|
name = 'Font Size',
|
|
desc = 'Font Size',
|
|
get = function()
|
|
return self.moduleSettings.fontSize
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.fontSize = v
|
|
self:Redraw()
|
|
end,
|
|
min = 8,
|
|
max = 20,
|
|
step = 1,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 32
|
|
}
|
|
|
|
opts["stackFontSize"] = {
|
|
type = 'range',
|
|
name = 'Stack Font Size',
|
|
desc = 'Stack Font Size',
|
|
get = function()
|
|
return self.moduleSettings.stackFontSize
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.stackFontSize = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
min = 8,
|
|
max = 20,
|
|
step = 1,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 32
|
|
}
|
|
|
|
opts["zoom"] = {
|
|
type = 'range',
|
|
name = 'Buff zoom',
|
|
desc = 'Buff/debuff icon zoom',
|
|
get = function()
|
|
return self.moduleSettings.zoom
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.zoom = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
min = 0,
|
|
max = 0.2,
|
|
step = 0.01,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
isPercent = true,
|
|
order = 33
|
|
}
|
|
|
|
opts["buffSize"] = {
|
|
type = 'range',
|
|
name = 'Buff size',
|
|
desc = 'Buff/debuff icon size',
|
|
get = function()
|
|
return self.moduleSettings.buffSize
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.buffSize = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
min = 8,
|
|
max = 30,
|
|
step = 1,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 34
|
|
}
|
|
|
|
opts["ownBuffSize"] = {
|
|
type = 'range',
|
|
name = 'Own buff size',
|
|
desc = 'Buff/debuff size for buffs/debuffs that were applied by you, the player',
|
|
get = function()
|
|
return self.moduleSettings.ownBuffSize
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.ownBuffSize = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
min = 8,
|
|
max = 60,
|
|
step = 1,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 35
|
|
}
|
|
|
|
opts["filter"] = {
|
|
type = 'text',
|
|
name = 'Filter buffs/debuffs',
|
|
desc = 'Toggles filtering buffs and debuffs (uses Blizzard default filter code)',
|
|
get = function()
|
|
return self.moduleSettings.filter
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.filter = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
validate = { "Never", "In Combat", "Always" },
|
|
order = 36
|
|
}
|
|
|
|
opts["perRow"] = {
|
|
type = 'range',
|
|
name = 'Buffs / row',
|
|
desc = 'How many buffs/debuffs is shown on each row',
|
|
get = function()
|
|
return self.moduleSettings.perRow
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.perRow = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
min = 0,
|
|
max = 20,
|
|
step = 1,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 37
|
|
}
|
|
|
|
opts["mouseTarget"] = {
|
|
type = 'toggle',
|
|
name = 'Mouseover for target',
|
|
desc = 'Toggle mouseover on/off for target',
|
|
get = function()
|
|
return self.moduleSettings.mouseTarget
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.mouseTarget = v
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 38
|
|
}
|
|
|
|
opts["mouseBuff"] = {
|
|
type = 'toggle',
|
|
name = 'Mouseover for buffs',
|
|
desc = 'Toggle mouseover on/off for buffs/debuffs',
|
|
get = function()
|
|
return self.moduleSettings.mouseBuff
|
|
end,
|
|
set = function(v)
|
|
self.moduleSettings.mouseBuff = v
|
|
self:RedrawBuffs()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled
|
|
end,
|
|
order = 39
|
|
}
|
|
|
|
opts["line1Tag"] = {
|
|
type = 'text',
|
|
name = 'Line 1 tag',
|
|
desc = 'DogTag-formatted string to use for the top text line (leave blank to revert to old behavior)\n\nType /dogtag for a list of available tags',
|
|
get = function()
|
|
return self.moduleSettings.line1Tag
|
|
end,
|
|
set = function(v)
|
|
v = DogTag:CleanCode(v)
|
|
self.moduleSettings.line1Tag = v
|
|
self:RegisterFontStrings()
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or DogTag == nil
|
|
end,
|
|
usage = '',
|
|
order = 39.1
|
|
}
|
|
|
|
opts["line2Tag"] = {
|
|
type = 'text',
|
|
name = 'Line 2 tag',
|
|
desc = 'DogTag-formatted string to use for the middle text line (leave blank to revert to old behavior)\n\nType /dogtag for a list of available tags',
|
|
get = function()
|
|
return self.moduleSettings.line2Tag
|
|
end,
|
|
set = function(v)
|
|
v = DogTag:CleanCode(v)
|
|
self.moduleSettings.line2Tag = v
|
|
self:RegisterFontStrings()
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or DogTag == nil
|
|
end,
|
|
usage = '',
|
|
order = 39.2
|
|
}
|
|
|
|
opts["line3Tag"] = {
|
|
type = 'text',
|
|
name = 'Line 3 tag',
|
|
desc = 'DogTag-formatted string to use for the bottom text line (leave blank to revert to old behavior)\n\nType /dogtag for a list of available tags',
|
|
get = function()
|
|
return self.moduleSettings.line3Tag
|
|
end,
|
|
set = function(v)
|
|
v = DogTag:CleanCode(v)
|
|
self.moduleSettings.line3Tag = v
|
|
self:RegisterFontStrings()
|
|
self:Redraw()
|
|
end,
|
|
disabled = function()
|
|
return not self.moduleSettings.enabled or DogTag == nil
|
|
end,
|
|
usage = '',
|
|
order = 39.3
|
|
}
|
|
|
|
return opts
|
|
end
|
|
|
|
|
|
-- OVERRIDE
|
|
function TargetInfo.prototype:GetDefaultSettings()
|
|
local defaults = TargetInfo.super.prototype.GetDefaultSettings(self)
|
|
|
|
defaults["fontSize"] = 13
|
|
defaults["stackFontSize"] = 11
|
|
defaults["vpos"] = -50
|
|
defaults["hpos"] = 0
|
|
defaults["zoom"] = 0.08
|
|
defaults["buffSize"] = 20
|
|
defaults["ownBuffSize"] = 20
|
|
defaults["mouseTarget"] = true
|
|
defaults["mouseBuff"] = true
|
|
defaults["filter"] = "Never"
|
|
defaults["perRow"] = 10
|
|
defaults["line1Tag"] = "[Name:HostileColor]"
|
|
-- defaults["line2Tag"] = "[Level:DifficultyColor] [[IsPlayer ? Race ! CreatureType]:ClassColor] [[IsPlayer ? Class]:ClassColor] [[~PvP ? \"PvE\" ! \"PvP\"]:HostileColor] [IsLeader ? \"Leader\":Yellow] [InCombat ? \"Combat\":Red] [Classification]"
|
|
defaults["line2Tag"] = "[Level:DifficultyColor] [SmartRace:ClassColor] [SmartClass:ClassColor] [PvPIcon] [IsLeader ? 'Leader':Yellow] [InCombat ? 'Combat':Red] [Classification]"
|
|
defaults["line3Tag"] = "[Guild:Angle]"
|
|
defaults["myTagVersion"] = 2
|
|
defaults["alwaysFullAlpha"] = true
|
|
|
|
return defaults
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:RegisterFontStrings()
|
|
if DogTag ~= nil then
|
|
if self.frame.targetName then
|
|
if self.moduleSettings.line1Tag ~= '' then
|
|
DogTag:AddFontString(self.frame.targetName, self.frame, self.moduleSettings.line1Tag, "Unit", { unit = target })
|
|
else
|
|
DogTag:RemoveFontString(self.frame.targetName)
|
|
end
|
|
end
|
|
if self.frame.targetInfo then
|
|
if self.moduleSettings.line2Tag ~= '' then
|
|
DogTag:AddFontString(self.frame.targetInfo, self.frame, self.moduleSettings.line2Tag, "Unit", { unit = target })
|
|
else
|
|
DogTag:RemoveFontString(self.frame.targetInfo)
|
|
end
|
|
end
|
|
if self.frame.targetGuild then
|
|
if self.moduleSettings.line3Tag ~= '' then
|
|
DogTag:AddFontString(self.frame.targetGuild, self.frame, self.moduleSettings.line3Tag, "Unit", { unit = target })
|
|
else
|
|
DogTag:RemoveFontString(self.frame.targetGuild)
|
|
end
|
|
end
|
|
|
|
self:TargetChanged()
|
|
DogTag:UpdateAllForFrame(self.frame)
|
|
end
|
|
end
|
|
|
|
function TargetInfo.prototype:UnregisterFontStrings()
|
|
if DogTag ~= nil then
|
|
DogTag:RemoveFontString(self.frame.targetName)
|
|
DogTag:RemoveFontString(self.frame.targetInfo)
|
|
DogTag:RemoveFontString(self.frame.targetGuild)
|
|
end
|
|
end
|
|
|
|
|
|
-- OVERRIDE
|
|
function TargetInfo.prototype:Redraw()
|
|
TargetInfo.super.prototype.Redraw(self)
|
|
|
|
if (self.moduleSettings.enabled) then
|
|
self:CreateFrame(true)
|
|
self:TargetChanged()
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:RedrawBuffs()
|
|
if (self.moduleSettings.enabled) then
|
|
self:CreateBuffFrame(false)
|
|
self:CreateDebuffFrame(false)
|
|
|
|
self:TargetChanged()
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-- 'Protected' methods --------------------------------------------------------
|
|
|
|
-- OVERRIDE
|
|
function TargetInfo.prototype:CreateFrame(redraw)
|
|
if not (self.frame) then
|
|
self.frame = CreateFrame("Button", "IceHUD_"..self.elementName, self.parent, "SecureUnitButtonTemplate")
|
|
end
|
|
|
|
-- Parnic - yes, 200 is fairly arbitrary. make a best effort for long names to fit
|
|
self.width = math.max(200, self.settings.gap + 50)
|
|
|
|
self.frame:SetScale(self.moduleSettings.scale)
|
|
|
|
-- set showing/hiding the frame depending on current target
|
|
self.frame:SetAttribute("unit", target)
|
|
|
|
self.frame:SetFrameStrata("BACKGROUND")
|
|
self.frame:SetWidth(self.width)
|
|
self.frame:SetHeight(32)
|
|
self.frame:ClearAllPoints()
|
|
self.frame:SetPoint("TOP", self.parent, "BOTTOM", self.moduleSettings.hpos, self.moduleSettings.vpos)
|
|
self.frame:SetScale(self.moduleSettings.scale)
|
|
|
|
if (self.moduleSettings.mouseTarget) then
|
|
self.frame:EnableMouse(true)
|
|
self.frame:RegisterForClicks("AnyUp")
|
|
self.frame:SetScript("OnEnter", function(frame) self:OnEnter(frame) end)
|
|
self.frame:SetScript("OnLeave", function(frame) self:OnLeave(frame) end)
|
|
else
|
|
self.frame:EnableMouse(false)
|
|
self.frame:RegisterForClicks()
|
|
self.frame:SetScript("OnEnter", nil)
|
|
self.frame:SetScript("OnLeave", nil)
|
|
end
|
|
self.frame.unit = target
|
|
|
|
|
|
-- set up stuff for clicking
|
|
self.frame:SetAttribute("type1", "target")
|
|
self.frame:SetAttribute("type2", "menu")
|
|
self.frame:SetAttribute("unit", target)
|
|
|
|
self.frame.menu = function()
|
|
ToggleDropDownMenu(1, nil, TargetFrameDropDown, "cursor")
|
|
end
|
|
|
|
|
|
-- create a fancy highlight frame for mouse over
|
|
if (not self.frame.highLight) then
|
|
self.frame.highLight = self.frame:CreateTexture(nil, "OVERLAY")
|
|
self.frame.highLight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
|
self.frame.highLight:SetBlendMode("ADD")
|
|
self.frame.highLight:SetAllPoints(self.frame)
|
|
self.frame.highLight:SetVertexColor(1, 1, 1, 0.25)
|
|
self.frame.highLight:Hide()
|
|
end
|
|
|
|
|
|
-- create rest of the frames
|
|
self:CreateTextFrame()
|
|
self:CreateInfoTextFrame()
|
|
self:CreateGuildTextFrame()
|
|
|
|
self:CreateBuffFrame(redraw)
|
|
self:CreateDebuffFrame(redraw)
|
|
|
|
self:CreateRaidIconFrame()
|
|
|
|
|
|
-- set up click casting
|
|
ClickCastFrames = ClickCastFrames or {}
|
|
ClickCastFrames[self.frame] = true
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateTextFrame()
|
|
self.frame.targetName = self:FontFactory(self.moduleSettings.fontSize+1, nil, self.frame.targetName)
|
|
self.frame.targetName:SetJustifyH("CENTER")
|
|
self.frame.targetName:SetJustifyV("TOP")
|
|
self.frame.targetName:SetAllPoints(self.frame)
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateInfoTextFrame()
|
|
self.frame.targetInfo = self:FontFactory(self.moduleSettings.fontSize, nil, self.frame.targetInfo)
|
|
|
|
-- self.frame.targetInfo:SetWidth(self.width)
|
|
self.frame.targetInfo:SetHeight(14)
|
|
self.frame.targetInfo:SetJustifyH("CENTER")
|
|
self.frame.targetInfo:SetJustifyV("TOP")
|
|
|
|
self.frame.targetInfo:SetPoint("TOP", self.frame, "TOP", 0, -16)
|
|
self.frame.targetInfo:Show()
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateGuildTextFrame()
|
|
self.frame.targetGuild = self:FontFactory(self.moduleSettings.fontSize, nil, self.frame.targetGuild)
|
|
|
|
-- self.frame.targetInfo:SetWidth(self.width)
|
|
self.frame.targetGuild:SetHeight(14)
|
|
self.frame.targetGuild:SetJustifyH("CENTER")
|
|
self.frame.targetGuild:SetJustifyV("TOP")
|
|
|
|
self.frame.targetGuild:SetPoint("TOP", self.frame, "BOTTOM", 0, 0)
|
|
self.frame.targetGuild:Show()
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateRaidIconFrame()
|
|
if (not self.frame.raidIcon) then
|
|
self.frame.raidIcon = CreateFrame("Frame", nil, self.frame)
|
|
end
|
|
|
|
if (not self.frame.raidIcon.icon) then
|
|
self.frame.raidIcon.icon = self.frame.raidIcon:CreateTexture(nil, "BACKGROUND")
|
|
self.frame.raidIcon.icon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons")
|
|
end
|
|
|
|
self.frame.raidIcon:SetPoint("BOTTOM", self.frame, "TOP", 0, 1)
|
|
self.frame.raidIcon:SetWidth(16)
|
|
self.frame.raidIcon:SetHeight(16)
|
|
|
|
self.frame.raidIcon.icon:SetAllPoints(self.frame.raidIcon)
|
|
SetRaidTargetIconTexture(self.frame.raidIcon.icon, 0)
|
|
self.frame.raidIcon:Hide()
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateBuffFrame(redraw)
|
|
if (not self.frame.buffFrame) then
|
|
self.frame.buffFrame = CreateFrame("Frame", nil, self.frame)
|
|
|
|
self.frame.buffFrame:SetFrameStrata("BACKGROUND")
|
|
self.frame.buffFrame:SetWidth(1)
|
|
self.frame.buffFrame:SetHeight(1)
|
|
|
|
self.frame.buffFrame:ClearAllPoints()
|
|
self.frame.buffFrame:SetPoint("TOPRIGHT", self.frame, "TOPLEFT", -10, 0)
|
|
self.frame.buffFrame:Show()
|
|
|
|
self.frame.buffFrame.buffs = {}
|
|
end
|
|
|
|
if (not redraw) then
|
|
self.frame.buffFrame.buffs = self:CreateIconFrames(self.frame.buffFrame, -1, self.frame.buffFrame.buffs, "buff")
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateDebuffFrame(redraw)
|
|
if (not self.frame.debuffFrame) then
|
|
self.frame.debuffFrame = CreateFrame("Frame", nil, self.frame)
|
|
|
|
self.frame.debuffFrame:SetFrameStrata("BACKGROUND")
|
|
self.frame.debuffFrame:SetWidth(1)
|
|
self.frame.debuffFrame:SetHeight(1)
|
|
|
|
self.frame.debuffFrame:ClearAllPoints()
|
|
self.frame.debuffFrame:SetPoint("TOPLEFT", self.frame, "TOPRIGHT", 10, 0)
|
|
self.frame.debuffFrame:Show()
|
|
|
|
self.frame.debuffFrame.buffs = {}
|
|
end
|
|
|
|
if (not redraw) then
|
|
self.frame.debuffFrame.buffs = self:CreateIconFrames(self.frame.debuffFrame, 1, self.frame.debuffFrame.buffs, "debuff")
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:CreateIconFrames(parent, direction, buffs, type)
|
|
local lastX = 0
|
|
local lastBuffSize = 0
|
|
|
|
for i = 1, IceCore.BuffLimit do
|
|
if (not buffs[i]) then
|
|
buffs[i] = CreateFrame("Frame", nil, parent)
|
|
buffs[i].icon = CreateFrame("Frame", nil, buffs[i])
|
|
buffs[i].cd = CreateFrame("Cooldown", nil, buffs[i], "CooldownFrameTemplate")
|
|
end
|
|
|
|
buffs[i]:SetFrameStrata("BACKGROUND")
|
|
if buffs[i].fromPlayer then
|
|
buffs[i]:SetWidth(self.moduleSettings.ownBuffSize)
|
|
buffs[i]:SetHeight(self.moduleSettings.ownBuffSize)
|
|
else
|
|
buffs[i]:SetWidth(self.moduleSettings.buffSize)
|
|
buffs[i]:SetHeight(self.moduleSettings.buffSize)
|
|
end
|
|
|
|
buffs[i].icon:SetFrameStrata("BACKGROUND")
|
|
if buffs[i].fromPlayer then
|
|
buffs[i].icon:SetWidth(self.moduleSettings.ownBuffSize-2)
|
|
buffs[i].icon:SetHeight(self.moduleSettings.ownBuffSize-2)
|
|
else
|
|
buffs[i].icon:SetWidth(self.moduleSettings.buffSize-2)
|
|
buffs[i].icon:SetHeight(self.moduleSettings.buffSize-2)
|
|
end
|
|
|
|
buffs[i].cd:SetFrameStrata("BACKGROUND")
|
|
buffs[i].cd:SetFrameLevel(buffs[i].icon:GetFrameLevel()+1)
|
|
buffs[i].cd:SetReverse(true)
|
|
buffs[i].cd:ClearAllPoints()
|
|
buffs[i].cd:SetAllPoints(buffs[i])
|
|
|
|
|
|
local buffSize = self.moduleSettings.buffSize
|
|
if buffs[i].fromPlayer then
|
|
buffSize = self.moduleSettings.ownBuffSize
|
|
end
|
|
|
|
local pos = i % self.moduleSettings.perRow
|
|
if pos == 1 or self.moduleSettings.perRow == 1 then
|
|
lastX = 0
|
|
lastBuffSize = 0
|
|
end
|
|
|
|
local x = lastX + lastBuffSize
|
|
lastX = x
|
|
lastBuffSize = (buffSize * direction)
|
|
local y = math.floor((i-1) / self.moduleSettings.perRow) * math.max(self.moduleSettings.buffSize, self.moduleSettings.ownBuffSize) * -1
|
|
|
|
buffs[i]:ClearAllPoints()
|
|
if direction < 0 then
|
|
buffs[i]:SetPoint("TOPRIGHT", x, y)
|
|
else
|
|
buffs[i]:SetPoint("TOPLEFT", x, y)
|
|
end
|
|
|
|
|
|
buffs[i].icon:ClearAllPoints()
|
|
buffs[i].icon:SetPoint("CENTER", 0, 0)
|
|
|
|
-- buffs[i]:Show()
|
|
-- buffs[i].icon:Show()
|
|
|
|
if (not buffs[i].texture) then
|
|
buffs[i].texture = buffs[i]:CreateTexture()
|
|
buffs[i].texture:ClearAllPoints()
|
|
buffs[i].texture:SetAllPoints(buffs[i])
|
|
|
|
buffs[i].icon.texture = buffs[i].icon:CreateTexture()
|
|
buffs[i].icon.texture:SetTexture(nil)
|
|
|
|
buffs[i].icon.texture:ClearAllPoints()
|
|
buffs[i].icon.texture:SetAllPoints(buffs[i].icon)
|
|
end
|
|
|
|
buffs[i].icon.stack = self:FontFactory(self.moduleSettings.stackFontSize, buffs[i].icon, buffs[i].icon.stack,
|
|
"OUTLINE")
|
|
|
|
buffs[i].icon.stack:ClearAllPoints()
|
|
buffs[i].icon.stack:SetPoint("BOTTOMRIGHT" , buffs[i].icon, "BOTTOMRIGHT", 3, -1)
|
|
|
|
|
|
buffs[i].id = i
|
|
if (self.moduleSettings.mouseBuff) then
|
|
buffs[i]:EnableMouse(true)
|
|
buffs[i]:SetScript("OnEnter", function() self:BuffOnEnter(type) end)
|
|
buffs[i]:SetScript("OnLeave", function() GameTooltip:Hide() end)
|
|
else
|
|
buffs[i]:EnableMouse(false)
|
|
buffs[i]:SetScript("OnEnter", nil)
|
|
buffs[i]:SetScript("OnLeave", nil)
|
|
end
|
|
end
|
|
|
|
return buffs
|
|
end
|
|
|
|
function TargetInfo.prototype:SetBuffSize(buff)
|
|
|
|
end
|
|
|
|
function TargetInfo.prototype:UpdateBuffs()
|
|
local zoom = self.moduleSettings.zoom
|
|
local filter = false
|
|
|
|
if (self.moduleSettings.filter == "Always") then
|
|
filter = true
|
|
elseif (self.moduleSettings.filter == "In Combat") then
|
|
if (UnitAffectingCombat("player")) then
|
|
filter = true
|
|
end
|
|
end
|
|
|
|
local hostile = UnitCanAttack("player", "target")
|
|
|
|
|
|
for i = 1, IceCore.BuffLimit do
|
|
local buffName, buffRank, buffTexture, buffApplications, buffType, buffDuration, buffTimeLeft, isFromMe;
|
|
if IceHUD.WowVer >= 30000 then
|
|
buffName, buffRank, buffTexture, buffApplications, buffType, buffDuration, buffTimeLeft, isFromMe
|
|
= UnitAura("target", i, "HELPFUL" .. (filter and not hostile and "|PLAYER" or "")) --UnitBuff("target", i, filter and not hostile)
|
|
else
|
|
buffName, buffRank, buffTexture, buffApplications, buffDuration, buffTimeLeft
|
|
= UnitBuff("target", i, filter and not hostile)
|
|
|
|
isFromMe = buffDuration and buffTimeLeft
|
|
end
|
|
|
|
if (buffTexture) then
|
|
self.frame.buffFrame.buffs[i].icon.texture:SetTexture(buffTexture)
|
|
self.frame.buffFrame.buffs[i].icon.texture:SetTexCoord(zoom, 1-zoom, zoom, 1-zoom)
|
|
|
|
local alpha = buffTexture and 0.5 or 0
|
|
self.frame.buffFrame.buffs[i].texture:SetTexture(0, 0, 0, alpha)
|
|
|
|
-- cooldown frame
|
|
if (buffDuration and buffDuration > 0 and
|
|
buffTimeLeft and buffTimeLeft > 0) then
|
|
local start
|
|
if IceHUD.WowVer >= 30000 then
|
|
-- in wotlk, the "bufftimeleft" parameter is actually the ending time for the buff
|
|
start = buffTimeLeft - buffDuration
|
|
else
|
|
start = GetTime() - buffDuration + buffTimeLeft
|
|
end
|
|
self.frame.buffFrame.buffs[i].cd:SetCooldown(start, buffDuration)
|
|
self.frame.buffFrame.buffs[i].cd:Show()
|
|
else
|
|
self.frame.buffFrame.buffs[i].cd:Hide()
|
|
end
|
|
|
|
self.frame.buffFrame.buffs[i].fromPlayer = isFromMe
|
|
|
|
if (buffApplications and (buffApplications > 1)) then
|
|
self.frame.buffFrame.buffs[i].icon.stack:SetText(buffApplications)
|
|
else
|
|
self.frame.buffFrame.buffs[i].icon.stack:SetText(nil)
|
|
end
|
|
|
|
|
|
self.frame.buffFrame.buffs[i]:Show()
|
|
else
|
|
self.frame.buffFrame.buffs[i]:Hide()
|
|
end
|
|
end
|
|
|
|
self.frame.buffFrame.buffs = self:CreateIconFrames(self.frame.buffFrame, -1, self.frame.buffFrame.buffs, "buff")
|
|
|
|
for i = 1, IceCore.BuffLimit do
|
|
local buffName, buffRank, buffTexture, buffApplications, debuffDispelType,
|
|
debuffDuration, debuffTimeLeft, isFromMe = UnitAura("target", i, "HARMFUL" .. (filter and not hostile and "|PLAYER" or "")) --UnitDebuff("target", i, filter and not hostile)
|
|
|
|
if (buffTexture and (not hostile or not filter or (filter and debuffDuration))) then
|
|
|
|
local color = debuffDispelType and DebuffTypeColor[debuffDispelType] or DebuffTypeColor["none"]
|
|
local alpha = buffTexture and 1 or 0
|
|
self.frame.debuffFrame.buffs[i].texture:SetTexture(1, 1, 1, alpha)
|
|
self.frame.debuffFrame.buffs[i].texture:SetVertexColor(color.r, color.g, color.b)
|
|
|
|
-- cooldown frame
|
|
if (debuffDuration and debuffDuration > 0 and
|
|
debuffTimeLeft and debuffTimeLeft > 0) then
|
|
local start
|
|
if IceHUD.WowVer >= 30000 then
|
|
-- in wotlk, the "bufftimeleft" parameter is actually the ending time for the buff
|
|
start = debuffTimeLeft - debuffDuration
|
|
else
|
|
start = GetTime() - debuffDuration + debuffTimeLeft
|
|
end
|
|
self.frame.debuffFrame.buffs[i].cd:SetCooldown(start, debuffDuration)
|
|
self.frame.debuffFrame.buffs[i].cd:Show()
|
|
else
|
|
self.frame.debuffFrame.buffs[i].cd:Hide()
|
|
end
|
|
|
|
self.frame.debuffFrame.buffs[i].fromPlayer = isFromMe
|
|
|
|
self.frame.debuffFrame.buffs[i].icon.texture:SetTexture(buffTexture)
|
|
self.frame.debuffFrame.buffs[i].icon.texture:SetTexCoord(zoom, 1-zoom, zoom, 1-zoom)
|
|
|
|
if (buffApplications and (buffApplications > 1)) then
|
|
self.frame.debuffFrame.buffs[i].icon.stack:SetText(buffApplications)
|
|
else
|
|
self.frame.debuffFrame.buffs[i].icon.stack:SetText(nil)
|
|
end
|
|
|
|
|
|
self.frame.debuffFrame.buffs[i]:Show()
|
|
else
|
|
self.frame.debuffFrame.buffs[i]:Hide()
|
|
end
|
|
end
|
|
|
|
self.frame.debuffFrame.buffs = self:CreateIconFrames(self.frame.debuffFrame, 1, self.frame.debuffFrame.buffs, "debuff")
|
|
end
|
|
|
|
|
|
|
|
function TargetInfo.prototype:AuraChanged(unit)
|
|
if (unit == target) then
|
|
self:UpdateBuffs()
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:UpdateRaidTargetIcon()
|
|
if not (UnitExists(target)) then
|
|
self.frame.raidIcon:Hide()
|
|
return
|
|
end
|
|
|
|
local index = GetRaidTargetIndex(target);
|
|
|
|
if (index and (index > 0)) then
|
|
SetRaidTargetIconTexture(self.frame.raidIcon.icon, index)
|
|
self.frame.raidIcon:Show()
|
|
else
|
|
self.frame.raidIcon:Hide()
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:TargetChanged()
|
|
TargetInfo.super.prototype.TargetChanged(self)
|
|
|
|
if (not UnitExists(target)) then
|
|
--self.frame:Hide()
|
|
--self.frame.target:Hide()
|
|
|
|
self.frame.targetName:SetText()
|
|
self.frame.targetInfo:SetText()
|
|
self.frame.targetGuild:SetText()
|
|
|
|
self:UpdateBuffs()
|
|
self:UpdateRaidTargetIcon()
|
|
return
|
|
end
|
|
|
|
|
|
-- pass "internal" as a paramater so event handler code doesn't execute
|
|
-- Update() unnecassarily
|
|
|
|
self:TargetName(internal)
|
|
|
|
self:TargetLevel(internal)
|
|
self:TargetReaction(internal)
|
|
self:TargetFaction(internal)
|
|
self:TargetFlags(internal)
|
|
|
|
self:UpdateBuffs()
|
|
self:UpdateRaidTargetIcon()
|
|
|
|
self:Update(target)
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:TargetName(unit)
|
|
if (unit == target or unit == internal) then
|
|
self.name, self.realm = UnitName(target)
|
|
self.classLocale, self.classEnglish = UnitClass(target)
|
|
self.isPlayer = UnitIsPlayer(target)
|
|
|
|
|
|
local classification = UnitClassification(target) or ""
|
|
if (string.find(classification, "boss")) then
|
|
self.classification = " |cffcc1111Boss|r"
|
|
elseif(string.find(classification, "rare")) then
|
|
self.classification = " |cffcc11ccRare|r"
|
|
else
|
|
self.classification = ""
|
|
end
|
|
|
|
|
|
local guildName, guildRankName, guildRankIndex = GetGuildInfo(target);
|
|
self.guild = guildName and "<" .. guildName .. ">" or ""
|
|
|
|
|
|
if (self.classLocale and self.isPlayer) then
|
|
self.classLocale = "|c" .. self:GetHexColor(self.classEnglish) .. self.classLocale .. "|r"
|
|
else
|
|
self.classLocale = UnitCreatureType(target)
|
|
end
|
|
|
|
|
|
self.leader = UnitIsPartyLeader(target) and " |cffcccc11Leader|r" or ""
|
|
self:Update(unit)
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:TargetLevel(unit)
|
|
if (unit == target or unit == internal) then
|
|
self.level = UnitLevel(target)
|
|
|
|
local color = GetDifficultyColor((self.level > 0) and self.level or 100)
|
|
|
|
if (self.level > 0) then
|
|
if (UnitClassification(target) == "elite") then
|
|
self.level = self.level .. "+"
|
|
end
|
|
else
|
|
self.level = "??"
|
|
end
|
|
|
|
self.level = "|c" .. self:ConvertToHex(color) .. self.level .. "|r"
|
|
|
|
self:Update(unit)
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:TargetReaction(unit)
|
|
if (unit == target or unit == internal) then
|
|
self.reaction = UnitReaction(target, "player")
|
|
|
|
-- if we don't get reaction, unit is out of range - has to be friendly
|
|
-- to be targettable (party/raid)
|
|
if (not self.reaction) then
|
|
self.reaction = 5
|
|
end
|
|
self:Update(unit)
|
|
end
|
|
end
|
|
|
|
|
|
-- PVP status
|
|
function TargetInfo.prototype:TargetFaction(unit)
|
|
if (unit == target or unit == internal) then
|
|
if (self.isPlayer) then
|
|
if (UnitIsPVP(target)) then
|
|
local color = "ff10ff10" -- friendly
|
|
if (UnitFactionGroup(target) ~= UnitFactionGroup("player")) then
|
|
color = "ffff1010" -- hostile
|
|
end
|
|
self.pvp = " |c" .. color .. "PvP|r"
|
|
else
|
|
self.pvp = " |cff1010ffPvE|r"
|
|
end
|
|
else
|
|
self.pvp = ""
|
|
end
|
|
|
|
self:TargetReaction(unit)
|
|
self:Update(unit)
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:TargetFlags(unit)
|
|
if (unit == target or unit == internal) then
|
|
self.tapped = UnitIsTapped(target) and (not UnitIsTappedByPlayer(target))
|
|
self.targetCombat = UnitAffectingCombat(target) and " |cffee4030Combat|r" or ""
|
|
self:UpdateBuffs()
|
|
self:Update(unit)
|
|
end
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:Update(unit)
|
|
if (unit ~= target) then
|
|
return
|
|
end
|
|
|
|
if DogTag == nil then
|
|
self.frame.targetName:SetText(self.name or '')
|
|
self.frame.targetName:SetVertexColor(UnitSelectionColor("target"))
|
|
|
|
local line2 = string.format("%s %s%s%s%s%s",
|
|
self.level or '', self.classLocale or '', self.pvp or '', self.leader or '', self.classification or '', self.targetCombat or '')
|
|
self.frame.targetInfo:SetText(line2)
|
|
|
|
local realm = self.realm and " " .. self.realm or ""
|
|
local line3 = string.format("%s%s", self.guild or '', realm)
|
|
self.frame.targetGuild:SetText(line3)
|
|
end
|
|
|
|
-- Parnic - i have no idea why i have to force UpdateFontString here...but
|
|
-- if i just do AllForFrame or AllForUnit, then selecting a unit after
|
|
-- having nothing selected refuses to update the frames...*sigh*
|
|
if DogTag ~= nil then
|
|
DogTag:UpdateFontString(self.frame.targetName)
|
|
DogTag:UpdateFontString(self.frame.targetInfo)
|
|
DogTag:UpdateFontString(self.frame.targetGuild)
|
|
end
|
|
|
|
self:UpdateAlpha()
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:OnEnter(frame)
|
|
UnitFrame_OnEnter(frame)
|
|
self.frame.highLight:Show()
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:OnLeave(frame)
|
|
UnitFrame_OnLeave(frame)
|
|
self.frame.highLight:Hide()
|
|
end
|
|
|
|
|
|
function TargetInfo.prototype:BuffOnEnter(type)
|
|
if (not this:IsVisible()) then
|
|
return
|
|
end
|
|
|
|
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
|
|
if (type == "buff") then
|
|
GameTooltip:SetUnitBuff(target, this.id)
|
|
else
|
|
GameTooltip:SetUnitDebuff(target, this.id)
|
|
end
|
|
end
|
|
|
|
|
|
-- Load us up
|
|
IceHUD.TargetInfo = TargetInfo:new()
|