Quantcast
--[[
##############################################################################
_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
        ___\///////////___________\///___________\/////////_____\///////////_#
##############################################################################
S U P E R - V I L L A I N - U I   By: Munglunch                              #
##############################################################################
--]]
local SuperVillain, L = unpack(select(2, ...));
local MOD = SuperVillain.Registry:Expose('SVUnit');
local _, ns = ...
local oUF_SuperVillain = ns.oUF
--[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
local assert = enforce;
assert(oUF_SuperVillain, "SVUI was unable to locate oUF.")
local ceil,tinsert = math.ceil,table.insert
local lastArenaFrame, lastBossFrame
--[[
##########################################################
BOSS HANDLERS
##########################################################
]]--
function MOD.Construct:boss()
	local frame = self
	MOD:SetActionPanel(frame, "boss")
	frame.Health = MOD:CreateHealthBar(frame, true, true)
	frame.Power = MOD:CreatePowerBar(frame, true, true)
	MOD:CreatePortrait(frame)
	frame.Buffs = MOD:CreateBuffs(frame, "boss")
	frame.Debuffs = MOD:CreateDebuffs(frame, "boss")
	frame.Afflicted = MOD:CreateAfflicted(frame)
	frame.Castbar = MOD:CreateCastbar(frame, true, nil, true, nil, true)
	frame.RaidIcon = MOD:CreateRaidIcon(frame)
	frame.AltPowerBar = MOD:CreateAltPowerBar(frame)
	frame.Range = { insideAlpha = 1, outsideAlpha = 1 }
	frame:SetAttribute("type2", "focus")

	if(not _G["SVUI_Boss_MOVE"]) then
		frame:Point("RIGHT", SuperVillain.UIParent, "RIGHT", -105, 0)
		SuperVillain:SetSVMovable(frame, "SVUI_Boss_MOVE", L["Boss Frames"], nil, nil, nil, "ALL, PARTY, RAID10, RAID25, RAID40")
	else
		frame:Point("TOPRIGHT", lastBossFrame, "BOTTOMRIGHT", 0, -20)
	end
	lastBossFrame = frame
end

function MOD.FrameUpdate:boss()
	local frame = self
	local db = MOD.db["boss"]
	local INDEX = frame.index;
	local holder = _G["SVUI_Boss_MOVE"]
	local UNIT_WIDTH = db.width;
	local UNIT_HEIGHT = db.height;
	frame.colors = oUF_SuperVillain.colors;
	frame:Size(UNIT_WIDTH, UNIT_HEIGHT)
	frame:ClearAllPoints()
	if(tonumber(INDEX) == 1) then
		holder:Width(UNIT_WIDTH)
		holder:Height(UNIT_HEIGHT + (UNIT_HEIGHT + 12 + db.castbar.height) * 4)
		if db.showBy == "UP"then
			frame:Point("BOTTOMRIGHT", holder, "BOTTOMRIGHT")
		else
			frame:Point("TOPRIGHT", holder, "TOPRIGHT")
		end
	else
		local yOffset = (UNIT_HEIGHT + 12 + db.castbar.height) * (INDEX - 1)
		if db.showBy == "UP"then
			frame:Point("BOTTOMRIGHT", holder, "BOTTOMRIGHT", 0, yOffset)
		else
			frame:Point("TOPRIGHT", holder, "TOPRIGHT", 0, -yOffset)
		end
	end
	frame:RegisterForClicks(MOD.db.fastClickTarget and "AnyDown" or "AnyUp")
	MOD:RefreshUnitLayout(frame, "boss")
	frame:UpdateAllElements()
end
--[[
##########################################################
ARENA HANDLERS
##########################################################
]]--
function MOD.Construct:arena()
	local frame = self
	local selfName = frame:GetName()
	local prepName = selfName.."PrepFrame";
	local selfID = frame:GetID()

	MOD:SetActionPanel(frame, "arena")
	frame.Health = MOD:CreateHealthBar(frame, true, true)
	frame.Power = MOD:CreatePowerBar(frame, true)
	MOD:CreatePortrait(frame)
	frame.Buffs = MOD:CreateBuffs(frame, "arena")
	frame.Debuffs = MOD:CreateDebuffs(frame, "arena")
	frame.Castbar = MOD:CreateCastbar(frame, true, nil, true, nil, true)
	frame.Trinket = MOD:CreateTrinket(frame)
	frame.PVPSpecIcon = MOD:CreatePVPSpecIcon(frame)
	frame.Range = { insideAlpha = 1, outsideAlpha = 1 }
	frame:SetAttribute("type2", "focus")

	if not _G[prepName] then
		local prep = CreateFrame("Frame", prepName, UIParent)
		prep:SetFrameStrata("MEDIUM")
		prep:SetAllPoints(frame)
		prep:SetID(selfID)
		prep:SetPanelTemplate("Bar", true, 3, 3, 3)
		prep.Health = CreateFrame("StatusBar", nil, prep)
		prep.Health:SetAllPoints(prep)
		prep.Health:SetStatusBarTexture([[Interface\AddOns\SVUI\assets\artwork\Bars\DEFAULT]])
		prep.Health:SetPanelTemplate("Bar", true, 3, 3, 3)
		prep.Icon = prep:CreateTexture(nil, "OVERLAY")
		prep.Icon.bg = CreateFrame("Frame", nil, prep)
		prep.Icon.bg:Point("TOPLEFT", prep, "TOPRIGHT", 1, 0)
		prep.Icon.bg:Point("BOTTOMRIGHT", prep, "BOTTOMRIGHT", 1, 0)
		prep.Icon.bg:SetFixedPanelTemplate("Default", true)
		prep.Icon:SetParent(prep.Icon.bg)
		prep.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
		prep.Icon:FillInner(prep.Icon.bg)
		prep.SpecClass = prep.Health:CreateFontString(nil, "OVERLAY")
		prep.SpecClass:SetFont(SuperVillain.Media.font.names, 12, "OUTLINE")
		prep.SpecClass:SetTextColor(1, 1, 1)
		prep.SpecClass:SetPoint("CENTER")
		prep:Hide()
	end

	if(not _G["SVUI_Arena_MOVE"]) then
		frame:Point("RIGHT", SuperVillain.UIParent, "RIGHT", -105, 0)
		SuperVillain:SetSVMovable(frame, "SVUI_Arena_MOVE", L["Arena Frames"], nil, nil, nil, "ALL, ARENA")
	else
		frame:Point("TOPRIGHT", lastArenaFrame, "BOTTOMRIGHT", 0, -20)
	end
	lastArenaFrame = frame
end

function MOD.FrameUpdate:arena()
	local frame = self
	local db = MOD.db["arena"]
	local INDEX = frame.index;
	local holder = _G["SVUI_Arena_MOVE"]
	local UNIT_WIDTH = db.width;
	local UNIT_HEIGHT = db.height;
	frame.colors = oUF_SuperVillain.colors;
	frame:Size(UNIT_WIDTH, UNIT_HEIGHT)
	frame:RegisterForClicks(MOD.db.fastClickTarget and "AnyDown" or "AnyUp")
	do
		local trinket = frame.Trinket;
		trinket.bg:Size(db.pvpTrinket.size)
		trinket.bg:ClearAllPoints()
		if(db.pvpTrinket.position == "RIGHT") then
			trinket.bg:Point("LEFT", frame, "RIGHT", db.pvpTrinket.xOffset, db.pvpTrinket.yOffset)
		else
			trinket.bg:Point("RIGHT", frame, "LEFT", db.pvpTrinket.xOffset, db.pvpTrinket.yOffset)
		end
		if db.pvpTrinket.enable and not frame:IsElementEnabled("Trinket")then
			frame:EnableElement("Trinket")
		elseif not db.pvpTrinket.enable and frame:IsElementEnabled("Trinket")then
			frame:DisableElement("Trinket")
		end
	end
	do
		local pvp = frame.PVPSpecIcon;
		pvp.bg:Point("RIGHT", frame, "RIGHT")
		pvp.bg:Size(UNIT_HEIGHT, UNIT_HEIGHT)
		if db.pvpSpecIcon then
			frame.InfoPanel:Point("TOPLEFT", frame, "TOPLEFT", 0, 0)
			frame.InfoPanel:Point("BOTTOMRIGHT", frame.PVPSpecIcon, "BOTTOMLEFT", 0, 0)
			if frame:IsElementEnabled("PVPSpecIcon")then
				frame:EnableElement("PVPSpecIcon")
			end
		elseif frame:IsElementEnabled("PVPSpecIcon")then
			frame:DisableElement("PVPSpecIcon")
		end
	end
	MOD:RefreshUnitLayout(frame, "arena")
	frame:ClearAllPoints()
	if(tonumber(INDEX) == 1) then
		holder:Width(UNIT_WIDTH)
		holder:Height(UNIT_HEIGHT + (UNIT_HEIGHT + 12 + db.castbar.height) * 4)
		if(db.showBy == "UP") then
			frame:Point("BOTTOMRIGHT", holder, "BOTTOMRIGHT")
		else
			frame:Point("TOPRIGHT", holder, "TOPRIGHT")
		end
	else
		local yOffset = (UNIT_HEIGHT + 12 + db.castbar.height) * (INDEX - 1)
		if(db.showBy == "UP") then
			frame:Point("BOTTOMRIGHT", holder, "BOTTOMRIGHT", 0, yOffset)
		else
			frame:Point("TOPRIGHT", holder, "TOPRIGHT", 0, -yOffset)
		end
	end
	frame:UpdateAllElements()
end
--[[
##########################################################
PREP FRAME HANDLER
##########################################################
]]--
local ArenaPrepHandler = CreateFrame("Frame")
local ArenaPrepHandler_OnEvent = function(self, event)
	local _, instanceType = IsInInstance()
	if(not MOD.db.arena.enable or instanceType ~= "arena") then return end
	if event == "PLAYER_LOGIN" then
		for i = 1, 5 do
			local prepframe = _G["SVUI_Arena"..i.."PrepFrame"]
			if(prepframe) then
				prepframe:SetAllPoints(_G["SVUI_Arena"..i])
			end
		end
	elseif event == "ARENA_OPPONENT_UPDATE" then
		for i = 1, 5 do
			local prepframe = _G["SVUI_Arena"..i.."PrepFrame"]
			if(prepframe and prepframe:IsShown()) then
				prepframe:Hide()
			end
		end
	else
		local numOpps = GetNumArenaOpponentSpecs()
		if numOpps > 0 then
			for i = 1, 5 do
				local prepframe = _G["SVUI_Arena"..i.."PrepFrame"]
				if i <= numOpps then
					local s = GetArenaOpponentSpec(i)
					local _, spec, class = nil, "UNKNOWN", "UNKNOWN"
					if s and s > 0 then
						_, spec, _, icon, _, _, class = GetSpecializationInfoByID(s)
					end
					if class and spec then
						prepframe.SpecClass:SetText(spec .. " - " .. LOCALIZED_CLASS_NAMES_MALE[class])
						prepframe.Icon:SetTexture(icon or [[INTERFACE\ICONS\INV_MISC_QUESTIONMARK]])

						local color = RAID_CLASS_COLORS[class]
						local textcolor = SVUI_CLASS_COLORS[class] or color
						if color then
							prepframe.Health:SetStatusBarColor(color.r, color.g, color.b)
							prepframe.SpecClass:SetTextColor(color.r, color.g, color.b)
						else
							prepframe.Health:SetStatusBarColor(0.25, 0.25, 0.25)
							prepframe.SpecClass:SetTextColor(1, 1, 1)
						end

						prepframe:Show()
					end
				else
					prepframe:Hide()
				end
			end
		else
			for i = 1, 5 do
				local prepframe = _G["SVUI_Arena"..i.."PrepFrame"]
				if(prepframe and prepframe:IsShown()) then
					prepframe:Hide()
				end
			end
		end
	end
end

ArenaPrepHandler:RegisterEvent("PLAYER_LOGIN")
ArenaPrepHandler:RegisterEvent("PLAYER_ENTERING_WORLD")
ArenaPrepHandler:RegisterEvent("ARENA_OPPONENT_UPDATE")
ArenaPrepHandler:RegisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS")
ArenaPrepHandler:SetScript("OnEvent", ArenaPrepHandler_OnEvent)