--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)