Quantcast
--[[

  Adrian L Lange grants anyone the right to use this work for any purpose,
  without any conditions, unless such conditions are required by law.

--]]

--some settings have been omved to here, for easier changing
local minalpha = 0
local maxalpha = 1
local pbn="oUF_PowerBar"
local height=8
local width=150
--local castbaroffset = 80
--local castbarheight = 16
--local castbarbuttonsize = 21
--local playertargetheight = 27
--local playertargetwidth = 180
--local petheight = 27
--local petwidth = 130
--local focustargettargetheight = 20
--local focustargettargetwidth = playertargetwidth * .80
--local debuffsize = 10
--local hideparty=true
--local showenergybar=true



local max = math.max
local floor = math.floor

local minimalist = [=[Interface\AddOns\oUF_PowerBar\media\minimalist]=]
local backdrop = {
	bgFile = [=[Interface\ChatFrame\ChatFrameBackground]=],
	insets = {top = -1, bottom = -1, left = -1, right = -1}
}

local colors = setmetatable({
	power = setmetatable({
		MANA = {0, 144/255, 1}
	}, {__index = oUF.colors.power}),
	reaction = setmetatable({
		[2] = {1, 0, 0},
		[4] = {1, 1, 0},
		[5] = {0, 1, 0}
	}, {__index = oUF.colors.reaction}),
	runes = setmetatable({
		[1] = {0.8, 0, 0},
		[3] = {0, 0.4, 0.7},
		[4] = {0.8, 0.8, 0.8}
	}, {__index = oUF.colors.runes})
}, {__index = oUF.colors})

local buffFilter = {
	[GetSpellInfo(62600)] = true,
	[GetSpellInfo(61336)] = true,
	[GetSpellInfo(52610)] = true,
	[GetSpellInfo(22842)] = true,
	[GetSpellInfo(22812)] = true,
	[GetSpellInfo(16870)] = true
}

local function menu(self)
	local drop = _G[string.gsub(self.unit, '(.)', string.upper, 1) .. 'FrameDropDown']
	if(drop) then
		ToggleDropDownMenu(1, nil, drop, 'cursor')
	end
end

local function updateCombo(self, event, unit)
	if(unit == PlayerFrame.unit and unit ~= self.CPoints.unit) then
		self.CPoints.unit = unit
	end
end

local function updatePower(self, event, unit, bar, minVal, maxVal)
	if(unit ~= 'target') then
        return
    end

	if(maxVal ~= 0) then
		self.Health:SetHeight(22)
		bar:Show()
	else
		self.Health:SetHeight(27)
		bar:Hide()
	end
end

local function castIcon(self, event, unit)
	local castbar = self.Castbar
	if(castbar.interrupt) then
		castbar.Button:SetBackdropColor(0, 0.9, 1)
	else
		castbar.Button:SetBackdropColor(0, 0, 0)
	end
end

local function castTime(self, duration)
	if(self.channeling) then
		self.Time:SetFormattedText('%.1f ', duration)
	elseif(self.casting) then
		self.Time:SetFormattedText('%.1f ', self.max - duration)
	end
end

local function updateTime(self, elapsed)
	self.remaining = max(self.remaining - elapsed, 0)
	self.time:SetText(self.remaining < 90 and floor(self.remaining) or '')
end

local function updateBuff(self, icons, unit, icon, index)
	local _, _, _, _, _, duration, expiration = UnitAura(unit, index, icon.filter)

	if(duration > 0 and expiration) then
		icon.remaining = expiration - GetTime()
		icon:SetScript('OnUpdate', updateTime)
	else
		icon:SetScript('OnUpdate', nil)
		icon.time:SetText()
	end
end

local function updateDebuff(self, icons, unit, icon, index)
	local _, _, _, _, dtype = UnitAura(unit, index, icon.filter)

	if(icon.debuff) then
		if(not UnitIsFriend('player', unit) and icon.owner ~= 'player' and icon.owner ~= 'vehicle') then
			icon:SetBackdropColor(0, 0, 0)
			icon.icon:SetDesaturated(true)
		else
			local color = DebuffTypeColor[dtype] or DebuffTypeColor.none
			icon:SetBackdropColor(color.r * 0.6, color.g * 0.6, color.b * 0.6)
			icon.icon:SetDesaturated(false)
		end
	end
end

local function createAura(self, button, icons)
	icons.showDebuffType = true

	button.cd:SetReverse()
	button:SetBackdrop(backdrop)
	button:SetBackdropColor(0, 0, 0)
	button.icon:SetTexCoord(0.06, 0.94, 0.06, 0.94)
	button.icon:SetDrawLayer('ARTWORK')
	button.overlay:SetTexture()

	if(self.unit == 'player') then
		icons.disableCooldown = true

		button.time = button:CreateFontString(nil, 'OVERLAY', 'NumberFontNormal')
		button.time:SetPoint('TOPLEFT', button)
	end
end

local function customFilter(icons, unit, icon, name, rank, texture, count, dtype, duration, expiration, caster)
	if(buffFilter[name] and caster == 'player') then
		return true
	end
end

local function style(self, unit)
    if((select(2, UnitClass('player')) == 'ROGUE') or
       (select(2, UnitClass('player')) == 'DRUID')
       ) then
	    self.colors = colors
	    --self.menu = menu

	    self:RegisterForClicks('AnyUp')
	    self:SetAttribute('type2', 'menu')

	    self:SetScript('OnEnter', UnitFrame_OnEnter)
	    self:SetScript('OnLeave', UnitFrame_OnLeave)

        self:SetAttribute('initial-height', height)
	    self:SetAttribute('initial-width', width)

	    self:SetBackdrop(backdrop)
	    self:SetBackdropColor(0, 0, 0)

	    self.Power = CreateFrame('StatusBar', nil, self)
        self.Power:SetAllPoints()
	    self.Power:SetStatusBarTexture(minimalist)
	    self.Power.frequentUpdates = true

	    self.Power.colorClass = true
	    self.Power.colorTapping = true
	    self.Power.colorDisconnected = true
	    self.Power.colorReaction = unit ~= 'pet'
	    self.Power.colorHappiness = unit == 'pet'
	    self.Power.colorPower = unit == 'pet'

	    self.Power.bg = self.Power:CreateTexture(nil, 'BORDER')
	    self.Power.bg:SetAllPoints(self.Power)
	    self.Power.bg:SetTexture([=[Interface\ChatFrame\ChatFrameBackground]=])
	    self.Power.bg.multiplier = 0.3

	    local power = self.Power:CreateFontString(nil, 'OVERLAY', 'GameFontHighlightSmallLeft')
	    power:SetPoint('CENTER', self.Power, 'CENTER')
	    power.frequentUpdates = 0.1
	    self:Tag(power, '[ppower][( )druidpower]')

        if(unit=="player" and IsAddOnLoaded("oUF_BarFader")) then
            self.BarFade = true
            self.BarFaderMinAlpha = minalpha
            self.BarFaderMaxAlpha = maxalpha
        end
        self.MoveableFrames = true
    end
end

oUF:RegisterStyle('PowerBar', style)
oUF:SetActiveStyle('PowerBar')

oUF:Spawn('player', pbn):SetPoint('CENTER', UIParent, 'CENTER')