idUnitframes = AceLibrary('AceAddon-2.0'):new('AceDB-2.0', 'AceEvent-2.0', 'AceHook-2.0')
idUnitframes.Frames = {}
function idUnitframes:OnEnable()
self.Constants = {
Global = {
Scale = 1,
Alpha = 1
},
Background = {
Padding = 5,
},
Bar = {
Width = 150,
Height = 15,
Texture = 'Interface\\AddOns\\idUnitframes\\textures\\bar'
},
Healthbar = {
Color = {
r = 49/255,
g = 227/255,
b = 37/255
}
},
Powerbar = {
Color = {
Druid = {r = 49/255, g = 37/255, b = 227/255},
Hunter = {r = 1.00, g = 1.00, b = 34/255},
Mage = {r = 49/255, g = 37/255, b = 227/255},
Paladin = {r = 49/255, g = 37/255, b = 227/255},
Priest = {r = 49/255, g = 37/255, b = 227/255},
Rogue = {r = 1.00, g = 1.00, b = 34/255},
Shaman = {r = 49/255, g = 37/255, b = 227/255},
Warlock = {r = 49/255, g = 37/255, b = 227/255},
Warrior = {r = 255/255, g = 0, b = 0}
}
},
Nametext = {
Class = {
Druid = 'Dru',
Hunter = 'Hun',
Mage = 'Mag',
Paladin = 'Pal',
Priest = 'Pri',
Rogue = 'Rog',
Shaman = 'Shm',
Warlock = 'Wlk',
Warrior = 'War'
}
},
Buff = {
Width = 40,
Height = 40
}
}
PlayerFrame:Hide()
TargetFrame:Hide()
PlayerFrame:SetScript('OnShow', function() PlayerFrame:Hide() end)
TargetFrame:SetScript('OnShow', function() TargetFrame:Hide() end)
self:createPlayerframe()
self:createTargetframe()
self:RegisterEvent('UNIT_HEALTH', function()
if arg1 == 'player' then
self:updateHealth('player')
elseif arg1 == 'target' then
self:updateHealth('target')
end
end)
self:RegisterEvent('UNIT_MAX_HEALTH', function()
if arg1 == 'player' then
self:updateHealth('player')
elseif arg1 == 'target' then
self:updateHealth('target')
end
end)
self:RegisterEvent('UNIT_MANA', function()
if arg1 == 'player' then
self:updatePower('player')
elseif arg1 == 'target' then
self:updatePower('target')
end
end)
self:RegisterEvent('UNIT_MAXMANA', function()
if arg1 == 'player' then
self:updatePower('player')
elseif arg1 == 'target' then
self:updatePower('target')
end
end)
self:RegisterEvent('UNIT_RAGE', function()
if arg1 == 'player' then
self:updatePower('player')
elseif arg1 == 'target' then
self:updatePower('target')
end
end)
self:RegisterEvent('UNIT_MAXRAGE', function()
if arg1 == 'player' then
self:updatePower('player')
elseif arg1 == 'target' then
self:updatePower('target')
end
end)
self:RegisterEvent('UNIT_AURA', function()
if arg1 == 'player' then
self:updateBuffs('player')
self:updateDebuffs('player')
elseif arg1 == 'target' then
self:updateBuffs('target')
self:updateDebuffs('target')
end
end)
self:RegisterEvent('PLAYER_TARGET_CHANGED', function()
if UnitExists('target') then
self:updateHealth('target')
self:updatePower('target')
self.Frames.target.Healthbar.Background:SetVertexColor(self.Constants.Healthbar.Color.r/5, self.Constants.Healthbar.Color.g/5, self.Constants.Healthbar.Color.b/5, 1)
self.Frames.target.Powerbar.Background:SetVertexColor(self.Constants.Powerbar.Color[UnitClass('target')].r/5, self.Constants.Powerbar.Color[UnitClass('target')].g/5, self.Constants.Powerbar.Color[UnitClass('target')].b/5, 1)
self:updateBuffs('target')
self:updateDebuffs('target')
self:updateName('target')
self.Frames.target:Show()
else
self.Frames.target:Hide()
end
end)
self.Frames.player:SetPoint('BOTTOM', UIParent, 'BOTTOM', 0, 150)
self.Frames.target:SetPoint('BOTTOM', self.Frames.player, 'TOP', 0, 1)
self.Frames.player:Show()
end
function idUnitframes:OnDisable()
self.Constants = nil
PlayerFrame:Show()
TargetFrame:Show()
PlayerFrame:SetScript('OnShow', nil)
TargetFrame:SetScript('OnShow', nil)
end
function idUnitframes:createPlayerframe()
self.Frames.player = self:newFrame()
self.Frames.player.unit = 'player'
self:updateHealth('player')
self:updatePower('player')
self.Frames.player.Healthbar.Background:SetVertexColor(self.Constants.Healthbar.Color.r/5, self.Constants.Healthbar.Color.g/5, self.Constants.Healthbar.Color.b/5, 1)
self.Frames.player.Powerbar.Background:SetVertexColor(self.Constants.Powerbar.Color[UnitClass('player')].r/5, self.Constants.Powerbar.Color[UnitClass('player')].g/5, self.Constants.Powerbar.Color[UnitClass('player')].b/5, 1)
self:updateBuffs('player')
self:updateDebuffs('player')
self:updateName('player')
end
function idUnitframes:createTargetframe()
self.Frames.target = self:newFrame()
self.Frames.target.unit = 'target'
end
function idUnitframes:newFrame()
local Font, _, _ = GameFontHighlightSmall:GetFont()
local Background = CreateFrame('Button', name, UIParent)
local Healthbar = CreateFrame('StatusBar', nil, Background)
Healthbar.Background = Healthbar:CreateTexture(nil, 'BACKGROUND')
local Powerbar = CreateFrame('StatusBar', nil, Background)
Powerbar.Background = Powerbar:CreateTexture(nil, 'BACKGROUND')
local Name = Background:CreateFontString(nil, 'OVERLAY')
local Debuffs = CreateFrame('Frame', nil, Background)
local Buffs = CreateFrame('Frame', nil, Background)
Healthbar:SetWidth(self.Constants.Bar.Width)
Healthbar:SetHeight(self.Constants.Bar.Height)
Healthbar:SetScale(self.Constants.Global.Scale)
Healthbar:SetAlpha(self.Constants.Global.Alpha)
Healthbar:SetStatusBarTexture(self.Constants.Bar.Texture)
Healthbar:SetStatusBarColor(self.Constants.Healthbar.Color.r, self.Constants.Healthbar.Color.g, self.Constants.Healthbar.Color.b)
Healthbar.Background:SetTexture('Interface\\Tooltips\\UI-Tooltip-Background')
Healthbar.Background:SetAllPoints(Healthbar)
Powerbar:SetWidth(self.Constants.Bar.Width)
Powerbar:SetHeight(self.Constants.Bar.Height)
Powerbar:SetScale(self.Constants.Global.Scale)
Powerbar:SetAlpha(self.Constants.Global.Alpha)
Powerbar:SetStatusBarTexture(self.Constants.Bar.Texture)
Powerbar.Background:SetTexture('Interface\\Tooltips\\UI-Tooltip-Background')
Powerbar.Background:SetAllPoints(Powerbar)
Background:SetWidth(self.Constants.Background.Padding*3 + self.Constants.Bar.Width + self.Constants.Bar.Width)
Background:SetHeight(self.Constants.Background.Padding*2 + self.Constants.Bar.Height)
Background:SetScale(self.Constants.Global.Scale)
Background:SetAlpha(self.Constants.Global.Alpha)
Background:SetBackdrop({
bgFile = 'Interface\\Tooltips\\UI-Tooltip-Background',
edgeFile = '',
edgeSize = 0,
tile = true,
tileSize = 16,
insets = {left = 0, right = 0, top = 0, bottom = 0}
})
Background:SetBackdropColor(0,0,0,0.6)
Background:EnableMouse(true)
--Background:SetMovable(true)
--Background:RegisterForDrag('LeftButton')
--Background:SetScript('OnDragStart', function() if IsAltKeyDown() then self.frames[u]:StartMoving() end end)
--Background:SetScript('OnDragStop', function() self.frames[u]:StopMovingOrSizing() self:savePosition() end)
Background:SetScript('OnEnter', function() UnitFrame_OnEnter() end)
Background:SetScript('OnLeave', function() UnitFrame_OnLeave() end)
Background:RegisterForClicks('LeftButtonUp','RightButtonUp','MiddleButtonUp','Button4Up','Button5Up')
Background:SetScript('OnClick', self.OnClick)
Name:SetFontObject(GameFontNormal)
Name:SetFont(Font, 11)
Name:SetHeight(Background:GetHeight())
Name:SetWidth(Healthbar:GetWidth())
Name:SetTextColor(1, 1, 1)
Name:SetJustifyH('RIGHT')
Name:SetJustifyV('CENTER')
for i=1,16 do
Debuffs[i] = CreateFrame('Button', nil, Debuffs)
Debuffs[i].Icon = Debuffs[i]:CreateTexture(nil, 'BACKGROUND')
Debuffs[i]:SetWidth(0) -- buffs fill in from the right
Debuffs[i]:SetHeight(Background:GetHeight())
Debuffs[i]:ClearAllPoints()
if i>1 then Debuffs[i]:SetPoint('LEFT', Debuffs[i-1], 'RIGHT') end
Debuffs[i].Icon:SetAllPoints(Debuffs[i])
Debuffs[i]:SetScript('OnEnter', self.OnAuraEnter)
Debuffs[i]:SetScript('OnLeave', function() GameTooltip:Hide() end)
Debuffs[i]:Show()
Buffs[i] = CreateFrame('Button', nil, Buffs)
Buffs[i].Icon = Buffs[i]:CreateTexture(nil, 'BACKGROUND')
Buffs[i]:SetWidth(0) -- buffs fill in from the right
Buffs[i]:SetHeight(Background:GetHeight())
Buffs[i]:ClearAllPoints()
if i>1 then Buffs[i]:SetPoint('LEFT', Buffs[i-1], 'RIGHT') end
Buffs[i].Icon:SetAllPoints(Buffs[i])
Buffs[i]:SetScript('OnEnter', self.OnAuraEnter)
Buffs[i]:SetScript('OnLeave', function() GameTooltip:Hide() end)
Buffs[i]:Show()
end
Debuffs[1]:SetPoint('LEFT', Debuffs, 'LEFT')
Buffs[1]:SetPoint('LEFT', Buffs, 'LEFT')
Debuffs:SetHeight(Background:GetHeight())
Debuffs:ClearAllPoints()
Debuffs:SetPoint('LEFT', Background, 'RIGHT', self.Constants.Background.Padding, 0)
Buffs:SetHeight(Background:GetHeight())
Buffs:ClearAllPoints()
Buffs:SetPoint('LEFT', Debuffs, 'RIGHT', self.Constants.Background.Padding, 0)
Healthbar:SetPoint('TOPLEFT', Background, 'TOPLEFT', self.Constants.Background.Padding, -self.Constants.Background.Padding)
Powerbar:SetPoint('LEFT', Healthbar, 'RIGHT', self.Constants.Background.Padding, 0)
Name:SetPoint('RIGHT', Background, 'LEFT', -self.Constants.Background.Padding, 0)
Background.Healthbar = Healthbar
Background.Powerbar = Powerbar
Background.Name = Name
Background.Debuffs = Debuffs
Background.Buffs = Buffs
Background:Hide()
return Background
end
function idUnitframes:updateHealth(Unit)
if not UnitExists(Unit) then return end
local Health = UnitHealth(Unit)
local Maxhealth = UnitHealthMax(Unit)
local r,g,b = self.Constants.Healthbar.Color.r, self.Constants.Healthbar.Color.g, self.Constants.Healthbar.Color.b
self.Frames[Unit].Healthbar:SetStatusBarColor(r, g, b, 1)
self.Frames[Unit].Healthbar:SetMinMaxValues(0, Maxhealth)
self.Frames[Unit].Healthbar:SetValue(Health)
end
function idUnitframes:updatePower(Unit)
if not UnitExists(Unit) then return end
local Health = UnitMana(Unit)
local Maxhealth = UnitManaMax(Unit)
local r = self.Constants.Powerbar.Color[UnitClass(Unit)].r
local g = self.Constants.Powerbar.Color[UnitClass(Unit)].g
local b = self.Constants.Powerbar.Color[UnitClass(Unit)].b
self.Frames[Unit].Powerbar:SetStatusBarColor(r, g, b, 1)
self.Frames[Unit].Powerbar:SetMinMaxValues(0, Maxhealth)
self.Frames[Unit].Powerbar:SetValue(Health)
end
function idUnitframes:updateBuffs(Unit)
if not UnitExists(Unit) then return end
local Buff
local Buffslength = 0
for i = 1, 16 do
Buff = UnitBuff(Unit, i)
if (Buff) then
self.Frames[Unit].Buffs[i]:SetWidth(self.Frames[Unit]:GetHeight())
self.Frames[Unit].Buffs[i].Icon:SetTexture(Buff)
self.Frames[Unit].Buffs[i].index = i
Buffslength = Buffslength + self.Frames[Unit].Buffs[i]:GetWidth()
else
self.Frames[Unit].Buffs[i].Icon:SetTexture(nil)
self.Frames[Unit].Buffs[i].index = nil
self.Frames[Unit].Buffs[i]:SetWidth(0)
end
Buff = nil
end
self.Frames[Unit].Buffs:SetWidth(self.Constants.Background.Padding+Buffslength)
end
function idUnitframes:updateDebuffs(Unit)
if not UnitExists(Unit) then return end
local Buff
local Buffslength = 0
for i = 1, 16 do
Buff = UnitDebuff(Unit, i)
if (Buff) then
self.Frames[Unit].Debuffs[i]:SetWidth(self.Frames[Unit]:GetHeight())
self.Frames[Unit].Debuffs[i].Icon:SetTexture(Buff)
self.Frames[Unit].Debuffs[i].index = i
Buffslength = Buffslength + self.Frames[Unit].Debuffs[i]:GetWidth()
else
self.Frames[Unit].Debuffs[i].Icon:SetTexture(nil)
self.Frames[Unit].Debuffs[i].index = nil
self.Frames[Unit].Debuffs[i]:SetWidth(0)
end
Buff = nil
end
if Buffslength > 0 then
self.Frames[Unit].Buffs:ClearAllPoints()
self.Frames[Unit].Buffs:SetPoint('LEFT', self.Frames[Unit].Debuffs, 'RIGHT', self.Constants.Background.Padding, 0)
self.Frames[Unit].Debuffs:Show()
self.Frames[Unit].Debuffs:SetWidth(Buffslength)
else
self.Frames[Unit].Buffs:ClearAllPoints()
self.Frames[Unit].Buffs:SetPoint('LEFT', self.Frames[Unit], 'RIGHT', self.Constants.Background.Padding, 0)
self.Frames[Unit].Debuffs:Hide()
end
end
function idUnitframes:updateName(Unit)
if not UnitExists(Unit) then return end
self.Frames[Unit].Name:SetText(string.format('%s %s %s', UnitName(Unit), UnitLevel(Unit), self.Constants.Nametext.Class[UnitClass(Unit)]))
end
function idUnitframes:OnClick()
local b,u = arg1, this.unit
if not UnitExists(u) then return end
if UnitIsUnit(u, 'player') then u = 'player' end
if b == 'LeftButton' then
if SpellIsTargeting() then
SpellTargetUnit(u)
elseif CursorHasItem() then
if UnitIsUnit(u, 'player') then
AutoEquipCursorItem()
elseif UnitIsFriend(u, 'player') and UnitIsPlayer(u) then
DropItemOnUnit('target')
end
else
TargetUnit(u)
end
elseif b == 'RightButton' then
u = oUF:strcap(u)
if string.find(u,'Party') then
ToggleDropDownMenu(1, nil, getglobal('PartyMemberFrame'..this:GetID()..'DropDown'), 'cursor', 0, 0)
else
ToggleDropDownMenu(1, nil, getglobal(u..'FrameDropDown'), 'cursor', 0, 0)
end
end
end
function idUnitframes:OnAuraEnter()
local u, i = this:GetParent():GetParent().unit, this.id
if not this:IsVisible() then return end
GameTooltip:SetOwner(this, 'ANCHOR_BOTTOMRIGHT')
local unit = this:GetParent().u
if (this.isdebuff) then
GameTooltip:SetUnitDebuff(u, i)
else
GameTooltip:SetUnitBuff(u, i)
end
end