vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local XPerl_Player_Events = {}

----------------------
-- Loading Function --
----------------------
function XPerl_Player_OnLoad()

        -- Events
        CombatFeedback_Initialize(XPerl_PlayerHitIndicator, 30)
        this:RegisterEvent("PLAYER_ENTERING_WORLD")
        this:RegisterEvent("PLAYER_LEAVING_WORLD")
        this:RegisterEvent("VARIABLES_LOADED")

        XPerl_Player_StatsFrame_DruidBar:SetHeight(1)
        XPerl_Player_StatsFrame_DruidBar:Hide()

        --XPerl_Player.PlayerFlash = 0
        XPerl_Player.EnergyTime = 0
        XPerl_Player.EnergyLast = 0

        -- Set here to reduce amount of function calls made - I know it's not much, but we're talking about saving the Universe here!
        -- ... cough
        this:SetScript("OnUpdate", XPerl_Player_OnUpdate)
        this:SetScript("OnEvent", XPerl_Player_OnEvent)
        this:SetScript("OnShow", XPerl_Player_UpdatePortrait)

        this.time = 0

        XPerl_RegisterHighlight(XPerl_Player_CastClickOverlay, 3)
        XPerl_RegisterPerlFrames(XPerl_Player, {"NameFrame", "StatsFrame", "LevelFrame", "PortraitFrame", "GroupFrame"})

        this.FlashFrames = {XPerl_Player_PortraitFrame, XPerl_Player_NameFrame,
                                XPerl_Player_LevelFrame, XPerl_Player_StatsFrame}
end

-------------------------
-- The Update Function --
-------------------------

local function XPerl_Player_CombatFlash(elapsed, argNew, argGreen)
        if (XPerl_CombatFlashSet (elapsed, XPerl_Player, argNew, argGreen)) then
                XPerl_CombatFlashSetFrames(XPerl_Player)
        end
end

function XPerl_Player_UpdatePortrait()
        if (XPerlConfig.ShowPlayerPortrait == 1) then
                if (XPerlConfig.ShowPlayerPortrait3D == 1) then
                        XPerl_Player_PortraitFrame_Portrait:Hide()
                        XPerl_Player_PortraitFrame_Portrait3D:Show()
                        XPerlSetPortrait3D(XPerl_Player_PortraitFrame_Portrait3D, "player")
                else
                        XPerl_Player_PortraitFrame_Portrait3D.last3DTime = nil
                        XPerl_Player_PortraitFrame_Portrait:Show()
                        XPerl_Player_PortraitFrame_Portrait3D:Hide()
                        SetPortraitTexture(XPerl_Player_PortraitFrame_Portrait, "player")
                end
        end
end

-- XPerl_Player_UpdateManaType
local function XPerl_Player_UpdateManaType()
        XPerl_SetManaBarType("player", XPerl_Player_StatsFrame_ManaBar, XPerl_Player_StatsFrame_ManaBarBG)

        if (UnitPowerType("player") == 3) then
                XPerl_Player.EnergyEnabled = true
        else
                XPerl_Player.EnergyEnabled = nil
        end
        XPerl_Player_TickerShowHide()
end

-- XPerl_Player_UpdateLeader()
function XPerl_Player_UpdateLeader()
        if (IsPartyLeader()) then
                XPerl_Player_NameFrame_LeaderIcon:Show()
        else
                XPerl_Player_NameFrame_LeaderIcon:Hide()
        end

        if (XPerlConfig.ShowPartyNumber == 1 and UnitInRaid("player")) then
                for i = 1,GetNumRaidMembers() do
                        local name, rank, subgroup = GetRaidRosterInfo(i)
                        if (name == UnitName("player")) then
                                XPerl_Player_GroupFrameGroup:SetText(string.format(XPERL_RAID_GROUP, subgroup))
                                XPerl_Player_GroupFrame:Show()
                                return
                        end
                end
        end

        XPerl_Player_GroupFrame:Hide()
end

-- XPerl_Player_UpdateMasterLooter()
local function XPerl_Player_UpdateMasterLooter()
        local method, index = GetLootMethod()

        if (method == "master" and index == 0) then
                XPerl_Player_NameFrame_MasterIcon:Show()
        else
                XPerl_Player_NameFrame_MasterIcon:Hide()
        end
end

-- XPerl_Player_UpdateName()
local function XPerl_Player_UpdateName()
        XPerl_Player_NameFrame_NameBarText:SetText(UnitName("player"))
end

-- XPerl_Player_UpdateRep
local function XPerl_Player_UpdateRep()
        local name, reaction, min, max, value = GetWatchedFactionInfo()
        local color

        if (name) then
                color = FACTION_BAR_COLORS[reaction]
        else
                name = "none watched"
                max = 1
                min = 0
                value = 0
                color = FACTION_BAR_COLORS[4]
        end

        value = value - min
        max = max - min
        min = 0

        XPerl_Player_StatsFrame_XPRestBar:SetMinMaxValues(0, 1)
        XPerl_Player_StatsFrame_XPRestBar:SetValue(0)

        XPerl_Player_StatsFrame_XPBar:SetMinMaxValues(min, max)
        XPerl_Player_StatsFrame_XPBar:SetValue(value)

        XPerl_Player_StatsFrame_XPBar:SetStatusBarColor(color.r, color.g, color.b, 1)
        XPerl_Player_StatsFrame_XPBarBG:SetVertexColor(color.r, color.g, color.b, 0.25)

        local perc = (value * 100) / max
        XPerl_Player_StatsFrame_XPBarPercent:SetText(string.format("%.1f%%", perc))
        XPerl_Player_StatsFrame_XPBarText:SetText(name)
end

-- XPerl_Player_UpdateXP
local function XPerl_Player_UpdateXP()
        if (UnitLevel("player") == MAX_PLAYER_LEVEL) then
                XPerl_Player_UpdateRep()
                return
        end

        local playerxp = UnitXP("player")
        local playerxpmax = UnitXPMax("player")
        local playerxprest = GetXPExhaustion() or 0
        XPerl_Player_StatsFrame_XPBar:SetMinMaxValues(0, playerxpmax)
        XPerl_Player_StatsFrame_XPRestBar:SetMinMaxValues(0, playerxpmax)
        XPerl_Player_StatsFrame_XPBar:SetValue(playerxp)
        local xptext

        if (playerxpmax > 10000) then
                xptext = string.format("%.0fK/%.0fK", playerxp / 1000, playerxpmax / 1000)
        else
                xptext = playerxp.."/"..playerxpmax
        end

        if (playerxprest > 0) then
                if (playerxpmax > 10000) then
                        xptext = xptext .. string.format("(+%.0fK)", playerxprest / 1000)
                else
                        xptext = xptext .. string.format("(+%d)", playerxprest)
                end

                color = {r = 0.3, g = 0.3, b = 1}
        else
                color = {r = 0.6, g = 0, b = 0.6}
        end

        XPerl_Player_StatsFrame_XPRestBar:SetValue(playerxp + playerxprest)
        XPerl_Player_StatsFrame_XPBar:SetStatusBarColor(color.r, color.g, color.b, 1)
        XPerl_Player_StatsFrame_XPRestBar:SetStatusBarColor(color.r, color.g, color.b, 0.5)
        XPerl_Player_StatsFrame_XPBarBG:SetVertexColor(color.r, color.g, color.b, 0.25)

        XPerl_Player_StatsFrame_XPBarText:SetText(xptext)

        local xppercenttext=((playerxp * 100.0) / playerxpmax)
        xppercenttext=string.format("%3.0f", xppercenttext)
        XPerl_Player_StatsFrame_XPBarPercent:SetText(xppercenttext.."%")
end

-- XPerl_Player_UpdateCombat
local function XPerl_Player_UpdateCombat()
        if (UnitAffectingCombat("player")) then
                XPerl_Player_NameFrame_NameBarText:SetTextColor(1,0,0)
                XPerl_Player_NameFrame_ActivityStatus:SetTexCoord(0.5, 1.0, 0.0, 0.5)
                XPerl_Player_NameFrame_ActivityStatus:Show()
        else
                if (UnitIsPVP("player")) then
                        XPerl_Player_NameFrame_NameBarText:SetTextColor(0,1,0)
                else
                        XPerl_ColourFriendlyUnit(XPerl_Player_NameFrame_NameBarText, "player")
                end

                if (IsResting()) then
                        XPerl_Player_NameFrame_ActivityStatus:SetTexCoord(0, 0.5, 0.0, 0.5)
                        XPerl_Player_NameFrame_ActivityStatus:Show()
                else
                        XPerl_Player_NameFrame_ActivityStatus:Hide()
                end
        end

        --if (XPerl_Player_Pet) then
        --      XPerl_Player_Pet_UpdateCombat()
        --end
end

-- XPerl_Player_UpdatePVP
local function XPerl_Player_UpdatePVP()
        local playerrankname, playerrank=GetPVPRankInfo(UnitPVPRank("player"), "player")
        if (playerrank and XPerlConfig.ShowPlayerPVPRank==1) then
                XPerl_Player_NameFrame_PVPRankIcon:Show()
                if (playerrank==0) then
                        XPerl_Player_NameFrame_PVPRankIcon:Hide()
                else
                        XPerl_Player_NameFrame_PVPRankIcon:SetTexture(string.format("Interface\\PVPRankBadges\\PVPRank%02d", playerrank))
                end
        else
                XPerl_Player_NameFrame_PVPRankIcon:Hide()
        end

        if (XPerlConfig.ShowPlayerClassIcon == 1) then
                local _, PlayerClass = UnitClass("player")
                local r, l, t, b = XPerl_ClassPos(PlayerClass)
                XPerl_Player_ClassTexture:SetTexCoord(r, l, t, b)
        end

        -- PVP Status settings
        if (UnitAffectingCombat("player")) then
                XPerl_Player_NameFrame_NameBarText:SetTextColor(1,0,0)
        elseif (UnitIsPVP("player")) then
                XPerl_Player_NameFrame_NameBarText:SetTextColor(0,1,0);
                if (XPerlConfig.ShowPlayerPVP == 1) then
                        XPerl_Player_NameFrame_PVPStatus:Show();
                        XPerl_Player_NameFrame_PVPStatus:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..UnitFactionGroup("player"));
                else
                        XPerl_Player_NameFrame_PVPStatus:Hide();
                end
        else
                XPerl_Player_NameFrame_PVPStatus:Hide()
                XPerl_ColourFriendlyUnit(XPerl_Player_NameFrame_NameBarText, "player")
        end
end

-- XPerl_Player_Feigning
local function XPerl_Player_Feigning ()
        for buffnum=1,16 do
                local buff = UnitBuff("player", buffnum)
                if (not buff) then
                        return
                end
                if (strfind(strlower(buff), "feigndeath")) then
                        return true
                end
        end
end

-- XPerl_Player_CheckDeadOrGhost
local function XPerl_Player_CheckDeadOrGhost()
        if (UnitIsDead("player")) then
                if (XPerl_Player_Feigning ()) then
                        XPerl_Player_StatsFrame_HealthBarText:SetText(XPERL_LOC_FEIGNDEATH)
                        XPerl_Player_StatsFrame_HealthBarText:Show()
                        return false
                else
                        XPerl_Player_StatsFrame_HealthBarText:SetText(XPERL_LOC_DEAD)
                        XPerl_Player_StatsFrame_HealthBarText:Show()
                        XPerl_Player_StatsFrame_ManaBarText:Hide()
                        return true
                end

        elseif (UnitIsGhost("player")) then
                XPerl_Player_StatsFrame_HealthBarText:SetText(XPERL_LOC_GHOST)
                XPerl_Player_StatsFrame_HealthBarText:Show()
                XPerl_Player_StatsFrame_ManaBarText:Hide()
                return true
        end

        return false
end

-- XPerl_Player_DruidBarUpdate
local function XPerl_Player_DruidBarUpdate()
        XPerl_Player_StatsFrame_DruidBar:SetMinMaxValues(0,DruidBarKey.maxmana)
        XPerl_Player_StatsFrame_DruidBar:SetValue(DruidBarKey.keepthemana)
        manaPct = (DruidBarKey.keepthemana * 100.0) / DruidBarKey.maxmana
        manaPct =  string.format("%3.0f", manaPct)
        XPerl_Player_StatsFrame_DruidBarPercent:SetText(manaPct.."%")
        XPerl_Player_StatsFrame_DruidBarText:SetText(math.floor(DruidBarKey.keepthemana).."/"..DruidBarKey.maxmana)
        if (UnitPowerType("player")>0) then
                if XPerlConfig.ShowPlayerXPBar==1 then
                        XPerl_Player_StatsFrame:SetHeight(60)
                else
                        XPerl_Player_StatsFrame:SetHeight(50)
                end
                XPerl_Player_StatsFrame_DruidBarText:Show()
                XPerl_Player_StatsFrame_DruidBarPercent:Show()
                XPerl_Player_StatsFrame_DruidBar:Show()
                XPerl_Player_StatsFrame_DruidBar:SetHeight(10)
        else
                if XPerlConfig.ShowPlayerXPBar == 1 then
                        XPerl_Player_StatsFrame:SetHeight(50)
                else
                        XPerl_Player_StatsFrame:SetHeight(40)
                end
                XPerl_Player_StatsFrame_DruidBarPercent:Hide()
                XPerl_Player_StatsFrame_DruidBarText:Hide()
                XPerl_Player_StatsFrame_DruidBar:Hide()
                XPerl_Player_StatsFrame_DruidBar:SetHeight(1)
        end
        XPerl_StatsFrameSetup(XPerl_Player_StatsFrame, {"DruidBar", "XPBar"})
end

-- XPerl_Player_UpdateMana
local function XPerl_Player_UpdateMana()
        local playermana = UnitMana("player")
        local playermanamax = UnitManaMax("player")
        XPerl_Player_StatsFrame_ManaBar:SetMinMaxValues(0, playermanamax)
        XPerl_Player_StatsFrame_ManaBar:SetValue(playermana)
        manaPct = (playermana * 100.0) / playermanamax
        manaPct =  string.format("%3.0f", manaPct)

        XPerl_Player_StatsFrame_ManaBarText:SetText(playermana.."/"..playermanamax)
        if (UnitPowerType("player")>=1) then
                XPerl_Player_StatsFrame_ManaBarPercent:SetText(playermana)
        else
                XPerl_Player_StatsFrame_ManaBarPercent:SetText(manaPct.."%")
        end

        if (XPerlConfig.ShowPlayerValues == 1) then
                XPerl_Player_StatsFrame_ManaBarText:Show()
        else
                XPerl_Player_StatsFrame_ManaBarText:Hide()
        end

        if (DruidBarKey) then
                local _, engClass = UnitClass("player")
                if (engClass == "DRUID") then
                        XPerl_Player_DruidBarUpdate()
                end
        end
end

-- XPerl_Player_UpdateHealth
local function XPerl_Player_UpdateHealth()
        local playerhealth = UnitHealth("player")
        local playerhealthmax = UnitHealthMax("player")

        XPerl_SetHealthBar(XPerl_Player_StatsFrame_HealthBar, playerhealth, playerhealthmax)

        XPerl_Player_CheckDeadOrGhost()
        PlayerStatus_OnUpdate(playerhealth, playerhealthmax)
end

-- XPerl_Player_UpdateLevel
local function XPerl_Player_UpdateLevel()
        XPerl_Player_LevelFrame_LevelBarText:SetText(UnitLevel("player"))
end

-- PlayerStatus_OnUpdate - replaces Blizzard code
function PlayerStatus_OnUpdate(val, max)
        if (XPerlConfig.FullScreenStatus == 1) then
                if (val and max) then
                        local test = val / max

                        if ( test <= 0.2 and not LowHealthFrame.flashing) then
                                UIFrameFlash(LowHealthFrame, 0.5, 0.5, 100);
                                LowHealthFrame.flashing = 1;
                        elseif ( (test > 0.1 and LowHealthFrame.flashing) or UnitIsDead("player") ) then
                                UIFrameFlash(LowHealthFrame, 1, 1, 0);
                                LowHealthFrame.flashing = nil;
                        end
                else
                        if ( UIParent.isOutOfControl and not OutOfControlFrame.flashing and not UnitOnTaxi("player")) then
                                UIFrameFlash(OutOfControlFrame, 0.5, 0.5, 100);
                                OutOfControlFrame.flashing = 1;
                        elseif ( not UIParent.isOutOfControl and OutOfControlFrame.flashing ) then
                                UIFrameFlash(OutOfControlFrame, 0.5, 0.5, 0);
                                OutOfControlFrame.flashing = nil;
                        end
                end
        else
                if (LowHealthFrame.flashing) then
                        UIFrameFlash(LowHealthFrame, 1, 1, 0);
                        LowHealthFrame.flashing = nil;
                end
                if (OutOfControlFrame.flashing) then
                        UIFrameFlash(OutOfControlFrame, 0.5, 0.5, 0);
                        OutOfControlFrame.flashing = nil;
                end
        end
end

-- XPerl_Player_OnUpdate
function XPerl_Player_OnUpdate()
        CombatFeedback_OnUpdate(arg1)
        if (this.PlayerFlash) then
                XPerl_Player_CombatFlash(arg1, false)
        end
end

-- XPerl_Player_UpdateDisplay
function XPerl_Player_UpdateDisplay ()
        XPerl_Player_UpdateXP()
        XPerl_Player_UpdateManaType()
        XPerl_Player_UpdateLevel()
        XPerl_Player_UpdateName()
        XPerl_Player_UpdatePVP()
        XPerl_Player_UpdateCombat()
        XPerl_Player_UpdateLeader()
        XPerl_Player_UpdateMasterLooter()
        XPerl_Player_UpdateMana()
        XPerl_Player_UpdateHealth()
        XPerl_Player_Events:PLAYER_AURAS_CHANGED()
end

--------------------
-- Click Handlers --
--------------------
function XPerl_Player_OnClick(button)
        if (XPerl_OnClick_Handler(button, "player")) then
                return
        end

        if (button == "RightButton") then
                HideDropDownMenu(1)
                ToggleDropDownMenu(1, nil, PlayerFrameDropDown, "XPerl_Player_StatsFrame", 0, 0)
        end
end

-- EVENTS AND STUFF

local events = {"PARTY_MEMBERS_CHANGED", "PARTY_LEADER_CHANGED", "PARTY_LOOT_METHOD_CHANGED", "RAID_ROSTER_UPDATE",
                "UNIT_SPELLMISS", "PLAYER_UPDATE_RESTING", "UNIT_FACTION", "UNIT_MODEL_CHANGED", "PLAYER_REGEN_ENABLED",
                "PLAYER_REGEN_DISABLED", "PLAYER_ENTER_COMBAT", "PLAYER_LEAVE_COMBAT", "PLAYER_LEVEL_UP", "PLAYER_DEAD",
                "UNIT_FLAGS", "PLAYER_XP_UPDATE", "UPDATE_FACTION", "PLAYER_AURAS_CHANGED",
                "UPDATE_SHAPESHIFT_FORMS", "PLAYER_CONTROL_LOST", "PLAYER_CONTROL_GAINED"}

local function XPerl_Player_RegisterSome()
        for i,event in pairs(events) do
                this:RegisterEvent(event)
        end
        XPerl_RegisterBasics()
end
local function XPerl_Player_UnregisterSome()
        for i,event in pairs(events) do
                this:UnregisterEvent(event)
        end
        XPerl_UnregisterBasics()
end

-------------------
-- Event Handler --
-------------------
function XPerl_Player_OnEvent()
        local func = XPerl_Player_Events[event]
        if (func) then
                func()
        else
XPerl_ShowMessage("EXTRA EVENT")
        end
end

-- PLAYER_ENTERING_WORLD
function XPerl_Player_Events:PLAYER_ENTERING_WORLD()
        XPerl_Player_RegisterSome()
        XPerl_Player_UpdateDisplay()
end

-- PLAYER_LEAVING_WORLD
function XPerl_Player_Events:PLAYER_LEAVING_WORLD()
        XPerl_Player_UnregisterSome()
end

-- UNIT_COMBAT
function XPerl_Player_Events:UNIT_COMBAT()
        if (arg1 == "player") then
                if (XPerlConfig.CombatHitIndicator == 1 and XPerlConfig.ShowPlayerPortrait == 1) then
                        CombatFeedback_OnCombatEvent(arg2, arg3, arg4, arg5)
                end

                if (arg2 == "HEAL") then
                        XPerl_Player_CombatFlash(elapsed, true, true)
                elseif (arg4 and arg4 > 0) then
                        XPerl_Player_CombatFlash(elapsed, true)
                end
        end
end

-- UNIT_SPELLMISS
function XPerl_Player_Events:UNIT_SPELLMISS()
        if (arg1 == "player") then
                if (XPerlConfig.CombatHitIndicator == 1 and XPerlConfig.ShowPlayerPortrait == 1) then
                        CombatFeedback_OnSpellMissEvent(arg2)
                end
        end
end

-- UNIT_MODEL_CHANGED
function XPerl_Player_Events:UNIT_MODEL_CHANGED()
        if (arg1 == "player") then
                XPerl_Player_UpdatePortrait()
        end
end
--XPerl_Player_Events.UNIT_PORTRAIT_UPDATE = XPerl_Player_Events.UNIT_MODEL_CHANGED

-- VARIABLES_LOADED
function XPerl_Player_Events:VARIABLES_LOADED()
        XPerl_Player_UpdatePortrait()
        this:UnregisterEvent(event)
end

-- PARTY_LOOT_METHOD_CHANGED
function XPerl_Player_Events:PARTY_LOOT_METHOD_CHANGED()
        XPerl_Player_UpdateLeader()
        XPerl_Player_UpdateMasterLooter()
end
XPerl_Player_Events.PARTY_MEMBERS_CHANGED = XPerl_Player_Events.PARTY_LOOT_METHOD_CHANGED
XPerl_Player_Events.PARTY_LEADER_CHANGED  = XPerl_Player_Events.PARTY_LOOT_METHOD_CHANGED

function XPerl_Player_Events:RAID_ROSTER_UPDATE()
        XPerl_Player_UpdateLeader()
        XPerl_Player_UpdateMasterLooter()
end

-- UNIT_HEALTH, UNIT_MAXHEALTH
function XPerl_Player_Events:UNIT_HEALTH()
        if (arg1=="player") then
                XPerl_Player_UpdateHealth()
        end
end
XPerl_Player_Events.UNIT_MAXHEALTH = XPerl_Player_Events.UNIT_HEALTH
XPerl_Player_Events.PLAYER_DEAD    = XPerl_Player_Events.UNIT_HEALTH

-- UNIT_MANA, UNIT_MAXMANA, UNIT_RAGE, UNIT_MAXRAGE, UNIT_ENERGY
-- UNIT_MAXENERGY
function XPerl_Player_Events:UNIT_MANA()
        if (arg1=="player") then
                XPerl_Player_UpdateMana()
        end
end
XPerl_Player_Events.UNIT_MAXMANA                = XPerl_Player_Events.UNIT_MANA
XPerl_Player_Events.UNIT_RAGE           = XPerl_Player_Events.UNIT_MANA
XPerl_Player_Events.UNIT_MAXRAGE         = XPerl_Player_Events.UNIT_MANA

local function CheckStealth()
        local i = 0
        while (GetPlayerBuffTexture(i) ~= nil) do               -- check for rogue's stealth and druid's prowl
                if (GetPlayerBuffTexture(i) == "Interface\\Icons\\Ability_Stealth" or
                        GetPlayerBuffTexture(i) == "Interface\\Icons\\Ability_Ambush") then
                        return true
                else
                        i = i + 1
                end
        end
end

function XPerl_Player_Events:UNIT_ENERGY()
        if (arg1=="player") then
                XPerl_Player_UpdateMana()

                local e = UnitMana("player")
                local m = UnitManaMax("player")
                if (e == XPerl_Player.EnergyLast + 20) then
                        XPerl_Player.EnergyTime = GetTime()
                end
                XPerl_Player.EnergyLast = e

                XPerl_Player_TickerShowHide()
        end
end
XPerl_Player_Events.UNIT_MAXENERGY       = XPerl_Player_Events.UNIT_ENERGY

-- UNIT_DISPLAYPOWER
function XPerl_Player_Events:UNIT_DISPLAYPOWER()
        XPerl_Player_UpdateManaType()
        XPerl_Player_UpdateMana()
end

-- UNIT_NAME_UPDATE
function XPerl_Player_Events:UNIT_NAME_UPDATE()
        if (arg1=="player") then
                XPerl_Player_UpdateName()
        end
end

-- UNIT_LEVEL
function XPerl_Player_Events:UNIT_LEVEL()
        if (arg1 == "player") then
                XPerl_Player_UpdateLevel()
                XPerl_Player_UpdateXP()
        end
end
XPerl_Player_Events.PLAYER_LEVEL_UP = XPerl_Player_Events.UNIT_LEVEL

-- PLAYER_XP_UPDATE
function XPerl_Player_Events:PLAYER_XP_UPDATE()
        XPerl_Player_UpdateXP()
end

function XPerl_Player_Events:UPDATE_FACTION()
        if (UnitLevel("player") == MAX_PLAYER_LEVEL) then
                XPerl_Player_UpdateRep()
        end
end

-- UNIT_FACTION
function XPerl_Player_Events:UNIT_FACTION()
        if (arg1 == "player") then
                XPerl_Player_UpdatePVP()
        end
end
XPerl_Player_Events.UNIT_FLAGS = XPerl_Player_Events.UNIT_FACTION

-- PLAYER_ENTER_COMBAT, PLAYER_LEAVE_COMBAT
function XPerl_Player_Events:PLAYER_ENTER_COMBAT()
        XPerl_Player_UpdateCombat()
end
XPerl_Player_Events.PLAYER_LEAVE_COMBAT = XPerl_Player_Events.PLAYER_ENTER_COMBAT

-- PLAYER_REGEN_ENABLED, PLAYER_REGEN_DISABLED
function XPerl_Player_Events:PLAYER_REGEN_ENABLED()
        XPerl_Player_UpdateCombat()
        --XPerl_Player_UpdateDisplay()
end
XPerl_Player_Events.PLAYER_REGEN_DISABLED = XPerl_Player_Events.PLAYER_REGEN_ENABLED
XPerl_Player_Events.PLAYER_UPDATE_RESTING = XPerl_Player_Events.PLAYER_REGEN_ENABLED

function XPerl_Player_Events:PLAYER_AURAS_CHANGED()
        XPerl_CheckDebuffs("player", {XPerl_Player_NameFrame, XPerl_Player_PortraitFrame, XPerl_Player_LevelFrame, XPerl_Player_StatsFrame})
        XPerl_Player_TickerShowHide()

        if (DruidBarKey) then
                -- For DruidBar addon, we update the mana bar on shapeshift
                local _, engClass = UnitClass("player")
                if (engClass == "DRUID") then
                        XPerl_Player_UpdateMana()
                end
        end

        if (UIParent.isOutOfControl and not UnitOnTaxi("player")) then
                PlayerStatus_OnUpdate()
        end
end

-- PLAYER_CONTROL_LOST
function XPerl_Player_Events:PLAYER_CONTROL_LOST()
        if (not UnitOnTaxi("player")) then
                UIParent.isOutOfControl = 1
        end
end

-- PLAYER_CONTROL_GAINED
function XPerl_Player_Events:PLAYER_CONTROL_GAINED()
        UIParent.isOutOfControl = nil
        PlayerStatus_OnUpdate()
end

-- Moving stuff
function XPerl_Player_GetGap()
        if (XPerl_Target) then
                local playerLeft = XPerl_Player:GetRight() * XPerl_Player:GetEffectiveScale()
                local targetLeft = XPerl_Target:GetLeft() * XPerl_Target:GetEffectiveScale()

                local a = targetLeft - playerLeft

                a = a + 0.01
                a = a * 100
                a = math.floor (a)
                a = a / 100

                return (math.floor(a + 4))
        end

        return 0
end

function XPerl_Player_SetGap(newGap)
        if (not XPerl_Target) then
                return
        end

        if (type(newGap) == "number") then
                newGap = newGap - 4

                local top = XPerl_Target:GetTop()
                local left = ((XPerl_Player:GetRight() * XPerl_Player:GetEffectiveScale()) + newGap) / XPerl_Target:GetEffectiveScale()

                XPerl_Target:ClearAllPoints()
                XPerl_Target:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", left, top)

                XPerl_Target:SetUserPlaced(true)

                if (XPerl_TargetTarget) then
                        top = XPerl_TargetTarget:GetTop()
                        left = ((XPerl_Target:GetRight() * XPerl_Target:GetEffectiveScale()) + newGap) / XPerl_TargetTarget:GetEffectiveScale()

                        -- Can't use the CastClickOverlay for GetRight() as wow doesn't update anchors until it renders the frame, anchors
                        -- are always 1 frame behind. Usually you won't notice, but when moving frames in this manner, it was ugly.
                        -- So, we adjust right a little.
                        if (XPerl_Target_LevelFrame:IsShown()) then
                                left = left + XPerl_Target_LevelFrame:GetWidth()
                        end

                        XPerl_TargetTarget:ClearAllPoints()
                        XPerl_TargetTarget:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", left, top)

                        if (XPerl_TargetTargetTarget) then
                                top = XPerl_TargetTargetTarget:GetTop()
                                left = (XPerl_TargetTarget:GetRight() * XPerl_TargetTarget:GetEffectiveScale()) + newGap
                                if (XPerlConfig.ShowTargetTargetPercent == 0) then
                                        left = left - 20
                                end
                                left = left / XPerl_TargetTargetTarget:GetEffectiveScale()

                                XPerl_TargetTargetTarget:ClearAllPoints()
                                XPerl_TargetTargetTarget:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", left, top)

                                XPerl_TargetTargetTarget:SetUserPlaced(true)
                        end

                        XPerl_TargetTarget:SetUserPlaced(true)
                end
        end
end

function XPerl_Player_AlignTop()
        if (not XPerl_Target) then
                return
        end

        local playerLeft = XPerl_Player:GetLeft()
        local targetLeft = XPerl_Target:GetLeft()
        local playerTop = XPerl_Player:GetTop()
        local top = playerTop * XPerl_Player:GetEffectiveScale()
        local newTop

        if (playerLeft == nil) then
                playerLeft = 5
        end
        if (targetLeft == nil) then
                targetLeft = 220
        end

        -- We set this for 1 reason, so that all the related frames scale in the same direction should the user do that...
        XPerl_Player:ClearAllPoints()
        XPerl_Player:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", playerLeft, playerTop)

        XPerl_Target:ClearAllPoints()
        newTop = top / XPerl_Target:GetEffectiveScale()
        XPerl_Target:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", targetLeft, newTop)

        XPerl_Target:StartMoving()
        XPerl_Target:StopMovingOrSizing()

        if (XPerl_TargetTarget) then
                local targettargetLeft = XPerl_TargetTarget:GetLeft()

                if (targettargetLeft == nil) then
                        targettargetLeft = targetLeft + 200
                end

                XPerl_TargetTarget:ClearAllPoints()
                newTop = top / XPerl_TargetTarget:GetEffectiveScale()
                XPerl_TargetTarget:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", targettargetLeft, newTop)

                if (XPerl_TargetTargetTarget) then
                        local targettargettargetLeft = XPerl_TargetTargetTarget:GetLeft()
                        if (targettargettargetLeft == nil) then
                                targettargettargetLeft = targettargetLeft + 200
                        end

                        XPerl_TargetTargetTarget:ClearAllPoints()
                        newTop = top / XPerl_TargetTargetTarget:GetEffectiveScale()
                        XPerl_TargetTargetTarget:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", targettargettargetLeft, newTop)

                        XPerl_TargetTargetTarget:StartMoving()
                        XPerl_TargetTargetTarget:StopMovingOrSizing()
                end

                XPerl_TargetTarget:StartMoving()
                XPerl_TargetTarget:StopMovingOrSizing()
        end
end


-- XPerl_Player_Energy_TickWatch
function XPerl_Player_Energy_OnUpdate()

        local time = GetTime()
        local temp = time - XPerl_Player.EnergyTime
        local remainder = mod (temp, 2)

        XPerl_Player_StatsFrame_EnergyTicker:SetValue(remainder)

        sparkPosition = XPerl_Player_StatsFrame_EnergyTicker:GetWidth() * (remainder / 2)

        XPerl_Player_StatsFrame_EnergyTicker_Spark:SetPoint("CENTER", XPerl_Player_StatsFrame_EnergyTicker, "LEFT", sparkPosition, 0)
end

-- XPerl_Player_TickerShowHide
function XPerl_Player_TickerShowHide()
        local e = UnitMana("player")
        local m = UnitManaMax("player")
        if (XPerl_Player.EnergyEnabled and (e < m or UnitAffectingCombat("player") or CheckStealth()) and not UnitIsDeadOrGhost("player") and XPerlConfig.EnergyTicker == 1) then
                XPerl_Player_StatsFrame_EnergyTicker:Show()
        else
                XPerl_Player_StatsFrame_EnergyTicker:Hide()
        end
end

-- XPerl_Player_Set_Bits()
function XPerl_Player_Set_Bits()
        if (XPerlConfig.ShowPlayerPortrait==0) then
                XPerl_Player_PortraitFrame:Hide()
                XPerl_Player_PortraitFrame:SetWidth(3)
        else
                XPerl_Player_PortraitFrame:Show()
                XPerl_Player_PortraitFrame:SetWidth(60)
                XPerl_Player_UpdatePortrait()
        end

        if (XPerlConfig.ShowPlayerLevel==0) then
                XPerl_Player_LevelFrame:Hide()
        else
                XPerl_Player_LevelFrame:Show()
        end

        if (XPerlConfig.ShowPlayerPercent == 0) then
                XPerl_Player_NameFrame:SetWidth(128)
                XPerl_Player_StatsFrame:SetWidth(128)
                XPerl_Player_StatsFrame_HealthBarPercent:Hide()
                XPerl_Player_StatsFrame_ManaBarPercent:Hide()
                XPerl_Player_StatsFrame_XPBarPercent:Hide()
        else
                XPerl_Player_NameFrame:SetWidth(160)
                XPerl_Player_StatsFrame:SetWidth(160)
                XPerl_Player_StatsFrame_HealthBarPercent:Show()
                XPerl_Player_StatsFrame_ManaBarPercent:Show()
                XPerl_Player_StatsFrame_XPBarPercent:Show()
        end

        if (XPerlConfig.ShowPlayerValues == 0) then
                XPerl_Player_StatsFrame_HealthBarText:Hide()
                XPerl_Player_StatsFrame_ManaBarText:Hide()
                XPerl_Player_StatsFrame_XPBarText:Hide()
        else
                XPerl_Player_StatsFrame_HealthBarText:Show()
                XPerl_Player_StatsFrame_ManaBarText:Show()
                XPerl_Player_StatsFrame_XPBarText:Show()
        end

        if (XPerlConfig.ShowPlayerClassIcon == 0) then
                XPerl_Player_ClassTexture:Hide()
        else
                XPerl_Player_ClassTexture:Show()
        end

        if (XPerlConfig.ShowPlayerPVPRank==0) then
                XPerl_Player_NameFrame_PVPRankIcon:Hide()
        else
                XPerl_Player_NameFrame_PVPRankIcon:Show()
        end

        if (XPerlConfig.ShowPlayerXPBar==0) then
                XPerl_Player_StatsFrame_XPBar:Hide()
                XPerl_Player_StatsFrame_XPRestBar:Hide()
                XPerl_Player_StatsFrame:SetHeight(40)
        else
                XPerl_Player_StatsFrame_XPBar:Show()
                XPerl_Player_StatsFrame_XPRestBar:Show()
                XPerl_Player_StatsFrame:SetHeight(50)
        end
end