vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
-- Create the addon object
ArcHUD = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceHook-2.0", "AceConsole-2.0", "AceDB-2.0", "AceModuleCore-2.0", "AceDebug-2.0", "Metrognome-2.0")

-- Locale object
local L = AceLibrary("AceLocale-2.0"):new("ArcHUD_Core")

-- Debugging levels
--   1 Warning
--   2 Info
--   3 Notice
--   4 Off
local debugLevels = {"warn", "info", "notice", "off"}

-- Set up Dewdrop and core addon options menu
local dewdrop = AceLibrary:GetInstance("Dewdrop-2.0")
local ddframe

-- Set up database
ArcHUD:RegisterDB("ArcHUDDB")
ArcHUD:RegisterDefaults("profile", {
        Debug = nil,
        TargetFrame = true,
        PlayerModel = true,
        MobModel = false,
        ShowGuild = true,
        ShowClass = false,
        Width = 30,
        YLoc = 0,
        FadeFull = 0.1,
        FadeOOC = 0.5,
        FadeIC = 0.75,
        RingVisibility = 3,
        PartyLock = true,
        TargetTarget = true,
        TargetTargetTarget = true,
        NamePlates = true,
        Scale = 1.0,
        AttachTop = false,
        ShowBuffs = true,
        HoverMsg = true,
        HoverDelay = 3,
        BlizzPlayer = true,
        BlizzTarget = true,
})

-- Set up chat commands
ArcHUD:RegisterChatCommand({"/archud", "/ah"}, {
        type = "group",
        name = "ArcHUD",
        args = {
                reset = {
                        type            = "group",
                        name            = "reset",
                        desc            = L"CMD_RESET",
                        args            = {
                                confirm = {
                                        type    = "execute",
                                        name    = "CONFIRM",
                                        desc    = L"CMD_RESET_CONFIRM",
                                        func    = "ResetOptionsConfirm",
                                }
                        }
                },
                config = {
                        type            = "execute",
                        name            = "config",
                        desc            = L"CMD_OPTS_FRAME",
                        func            = function()
                                if not ddframe then
                                        ddframe = CreateFrame("Frame", nil, UIParent)
                                        ddframe:SetWidth(2)
                                        ddframe:SetHeight(2)
                                        ddframe:SetPoint("BOTTOMLEFT", GetCursorPosition())
                                        ddframe:SetClampedToScreen(true)
                                        dewdrop:Register(ddframe, 'dontHook', true, 'children', ArcHUD.createDDMenu)
                                end
                                local x,y = GetCursorPosition()
                                ddframe:SetPoint("BOTTOMLEFT", x / UIParent:GetScale(), y / UIParent:GetScale())
                                dewdrop:Open(ddframe)
                        end,
                },
                debug = {
                        type            = "text",
                        name            = "debug",
                        desc            = L"CMD_OPTS_DEBUG",
                        get                     = function()
                                return debugLevels[ArcHUD:GetDebugLevel() or 4]
                        end,
                        set                     = function(v)
                                if(v == "notice") then
                                        ArcHUD:SetDebugLevel(3)
                                        ArcHUD.db.profile.Debug = 3
                                elseif(v == "info") then
                                        ArcHUD:SetDebugLevel(2)
                                        ArcHUD.db.profile.Debug = 2
                                elseif(v == "warn") then
                                        ArcHUD:SetDebugLevel(1)
                                        ArcHUD.db.profile.Debug = 1
                                elseif(v == "off") then
                                        ArcHUD:SetDebugLevel(nil)
                                        ArcHUD.db.profile.Debug = nil
                                end
                        end,
                        validate        = {"off", "warn", "info", "notice"},
                        order           = -2,
                },
        },
}, "ARCHUD")

function ArcHUD.modDB(action, key, namespace, value)
        if(not action or not key) then return end
        if(namespace and not value and not ArcHUD:HasModule(namespace)) then
                value = namespace
                namespace = nil
        end

        if(action == "toggle") then
                ArcHUD:LevelDebug(3, "Toggling key '%s'", key)
                if(namespace) then
                        ArcHUD:AcquireDBNamespace(namespace).profile[key] = not ArcHUD:AcquireDBNamespace(namespace).profile[key]
                else
                        ArcHUD.db.profile[key] = not ArcHUD.db.profile[key]
                end
        elseif(action == "set") then
                ArcHUD:LevelDebug(3, "Setting new value for key '%s' = '%s'", key, value)
                if(namespace) then
                        ArcHUD:AcquireDBNamespace(namespace).profile[key] = tonumber(value)
                else
                        ArcHUD.db.profile[key] = tonumber(value)
                end
        end

        if(namespace) then
                ArcHUD:TriggerEvent("ARCHUD_MODULE_UPDATE", namespace)
        else
                ArcHUD:OnProfileDisable()
                ArcHUD:OnProfileEnable()
        end
end

function ArcHUD.createDDMenu(level, menu)
        if(level == 1) then
                for _,v in ipairs(ArcHUD.dewdrop_menu["L1"]) do
                        if(type(v) == "table") then
                                ArcHUD:LevelDebug(3, "Creating button on level %s", level)
                                dewdrop:AddLine(unpack(v))
                        else
                                ArcHUD:LevelDebug(1, "Error in createDDMenu in level %d (table expected, got %s)", level, type(v))
                        end
                end
        else
                if(ArcHUD.dewdrop_menu[menu]) then
                        local id
                        local val
                        local arg3
                        local arg4
                        local isradio
                        for _,v in ipairs(ArcHUD.dewdrop_menu[menu]) do
                                if(type(v) == "table") then
                                        ArcHUD:LevelDebug(3, "Creating button on level %s in menu %s", level, menu)
                                        id, val, arg3, arg4, isradio = nil, nil, nil, nil, nil
                                        for a,b in ipairs(v) do
                                                --ArcHUD:LevelDebug(3, "  ID: %d, Value: %s", a, (type(b) == "function" and "function" or b))
                                                if(b == "checked" or b == "sliderValue") then
                                                        id = a+1
                                                elseif(b == "isRadio" and v[a+1]) then
                                                        isradio = true
                                                elseif(b == "arg2" or b == "sliderArg2") then
                                                        val = v[a+1]
                                                elseif(b == "arg3" or b == "sliderArg3") then
                                                        arg3 = v[a+1]
                                                elseif(b == "arg4" or b == "sliderArg4") then
                                                        arg4 = v[a+1]
                                                end
                                        end
                                        if(id) then
                                                ArcHUD:LevelDebug(3, "  Found value on '%d', setting name '%s'", id, val)
                                                if(isradio) then
                                                        if(arg4) then
                                                                ArcHUD:LevelDebug(3, "  Using namespace '%s'", arg3)
                                                                v[id] = (ArcHUD:AcquireDBNamespace(arg3).profile[val] == arg4 and true or false)
                                                                ArcHUD:LevelDebug(3, "  Value set to '%s'", v[id])
                                                        else
                                                                v[id] = (ArcHUD.db.profile[val] == arg3 and true or false)
                                                                ArcHUD:LevelDebug(3, "  Value set to '%s'", v[id])
                                                        end
                                                else
                                                        if(arg3) then
                                                                ArcHUD:LevelDebug(3, "  Using namespace '%s'", arg3)
                                                                v[id] = ArcHUD:AcquireDBNamespace(arg3).profile[val]
                                                                ArcHUD:LevelDebug(3, "  Value set to '%s'", v[id])
                                                        else
                                                                v[id] = ArcHUD.db.profile[val]
                                                                ArcHUD:LevelDebug(3, "  Value set to '%s'", v[id])
                                                        end
                                                end
                                        end
                                        dewdrop:AddLine(unpack(v))
                                else
                                        ArcHUD:LevelDebug(1, "Error in createDDMenu in level %d (table expected, got %s)", level, type(v))
                                end
                        end
                end
        end
end

function ArcHUD:OnInitialize()
        -- Set debug level
        self:SetDebugLevel(self.db.profile.Debug)

        self.ClassColor = {
                ["MAGE"] =              "00FFFF",
                ["WARLOCK"] =   "8D54FB",
                ["PRIEST"] =    "FFFFFF",
                ["DRUID"] =             "FF8A00",
                ["SHAMAN"] =    "FF71A8",
                ["PALADIN"] =   "FF71A8",
                ["ROGUE"] =             "FFFF00",
                ["HUNTER"] =    "00FF00",
                ["WARRIOR"] =   "B39442",
        }

        self:LevelDebug(3, "Creating core addon Dewdrop menu")
        self.dewdrop_menu = {
                ["L1"] = {
                        {"text", L("TEXT","TITLE"), "isTitle", true},
                        {"text", L("Version: ")..self.version,  "notClickable", true},
                        {"text", L("Author: ")..self.author, "notClickable", true},
                        {},
                        {"text", L("TEXT","DISPLAY"), "hasArrow", true, "value", "L2_display"},
                        {"text", L("TEXT","FADE"), "hasArrow", true, "value", "L2_fade"},
                        {"text", L("TEXT","MISC"), "hasArrow", true, "value", "L2_misc"},
                        {},
                        {"text", L("TEXT","RINGS"), "isTitle", true},
                },
                ["L2_display"] = {
                        {
                                "text", L("TEXT","TARGETFRAME"),
                                "tooltipTitle", L("TEXT","TARGETFRAME"),
                                "tooltipText", L("TOOLTIP","TARGETFRAME"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "TargetFrame"
                        },
                        {
                                "text", L("TEXT","BLIZZPLAYER"),
                                "tooltipTitle", L("TEXT","BLIZZPLAYER"),
                                "tooltipText", L("TOOLTIP","BLIZZPLAYER"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "BlizzPlayer"
                        },
                        {
                                "text", L("TEXT","BLIZZTARGET"),
                                "tooltipTitle", L("TEXT","BLIZZTARGET"),
                                "tooltipText", L("TOOLTIP","BLIZZTARGET"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "BlizzTarget"
                        },
                        {
                                "text", L("TEXT","PLAYERMODEL"),
                                "tooltipTitle", L("TEXT","PLAYERMODEL"),
                                "tooltipText", L("TOOLTIP","PLAYERMODEL"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "PlayerModel"
                        },
                        {
                                "text", L("TEXT","MOBMODEL"),
                                "tooltipTitle", L("TEXT","MOBMODEL"),
                                "tooltipText", L("TOOLTIP","MOBMODEL"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "MobModel"
                        },
                        {
                                "text", L("TEXT","SHOWGUILD"),
                                "tooltipTitle", L("TEXT","SHOWGUILD"),
                                "tooltipText", L("TOOLTIP","SHOWGUILD"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "ShowGuild"
                        },
                        {
                                "text", L("TEXT","SHOWCLASS"),
                                "tooltipTitle", L("TEXT","SHOWCLASS"),
                                "tooltipText", L("TOOLTIP","SHOWCLASS"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "ShowClass"
                        },
                        {
                                "text", L("TEXT","NAMEPLATES"),
                                "tooltipTitle", L("TEXT","NAMEPLATES"),
                                "tooltipText", L("TOOLTIP","NAMEPLATES"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "NamePlates"
                        },
                        {
                                "text", L("TEXT","ATTACHTOP"),
                                "tooltipTitle", L("TEXT","ATTACHTOP"),
                                "tooltipText", L("TOOLTIP","ATTACHTOP"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "AttachTop"
                        },
                        {
                                "text", L("TEXT","TOT"),
                                "tooltipTitle", L("TEXT","TOT"),
                                "tooltipText", L("TOOLTIP","TOT"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "TargetTarget"
                        },
                        {
                                "text", L("TEXT","TOTOT"),
                                "tooltipTitle", L("TEXT","TOTOT"),
                                "tooltipText", L("TOOLTIP","TOTOT"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "TargetTargetTarget"
                        },
                        {
                                "text", L("TEXT","HOVERMSG"),
                                "tooltipTitle", L("TEXT","HOVERMSG"),
                                "tooltipText", L("TOOLTIP","HOVERMSG"),
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "toggle",
                                "arg2", "HoverMsg"
                        },
                        {
                                "text", L("TEXT","HOVERDELAY"),
                                "tooltipTitle", L("TEXT","HOVERDELAY"),
                                "tooltipText", L("TOOLTIP","HOVERDELAY"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderMin", 0,
                                "sliderMax", 5,
                                "sliderMinText", "Instant",
                                "sliderMaxText", "5s",
                                "sliderStep", 0.5,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "HoverDelay"
                        },
                },
                ["L2_fade"] = {
                        {
                                "text", L("TEXT","FADE_FULL"),
                                "tooltipTitle", L("TEXT","FADE_FULL"),
                                "tooltipText", L("TOOLTIP","FADE_FULL"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderStep", 0.01,
                                "sliderIsPercent", true,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "FadeFull"
                        },
                        {
                                "text", L("TEXT","FADE_OOC"),
                                "tooltipTitle", L("TEXT","FADE_OOC"),
                                "tooltipText", L("TOOLTIP","FADE_OOC"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderStep", 0.01,
                                "sliderIsPercent", true,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "FadeOOC"
                        },
                        {
                                "text", L("TEXT","FADE_IC"),
                                "tooltipTitle", L("TEXT","FADE_IC"),
                                "tooltipText", L("TOOLTIP","FADE_IC"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderStep", 0.01,
                                "sliderIsPercent", true,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "FadeIC"
                        },
                },
                ["L2_misc"] = {
                        {
                                "text", L("TEXT","WIDTH"),
                                "tooltipTitle", L("TEXT","WIDTH"),
                                "tooltipText", L("TOOLTIP","WIDTH"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderMin", 30,
                                "sliderMax", 100,
                                "sliderStep", 1,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "Width"
                        },
                        {
                                "text", L("TEXT","YLOC"),
                                "tooltipTitle", L("TEXT","YLOC"),
                                "tooltipText", L("TOOLTIP","YLOC"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderMin", -50,
                                "sliderMax", 200,
                                "sliderStep", 1,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "YLoc"
                        },
                        {
                                "text", L("TEXT","SCALE"),
                                "tooltipTitle", L("TEXT","SCALE"),
                                "tooltipText", L("TOOLTIP","SCALE"),
                                "hasArrow", true,
                                "hasSlider", true,
                                "sliderStep", 0.01,
                                "sliderMax", 2,
                                "sliderIsPercent", true,
                                "sliderValue", 0,
                                "sliderFunc", ArcHUD.modDB,
                                "sliderArg1", "set",
                                "sliderArg2", "Scale"
                        },
                        {
                                "text", L("TEXT","RINGVIS"),
                                "tooltipTitle", L("TEXT","RINGVIS"),
                                "tooltipText", L("TOOLTIP","RINGVIS"),
                                "hasArrow", true,
                                "value", "L3_ringvis"
                        },
                },
                ["L3_ringvis"] = {
                        {
                                "text", L("TEXT","RINGVIS_1"),
                                "tooltipTitle", L("TEXT","RINGVIS_1"),
                                "tooltipText", L("TOOLTIP","RINGVIS_1"),
                                "isRadio", true,
                                "checked", true,
                                "func", ArcHUD.modDB,
                                "arg1", "set",
                                "arg2", "RingVisibility",
                                "arg3", 1
                        },
                        {
                                "text", L("TEXT","RINGVIS_2"),
                                "tooltipTitle", L("TEXT","RINGVIS_2"),
                                "tooltipText", L("TOOLTIP","RINGVIS_2"),
                                "isRadio", true,
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "set",
                                "arg2", "RingVisibility",
                                "arg3", 2
                        },
                        {
                                "text", L("TEXT","RINGVIS_3"),
                                "tooltipTitle", L("TEXT","RINGVIS_3"),
                                "tooltipText", L("TOOLTIP","RINGVIS_3"),
                                "isRadio", true,
                                "checked", false,
                                "func", ArcHUD.modDB,
                                "arg1", "set",
                                "arg2", "RingVisibility",
                                "arg3", 3
                        },
                },
        }

        -- Taken from Moog_Hud
        self.RepColor = { "FF4444", "DD4444", "DD7744", "BB9944", "44DD44", "55EE44", "66FF44"}

        self:LevelDebug(3, "Registering Metrognome timers")
        self:RegisterMetro("UpdatePetNamePlate", self.UpdatePetNamePlate, 2, self)
        self:RegisterMetro("UpdateTargetTarget", self.UpdateTargetTarget, 1, self)
        self:RegisterMetro("CheckNamePlateMouseOver", self.CheckNamePlateMouseOver, 0.1, self)

        self:LevelDebug(3, "Setting up TargetHUD globals")
        self.TargetHUD = getglobal("ArcTargetHUD")
        self.TargetHUD.frame = "ArcTargetHUD"
        self.TargetHUD.Name = getglobal(self.TargetHUD.frame.."Name")
        self.TargetHUD.Level = getglobal(self.TargetHUD.frame.."Level")
        self.TargetHUD.HPText = getglobal(self.TargetHUD.frame.."HPText")
        self.TargetHUD.MPText = getglobal(self.TargetHUD.frame.."MPText")
        self.TargetHUD.PVPIcon = getglobal(self.TargetHUD.frame.."PVPIcon")
        self.TargetHUD.MLIcon = getglobal(self.TargetHUD.frame.."MLIcon")
        self.TargetHUD.LeaderIcon = getglobal(self.TargetHUD.frame.."LeaderIcon")
        self.TargetHUD.RaidTargetIcon = getglobal(self.TargetHUD.frame.."RaidTargetIcon")
        self.TargetHUD.Combo = getglobal("ArcHUDFrameCombo")
        self.TargetHUD.Model = getglobal("ArcPlayerModelFrame")

        self.TargetHUD.Target = getglobal(self.TargetHUD.frame.."Target")
        self.TargetHUD.Target.frame = self.TargetHUD.frame.."Target"
        self.TargetHUD.Target.Name = getglobal(self.TargetHUD.Target.frame.."Name")
        self.TargetHUD.Target.HPText = getglobal(self.TargetHUD.Target.frame.."HPText")
        self.TargetHUD.Target.MPText = getglobal(self.TargetHUD.Target.frame.."MPText")

        self.TargetHUD.TargetTarget = getglobal(self.TargetHUD.frame.."TargetTarget")
        self.TargetHUD.TargetTarget.frame = self.TargetHUD.frame.."TargetTarget"
        self.TargetHUD.TargetTarget.Name = getglobal(self.TargetHUD.TargetTarget.frame.."Name")
        self.TargetHUD.TargetTarget.HPText = getglobal(self.TargetHUD.TargetTarget.frame.."HPText")
        self.TargetHUD.TargetTarget.MPText = getglobal(self.TargetHUD.TargetTarget.frame.."MPText")

        self:LevelDebug(3, "Setting up NamePlate globals")
        self.NamePlates = {}
        -- Player clickable nameplate
        self.NamePlates.Player = getglobal("ArcHUDFramePlayerNamePlate")
        self.NamePlates.Player.frame = "ArcHUDFramePlayerNamePlate"
        self.NamePlates.Player.unit = "player"
        self.NamePlates.Player.Text = getglobal(self.NamePlates.Player.frame.."Text")

        -- Pet clickable nameplate
        self.NamePlates.Pet = getglobal("ArcHUDFramePetNamePlate")
        self.NamePlates.Pet.frame = "ArcHUDFramePetNamePlate"
        self.NamePlates.Pet.unit = "pet"
        self.NamePlates.Pet.Text = getglobal(self.NamePlates.Pet.frame.."Text")

        -- Target clickable nameplate
        self.NamePlates.Target = getglobal(self.TargetHUD.frame.."NamePlate")
        self.NamePlates.Target.frame = self.TargetHUD.frame.."NamePlate"
        self.NamePlates.Target.unit = "target"

        -- Targettarget clickable nameplate
        self.NamePlates.TargetTarget = getglobal(self.TargetHUD.frame.."TargetNamePlate")
        self.NamePlates.TargetTarget.frame = self.TargetHUD.frame.."TargetNamePlate"
        self.NamePlates.TargetTarget.unit = "targettarget"

        -- Targettargettarget clickable nameplate
        self.NamePlates.TargetTargetTarget = getglobal(self.TargetHUD.frame.."TargetTargetNamePlate")
        self.NamePlates.TargetTargetTarget.frame = self.TargetHUD.frame.."TargetTargetNamePlate"
        self.NamePlates.TargetTargetTarget.unit = "targettargettarget"

        self:LevelDebug(3, "Initializing nameplates")
        -- Initialize nameplate dropdowns
        self:InitNamePlate("Target")
        self:InitNamePlate("TargetTarget")
        self:InitNamePlate("TargetTargetTarget")
        self:InitNamePlate("Player")
        self:InitNamePlate("Pet")

        -- Update fonts for locale
        self:LevelDebug(3, "Updating fonts for locale")
        self:UpdateFonts(self.TargetHUD)
        self:UpdateFonts(self.NamePlates)

        self.TargetHUD.PVPIcon:GetParent():SetScale(0.6)
        self.TargetHUD.RaidTargetIcon:GetParent():SetScale(0.75)

        self:TriggerEvent("ARCHUD_LOADED")
        self:LevelDebug(2, "ArcHUD has been initialized.")
end

function ArcHUD:OnEnable()
        self:LevelDebug(3, "Registering events")
        self:RegisterEvent("PLAYER_COMBO_POINTS",       "EventHandler")
        self:RegisterEvent("PLAYER_ENTERING_WORLD",     "EventHandler")

        self:RegisterEvent("PLAYER_ENTER_COMBAT",       "CombatStatus")
        self:RegisterEvent("PLAYER_LEAVE_COMBAT",       "CombatStatus")
        self:RegisterEvent("PLAYER_REGEN_ENABLED",      "CombatStatus")
        self:RegisterEvent("PLAYER_REGEN_DISABLED",     "CombatStatus")
        self:RegisterEvent("PET_ATTACK_START",          "CombatStatus")
        self:RegisterEvent("PET_ATTACK_STOP",           "CombatStatus")

        self:RegisterEvent("UNIT_FACTION",                      "UpdateFaction")
        self:RegisterEvent("PARTY_MEMBERS_CHANGED",     "UpdateFaction")

        self:RegisterEvent("RAID_TARGET_UPDATE",        "UpdateRaidTargetIcon")

        self:RegisterEvent("PLAYER_FLAGS_CHANGED")

        self:OnProfileEnable()

        self.Enabled = true

        ArcHUDFrame:Show()
        self:LevelDebug(3, "Triggering ring enable event")
        self:TriggerEvent("ARCHUD_MODULE_ENABLE")
        self:LevelDebug(2, "ArcHUD is now enabled")
end

function ArcHUD:OnDisable()
        self:LevelDebug(3, "Triggering ring disable event")
        self:TriggerEvent("ARCHUD_MODULE_DISABLE")

        -- Hide frame
        ArcHUDFrame:Hide()

        self.Enabled = false
        self:LevelDebug(2, "ArcHUD is now disabled")
end

function ArcHUD:OnProfileEnable()
        if(self.db.profile.BlizzPlayer and self.BlizzPlayerHidden or not self.db.profile.BlizzPlayer and not self.BlizzPlayerHidden) then
                self:HideBlizzardPlayer(self.db.profile.BlizzPlayer)
        end
        if(self.db.profile.BlizzTarget and self.BlizzTargetHidden or not self.db.profile.BlizzTarget and not self.BlizzTargetHidden) then
                self:HideBlizzardTarget(self.db.profile.BlizzTarget)
        end

        if(self.db.profile.TargetFrame) then
                self:LevelDebug(3, "Targetframe enabled. Registering unit events")
                self:RegisterEvent("UNIT_HEALTH",                       "EventHandler")
                self:RegisterEvent("UNIT_MAXHEALTH",            "EventHandler")
                self:RegisterEvent("UNIT_MANA",                         "EventHandler")
                self:RegisterEvent("UNIT_RAGE",                         "EventHandler")
                self:RegisterEvent("UNIT_FOCUS",                        "EventHandler")
                self:RegisterEvent("UNIT_ENERGY",                       "EventHandler")
                self:RegisterEvent("UNIT_MAXMANA",                      "EventHandler")
                self:RegisterEvent("UNIT_MAXRAGE",                      "EventHandler")
                self:RegisterEvent("UNIT_MAXFOCUS",             "EventHandler")
                self:RegisterEvent("UNIT_MAXENERGY",            "EventHandler")
                self:RegisterEvent("UNIT_DISPLAYPOWER",         "EventHandler")
                if(self.db.profile.ShowBuffs) then
                        self:RegisterEvent("UNIT_AURA",                         "TargetAuras")
                else
                        for i=1,16 do
                                getglobal(self.TargetHUD.frame.."Buff"..i):Hide()
                                getglobal(self.TargetHUD.frame.."DeBuff"..i):Hide()
                        end
                end
                self:RegisterEvent("PLAYER_TARGET_CHANGED",     "TargetUpdate")

                -- Show target frame if we have a target
                if(UnitExists("target")) then
                        self:TargetUpdate()
                end

                self:LevelDebug(3, "Enabling TargetTarget updates")
                -- Enable Target's Target('s Target) updates
                self:StartMetro("UpdateTargetTarget")


                if(self.db.profile.AttachTop) then
                        self:LevelDebug(3, "Attaching targetframe to top")
                        self.TargetHUD:ClearAllPoints()
                        self.TargetHUD:SetPoint("BOTTOM", self.TargetHUD:GetParent(), "TOP", 0, -100)
                else
                        self:LevelDebug(3, "Attaching targetframe to bottom")
                        self.TargetHUD:ClearAllPoints()
                        self.TargetHUD:SetPoint("TOP", self.TargetHUD:GetParent(), "BOTTOM", 0, -50)
                end
        else
                self:StopMetro("UpdateTargetTarget")
                self.TargetHUD:Hide()
        end

        self:LevelDebug(3, "Positioning ring anchors. Width: "..self.db.profile.Width)
        -- Position the HUD according to user settings
        if(self:HasModule("Anchors")) then
                self:GetModule("Anchors").Left:ClearAllPoints()
                self:GetModule("Anchors").Left:SetPoint("TOPLEFT", ArcHUDFrame, "TOPLEFT", 0-self.db.profile.Width, 0)
                self:GetModule("Anchors").Right:ClearAllPoints()
                self:GetModule("Anchors").Right:SetPoint("TOPLEFT", ArcHUDFrame, "TOPRIGHT", self.db.profile.Width, 0)
        end

        self:LevelDebug(3, "Position frame. YLoc: "..self.db.profile.YLoc)
        ArcHUDFrame:ClearAllPoints()
        ArcHUDFrame:SetPoint("CENTER", WorldFrame, "CENTER", 0, self.db.profile.YLoc)

        self:LevelDebug(3, "Setting scale. Scale: "..self.db.profile.Scale)
        -- Scale the HUD according to user settings.
        ArcHUDFrame:SetScale(self.db.profile.Scale)

        -- Set initial combat flags
        self.PlayerIsInCombat = false
        self.PlayerIsRegenOn = true
        self.PetIsInCombat = false

        self:LevelDebug(3, "Setting player name to nameplate")
        -- Set playername
        self:UpdateFaction()

        -- Enable nameplate updates
        if(self.db.profile.NamePlates) then
                self:LevelDebug(3, "Nameplates enabled. Showing frames and starting update timers")
                self:UnregisterMetro("Enable_player")
                self:UnregisterMetro("Enable_pet")
                self:RegisterMetro("Enable_player", self.EnableDisableNameplate, self.db.profile.HoverDelay, self, "Player")
                self:RegisterMetro("Enable_pet", self.EnableDisableNameplate, self.db.profile.HoverDelay, self, "Pet")
                self.NamePlates.Player:Show()
                self.NamePlates.Pet:Show()
                self:StartMetro("UpdatePetNamePlate")
                self:StartMetro("CheckNamePlateMouseOver")
        else
                self:LevelDebug(3, "Nameplates not enabled.")
                self:UnregisterMetro("Enable_player")
                self:UnregisterMetro("Enable_pet")
                self.NamePlates.Player:Hide()
                self.NamePlates.Pet:Hide()
        end
end

function ArcHUD:OnProfileDisable()
        self:LevelDebug(3, "Unregistering events")
        if(self:IsEventRegistered("UNIT_HEALTH")) then
                self:UnregisterEvent("UNIT_HEALTH")
                self:UnregisterEvent("UNIT_MAXHEALTH")
                self:UnregisterEvent("UNIT_MANA")
                self:UnregisterEvent("UNIT_RAGE")
                self:UnregisterEvent("UNIT_FOCUS")
                self:UnregisterEvent("UNIT_ENERGY")
                self:UnregisterEvent("UNIT_MAXMANA")
                self:UnregisterEvent("UNIT_MAXRAGE")
                self:UnregisterEvent("UNIT_MAXFOCUS")
                self:UnregisterEvent("UNIT_MAXENERGY")
                self:UnregisterEvent("UNIT_DISPLAYPOWER")
        end
        if(self:IsEventRegistered("UNIT_AURA")) then self:UnregisterEvent("UNIT_AURA") end
        if(self:IsEventRegistered("UNIT_FACTION")) then self:UnregisterEvent("UNIT_FACTION") end
        if(self:IsEventRegistered("PLAYER_TARGET_CHANGED")) then self:UnregisterEvent("PLAYER_TARGET_CHANGED") end

        self:LevelDebug(3, "Disabling timers")
        self:StopMetro("UpdateTargetTarget")
        self:StopMetro("UpdatePetNamePlate")
        self:StopMetro("CheckNamePlateMouseOver")
        self:UnregisterMetro("Enable_player")
        self:UnregisterMetro("Enable_pet")

        self:LevelDebug(3, "Hiding frames")
        for i=1,16 do
                getglobal(self.TargetHUD.frame.."Buff"..i):Hide()
                getglobal(self.TargetHUD.frame.."DeBuff"..i):Hide()
        end
        self.TargetHUD:Hide()
        self.NamePlates.Player:Hide()
        self.NamePlates.Pet:Hide()
end

function ArcHUD:ResetOptionsConfirm()
        self:ResetDB("profile")
        self:OnProfileDisable()
        self:OnProfileEnable()
        self:TriggerEvent("ARCHUD_MODULE_UPDATE")
        self:Print(L"TEXT_RESET_CONFIRM")
end

function ArcHUD:InitNamePlate(frame)
        local this = self.NamePlates[frame]

        this:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up")

        this.OnClick = function(self)
                if(ArcHUD_CustomClick) then
                        ArcHUD_CustomClick(arg1, self.unit)
                else
                        if(SpellIsTargeting()) then
                                SpellStopTargeting()
                                return
                        end
                        if(arg1 == "LeftButton") then
                                TargetUnit(self.unit)
                        elseif(arg1 == "RightButton") then
                                ToggleDropDownMenu(1, nil, getglobal(ArcHUD:strcap(self.unit).."FrameDropDown"), "cursor", 0, 0)
                        end
                end
        end
        this.OnEnter = function(self)
                if(SpellIsTargeting()) then
                        if (SpellCanTargetUnit(self.unit)) then
                                SetCursor("CAST_CURSOR")
                        else
                                SetCursor("CAST_ERROR_CURSOR")
                        end
                end
                GameTooltip:SetOwner(self, ANCHOR_BOTTOMRIGHT)
                GameTooltip:SetUnit(self.unit)
                GameTooltip:Show()
        end
        this.OnLeave = function(self)
                if(SpellIsTargeting()) then
                        SetCursor("CAST_ERROR_CURSOR")
                end
                if(GameTooltip:IsOwned(self)) then
                        GameTooltip:Hide()
                end
        end

        if(frame ~= "Target" and frame ~= "TargetTarget" and frame ~= "TargetTargetTarget") then
                self:RegisterMetro(frame.."Alpha", ArcHUDRingTemplate.AlphaUpdate, 0.01, this)
                self:StartMetro(frame.."Alpha")

                this.fadeIn = 0.25
                this.fadeOut = 0.25

                ArcHUDRingTemplate.SetRingAlpha(this, self.db.profile.FadeFull)
        else
                this.Enabled = TRUE
        end
end

function ArcHUD:CheckNamePlateMouseOver()
        if(MouseIsOver(self.NamePlates.Player)) then
                if(not self.NamePlates.Player.Started) then
                        ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Player, 1.0)
                        self.NamePlates.Player.Started = true
                        self:StartMetro("Enable_player")
                end
        else
                if(self.NamePlates.Player.Started) then
                        ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Player, self.db.profile.FadeFull)
                        self:StopMetro("Enable_player")
                        self.NamePlates.Player.Started = false
                        self.NamePlates.Player:EnableMouse(false)
                        self.NamePlates.Player:SetToplevel(false)
                end
        end

        -- Check pet nameplate
        if(not UnitExists("pet")) then
                return
        end
        if(MouseIsOver(self.NamePlates.Pet)) then
                if(not self.NamePlates.Pet.Started) then
                        ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Pet, 1.0)
                        self.NamePlates.Pet.Started = true
                        self:StartMetro("Enable_pet")
                end
        else
                if(self.NamePlates.Pet.Started) then
                        ArcHUDRingTemplate.SetRingAlpha(self.NamePlates.Pet, self.db.profile.FadeFull)
                        self:StopMetro("Enable_pet")
                        self.NamePlates.Pet.Started = false
                        self.NamePlates.Pet:EnableMouse(false)
                        self.NamePlates.Pet:SetToplevel(false)
                end
        end
end

function ArcHUD:EnableDisableNameplate(unit)
        self.NamePlates[unit]:EnableMouse(true)
        self.NamePlates[unit]:SetToplevel(true)
        self:StopMetro("Enable_"..string.lower(unit))
        if(self.db.profile.HoverMsg) then
                self:Print("Enabling mouse input for "..unit)
        end
end

function ArcHUD:TargetUpdate()
        -- Make sure we are targeting someone and that ArcHUD is enabled
        if (UnitExists("target") and self.db.profile.TargetFrame) then
                -- 3D target model
                if((self.db.profile.PlayerModel and UnitIsPlayer("target")) or (self.db.profile.MobModel and not UnitIsPlayer("target"))) then
                        self.TargetHUD.Model:Show()
                        self.TargetHUD.Model:SetUnit("target")
                else
                        self.TargetHUD.Model:Hide()
                end
                self.TargetHUD:Show()

                if(UnitIsDead("target") or UnitIsGhost("target")) then
                        self.TargetHUD.HPText:SetText("Dead")
                else
                        -- Support for MobHealth3
                        if(MobHealth3) then
                                local cur, max, found = MobHealth3:GetUnitHealth("target", UnitHealth("target"), UnitHealthMax("target"))
                                self.TargetHUD.HPText:SetText(cur.."/"..max)
                        -- Support for MobHealth2 / MobInfo-2
                        elseif(self:MobHealth_GetTargetCurHP()) then
                                self.TargetHUD.HPText:SetText(self:MobHealth_GetTargetCurHP().."/"..self:MobHealth_GetTargetMaxHP())
                        else
                                self.TargetHUD.HPText:SetText(UnitHealth("target").."/"..UnitHealthMax("target"))
                        end
                end

                -- Does the unit have mana? If so we want to show it
                if (UnitManaMax("target") > 0) then
                        self.TargetHUD.MPText:SetText(UnitMana("target").."/"..UnitManaMax("target"))
                else
                        self.TargetHUD.MPText:SetText(" ")
                end

                local addtolevel = ""
                if(self.db.profile.ShowClass) then
                        addtolevel = " " .. (UnitIsPlayer("target") and UnitClass("target") or UnitCreatureFamily("target") or UnitCreatureType("target"))
                        self.TargetHUD.Level:SetJustifyH("CENTER")
                else
                        self.TargetHUD.Level:SetJustifyH("LEFT")
                end
                -- What kind of target is it? If UnitLevel returns negative we have a target whose
                --   level are too high to show or a boss
                if (UnitLevel("target") < 0) then
                        if ( UnitClassification("target") == "worldboss" ) then
                                self.TargetHUD.Level:SetText("Boss" .. addtolevel)
                        else
                                self.TargetHUD.Level:SetText("L??" .. addtolevel)
                        end
                else
                        -- Make sure we mark elites with a + after the level
                        if(not string.find(UnitClassification("target"), "elite")) then
                                self.TargetHUD.Level:SetText("L" .. UnitLevel("target") .. addtolevel)
                        else
                                self.TargetHUD.Level:SetText("L" .. UnitLevel("target") .. "+" .. addtolevel)
                        end
                end

                -- Check if the target is friendly to the player
                targetfriend = UnitIsFriend("player","target")

                -- Color the level display based on the targets level in relation
                --  to player level
                if (targetfriend) then
                        self.TargetHUD.Level:SetTextColor(1, 0.9, 0)
                elseif (UnitIsTrivial("target")) then
                        self.TargetHUD.Level:SetTextColor(0.7, 0.7, 0.7)
                elseif (UnitLevel("target") == -1) then
                        self.TargetHUD.Level:SetTextColor(1, 0, 0)
                elseif (UnitLevel("target") <= (UnitLevel("player")-3)) then
                        self.TargetHUD.Level:SetTextColor(0, 0.9, 0)
                elseif (UnitLevel("target") >= (UnitLevel("player")+5)) then
                        self.TargetHUD.Level:SetTextColor(1, 0, 0)
                elseif (UnitLevel("target") >= (UnitLevel("player")+3)) then
                        self.TargetHUD.Level:SetTextColor(1, 0.5, 0)
                else
                        self.TargetHUD.Level:SetTextColor(1, 0.9, 0)
                end

                -- Color the targets hp and mana text correctly
                local info = {}
                if (UnitPowerType("target") == 0) then
                        info = { r = 0.00, g = 1.00, b = 1.00 }
                else
                        info = ManaBarColor[UnitPowerType("target")]
                end
                self.TargetHUD.MPText:SetTextColor(info.r, info.g, info.b)

                if(targetfriend) then
                        self.TargetHUD.HPText:SetTextColor(0, 1, 0)
                else
                        self.TargetHUD.HPText:SetTextColor(1, 0, 0)
                end

                -- The name of the target should be colored differently if it's a player or if
                --   it's a mob
                local _, class = UnitClass("target")
                local color = self.ClassColor[class]
                if (color and UnitIsPlayer("target")) then
                        -- Is target in a guild?
                        local guild, _, _ = GetGuildInfo("target")

                        -- Color the target name based on class since we have a player targeted
                        if(guild and ArcHUD.db.profile.ShowGuild) then
                                self.TargetHUD.Name:SetText("|cff"..color..UnitName("target").." <"..guild..">".."|r")
                        else
                                self.TargetHUD.Name:SetText("|cff"..color..UnitName("target").."|r")
                        end
                else
                        -- Color the target name based on reaction (red to green) since we have a
                        --   mob targeted
                        local reaction = self.RepColor[UnitReaction("target","player")]
                        if(reaction) then
                                self.TargetHUD.Name:SetText("|cff"..reaction..UnitName("target").."|r")
                        else
                                self.TargetHUD.Name:SetText(UnitName("target"))
                        end
                end

                -- Show clickable nameplate only if the target is a friendly player and not self
                --[[if(UnitIsPlayer("target") and targetfriend and not UnitIsUnit("player", "target")) then
                        self.NamePlates.Target:Show()
                else
                        self.NamePlates.Target:Hide()
                end]]

                if(self.db.profile.ShowBuffs) then
                        -- Update buffs and debuffs for the target
                        self:TargetAuras()
                end

                self:UpdateFaction("target")
                self:UpdateRaidTargetIcon()
                self:PLAYER_FLAGS_CHANGED("target")

                if(self.BlizzTargetHidden) then
                        if(UnitIsEnemy("target", "player")) then
                                PlaySound("igCreatureAggroSelect")
                        elseif(UnitIsFriend("player", "target")) then
                                PlaySound("igCharacterNPCSelect")
                        else
                                PlaySound("igCreatureNeutralSelect")
                        end
                end
        else
                -- We didn't have anything targeted or ArcHUD is disabled so lets hide the
                --   target frame again
                if(self.BlizzTargetHidden) then
                        PlaySound("INTERFACESOUND_LOSTTARGETUNIT")
                end
                self.TargetHUD:Hide()
        end
end

function ArcHUD:UpdateFaction(unit)
        self:LevelDebug(2, "UpdateFaction: arg1 = %s, unit = %s", arg1 or "nil", unit or "nil")

        if(not unit and arg1 and arg1 ~= "player") then return end
        if(arg1 and not unit) then unit = arg1 end

        if(unit and unit == "target") then
                local factionGroup = UnitFactionGroup("target")
                if(UnitIsPVPFreeForAll("target")) then
                        self.TargetHUD.PVPIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA")
                        self.TargetHUD.PVPIcon:Show()
                elseif(factionGroup and UnitIsPVP("target")) then
                        self.TargetHUD.PVPIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..factionGroup)
                        self.TargetHUD.PVPIcon:Show()
                else
                        self.TargetHUD.PVPIcon:Hide()
                end
        else
                local factionGroup, factionName = UnitFactionGroup("player");
                local _, class = UnitClass("player")
                local color = self.ClassColor[class]
                if(UnitIsPVPFreeForAll("player")) then
                        self.NamePlates.Player.Text:SetText("|cffffff00[FFA] |cff"..(color or "ffffff")..(UnitName("player") or "Unknown Entity").."|r")
                elseif(factionGroup and UnitIsPVP("player")) then
                        self.NamePlates.Player.Text:SetText("|cffff0000[PVP] |cff"..(color or "ffffff")..(UnitName("player") or "Unknown Entity").."|r")
                else
                        self.NamePlates.Player.Text:SetText("|cff"..(color or "ffffff")..(UnitName("player") or "Unknown Entity").."|r")
                end
        end
end

function ArcHUD:UpdateRaidTargetIcon()
        if(not UnitExists("target")) then self.TargetHUD.RaidTargetIcon:Hide() return end

        local index = GetRaidTargetIndex("target")
        if(index) then
                SetRaidTargetIconTexture(self.TargetHUD.RaidTargetIcon, index)
                self.TargetHUD.RaidTargetIcon:Show()
        else
                self.TargetHUD.RaidTargetIcon:Hide()
        end
end

function ArcHUD:PLAYER_FLAGS_CHANGED(unit)
        if(arg1 and not unit) then unit = arg1 end
        if(not UnitExists("target")) then self.TargetHUD.LeaderIcon:Hide() return end

        if(unit == "target") then
                if(UnitIsPartyLeader("target")) then
                        self.TargetHUD.LeaderIcon:Show()
                else
                        self.TargetHUD.LeaderIcon:Hide()
                end
        end
end

function ArcHUD:TargetAuras()
        if(not arg1 == "target") then return end
        local frame = self.TargetHUD.frame
        local unit = "target"
        local i, icon, buff, debuff, debuffborder, debuffcount, debuffType, color
        for i = 1, 16 do
                buff = UnitBuff(unit, i)
                button = getglobal(frame.."Buff"..i)
                if (buff) then
                        icon = getglobal(button:GetName().."Icon")
                        icon:SetTexture(buff)
                        button:Show()
                        button.unit = unit
                else
                        button:Hide()
                end
        end

        for i = 1, 16 do
                debuff, debuffApplications, debuffType = UnitDebuff(unit, i)
                button = getglobal(frame.."DeBuff"..i)
                if (debuff) then
                        icon = getglobal(button:GetName().."Icon")
                        debuffborder = getglobal(button:GetName().."Border")
                        debuffcount = getglobal(button:GetName().."Count")
                        icon:SetTexture(debuff)
                        button:Show()
                        debuffborder:Show()
                        button.isdebuff = 1
                        button.unit = unit
                        if ( debuffType ) then
                                color = DebuffTypeColor[debuffType]
                        else
                                color = DebuffTypeColor["none"]
                        end
                        debuffborder:SetVertexColor(color.r, color.g, color.b)
                        if (debuffApplications > 1) then
                                debuffcount:SetText(debuffApplications)
                                debuffcount:Show()
                        else
                                debuffcount:Hide()
                        end
                else
                        button:Hide()
                end
        end
end

function ArcHUD:SetAuraTooltip(this)
        if (not this:IsVisible()) then return end
        GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT")
        local unit = this.unit
        if (this.isdebuff == 1) then
                GameTooltip:SetUnitDebuff(unit, this:GetID())
        else
                GameTooltip:SetUnitBuff(unit, this:GetID())
        end
end

function ArcHUD:EventHandler()
        if (event == "UNIT_DISPLAYPOWER") then
                local info = {}
                if (arg1 == "target") then
                        if (UnitPowerType(arg1) == 0) then
                                info = { r = 0.00, g = 1.00, b = 1.00 }
                        else
                                info = ManaBarColor[UnitPowerType(arg1)]
                        end
                        self.TargetHUD.MPText:SetTextColor(info.r, info.g, info.b)
                end
        elseif (event == "PLAYER_COMBO_POINTS") then
                local points = GetComboPoints()
                if (points > 0) then
                        self.TargetHUD.Combo:SetText(points)
                else
                        self.TargetHUD.Combo:SetText("")
                end
        elseif (event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH") then
                if (arg1 == "target") then
                        -- Support for MobHealth3
                        if(MobHealth3) then
                                local cur, max, found = MobHealth3:GetUnitHealth(arg1, UnitHealth(arg1), UnitHealthMax(arg1))
                                self.TargetHUD.HPText:SetText(cur.."/"..max)
                        -- Support for MobHealth2 / MobInfo-2
                        elseif(self:MobHealth_GetTargetCurHP()) then
                                self.TargetHUD.HPText:SetText(self:MobHealth_GetTargetCurHP().."/"..self:MobHealth_GetTargetMaxHP())
                        else
                                self.TargetHUD.HPText:SetText(UnitHealth(arg1).."/"..UnitHealthMax(arg1))
                        end
                end
        elseif(event == "PLAYER_ENTERING_WORLD") then
                self.PlayerIsInCombat = false
                self.PlayerIsRegenOn = true
        else
                if (arg1 == "target") then
                        self.TargetHUD.MPText:SetText(UnitMana(arg1).."/"..UnitManaMax(arg1))
                end
        end
end

function ArcHUD:CombatStatus()
        self:LevelDebug(2, "CombatStatus: event = " .. event)
        if(event == "PLAYER_ENTER_COMBAT" or event == "PLAYER_REGEN_DISABLED") then
                self.PlayerIsInCombat = true
                if(event == "PLAYER_REGEN_DISABLED") then
                        self.PlayerIsRegenOn = false
                end
        elseif(event == "PLAYER_LEAVE_COMBAT" or event == "PLAYER_REGEN_ENABLED") then
                if(event == "PLAYER_LEAVE_COMBAT" and self.PlayerIsRegenOn) then
                        self.PlayerIsInCombat = false
                elseif(event == "PLAYER_REGEN_ENABLED") then
                        self.PlayerIsInCombat = false
                        self.PlayerIsRegenOn = true
                end
        elseif(event == "PET_ATTACK_START") then
                self.PetIsInCombat = true
        elseif(event == "PET_ATTACK_STOP") then
                self.PetIsInCombat = false
        end
end

function ArcHUD:UpdatePetNamePlate()
        if(UnitExists("pet")) then
                local happiness, _, _ = GetPetHappiness()
                local color
                if(happiness) then
                        if(happiness == 1) then
                                color = "ff0000"
                                happiness = " :("
                        elseif(happiness == 2) then
                                color = "ffff00"
                                happiness = " :||"
                        elseif(happiness == 3) then
                                color = "00ff00"
                                happiness = " :)"
                        end
                else
                        color = "ffffff"
                        happiness = ""
                end
                self.NamePlates.Pet.Text:SetText("|cff"..color..UnitName("pet").." "..happiness.."|r")
                self.NamePlates.Pet:Show()
        else
                self.NamePlates.Pet:Hide()
        end
end

function ArcHUD:UpdateTargetTarget()
        -- Handle Target's Target
        if(UnitExists("targettarget") and self.db.profile.TargetTarget) then
                local _, class = UnitClass("targettarget")
                local color = self.ClassColor[class]
                if (color and UnitIsPlayer("targettarget")) then
                                self.TargetHUD.Target.Name:SetText("|cff"..color..UnitName("targettarget").."|r")
                else
                        local reaction = self.RepColor[UnitReaction("targettarget","player")]
                        if(reaction) then
                                self.TargetHUD.Target.Name:SetText("|cff"..reaction..UnitName("targettarget").."|r")
                        else
                                self.TargetHUD.Target.Name:SetText(UnitName("targettarget"))
                        end
                end

                local info = {}
                if (UnitPowerType("targettarget") == 0) then
                        info = { r = 0.00, g = 1.00, b = 1.00 }
                else
                        info = ManaBarColor[UnitPowerType("targettarget")]
                end
                self.TargetHUD.Target.MPText:SetTextColor(info.r, info.g, info.b)

                if(UnitIsFriend("player","targettarget")) then
                        self.TargetHUD.Target.HPText:SetTextColor(0, 1, 0)
                else
                        self.TargetHUD.Target.HPText:SetTextColor(1, 0, 0)
                end
                if(UnitIsDead("targettarget") or UnitIsGhost("targettarget")) then
                        self.TargetHUD.Target.HPText:SetText("Dead")
                else
                        self.TargetHUD.Target.HPText:SetText(math.floor(UnitHealth("targettarget")/UnitHealthMax("targettarget")*100).."%")
                end

                if (UnitManaMax("targettarget") > 0) then
                        self.TargetHUD.Target.MPText:SetText(math.floor(UnitMana("targettarget")/UnitManaMax("targettarget")*100).."%")
                else
                        self.TargetHUD.Target.MPText:SetText(" ")
                end
                self.TargetHUD.Target:Show()
        else
                self.TargetHUD.Target:Hide()
        end

        -- Handle Target's Target's Target
        if(UnitExists("targettargettarget") and self.db.profile.TargetTargetTarget) then
                local _, class = UnitClass("targettargettarget")
                local color = self.ClassColor[class]
                if (color and UnitIsPlayer("targettargettarget")) then
                                self.TargetHUD.TargetTarget.Name:SetText("|cff"..color..UnitName("targettargettarget").."|r")
                else
                        local reaction = self.RepColor[UnitReaction("targettargettarget","player")]
                        if(reaction) then
                                self.TargetHUD.TargetTarget.Name:SetText("|cff"..reaction..UnitName("targettargettarget").."|r")
                        else
                                self.TargetHUD.TargetTarget.Name:SetText(UnitName("targettargettarget"))
                        end
                end

                local info = {}
                if (UnitPowerType("targettargettarget") == 0) then
                        info = { r = 0.00, g = 1.00, b = 1.00 }
                else
                        info = ManaBarColor[UnitPowerType("targettargettarget")]
                end
                self.TargetHUD.TargetTarget.MPText:SetTextColor(info.r, info.g, info.b)

                if(UnitIsFriend("player","targettargettarget")) then
                        self.TargetHUD.TargetTarget.HPText:SetTextColor(0, 1, 0)
                else
                        self.TargetHUD.TargetTarget.HPText:SetTextColor(1, 0, 0)
                end
                if(UnitIsDead("targettargettarget") or UnitIsGhost("targettargettarget")) then
                        self.TargetHUD.TargetTarget.HPText:SetText("Dead")
                else
                        self.TargetHUD.TargetTarget.HPText:SetText(math.floor(UnitHealth("targettargettarget")/UnitHealthMax("targettargettarget")*100).."%")
                end

                if (UnitManaMax("targettargettarget") > 0) then
                        self.TargetHUD.TargetTarget.MPText:SetText(math.floor(UnitMana("targettargettarget")/UnitManaMax("targettargettarget")*100).."%")
                else
                        self.TargetHUD.TargetTarget.MPText:SetText(" ")
                end
                self.TargetHUD.TargetTarget:Show()
        else
                self.TargetHUD.TargetTarget:Hide()
        end
end

function ArcHUD:UpdateFonts(tbl)
        local update = false
    for k,v in pairs(tbl) do
        if(type(v) == "table") then
                        if(v.GetFont) then
                                local fontName, fontSize, fontFlags = v:GetFont()
                                if(fontName) then
                                        self:LevelDebug(2, "UpdateFonts: fontName = %s, localeFont = %s", fontName, L"FONT")
                                end
                                if(fontName and not string.find(fontName, L"FONT")) then
                                        v:SetFont("Fonts\\"..L"FONT", fontSize, fontFlags)
                                        update = true
                                end
                        end
            self:UpdateFonts(v)
        end
    end
        if(update) then
                self:LevelDebug(3, "Fonts updated")
        end
end


-- MobInfo-2 mob health code
--------------------------------
function ArcHUD:MobHealth_PPP(index)
  if(MobHealth_PPP) then
    return MobHealth_PPP( index );
  else
        if( index and MobHealthDB[index] ) then
                local s, e, pts, pct = string.find(MobHealthDB[index], "^(%d+)/(%d+)$");
                if( pts and pct ) then
                        pts = pts + 0;
                        pct = pct + 0;
                        if( pct ~= 0 ) then
                                return pts / pct;
                        end
                end
        end
        return 0;
  end
end  -- of My_MobHealth_PPP

function ArcHUD:MobHealth_GetTargetCurHP()
        if(MobHealthFrame) then
                if(MobHealth_GetTargetCurHP) then
                        return MobHealth_GetTargetCurHP();
                else
                        local name  = UnitName("target");
                        local level = UnitLevel("target");
                        local healthPercent = UnitHealth("target");
                        if  name  and  level  and  healthPercent  then
                                local index = name..":"..level;
                                local ppp = self:MobHealth_PPP( index );
                                return math.floor( healthPercent * ppp + 0.5);
                        end
                end
        end
        return nil;
end  -- of MobHealth_GetTargetCurHP()

function ArcHUD:MobHealth_GetTargetMaxHP()
        if(MobHealthFrame) then
                if(MobHealth_GetTargetMaxHP) then
                        return MobHealth_GetTargetMaxHP();
                else
                        local name  = UnitName("target");
                        local level = UnitLevel("target");
                        if  name  and  level  then
                                local index = name..":"..level;
                                local ppp = self:MobHealth_PPP( index );
                                return math.floor( 100 * ppp + 0.5);
                        end
                end
        end
        return nil;
end  -- of MobHealth_GetTargetMaxHP()


-- Blizzard Frame functions
-- Taken from AceUnitFrames
function ArcHUD:HideBlizzardPlayer(hide)
        self.BlizzPlayerHidden = not hide
        if not hide then
                PlayerFrame:UnregisterAllEvents()
                PlayerFrameHealthBar:UnregisterAllEvents()
                PlayerFrameManaBar:UnregisterAllEvents()
                PlayerFrame:Hide()

                PetFrame:UnregisterAllEvents()
                PetFrameHealthBar:UnregisterAllEvents()
                PetFrameManaBar:UnregisterAllEvents()
                PetFrame:Hide()
        else
                PlayerFrame:RegisterEvent("UNIT_LEVEL")
                PlayerFrame:RegisterEvent("UNIT_COMBAT")
                PlayerFrame:RegisterEvent("UNIT_PVP_UPDATE")
                PlayerFrame:RegisterEvent("UNIT_MAXMANA")
                PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
                PlayerFrame:RegisterEvent("PLAYER_ENTER_COMBAT")
                PlayerFrame:RegisterEvent("PLAYER_LEAVE_COMBAT")
                PlayerFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
                PlayerFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
                PlayerFrame:RegisterEvent("PLAYER_UPDATE_RESTING")
                PlayerFrame:RegisterEvent("PARTY_MEMBERS_CHANGED")
                PlayerFrame:RegisterEvent("PARTY_LEADER_CHANGED")
                PlayerFrame:RegisterEvent("PARTY_LOOT_METHOD_CHANGED")
                PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
                PlayerFrame:RegisterEvent("RAID_ROSTER_UPDATE")
                PlayerFrame:RegisterEvent("PLAYTIME_CHANGED")
                PlayerFrame:RegisterEvent("UNIT_NAME_UPDATE")
                PlayerFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE")
                PlayerFrame:RegisterEvent("UNIT_DISPLAYPOWER")
                PlayerFrameHealthBar:RegisterEvent("CVAR_UPDATE")
                PlayerFrameHealthBar:RegisterEvent("UNIT_HEALTH")
                PlayerFrameHealthBar:RegisterEvent("UNIT_MAXHEALTH")
                PlayerFrameManaBar:RegisterEvent("CVAR_UPDATE")
                PlayerFrameManaBar:RegisterEvent("UNIT_MANA")
                PlayerFrameManaBar:RegisterEvent("UNIT_RAGE")
                PlayerFrameManaBar:RegisterEvent("UNIT_FOCUS")
                PlayerFrameManaBar:RegisterEvent("UNIT_ENERGY")
                PlayerFrameManaBar:RegisterEvent("UNIT_HAPPINESS")
                PlayerFrameManaBar:RegisterEvent("UNIT_MAXMANA")
                PlayerFrameManaBar:RegisterEvent("UNIT_MAXRAGE")
                PlayerFrameManaBar:RegisterEvent("UNIT_MAXFOCUS")
                PlayerFrameManaBar:RegisterEvent("UNIT_MAXENERGY")
                PlayerFrameManaBar:RegisterEvent("UNIT_MAXHAPPINESS")
                PlayerFrameManaBar:RegisterEvent("UNIT_DISPLAYPOWER")
                PlayerFrame:Show()

                PetFrame:RegisterEvent("UNIT_PET")
                PetFrame:RegisterEvent("UNIT_COMBAT")
                PetFrame:RegisterEvent("UNIT_AURA")
                PetFrame:RegisterEvent("PET_ATTACK_START")
                PetFrame:RegisterEvent("PET_ATTACK_STOP")
                PetFrame:RegisterEvent("UNIT_HAPPINESS")
                PetFrame:RegisterEvent("UNIT_NAME_UPDATE")
                PetFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE")
                PetFrame:RegisterEvent("UNIT_DISPLAYPOWER")
                PetFrameHealthBar:RegisterEvent("CVAR_UPDATE")
                PetFrameHealthBar:RegisterEvent("UNIT_HEALTH")
                PetFrameHealthBar:RegisterEvent("UNIT_MAXHEALTH")
                PetFrameManaBar:RegisterEvent("CVAR_UPDATE")
                PetFrameManaBar:RegisterEvent("UNIT_MANA")
                PetFrameManaBar:RegisterEvent("UNIT_RAGE")
                PetFrameManaBar:RegisterEvent("UNIT_FOCUS")
                PetFrameManaBar:RegisterEvent("UNIT_ENERGY")
                PetFrameManaBar:RegisterEvent("UNIT_HAPPINESS")
                PetFrameManaBar:RegisterEvent("UNIT_MAXMANA")
                PetFrameManaBar:RegisterEvent("UNIT_MAXRAGE")
                PetFrameManaBar:RegisterEvent("UNIT_MAXFOCUS")
                PetFrameManaBar:RegisterEvent("UNIT_MAXENERGY")
                PetFrameManaBar:RegisterEvent("UNIT_MAXHAPPINESS")
                PetFrameManaBar:RegisterEvent("UNIT_DISPLAYPOWER")
        end
end

function ArcHUD:HideBlizzardTarget(hide)
        self.BlizzTargetHidden = not hide
        if not hide then
                TargetFrame:UnregisterAllEvents()
                TargetFrameHealthBar:UnregisterAllEvents()
                TargetFrameManaBar:UnregisterAllEvents()
                TargetFrame:Hide()

                ComboFrame:UnregisterAllEvents()
        else
                TargetFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
                TargetFrame:RegisterEvent("UNIT_HEALTH")
                TargetFrame:RegisterEvent("UNIT_LEVEL")
                TargetFrame:RegisterEvent("UNIT_FACTION")
                TargetFrame:RegisterEvent("UNIT_CLASSIFICATION_CHANGED")
                TargetFrame:RegisterEvent("UNIT_AURA")
                TargetFrame:RegisterEvent("PLAYER_FLAGS_CHANGED")
                TargetFrame:RegisterEvent("PARTY_MEMBERS_CHANGED")
                TargetFrame:RegisterEvent("UNIT_NAME_UPDATE")
                TargetFrame:RegisterEvent("UNIT_PORTRAIT_UPDATE")
                TargetFrame:RegisterEvent("UNIT_DISPLAYPOWER")
                TargetFrameHealthBar:RegisterEvent("CVAR_UPDATE")
                TargetFrameHealthBar:RegisterEvent("UNIT_HEALTH")
                TargetFrameHealthBar:RegisterEvent("UNIT_MAXHEALTH")
                TargetFrameManaBar:RegisterEvent("CVAR_UPDATE")
                TargetFrameManaBar:RegisterEvent("UNIT_MANA")
                TargetFrameManaBar:RegisterEvent("UNIT_RAGE")
                TargetFrameManaBar:RegisterEvent("UNIT_FOCUS")
                TargetFrameManaBar:RegisterEvent("UNIT_ENERGY")
                TargetFrameManaBar:RegisterEvent("UNIT_HAPPINESS")
                TargetFrameManaBar:RegisterEvent("UNIT_MAXMANA")
                TargetFrameManaBar:RegisterEvent("UNIT_MAXRAGE")
                TargetFrameManaBar:RegisterEvent("UNIT_MAXFOCUS")
                TargetFrameManaBar:RegisterEvent("UNIT_MAXENERGY")
                TargetFrameManaBar:RegisterEvent("UNIT_MAXHAPPINESS")
                TargetFrameManaBar:RegisterEvent("UNIT_DISPLAYPOWER")
                --if(UnitExists("target")) then
                        --TargetFrame:Show()
                --end
                this = TargetFrame
                TargetFrame_Update()

                ComboFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
                ComboFrame:RegisterEvent("PLAYER_COMBO_POINTS")
        end
end