--get the addon namespace
local addon, ns = ...
--get the config values
local cfg = ns.cfg
---------------------------------------
-- CONSTANTS
---------------------------------------
local _G = _G
--disable consolidated buffs
SetCVar("consolidateBuffs", 0)
local BuffFrame = _G["BuffFrame"]
local TemporaryEnchantFrame = _G["TemporaryEnchantFrame"]
local ConsolidatedBuffs = _G["ConsolidatedBuffs"]
--rewrite the oneletter shortcuts
HOUR_ONELETTER_ABBR = "%dh";
DAY_ONELETTER_ABBR = "%dd";
MINUTE_ONELETTER_ABBR = "%dm";
SECOND_ONELETTER_ABBR = "%ds";
--classcolor
local classcolor = RAID_CLASS_COLORS[select(2, UnitClass("player"))]
if cfg.color.classcolored then
cfg.color.normal = classcolor
end
if cfg.background.classcolored then
cfg.background.shadowcolor = classcolor
end
--backdrop
local backdrop = {
bgFile = "",
edgeFile = cfg.textures.outer_shadow,
tile = false,
tileSize = 32,
edgeSize = cfg.background.inset,
insets = {
left = cfg.background.inset,
right = cfg.background.inset,
top = cfg.background.inset,
bottom = cfg.background.inset,
},
}
---------------------------------------
-- FUNCTIONS
---------------------------------------
--allows frames to become movable but frames can be locked or set to default positions
local function applyDragFunctionality(f,userplaced,locked)
f:SetScript("OnDragStart", function(s) if IsAltKeyDown() and IsShiftKeyDown() then s:StartMoving() end end)
f:SetScript("OnDragStop", function(s) s:StopMovingOrSizing() end)
local t = f:CreateTexture(nil,"OVERLAY",nil,6)
t:SetAllPoints(f)
t:SetTexture(0,1,0)
t:SetAlpha(0)
f.dragtexture = t
f:SetHitRectInsets(-15,-15,-15,-15)
f:SetClampedToScreen(true)
if not userplaced then
f:SetMovable(false)
else
f:SetMovable(true)
f:SetUserPlaced(true)
if not locked then
f.dragtexture:SetAlpha(0.2)
f:EnableMouse(true)
f:RegisterForDrag("LeftButton")
f:SetScript("OnEnter", function(s)
GameTooltip:SetOwner(s, "ANCHOR_TOP")
GameTooltip:AddLine(s:GetName(), 0, 1, 0.5, 1, 1, 1)
GameTooltip:AddLine("Hold down ALT+SHIFT to drag!", 1, 1, 1, 1, 1, 1)
GameTooltip:Show()
end)
f:SetScript("OnLeave", function(s) GameTooltip:Hide() end)
else
f.dragtexture:SetAlpha(0)
f:EnableMouse(nil)
f:RegisterForDrag(nil)
f:SetScript("OnEnter", nil)
f:SetScript("OnLeave", nil)
end
end
end
--update wpn enchant icon positions
local function updateTempEnchantAnchors()
local previousBuff
for i=1, NUM_TEMP_ENCHANT_FRAMES do
local b = _G["TempEnchant"..i]
if b then
if (i == 1) then
b:SetPoint("TOPRIGHT", TemporaryEnchantFrame, "TOPRIGHT", 0, 0)
else
b:SetPoint("RIGHT", previousBuff, "LEFT", -cfg.tempenchant.colSpacing, 0)
end
previousBuff = b
end
end
end
--create drag frame for temp enchant icons
local function createTempEnchantHolder()
local f = CreateFrame("Frame", "rBFS_TempEnchantHolder", UIParent)
f:SetSize(50,50)
f:SetPoint(cfg.tempenchant.pos.a1,cfg.tempenchant.pos.af,cfg.tempenchant.pos.a2,cfg.tempenchant.pos.x,cfg.tempenchant.pos.y)
applyDragFunctionality(f,cfg.tempenchant.userplaced,cfg.tempenchant.locked)
end
--create drag frame for buff icons
local function createBuffFrameHolder()
local f = CreateFrame("Frame", "rBFS_BuffFrameHolder", UIParent)
f:SetSize(50,50)
f:SetPoint(cfg.buffframe.pos.a1,cfg.buffframe.pos.af,cfg.buffframe.pos.a2,cfg.buffframe.pos.x,cfg.buffframe.pos.y)
applyDragFunctionality(f,cfg.buffframe.userplaced,cfg.buffframe.locked)
end
--move tempenchant frame
local function moveTempEnchantFrame()
local f = _G["rBFS_TempEnchantHolder"]
TemporaryEnchantFrame:SetParent(f)
TemporaryEnchantFrame:ClearAllPoints()
TemporaryEnchantFrame:SetPoint("TOPRIGHT",0,0)
end
--move buff frame
local function moveBuffFrame()
local f = _G["rBFS_BuffFrameHolder"]
BuffFrame:SetParent(f)
BuffFrame:ClearAllPoints()
BuffFrame:SetPoint("TOPRIGHT",0,0)
end
--apply aura frame texture func
local function applySkin(b,type)
if not b or (b and b.styled) then return end
local name = b:GetName()
--print("applying skin for "..name)
local border = _G[name.."Border"]
local icon = _G[name.."Icon"]
if border then
border:SetTexture(cfg.textures.normal)
border:SetTexCoord(0,1,0,1)
border:SetDrawLayer("BACKGROUND",-7)
if type == "wpn" then
border:SetVertexColor(0.7,0,1)
end
border:ClearAllPoints()
border:SetAllPoints(b)
b.Border = border
else
--create border (for buff icons)
local new = b:CreateTexture(nil,"BACKGROUND",nil,-7)
new:SetAllPoints(b)
new:SetTexture(cfg.textures.normal)
new:SetVertexColor(cfg.color.normal.r,cfg.color.normal.g,cfg.color.normal.b)
b.Border = border
end
--icon
icon:SetTexCoord(0.1,0.9,0.1,0.9)
icon:SetPoint("TOPLEFT", b, "TOPLEFT", 2, -2)
icon:SetPoint("BOTTOMRIGHT", b, "BOTTOMRIGHT", -2, 2)
icon:SetDrawLayer("BACKGROUND",-8)
--duration
b.duration:SetFont(cfg.font, cfg.duration.fontsize, "THINOUTLINE")
b.duration:ClearAllPoints()
b.duration:SetPoint(cfg.duration.pos.a1,cfg.duration.pos.x,cfg.duration.pos.y)
--count
b.count:SetFont(cfg.font, cfg.count.fontsize, "THINOUTLINE")
b.count:ClearAllPoints()
b.count:SetPoint(cfg.count.pos.a1,cfg.count.pos.x,cfg.count.pos.y)
--shadow
if cfg.background.showshadow then
local back = CreateFrame("Frame", nil, b)
back:SetPoint("TOPLEFT", b, "TOPLEFT", -4, 4)
back:SetPoint("BOTTOMRIGHT", b, "BOTTOMRIGHT", 4, -4)
back:SetFrameLevel(b:GetFrameLevel()-1)
back:SetBackdrop(backdrop)
back:SetBackdropBorderColor(cfg.background.shadowcolor.r,cfg.background.shadowcolor.g,cfg.background.shadowcolor.b,cfg.background.shadowcolor.a)
end
--set button styled variable
b.styled = true
end
--update buff anchors
local function updateBuffAnchors()
--print(BUFF_ACTUAL_DISPLAY)
local numBuffs = 0
local buff, previousBuff, aboveBuff
for i = 1, BUFF_ACTUAL_DISPLAY do
buff = _G["BuffButton"..i]
if not buff.styled then applySkin(buff,"buff") end
buff:SetParent(BuffFrame)
buff.consolidated = nil
buff.parent = BuffFrame
buff:ClearAllPoints()
numBuffs = numBuffs + 1
index = numBuffs
if ((index > 1) and (mod(index, cfg.buffframe.buffsPerRow) == 1)) then
buff:SetPoint("TOP", aboveBuff, "BOTTOM", 0, -cfg.buffframe.rowSpacing)
aboveBuff = buff
elseif (index == 1) then
buff:SetPoint("TOPRIGHT", BuffFrame, "TOPRIGHT", 0, 0)
aboveBuff = buff
else
buff:SetPoint("RIGHT", previousBuff, "LEFT", -cfg.buffframe.colSpacing, 0)
end
previousBuff = buff
end
end
--update debuff anchors
local function updateDebuffAnchors(buttonName,index)
local numBuffs = BUFF_ACTUAL_DISPLAY
local rows = ceil(numBuffs/cfg.buffframe.buffsPerRow)
local gap = cfg.buffframe.gap
if rows == 0 then gap = 0 end
local buff = _G[buttonName..index]
if not buff.styled then applySkin(buff,"debuff") end
-- Position debuffs
if ((index > 1) and (mod(index, cfg.buffframe.buffsPerRow) == 1)) then
buff:SetPoint("TOP", _G[buttonName..(index-cfg.buffframe.buffsPerRow)], "BOTTOM", 0, -cfg.buffframe.rowSpacing)
elseif (index == 1) then
buff:SetPoint("TOPRIGHT", BuffFrame, "TOPRIGHT", 0, -(rows*(cfg.buffframe.rowSpacing+buff:GetHeight())+gap))
else
buff:SetPoint("RIGHT", _G[buttonName..(index-1)], "LEFT", -cfg.buffframe.colSpacing, 0)
end
end
--create drag frames
createTempEnchantHolder()
createBuffFrameHolder()
--init func
local function init()
--BuffFrame scale
BuffFrame:SetScale(cfg.buffframe.scale)
--temp enchantframe scale
TemporaryEnchantFrame:SetScale(cfg.tempenchant.scale)
--position buff frame
moveBuffFrame()
--position temp enchant icons
moveTempEnchantFrame()
--skin temp enchant
for i=1, NUM_TEMP_ENCHANT_FRAMES do
local b = _G["TempEnchant"..i]
if b and not b.styled then
applySkin(b, "wpn")
end
end
--move temp enchant icons in position
updateTempEnchantAnchors()
--hook the consolidatedbuffs
if ConsolidatedBuffs then
ConsolidatedBuffs:UnregisterAllEvents()
ConsolidatedBuffs:HookScript("OnShow", function(s)
s:Hide()
moveTempEnchantFrame()
end)
ConsolidatedBuffs:HookScript("OnHide", function(s)
moveTempEnchantFrame()
end)
ConsolidatedBuffs:Hide()
end
end
---------------------------------------
-- CALLS // HOOKS
---------------------------------------
--hook Blizzard functions to move the buffframe
hooksecurefunc("BuffFrame_UpdateAllBuffAnchors", updateBuffAnchors)
hooksecurefunc("DebuffButton_UpdateAnchors", updateDebuffAnchors)
local a = CreateFrame("Frame")
a:RegisterEvent("PLAYER_LOGIN")
a:SetScript("OnEvent", init)