vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
---------------
-- Variables --
---------------
Perl_Player_Config = {};

-- Default Saved Variables (also set in Perl_Player_GetVars)
local locked = 0;               -- unlocked by default
local xpbarstate = 1;           -- show default xp bar by default
local compactmode = 0;          -- compact mode is disabled by default
local showraidgroup = 1;        -- show the raid group number by default when in raids
local scale = 1;                -- default scale
local healermode = 0;           -- nurfed unit frame style
local transparency = 1;         -- transparency for frames
local showportrait = 0;         -- portrait is hidden by default
local compactpercent = 0;       -- percents are not shown in compact mode by default
local threedportrait = 0;       -- 3d portraits are off by default
local portraitcombattext = 1;   -- Combat text is enabled by default on the portrait frame
local showdruidbar = 1;         -- Druid Bar support is enabled by default

-- Default Local Variables
local InCombat = 0;             -- used to track if the player is in combat and if the icon should be displayed
local Initialized = nil;        -- waiting to be initialized
local mouseoverhealthflag = 0;  -- is the mouse over the health bar for healer mode?
local mouseovermanaflag = 0;    -- is the mouse over the mana bar for healer mode?

-- Variables for position of the class icon texture.
local Perl_Player_ClassPosRight = {};
local Perl_Player_ClassPosLeft = {};
local Perl_Player_ClassPosTop = {};
local Perl_Player_ClassPosBottom = {};


----------------------
-- Loading Function --
----------------------
function Perl_Player_OnLoad()
        -- Combat Text
        CombatFeedback_Initialize(Perl_Player_HitIndicator, 30);

        -- Events
        this:RegisterEvent("ADDON_LOADED");
        this:RegisterEvent("PARTY_LEADER_CHANGED");
        this:RegisterEvent("PARTY_LOOT_METHOD_CHANGED");
        this:RegisterEvent("PARTY_MEMBERS_CHANGED");
        this:RegisterEvent("PLAYER_ENTERING_WORLD");
        this:RegisterEvent("PLAYER_REGEN_DISABLED");
        this:RegisterEvent("PLAYER_REGEN_ENABLED");
        this:RegisterEvent("PLAYER_UPDATE_RESTING");
        this:RegisterEvent("PLAYER_XP_UPDATE");
        this:RegisterEvent("RAID_ROSTER_UPDATE");
        this:RegisterEvent("UNIT_COMBAT");
        this:RegisterEvent("UNIT_DISPLAYPOWER");
        this:RegisterEvent("UNIT_ENERGY");
        this:RegisterEvent("UNIT_HEALTH");
        this:RegisterEvent("UNIT_LEVEL");
        this:RegisterEvent("UNIT_MANA");
        this:RegisterEvent("UNIT_MAXENERGY");
        this:RegisterEvent("UNIT_MAXHEALTH");
        this:RegisterEvent("UNIT_MAXMANA");
        this:RegisterEvent("UNIT_MAXRAGE");
        this:RegisterEvent("UNIT_MODEL_CHANGED");
        this:RegisterEvent("UNIT_PORTRAIT_UPDATE");
        this:RegisterEvent("UNIT_PVP_UPDATE");
        this:RegisterEvent("UNIT_RAGE");
        this:RegisterEvent("UNIT_SPELLMISS");
        this:RegisterEvent("UPDATE_FACTION");
        this:RegisterEvent("VARIABLES_LOADED");

        -- Button Click Overlays (in order of occurrence in XML)
        Perl_Player_Name_CastClickOverlay:SetFrameLevel(Perl_Player_Name:GetFrameLevel() + 2);
        Perl_Player_RaidGroupNumberFrame_CastClickOverlay:SetFrameLevel(Perl_Player_RaidGroupNumberFrame:GetFrameLevel() + 1);
        Perl_Player_LevelFrame_CastClickOverlay:SetFrameLevel(Perl_Player_LevelFrame:GetFrameLevel() + 1);
        Perl_Player_PortraitFrame_CastClickOverlay:SetFrameLevel(Perl_Player_PortraitFrame:GetFrameLevel() + 2);
        Perl_Player_StatsFrame_CastClickOverlay:SetFrameLevel(Perl_Player_StatsFrame:GetFrameLevel() + 1);
        Perl_Player_HealthBar_CastClickOverlay:SetFrameLevel(Perl_Player_StatsFrame:GetFrameLevel() + 2);
        Perl_Player_ManaBar_CastClickOverlay:SetFrameLevel(Perl_Player_StatsFrame:GetFrameLevel() + 2);
        Perl_Player_DruidBar_CastClickOverlay:SetFrameLevel(Perl_Player_StatsFrame:GetFrameLevel() + 2);
        Perl_Player_XPBar_CastClickOverlay:SetFrameLevel(Perl_Player_StatsFrame:GetFrameLevel() + 2);

        if (DEFAULT_CHAT_FRAME) then
                DEFAULT_CHAT_FRAME:AddMessage("|cffffff00Perl Classic: Player loaded successfully.");
        end
end


-------------------
-- Event Handler --
-------------------
function Perl_Player_OnEvent(event)
        if (event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH") then
                if (arg1 == "player") then
                        Perl_Player_Update_Health();            -- Update health values
                end
                return;
        elseif ((event == "UNIT_ENERGY") or (event == "UNIT_MANA") or (event == "UNIT_RAGE") or (event == "UNIT_MAXMANA") or (event == "UNIT_MAXENERGY") or (event == "UNIT_MAXRAGE")) then
                if (arg1 == "player") then
                        Perl_Player_Update_Mana();              -- Update energy/mana/rage values
                end
                return;
        elseif (event == "UNIT_DISPLAYPOWER") then
                if (arg1 == "player") then
                        Perl_Player_Update_Mana_Bar();          -- What type of energy are we using now?
                        Perl_Player_Update_Mana();              -- Update the energy info immediately
                end
                return;
        elseif (event == "UNIT_COMBAT") then
                if (arg1 == "player") then
                        CombatFeedback_OnCombatEvent(arg2, arg3, arg4, arg5);
                end
                return;
        elseif (event == "UNIT_SPELLMISS") then
                if (arg1 == "player") then
                        CombatFeedback_OnSpellMissEvent(arg2);
                end
                return;
        elseif ((event == "PLAYER_REGEN_DISABLED") or (event == "PLAYER_REGEN_ENABLED") or (event == "PLAYER_UPDATE_RESTING")) then
                Perl_Player_Update_Combat_Status(event);        -- Are we fighting, resting, or none?
                return;
        elseif (event == "PLAYER_XP_UPDATE") then
                if (xpbarstate == 1) then
                        Perl_Player_Update_Experience();        -- Set the experience bar info
                end
                return;
        elseif (event == "UPDATE_FACTION") then
                if (xpbarstate == 4) then
                        Perl_Player_Update_Reputation();        -- Set faction info
                end
                return;
        elseif (event == "UNIT_PVP_UPDATE") then
                Perl_Player_Update_PvP_Status();                -- Is the character PvP flagged?
                return;
        elseif (event == "UNIT_LEVEL") then
                if (arg1 == "player") then
                        Perl_Player_LevelFrame_LevelBarText:SetText(UnitLevel("player"));       -- Set the player's level
                end
                return;
        elseif (event == "RAID_ROSTER_UPDATE") then
                Perl_Player_Update_Raid_Group_Number();         -- What raid group number are we in?
                return;
        elseif (event == "PARTY_LEADER_CHANGED" or event == "PARTY_MEMBERS_CHANGED") then
                Perl_Player_Update_Leader();                    -- Are we the party leader?
                return;
        elseif (event == "PARTY_LOOT_METHOD_CHANGED") then
                Perl_Player_Update_Loot_Method();
                return;
        elseif (event == "UNIT_PORTRAIT_UPDATE" or event == "UNIT_MODEL_CHANGED") then
                if (arg1 == "player") then
                        Perl_Player_Update_Portrait();
                end
                return;
        elseif (event == "VARIABLES_LOADED") or (event=="PLAYER_ENTERING_WORLD") then
                Perl_Player_Initialize();
                InCombat = 0;                                   -- You can't be fighting if you're zoning, and no event is sent, force it to no combat.
                Perl_Player_Update_Once();
                return;
        elseif (event == "ADDON_LOADED") then
                if (arg1 == "Perl_Player") then
                        Perl_Player_myAddOns_Support();
                end
                return;
        else
                return;
        end
end


-------------------------------
-- Loading Settings Function --
-------------------------------
function Perl_Player_Initialize()
        -- Check if we loaded the mod already.
        if (Initialized) then
                Perl_Player_Set_Scale();
                return;
        end

        -- Check if a previous exists, if not, enable by default.
        if (type(Perl_Player_Config[UnitName("player")]) == "table") then
                Perl_Player_GetVars();
        else
                Perl_Player_UpdateVars();
        end

        -- Major config options.
        Perl_Player_Initialize_Frame_Color();
        Perl_Player_Set_Localized_ClassIcons();

        -- Unregister the Blizzard frames via the 1.8 function
        PlayerFrame:UnregisterAllEvents();
        PlayerFrameHealthBar:UnregisterAllEvents();
        PlayerFrameManaBar:UnregisterAllEvents();

        Perl_Player_Frame:Show();

        Initialized = 1;
end

function Perl_Player_Initialize_Frame_Color()
        Perl_Player_StatsFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Player_StatsFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Player_LevelFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Player_LevelFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Player_NameFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Player_NameFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Player_RaidGroupNumberFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Player_RaidGroupNumberFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);
        Perl_Player_PortraitFrame:SetBackdropColor(0, 0, 0, 1);
        Perl_Player_PortraitFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1);

        Perl_Player_HealthBarText:SetTextColor(1, 1, 1, 1);
        Perl_Player_ManaBarText:SetTextColor(1, 1, 1, 1);
        Perl_Player_RaidGroupNumberBarText:SetTextColor(1, 1, 1);
end


----------------------
-- Update Functions --
----------------------
function Perl_Player_Update_Once()
        local PlayerClass = UnitClass("player");

        PlayerFrame:Hide();                                     -- Hide default frame
        Perl_Player_Set_Scale();                                -- Set the scale
        Perl_Player_Set_Transparency();                         -- Set the transparency
        Perl_Player_NameBarText:SetText(UnitName("player"));    -- Set the player's name
        Perl_Player_Update_Portrait();                          -- Set the player's portrait
        Perl_Player_Update_PvP_Status();                        -- Is the character PvP flagged?
        Perl_Player_ClassTexture:SetTexCoord(Perl_Player_ClassPosRight[PlayerClass], Perl_Player_ClassPosLeft[PlayerClass], Perl_Player_ClassPosTop[PlayerClass], Perl_Player_ClassPosBottom[PlayerClass]);     -- Set the player's class icon
        Perl_Player_Set_Text_Positions();                       -- Align the text according to compact and healer mode
        Perl_Player_Update_Health();                            -- Set the player's health on load or toggle
        Perl_Player_Update_Mana();                              -- Set the player's mana/energy on load or toggle
        Perl_Player_Update_Mana_Bar();                          -- Set the type of mana used
        Perl_Player_LevelFrame_LevelBarText:SetText(UnitLevel("player"));       -- Set the player's level
        Perl_Player_XPBar_Display(xpbarstate);                  -- Set the xp bar mode and update the experience if needed
        Perl_Player_Update_Raid_Group_Number();                 -- Are we in a raid at login?
        Perl_Player_Update_Leader();                            -- Are we the party leader?
        Perl_Player_Update_Loot_Method();                       -- Are we the master looter?
        Perl_Player_Update_Combat_Status();                     -- Are we already fighting or resting?
        Perl_Player_Set_CompactMode();                          -- Are we using compact mode?
end

function Perl_Player_Update_Health()
        local playerhealth = UnitHealth("player");
        local playerhealthmax = UnitHealthMax("player");
        local playerhealthpercent = floor(playerhealth/playerhealthmax*100+0.5);

        if (UnitIsDead("player") or UnitIsGhost("player")) then                         -- This prevents negative health
                playerhealth = 0;
                playerhealthpercent = 0;
        end

        Perl_Player_HealthBar:SetMinMaxValues(0, playerhealthmax);
        Perl_Player_HealthBar:SetValue(playerhealth);

        if (PCUF_COLORHEALTH == 1) then
                if ((playerhealthpercent <= 100) and (playerhealthpercent > 75)) then
                        Perl_Player_HealthBar:SetStatusBarColor(0, 0.8, 0);
                        Perl_Player_HealthBarBG:SetStatusBarColor(0, 0.8, 0, 0.25);
                elseif ((playerhealthpercent <= 75) and (playerhealthpercent > 50)) then
                        Perl_Player_HealthBar:SetStatusBarColor(1, 1, 0);
                        Perl_Player_HealthBarBG:SetStatusBarColor(1, 1, 0, 0.25);
                elseif ((playerhealthpercent <= 50) and (playerhealthpercent > 25)) then
                        Perl_Player_HealthBar:SetStatusBarColor(1, 0.5, 0);
                        Perl_Player_HealthBarBG:SetStatusBarColor(1, 0.5, 0, 0.25);
                else
                        Perl_Player_HealthBar:SetStatusBarColor(1, 0, 0);
                        Perl_Player_HealthBarBG:SetStatusBarColor(1, 0, 0, 0.25);
                end
        else
                Perl_Player_HealthBar:SetStatusBarColor(0, 0.8, 0);
                Perl_Player_HealthBarBG:SetStatusBarColor(0, 0.8, 0, 0.25);
        end

        if (compactmode == 0) then
                if (healermode == 1) then               -- compact mode off and healer mode on
                        Perl_Player_HealthBarText:SetText("-"..playerhealthmax - playerhealth);
                        if (mouseoverhealthflag == 0) then
                                Perl_Player_HealthBarTextPercent:SetText();
                        else
                                Perl_Player_HealthBarTextPercent:SetText(playerhealth.."/"..playerhealthmax);
                        end
                else                                    -- compact mode off and healer mode off
                        Perl_Player_HealthBarText:SetText(playerhealth.."/"..playerhealthmax);
                        Perl_Player_HealthBarTextPercent:SetText(playerhealthpercent .. "%");
                end
                Perl_Player_HealthBarTextCompactPercent:SetText();                                                      -- Hide the compact mode percent text in full mode
        else
                if (healermode == 1) then               -- compact mode on and healer mode on
                        Perl_Player_HealthBarText:SetText("-"..playerhealthmax - playerhealth);
                        if (mouseoverhealthflag == 0) then
                                Perl_Player_HealthBarTextPercent:SetText();
                        else
                                Perl_Player_HealthBarTextPercent:SetText(playerhealth.."/"..playerhealthmax);
                        end
                else                                    -- compact mode on and healer mode off
                        Perl_Player_HealthBarText:SetText();
                        Perl_Player_HealthBarTextPercent:SetText(playerhealth.."/"..playerhealthmax);
                end

                if (compactpercent == 1) then
                        Perl_Player_HealthBarTextCompactPercent:SetText(playerhealthpercent.."%");
                else
                        Perl_Player_HealthBarTextCompactPercent:SetText();
                end
        end
end

function Perl_Player_Update_Mana()
        local playermana = UnitMana("player");
        local playermanamax = UnitManaMax("player");
        local playermanapercent = floor(playermana/playermanamax*100+0.5);

        if (UnitIsDead("player") or UnitIsGhost("player")) then                         -- This prevents negative mana
                playermana = 0;
                playermanapercent = 0;
        end

        Perl_Player_ManaBar:SetMinMaxValues(0, playermanamax);
        Perl_Player_ManaBar:SetValue(playermana);

        if (compactmode == 0) then
                if (healermode == 1) then
                        if (mouseovermanaflag == 0) then
                                Perl_Player_ManaBarText:SetText();
                                Perl_Player_ManaBarTextPercent:SetText();
                        else
                                if (UnitPowerType("player") == 1) then
                                        Perl_Player_ManaBarTextPercent:SetText(playermana);
                                else
                                        Perl_Player_ManaBarTextPercent:SetText(playermana.."/"..playermanamax);
                                end
                        end
                else
                        Perl_Player_ManaBarText:SetText(playermana.."/"..playermanamax);
                        if (UnitPowerType("player") == 1) then
                                Perl_Player_ManaBarTextPercent:SetText(playermana);
                        else
                                Perl_Player_ManaBarTextPercent:SetText(playermanapercent.."%");
                        end
                end
                Perl_Player_ManaBarTextCompactPercent:SetText();                                                        -- Hide the compact mode percent text in full mode
        else
                if (healermode == 1) then
                        if (mouseovermanaflag == 0) then
                                Perl_Player_ManaBarText:SetText();
                                Perl_Player_ManaBarTextPercent:SetText();
                        else
                                if (UnitPowerType("player") == 1) then
                                        Perl_Player_ManaBarTextPercent:SetText(playermana);
                                else
                                        Perl_Player_ManaBarTextPercent:SetText(playermana.."/"..playermanamax);
                                end
                        end
                else
                        Perl_Player_ManaBarText:SetText();
                        if (UnitPowerType("player") == 1) then
                                Perl_Player_ManaBarTextPercent:SetText(playermana);
                        else
                                Perl_Player_ManaBarTextPercent:SetText(playermana.."/"..playermanamax);
                        end
                end

                if (compactpercent == 1) then
                        Perl_Player_ManaBarTextCompactPercent:SetText(playermanapercent.."%");
                else
                        Perl_Player_ManaBarTextCompactPercent:SetText();
                end
        end

        if (showdruidbar == 1) then
                if (DruidBarKey and (UnitClass("player") == PERL_LOCALIZED_DRUID)) then
                        if (UnitPowerType("player") > 0) then
                                -- Show the bars and set the text and reposition the original mana bar below the druid bar
                                local playerdruidbarmana = floor(DruidBarKey.keepthemana);
                                local playerdruidbarmanamax = DruidBarKey.maxmana;
                                local playerdruidbarmanapercent = floor(playerdruidbarmana/playerdruidbarmanamax*100+0.5);

                                if (playerdruidbarmanapercent == 100) then              -- This is to ensure the value isn't 1 or 2 mana under max when 100%
                                        playerdruidbarmana = playerdruidbarmanamax;
                                end

                                Perl_Player_DruidBar:SetMinMaxValues(0, playerdruidbarmanamax);
                                Perl_Player_DruidBar:SetValue(playerdruidbarmana);

                                -- Show the bar and adjust the stats frame
                                Perl_Player_DruidBar:Show();
                                Perl_Player_DruidBarBG:Show();
                                Perl_Player_DruidBar_CastClickOverlay:Show();
                                Perl_Player_ManaBar:SetPoint("TOP", "Perl_Player_DruidBar", "BOTTOM", 0, -2);
                                if (xpbarstate == 3) then
                                        Perl_Player_StatsFrame:SetHeight(54);           -- Experience Bar is hidden
                                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                                else
                                        Perl_Player_StatsFrame:SetHeight(66);           -- Experience Bar is shown
                                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(66);
                                end

                                -- Display the needed text
                                if (compactmode == 0) then
                                        if (healermode == 1) then
                                                if (mouseovermanaflag == 0) then
                                                        Perl_Player_DruidBarText:SetText();
                                                        Perl_Player_DruidBarTextPercent:SetText();
                                                else
                                                        Perl_Player_DruidBarTextPercent:SetText(playerdruidbarmana.."/"..playerdruidbarmanamax);
                                                end
                                        else
                                                Perl_Player_DruidBarText:SetText(playerdruidbarmana.."/"..playerdruidbarmanamax);
                                                Perl_Player_DruidBarTextPercent:SetText(playerdruidbarmanapercent.."%");
                                        end
                                        Perl_Player_DruidBarTextCompactPercent:SetText();                                                       -- Hide the compact mode percent text in full mode
                                else
                                        if (healermode == 1) then
                                                if (mouseovermanaflag == 0) then
                                                        Perl_Player_DruidBarText:SetText();
                                                        Perl_Player_DruidBarTextPercent:SetText();
                                                else
                                                        Perl_Player_DruidBarTextPercent:SetText(playerdruidbarmana.."/"..playerdruidbarmanamax);
                                                end
                                        else
                                                Perl_Player_DruidBarText:SetText();
                                                Perl_Player_DruidBarTextPercent:SetText(playerdruidbarmana.."/"..playerdruidbarmanamax);
                                        end

                                        if (compactpercent == 1) then
                                                Perl_Player_DruidBarTextCompactPercent:SetText(playerdruidbarmanapercent.."%");
                                        else
                                                Perl_Player_DruidBarTextCompactPercent:SetText();
                                        end
                                end
                        else
                                -- Hide it all (bars and text)
                                Perl_Player_DruidBarText:SetText();
                                Perl_Player_DruidBarTextPercent:SetText();
                                Perl_Player_DruidBarTextCompactPercent:SetText();
                                Perl_Player_DruidBar:Hide();
                                Perl_Player_DruidBarBG:Hide();
                                Perl_Player_DruidBar_CastClickOverlay:Hide();
                                Perl_Player_ManaBar:SetPoint("TOP", "Perl_Player_HealthBar", "BOTTOM", 0, -2);
                                if (xpbarstate == 3) then
                                        Perl_Player_StatsFrame:SetHeight(42);                   -- Experience Bar is hidden
                                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(42);
                                else
                                        Perl_Player_StatsFrame:SetHeight(54);                   -- Experience Bar is shown
                                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                                end
                        end
                else
                        -- Hide it all (bars and text)
                        Perl_Player_DruidBarText:SetText();
                        Perl_Player_DruidBarTextPercent:SetText();
                        Perl_Player_DruidBarTextCompactPercent:SetText();
                        Perl_Player_DruidBar:Hide();
                        Perl_Player_DruidBarBG:Hide();
                        Perl_Player_DruidBar_CastClickOverlay:Hide();
                        Perl_Player_ManaBar:SetPoint("TOP", "Perl_Player_HealthBar", "BOTTOM", 0, -2);
                        if (xpbarstate == 3) then
                                Perl_Player_StatsFrame:SetHeight(42);                   -- Experience Bar is hidden
                                Perl_Player_StatsFrame_CastClickOverlay:SetHeight(42);
                        else
                                Perl_Player_StatsFrame:SetHeight(54);                   -- Experience Bar is shown
                                Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                        end
                end
        else
                -- Hide it all (bars and text)
                Perl_Player_DruidBarText:SetText();
                Perl_Player_DruidBarTextPercent:SetText();
                Perl_Player_DruidBarTextCompactPercent:SetText();
                Perl_Player_DruidBar:Hide();
                Perl_Player_DruidBarBG:Hide();
                Perl_Player_DruidBar_CastClickOverlay:Hide();
                Perl_Player_ManaBar:SetPoint("TOP", "Perl_Player_HealthBar", "BOTTOM", 0, -2);
                if (xpbarstate == 3) then
                        Perl_Player_StatsFrame:SetHeight(42);                   -- Experience Bar is hidden
                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(42);
                else
                        Perl_Player_StatsFrame:SetHeight(54);                   -- Experience Bar is shown
                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                end
        end
end

function Perl_Player_Update_Mana_Bar()
        local playerpower = UnitPowerType("player");

        -- Set mana bar color
        if (playerpower == 0) then
                Perl_Player_ManaBar:SetStatusBarColor(0, 0, 1, 1);
                Perl_Player_ManaBarBG:SetStatusBarColor(0, 0, 1, 0.25);
        elseif (playerpower == 1) then
                Perl_Player_ManaBar:SetStatusBarColor(1, 0, 0, 1);
                Perl_Player_ManaBarBG:SetStatusBarColor(1, 0, 0, 0.25);
        elseif (playerpower == 3) then
                Perl_Player_ManaBar:SetStatusBarColor(1, 1, 0, 1);
                Perl_Player_ManaBarBG:SetStatusBarColor(1, 1, 0, 0.25);
        end
end

function Perl_Player_Update_Experience()
        if (UnitLevel("player") ~= 70) then
                -- XP Bar stuff
                local playerxp = UnitXP("player");
                local playerxpmax = UnitXPMax("player");
                local playerxprest = GetXPExhaustion();

                Perl_Player_XPBar:SetMinMaxValues(0, playerxpmax);
                Perl_Player_XPRestBar:SetMinMaxValues(0, playerxpmax);
                Perl_Player_XPBar:SetValue(playerxp);

                -- Set xp text
                local xptext = playerxp.."/"..playerxpmax;
                local xptextpercent = floor(playerxp/playerxpmax*100+0.5);

                if (playerxprest) then
                        xptext = xptext .."(+"..(playerxprest)..")";
                        Perl_Player_XPBar:SetStatusBarColor(0, 0.6, 0.6, 1);
                        Perl_Player_XPRestBar:SetStatusBarColor(0, 0.6, 0.6, 0.5);
                        Perl_Player_XPBarBG:SetStatusBarColor(0, 0.6, 0.6, 0.25);
                        Perl_Player_XPRestBar:SetValue(playerxp + playerxprest);
                else
                        Perl_Player_XPBar:SetStatusBarColor(0, 0.6, 0.6, 1);
                        Perl_Player_XPRestBar:SetStatusBarColor(0, 0.6, 0.6, 0.5);
                        Perl_Player_XPBarBG:SetStatusBarColor(0, 0.6, 0.6, 0.25);
                        Perl_Player_XPRestBar:SetValue(playerxp);
                end

                Perl_Player_XPBarText:SetText(xptextpercent.."%");
        else
                Perl_Player_XPBar:SetMinMaxValues(0, 1);
                Perl_Player_XPRestBar:SetMinMaxValues(0, 1);
                Perl_Player_XPBar:SetValue(1);
                Perl_Player_XPRestBar:SetValue(1);

                Perl_Player_XPBar:SetStatusBarColor(0, 0.6, 0.6, 1);
                Perl_Player_XPRestBar:SetStatusBarColor(0, 0.6, 0.6, 0.5);
                Perl_Player_XPBarBG:SetStatusBarColor(0, 0.6, 0.6, 0.25);

                Perl_Player_XPBarText:SetText("Level 70");
        end
        
end

function Perl_Player_Update_Reputation()
        local name, reaction, min, max, value = GetWatchedFactionInfo();
        if (name) then
                value = value - min;
                max = max - min;
                min = 0;
                
                Perl_Player_XPBar:SetMinMaxValues(min, max);
                Perl_Player_XPRestBar:SetMinMaxValues(min, max);
                Perl_Player_XPBar:SetValue(value);
                Perl_Player_XPRestBar:SetValue(value);

                local color = FACTION_BAR_COLORS[reaction];
                Perl_Player_XPBar:SetStatusBarColor(color.r, color.g, color.b, 1);
                Perl_Player_XPRestBar:SetStatusBarColor(color.r, color.g, color.b, 0.5);
                Perl_Player_XPBarBG:SetStatusBarColor(color.r, color.g, color.b, 0.25);

                Perl_Player_XPBarText:SetText(name);
        else
                Perl_Player_XPBar:SetMinMaxValues(0, 1);
                Perl_Player_XPRestBar:SetMinMaxValues(0, 1);
                Perl_Player_XPBar:SetValue(1);
                Perl_Player_XPRestBar:SetValue(1);

                Perl_Player_XPBar:SetStatusBarColor(0.9, 0.7, 0, 1);
                Perl_Player_XPRestBar:SetStatusBarColor(0.9, 0.7, 0, 0.5);
                Perl_Player_XPBarBG:SetStatusBarColor(0.9, 0.7, 0, 0.25);

                Perl_Player_XPBarText:SetText("Select a Reputation");
        end
end

function Perl_Player_Update_Combat_Status(event)
        -- Rest/Combat Status Icon
        if (event == "PLAYER_REGEN_DISABLED") then
                InCombat = 1;
                Perl_Player_ActivityStatus:SetTexCoord(0.5, 1.0, 0.0, 0.5);
                Perl_Player_ActivityStatus:Show();
        elseif (event == "PLAYER_REGEN_ENABLED") then
                InCombat = 0;
                Perl_Player_ActivityStatus:Hide();
        elseif (IsResting()) then
                if (InCombat == 1) then
                        return;
                else
                        Perl_Player_ActivityStatus:SetTexCoord(0, 0.5, 0.0, 0.5);
                        Perl_Player_ActivityStatus:Show();
                end
        else
                if (InCombat == 1) then
                        return;
                else
                        Perl_Player_ActivityStatus:Hide();
                end
        end
end

function Perl_Player_Update_Raid_Group_Number()         -- taken from 1.8
        if (showraidgroup == 1) then
                Perl_Player_RaidGroupNumberFrame:Hide();
                local name, rank, subgroup;
                if (GetNumRaidMembers() == 0) then
                        Perl_Player_RaidGroupNumberFrame:Hide();
                        Perl_Player_MasterIcon:Hide();                          -- This was added to correctly hide the master loot icon after leaving a party/raid
                        return;
                end
                local numRaidMembers = GetNumRaidMembers();
                for i=1, MAX_RAID_MEMBERS do
                        if (i <= numRaidMembers) then
                                name, rank, subgroup = GetRaidRosterInfo(i);
                                -- Set the player's group number indicator
                                if (name == UnitName("player")) then
                                        Perl_Player_RaidGroupNumberBarText:SetText("Group "..subgroup);
                                        Perl_Player_RaidGroupNumberFrame:Show();
                                        return;
                                end
                        end
                end
        else
                Perl_Player_RaidGroupNumberFrame:Hide();
        end
end

function Perl_Player_Update_Leader()
        if (IsPartyLeader()) then
                Perl_Player_LeaderIcon:Show();
        else
                Perl_Player_LeaderIcon:Hide();
        end
end

function Perl_Player_Update_Loot_Method()
        local lootMethod, lootMaster;
        lootMethod, lootMaster = GetLootMethod();
        if (lootMaster == 0) then
                Perl_Player_MasterIcon:Show();
        else
                Perl_Player_MasterIcon:Hide();
        end
end

function Perl_Player_Update_PvP_Status()
        if (UnitIsPVP("player")) then
                local factionGroup = UnitFactionGroup("player");
                Perl_Player_NameBarText:SetTextColor(0,1,0);
                Perl_Player_PVPStatus:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..factionGroup);
                Perl_Player_PVPStatus:Show();
        else
                Perl_Player_NameBarText:SetTextColor(0.5,0.5,1);
                Perl_Player_PVPStatus:Hide();
        end
end

function Perl_Player_Set_CompactMode()
        if (compactmode == 0) then
                Perl_Player_Update_Health();
                Perl_Player_Update_Mana();
                Perl_Player_XPBar:SetWidth(220);
                Perl_Player_XPRestBar:SetWidth(220);
                Perl_Player_XPBarBG:SetWidth(220);
                Perl_Player_XPBar_CastClickOverlay:SetWidth(220);
                Perl_Player_StatsFrame:SetWidth(240);
                Perl_Player_StatsFrame_CastClickOverlay:SetWidth(240);
        else
                if (compactpercent == 0) then
                        Perl_Player_Update_Health();
                        Perl_Player_Update_Mana();
                        Perl_Player_XPBar:SetWidth(150);
                        Perl_Player_XPRestBar:SetWidth(150);
                        Perl_Player_XPBarBG:SetWidth(150);
                        Perl_Player_XPBar_CastClickOverlay:SetWidth(150);
                        Perl_Player_StatsFrame:SetWidth(170);
                        Perl_Player_StatsFrame_CastClickOverlay:SetWidth(170);
                else
                        Perl_Player_Update_Health();
                        Perl_Player_Update_Mana();
                        Perl_Player_XPBar:SetWidth(185);
                        Perl_Player_XPRestBar:SetWidth(185);
                        Perl_Player_XPBarBG:SetWidth(185);
                        Perl_Player_XPBar_CastClickOverlay:SetWidth(185);
                        Perl_Player_StatsFrame:SetWidth(205);
                        Perl_Player_StatsFrame_CastClickOverlay:SetWidth(205);
                end
                
        end
end

function Perl_Player_Set_Text_Positions()
        if (compactmode == 0) then
                Perl_Player_HealthBarText:SetPoint("RIGHT", 70, 0);
                Perl_Player_HealthBarTextPercent:SetPoint("TOP", 0, 1);
                Perl_Player_ManaBarText:SetPoint("RIGHT", 70, 0);
                Perl_Player_ManaBarTextPercent:SetPoint("TOP", 0, 1);
                Perl_Player_DruidBarText:SetPoint("RIGHT", 70, 0);
                Perl_Player_DruidBarTextPercent:SetPoint("TOP", 0, 1);
        else
                if (healermode == 1) then
                        Perl_Player_HealthBarText:SetPoint("RIGHT", -10, 0);
                        Perl_Player_HealthBarTextPercent:SetPoint("TOP", -40, 1);
                        Perl_Player_ManaBarText:SetPoint("RIGHT", -10, 0);
                        Perl_Player_ManaBarTextPercent:SetPoint("TOP", -40, 1);
                        Perl_Player_DruidBarText:SetPoint("RIGHT", -10, 0);
                        Perl_Player_DruidBarTextPercent:SetPoint("TOP", -40, 1);
                else
                        Perl_Player_HealthBarText:SetPoint("RIGHT", 70, 0);
                        Perl_Player_HealthBarTextPercent:SetPoint("TOP", 0, 1);
                        Perl_Player_ManaBarText:SetPoint("RIGHT", 70, 0);
                        Perl_Player_ManaBarTextPercent:SetPoint("TOP", 0, 1);
                        Perl_Player_DruidBarText:SetPoint("RIGHT", 70, 0);
                        Perl_Player_DruidBarTextPercent:SetPoint("TOP", 0, 1);
                end
        end
end

function Perl_Player_HealthShow()
        if (healermode == 1) then
                local playerhealth = UnitHealth("player");
                local playerhealthmax = UnitHealthMax("player");

                if (UnitIsDead("player") or UnitIsGhost("player")) then                         -- This prevents negative health
                        playerhealth = 0;
                end

                Perl_Player_HealthBarTextPercent:SetText(playerhealth.."/"..playerhealthmax);
                mouseoverhealthflag = 1;
        end
end

function Perl_Player_HealthHide()
        if (healermode == 1) then
                Perl_Player_HealthBarTextPercent:SetText();
                mouseoverhealthflag = 0;
        end
end

function Perl_Player_ManaShow()
        if (healermode == 1) then
                local playermana = UnitMana("player");
                local playermanamax = UnitManaMax("player");

                if (UnitIsDead("player") or UnitIsGhost("player")) then                         -- This prevents negative mana
                        playermana = 0;
                end

                if (UnitPowerType("player") == 1) then
                        Perl_Player_ManaBarTextPercent:SetText(playermana);
                else
                        Perl_Player_ManaBarTextPercent:SetText(playermana.."/"..playermanamax);
                end
                mouseovermanaflag = 1;
        end
end

function Perl_Player_ManaHide()
        if (healermode == 1) then
                Perl_Player_ManaBarTextPercent:SetText();
                mouseovermanaflag = 0;
        end
end

function Perl_Player_DruidBarManaShow()
        if (DruidBarKey and (UnitClass("player") == PERL_LOCALIZED_DRUID)) then
                if (healermode == 1) then
                        local playerdruidbarmana = floor(DruidBarKey.keepthemana);
                        local playerdruidbarmanamax = DruidBarKey.maxmana;
                        local playerdruidbarmanapercent = floor(playerdruidbarmana/playerdruidbarmanamax*100+0.5);

                        if (playerdruidbarmanapercent == 100) then                      -- This is to ensure the value isn't 1 or 2 mana under max when 100%
                                playerdruidbarmana = playerdruidbarmanamax;
                        end

                        if (UnitIsDead("player") or UnitIsGhost("player")) then         -- This prevents negative mana
                                playerdruidbarmana = 0;
                        end

                        Perl_Player_DruidBarTextPercent:SetText(playerdruidbarmana.."/"..playerdruidbarmanamax);

                        mouseovermanaflag = 1;
                end
        end
end

function Perl_Player_DruidBarManaHide()
        if (healermode == 1) then
                Perl_Player_DruidBarTextPercent:SetText();
                mouseovermanaflag = 0;
        end
end

function Perl_Player_Update_Portrait()
        if (showportrait == 1) then
                Perl_Player_PortraitTextFrame:SetFrameLevel(Perl_Player_PortraitFrame:GetFrameLevel() + 1);     -- Put the combat text above it so the portrait graphic doesn't go on top of it
                Perl_Player_PortraitFrame:Show();                                                               -- Show the main portrait frame

                if (threedportrait == 0) then
                        SetPortraitTexture(Perl_Player_Portrait, "player");                                     -- Load the correct 2d graphic
                        Perl_Player_PortraitFrame_PlayerModel:Hide();                                           -- Hide the 3d graphic
                        Perl_Player_Portrait:Show();                                                            -- Show the 2d graphic
                else
                        Perl_Player_PortraitFrame_PlayerModel:SetUnit("player");                                -- Load the correct 3d graphic
                        Perl_Player_Portrait:Hide();                                                            -- Hide the 2d graphic
                        Perl_Player_PortraitFrame_PlayerModel:Show();                                           -- Show the 3d graphic
                        Perl_Player_PortraitFrame_PlayerModel:SetCamera(0);
                end

                Perl_Player_PortraitTextFrame:Show();                                                           -- Show the combat text frame
        else
                Perl_Player_PortraitFrame:Hide();                                                               -- Hide the frame and 2d/3d portion
                Perl_Player_PortraitTextFrame:Hide();                                                           -- Hide the combat text
        end
end

function Perl_Player_Portrait_Combat_Text()
        if (portraitcombattext == 1) then
                CombatFeedback_OnUpdate(arg1);
        end
end

function Perl_Player_Set_Localized_ClassIcons()
        Perl_Player_ClassPosRight = {
                [PERL_LOCALIZED_DRUID] = 0.75,
                [PERL_LOCALIZED_HUNTER] = 0,
                [PERL_LOCALIZED_MAGE] = 0.25,
                [PERL_LOCALIZED_PALADIN] = 0,
                [PERL_LOCALIZED_PRIEST] = 0.5,
                [PERL_LOCALIZED_ROGUE] = 0.5,
                [PERL_LOCALIZED_SHAMAN] = 0.25,
                [PERL_LOCALIZED_WARLOCK] = 0.75,
                [PERL_LOCALIZED_WARRIOR] = 0,
        };
        Perl_Player_ClassPosLeft = {
                [PERL_LOCALIZED_DRUID] = 1,
                [PERL_LOCALIZED_HUNTER] = 0.25,
                [PERL_LOCALIZED_MAGE] = 0.5,
                [PERL_LOCALIZED_PALADIN] = 0.25,
                [PERL_LOCALIZED_PRIEST] = 0.75,
                [PERL_LOCALIZED_ROGUE] = 0.75,
                [PERL_LOCALIZED_SHAMAN] = 0.5,
                [PERL_LOCALIZED_WARLOCK] = 1,
                [PERL_LOCALIZED_WARRIOR] = 0.25,
        };
        Perl_Player_ClassPosTop = {
                [PERL_LOCALIZED_DRUID] = 0,
                [PERL_LOCALIZED_HUNTER] = 0.25,
                [PERL_LOCALIZED_MAGE] = 0,
                [PERL_LOCALIZED_PALADIN] = 0.5,
                [PERL_LOCALIZED_PRIEST] = 0.25,
                [PERL_LOCALIZED_ROGUE] = 0,
                [PERL_LOCALIZED_SHAMAN] = 0.25,
                [PERL_LOCALIZED_WARLOCK] = 0.25,
                [PERL_LOCALIZED_WARRIOR] = 0,
                
        };
        Perl_Player_ClassPosBottom = {
                [PERL_LOCALIZED_DRUID] = 0.25,
                [PERL_LOCALIZED_HUNTER] = 0.5,
                [PERL_LOCALIZED_MAGE] = 0.25,
                [PERL_LOCALIZED_PALADIN] = 0.75,
                [PERL_LOCALIZED_PRIEST] = 0.5,
                [PERL_LOCALIZED_ROGUE] = 0.25,
                [PERL_LOCALIZED_SHAMAN] = 0.5,
                [PERL_LOCALIZED_WARLOCK] = 0.5,
                [PERL_LOCALIZED_WARRIOR] = 0.25,
        };
end


--------------------------
-- GUI Config Functions --
--------------------------
function Perl_Player_XPBar_Display(state)
        if (state == 1) then                                                    -- Experience
                Perl_Player_StatsFrame:SetHeight(54);
                Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                Perl_Player_XPBar:Show();
                Perl_Player_XPBarBG:Show();
                Perl_Player_XPRestBar:Show();
                Perl_Player_XPBar_CastClickOverlay:Show();
                Perl_Player_Update_Experience();
        elseif (state == 2) then                                                -- PvP
                Perl_Player_StatsFrame:SetHeight(54);
                Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                Perl_Player_XPBar:Show();
                Perl_Player_XPBarBG:Show();
                Perl_Player_XPRestBar:Show();
                Perl_Player_XPBar_CastClickOverlay:Show();
                local rankNumber, rankName, rankProgress;
                rankNumber = UnitPVPRank("player")
                if (rankNumber < 1) then
                        rankName = "Unranked"
                else
                        rankName = GetPVPRankInfo(rankNumber, "player");
                end
                rankProgress = GetPVPRankProgress();
                Perl_Player_XPBar:SetMinMaxValues(0, 1);
                Perl_Player_XPRestBar:SetMinMaxValues(0, 1);
                Perl_Player_XPBar:SetValue(rankProgress);
                Perl_Player_XPRestBar:SetValue(rankProgress);
                Perl_Player_XPBarText:SetText(rankName);
        elseif (state == 3) then                                                -- Hidden
                Perl_Player_XPBar:Hide();
                Perl_Player_XPBarBG:Hide();
                Perl_Player_XPRestBar:Hide();
                Perl_Player_XPBar_CastClickOverlay:Hide();
                Perl_Player_StatsFrame:SetHeight(42);
                Perl_Player_StatsFrame_CastClickOverlay:SetHeight(42);
        elseif (state == 4) then                                                -- Reputation
                Perl_Player_StatsFrame:SetHeight(54);
                Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                Perl_Player_XPBar:Show();
                Perl_Player_XPBarBG:Show();
                Perl_Player_XPRestBar:Show();
                Perl_Player_XPBar_CastClickOverlay:Show();
                Perl_Player_Update_Reputation();
        end
        if (DruidBarKey and (UnitClass("player") == PERL_LOCALIZED_DRUID) and (UnitPowerType("player") > 0)) then               -- Only change the size if the player has Druid Bar, is a Druid, and is morphed currently
                if (state == 3) then
                        Perl_Player_StatsFrame:SetHeight(54);                   -- Experience Bar is hidden
                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(54);
                else
                        Perl_Player_StatsFrame:SetHeight(66);                   -- Experience Bar is shown
                        Perl_Player_StatsFrame_CastClickOverlay:SetHeight(66);
                end
        end
        xpbarstate = state;
        Perl_Player_UpdateVars();
end

function Perl_Player_Set_Compact(newvalue)
        compactmode = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Set_Text_Positions();
        Perl_Player_Set_CompactMode();
end

function Perl_Player_Set_Healer(newvalue)
        healermode = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Set_Text_Positions();
        Perl_Player_Update_Health();
        Perl_Player_Update_Mana();
end

function Perl_Player_Set_RaidGroupNumber(newvalue)
        showraidgroup = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Update_Raid_Group_Number();
end

function Perl_Player_Set_Lock(newvalue)
        locked = newvalue;
        Perl_Player_UpdateVars();
end

function Perl_Player_Set_Portrait(newvalue)
        showportrait = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Update_Portrait();
end

function Perl_Player_Set_3D_Portrait(newvalue)
        threedportrait = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Update_Portrait();
end

function Perl_Player_Set_Portrait_Combat_Text(newvalue)
        portraitcombattext = newvalue;
        Perl_Player_UpdateVars();
end

function Perl_Player_Set_Compact_Percent(newvalue)
        compactpercent = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Set_Text_Positions();
        Perl_Player_Set_CompactMode();
        Perl_Player_Update_Health();
        Perl_Player_Update_Mana();
end

function Perl_Player_Set_DruidBar(newvalue)
        showdruidbar = newvalue;
        Perl_Player_UpdateVars();
        Perl_Player_Set_Text_Positions();
        Perl_Player_Set_CompactMode();          -- Perl_Player_Update_Mana() called here
end

function Perl_Player_Set_Scale(number)
        local unsavedscale;
        if (number ~= nil) then
                scale = (number / 100);                                 -- convert the user input to a wow acceptable value
        end
        unsavedscale = 1 - UIParent:GetEffectiveScale() + scale;        -- run it through the scaling formula introduced in 1.9
        Perl_Player_Frame:SetScale(unsavedscale);
        Perl_Player_UpdateVars();
end

function Perl_Player_Set_Transparency(number)
        if (number ~= nil) then
                transparency = (number / 100);                          -- convert the user input to a wow acceptable value
        end
        Perl_Player_Frame:SetAlpha(transparency);
        Perl_Player_UpdateVars();
end


------------------------------
-- Saved Variable Functions --
------------------------------
function Perl_Player_GetVars()
        locked = Perl_Player_Config[UnitName("player")]["Locked"];
        xpbarstate = Perl_Player_Config[UnitName("player")]["XPBarState"];
        compactmode = Perl_Player_Config[UnitName("player")]["CompactMode"];
        showraidgroup = Perl_Player_Config[UnitName("player")]["ShowRaidGroup"];
        scale = Perl_Player_Config[UnitName("player")]["Scale"];
        healermode = Perl_Player_Config[UnitName("player")]["HealerMode"];
        transparency = Perl_Player_Config[UnitName("player")]["Transparency"];
        showportrait = Perl_Player_Config[UnitName("player")]["ShowPortrait"];
        compactpercent = Perl_Player_Config[UnitName("player")]["CompactPercent"];
        threedportrait = Perl_Player_Config[UnitName("player")]["ThreeDPortrait"];
        portraitcombattext = Perl_Player_Config[UnitName("player")]["PortraitCombatText"];
        showdruidbar = Perl_Player_Config[UnitName("player")]["ShowDruidBar"];

        if (locked == nil) then
                locked = 0;
        end
        if (xpbarstate == nil) then
                xpbarstate = 1;
        end
        if (compactmode == nil) then
                compactmode = 0;
        end
        if (showraidgroup == nil) then
                showraidgroup = 1;
        end
        if (scale == nil) then
                scale = 1;
        end
        if (healermode == nil) then
                healermode = 0;
        end
        if (transparency == nil) then
                transparency = 1;
        end
        if (showportrait == nil) then
                showportrait = 0;
        end
        if (compactpercent == nil) then
                compactpercent = 0;
        end
        if (threedportrait == nil) then
                threedportrait = 0;
        end
        if (portraitcombattext == nil) then
                portraitcombattext = 1;
        end
        if (showdruidbar == nil) then
                showdruidbar = 1;
        end

        local vars = {
                ["locked"] = locked,
                ["xpbarstate"] = xpbarstate,
                ["compactmode"] = compactmode,
                ["showraidgroup"] = showraidgroup,
                ["scale"] = scale,
                ["healermode"] = healermode,
                ["transparency"] = transparency,
                ["showportrait"] = showportrait,
                ["compactpercent"] = compactpercent,
                ["threedportrait"] = threedportrait,
                ["portraitcombattext"] = portraitcombattext,
                ["showdruidbar"] = showdruidbar,
        }
        return vars;
end

function Perl_Player_UpdateVars(vartable)
        if (vartable ~= nil) then
                -- Sanity checks in case you use a load from an old version
                if (vartable["Global Settings"] ~= nil) then
                        if (vartable["Global Settings"]["Locked"] ~= nil) then
                                locked = vartable["Global Settings"]["Locked"];
                        else
                                locked = nil;
                        end
                        if (vartable["Global Settings"]["XPBarState"] ~= nil) then
                                xpbarstate = vartable["Global Settings"]["XPBarState"];
                        else
                                xpbarstate = nil;
                        end
                        if (vartable["Global Settings"]["CompactMode"] ~= nil) then
                                compactmode = vartable["Global Settings"]["CompactMode"];
                        else
                                compactmode = nil;
                        end
                        if (vartable["Global Settings"]["ShowRaidGroup"] ~= nil) then
                                showraidgroup = vartable["Global Settings"]["ShowRaidGroup"];
                        else
                                showraidgroup = nil;
                        end
                        if (vartable["Global Settings"]["Scale"] ~= nil) then
                                scale = vartable["Global Settings"]["Scale"];
                        else
                                scale = nil;
                        end
                        if (vartable["Global Settings"]["HealerMode"] ~= nil) then
                                healermode = vartable["Global Settings"]["HealerMode"];
                        else
                                healermode = nil;
                        end
                        if (vartable["Global Settings"]["Transparency"] ~= nil) then
                                transparency = vartable["Global Settings"]["Transparency"];
                        else
                                transparency = nil;
                        end
                        if (vartable["Global Settings"]["ShowPortrait"] ~= nil) then
                                showportrait = vartable["Global Settings"]["ShowPortrait"];
                        else
                                showportrait = nil;
                        end
                        if (vartable["Global Settings"]["CompactPercent"] ~= nil) then
                                compactpercent = vartable["Global Settings"]["CompactPercent"];
                        else
                                compactpercent = nil;
                        end
                        if (vartable["Global Settings"]["ThreeDPortrait"] ~= nil) then
                                threedportrait = vartable["Global Settings"]["ThreeDPortrait"];
                        else
                                threedportrait = nil;
                        end
                        if (vartable["Global Settings"]["PortraitCombatText"] ~= nil) then
                                portraitcombattext = vartable["Global Settings"]["PortraitCombatText"];
                        else
                                portraitcombattext = nil;
                        end
                        if (vartable["Global Settings"]["ShowDruidBar"] ~= nil) then
                                showdruidbar = vartable["Global Settings"]["ShowDruidBar"];
                        else
                                showdruidbar = nil;
                        end
                end

                -- Set the new values if any new values were found, same defaults as above
                if (locked == nil) then
                        locked = 0;
                end
                if (xpbarstate == nil) then
                        xpbarstate = 1;
                end
                if (compactmode == nil) then
                        compactmode = 0;
                end
                if (showraidgroup == nil) then
                        showraidgroup = 1;
                end
                if (scale == nil) then
                        scale = 1;
                end
                if (healermode == nil) then
                        healermode = 0;
                end
                if (transparency == nil) then
                        transparency = 1;
                end
                if (showportrait == nil) then
                        showportrait = 0;
                end
                if (compactpercent == nil) then
                        compactpercent = 0;
                end
                if (threedportrait == nil) then
                        threedportrait = 0;
                end
                if (portraitcombattext == nil) then
                        portraitcombattext = 1;
                end
                if (showdruidbar == nil) then
                        showdruidbar = 1;
                end

                -- Call any code we need to activate them
                Perl_Player_XPBar_Display(xpbarstate);
                Perl_Player_Set_Compact(compactmode);
                Perl_Player_Set_Healer(healermode);
                Perl_Player_Update_Raid_Group_Number();
                Perl_Player_Update_Health();
                Perl_Player_Update_Mana();
                Perl_Player_Update_Portrait();
                Perl_Player_Set_Scale();
                Perl_Player_Set_Transparency();
        end

        Perl_Player_Config[UnitName("player")] = {
                ["Locked"] = locked,
                ["XPBarState"] = xpbarstate,
                ["CompactMode"] = compactmode,
                ["ShowRaidGroup"] = showraidgroup,
                ["Scale"] = scale,
                ["HealerMode"] = healermode,
                ["Transparency"] = transparency,
                ["ShowPortrait"] = showportrait,
                ["CompactPercent"] = compactpercent,
                ["ThreeDPortrait"] = threedportrait,
                ["PortraitCombatText"] = portraitcombattext,
                ["ShowDruidBar"] = showdruidbar,
        };
end


--------------------
-- Click Handlers --
--------------------
function Perl_PlayerDropDown_OnLoad()
        UIDropDownMenu_Initialize(this, Perl_PlayerDropDown_Initialize, "MENU");
end

function Perl_PlayerDropDown_Initialize()
        UnitPopup_ShowMenu(Perl_Player_DropDown, "SELF", "player");
end

function Perl_Player_MouseClick(button)
        if (CastPartyConfig and PCUF_CASTPARTYSUPPORT == 1) then
                if (not string.find(GetMouseFocus():GetName(), "Name")) then
                        CastParty_OnClickByUnit(button, "player");
                end
        elseif (Genesis_data and PCUF_CASTPARTYSUPPORT == 1) then
                if (not string.find(GetMouseFocus():GetName(), "Name")) then
                        Genesis_MouseHeal("player", button);
                end
        else
                if (SpellIsTargeting() and button == "RightButton") then
                        SpellStopTargeting();
                        return;
                end

                if (button == "LeftButton") then
                        if (SpellIsTargeting()) then
                                SpellTargetUnit("player");
                        elseif (CursorHasItem()) then
                                DropItemOnUnit("player");
                        else
                                TargetUnit("player");
                        end
                end
        end
end

function Perl_Player_MouseDown(button)
        if (button == "LeftButton" and locked == 0) then
                Perl_Player_Frame:StartMoving();
        end
end

function Perl_Player_MouseUp(button)
        if (button == "RightButton") then
                if ((CastPartyConfig or Genesis_data) and PCUF_CASTPARTYSUPPORT == 1) then
                        if (not (IsAltKeyDown() or IsControlKeyDown() or IsShiftKeyDown()) and string.find(GetMouseFocus():GetName(), "Name")) then             -- if alt, ctrl, or shift ARE NOT held AND we are clicking the name frame, show the menu
                                ToggleDropDownMenu(1, nil, Perl_Player_DropDown, "Perl_Player_NameFrame", 40, 0);
                        end
                else
                        if (not (IsAltKeyDown() or IsControlKeyDown() or IsShiftKeyDown())) then                -- if alt, ctrl, or shift ARE NOT held, show the menu
                                ToggleDropDownMenu(1, nil, Perl_Player_DropDown, "Perl_Player_NameFrame", 40, 0);
                        end
                end
        end

        Perl_Player_Frame:StopMovingOrSizing();
end


------------------------
-- Experience Tooltip --
------------------------
function Perl_Player_XPTooltip()
        local playerxp, playerxpmax, xptext
        GameTooltip_SetDefaultAnchor(GameTooltip, this);
        if (xpbarstate == 1) then
                local playerlevel = UnitLevel("player");                        -- Player's next level
                if (playerlevel < 70) then
                        playerxp = UnitXP("player");                            -- Player's current XP
                        playerxpmax = UnitXPMax("player");                      -- Experience for the current level
                        local playerxprest = GetXPExhaustion();                 -- Amount of bonus xp we have
                        local xptolevel = playerxpmax - playerxp                -- XP till level

                        if (playerxprest) then
                                xptext = playerxp.."/"..playerxpmax .." (+"..(playerxprest)..")";       -- Create the experience string w/ rest xp
                        else
                                xptext = playerxp.."/"..playerxpmax;            -- Create the experience string w/ no rest xp
                        end

                        GameTooltip:SetText(xptext, 255/255, 209/255, 0/255);
                        GameTooltip:AddLine(xptolevel.." until level "..(playerlevel + 1), 255/255, 209/255, 0/255);
                else
                        GameTooltip:SetText("You can't gain anymore experience!", 255/255, 209/255, 0/255);
                end
                
        elseif (xpbarstate == 2) then
                local rankNumber, rankName, rankProgress;                       -- Some variables
                rankNumber = UnitPVPRank("player")
                if (rankNumber < 1) then
                        rankName = "Unranked"
                        GameTooltip:SetText("You are Unranked.", 255/255, 209/255, 0/255);
                else
                        rankName = GetPVPRankInfo(rankNumber, "player");
                        rankProgress = floor(GetPVPRankProgress() * 100);
                        GameTooltip:SetText(rankProgress.."% into Rank "..(rankNumber - 4).." ("..rankName..")", 255/255, 209/255, 0/255);
                        if (rankNumber < 18) then
                                rankNumber = rankNumber + 1;
                                rankName = GetPVPRankInfo(rankNumber, "player");
                                GameTooltip:AddLine((100 - rankProgress).."% until Rank "..(rankNumber - 4).." ("..rankName..")", 255/255, 209/255, 0/255);
                        end
                end
        elseif (xpbarstate == 4) then
                local name, reaction, min, max, value = GetWatchedFactionInfo();
                if (name) then
                        value = value - min;
                        max = max - min;
                        min = 0;
                        GameTooltip:SetText(floor(value/max*100+0.5).."% into "..Perl_Player_Get_Reaction_Name(reaction), 255/255, 209/255, 0/255);
                        GameTooltip:AddLine(value.."/"..max, 255/255, 209/255, 0/255);
                        if (reaction ~= 8) then
                                GameTooltip:AddLine((max - value).." until "..Perl_Player_Get_Reaction_Name(reaction + 1), 255/255, 209/255, 0/255);
                        end
                else
                        GameTooltip:SetText("There is no reputation being tracked.", 255/255, 209/255, 0/255);
                end
        end
        GameTooltip:Show();
end

function Perl_Player_Get_Reaction_Name(reaction)
        local reactionname;
        if (reaction == 1) then
                reactionname = "Hated";
        elseif (reaction == 2) then
                reactionname = "Hostile";
        elseif (reaction == 3) then
                reactionname = "Unfriendly";
        elseif (reaction == 4) then
                reactionname = "Neutral";
        elseif (reaction == 5) then
                reactionname = "Friendly";
        elseif (reaction == 6) then
                reactionname = "Honored";
        elseif (reaction == 7) then
                reactionname = "Revered";
        elseif (reaction == 8) then
                reactionname = "Exalted";
        end
        return reactionname;
end


-----------------------
-- Scripting Support --
-----------------------
function Perl_Player_InCombat()
        if (InCombat == 1) then
                return 1;
        else
                return nil;
        end
end


----------------------
-- myAddOns Support --
----------------------
function Perl_Player_myAddOns_Support()
        -- Register the addon in myAddOns
        if (myAddOnsFrame_Register) then
                local Perl_Player_myAddOns_Details = {
                        name = "Perl_Player",
                        version = "Version 0.58",
                        releaseDate = "April 15, 2006",
                        author = "Perl; Maintained by Global",
                        email = "global@g-ball.com",
                        website = "http://www.curse-gaming.com/mod.php?addid=2257",
                        category = MYADDONS_CATEGORY_OTHERS
                };
                Perl_Player_myAddOns_Help = {};
                Perl_Player_myAddOns_Help[1] = "/perl";
                myAddOnsFrame_Register(Perl_Player_myAddOns_Details, Perl_Player_myAddOns_Help);
        end
end

Generated by GNU Enscript 1.6.5.90.