Quantcast

Merge branch 'master' of git.wowinterface.com:TitanPanel-571

HonorGoG [01-19-24 - 23:01]
Merge branch 'master' of git.wowinterface.com:TitanPanel-571

* 'master' of git.wowinterface.com:TitanPanel-571:
  - XP : On Hide stop events to save cycles; on Show start plugin
  - Gold : On Hide stop events to save cycles; on Show start plugin
  - Bag : On hide stop events to reduce cycles; on show register to start plugin
  - Ammo : Combine Wrath and CE; fix for #1380; refactor to remove no longer needed events & reduce cycles
Filename
TitanAmmo/TitanAmmo_Vanilla.toc
TitanAmmo/TitanAmmo_Wrath.toc
TitanAmmo/TitanClassicAmmo.lua
TitanAmmo/TitanClassicAmmo.xml
TitanAmmo/TitanClassicAmmo_CE.lua
TitanAmmo/TitanClassicAmmo_CE.xml
TitanBag/TitanBag.lua
TitanGold/TitanGold.lua
TitanXP/TitanXP.lua
diff --git a/TitanAmmo/TitanAmmo_Vanilla.toc b/TitanAmmo/TitanAmmo_Vanilla.toc
index 660b099..42d7525 100644
--- a/TitanAmmo/TitanAmmo_Vanilla.toc
+++ b/TitanAmmo/TitanAmmo_Vanilla.toc
@@ -1,9 +1,9 @@
 ## Interface: 11500
-## Title: Titan Panel [|cffeda55fAmmo|r] |cff00aa008.0.2|r
-## Version: 8.0.2
+## Title: Titan Panel [|cffeda55fAmmo|r] |cff00aa008.0.1|r
+## Version: 8.0.1
 ## Notes: Adds an ammo monitor to Titan Panel - Classic versions only
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-TitanClassicAmmo_CE.xml
\ No newline at end of file
+TitanClassicAmmo.lua
\ No newline at end of file
diff --git a/TitanAmmo/TitanAmmo_Wrath.toc b/TitanAmmo/TitanAmmo_Wrath.toc
index c8aa34e..bb46973 100644
--- a/TitanAmmo/TitanAmmo_Wrath.toc
+++ b/TitanAmmo/TitanAmmo_Wrath.toc
@@ -1,9 +1,9 @@
 ## Interface: 30403
-## Title: Titan Panel [|cffeda55fAmmo|r] |cff00aa008.0.2|r
-## Version: 8.0.2
+## Title: Titan Panel [|cffeda55fAmmo|r] |cff00aa008.0.1|r
+## Version: 8.0.1
 ## Notes: Adds an ammo monitor to Titan Panel - Classic versions only
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: TitanClassic
-TitanClassicAmmo.xml
\ No newline at end of file
+TitanClassicAmmo.lua
\ No newline at end of file
diff --git a/TitanAmmo/TitanClassicAmmo.lua b/TitanAmmo/TitanClassicAmmo.lua
index ed139c2..5c1a98b 100644
--- a/TitanAmmo/TitanClassicAmmo.lua
+++ b/TitanAmmo/TitanClassicAmmo.lua
@@ -4,17 +4,21 @@
 -- *
 -- * By: Titan Panel Development Team
 -- **************************************************************************
+-- 2024 Jan - Combined Classic Era and Wrath into one version
 -- 2019 Aug - reverted and updated for Classic
 --
 -- This will track the count of ammo (bows and guns) or thrown (knives) equipped.
 -- Ammo is placed in the 'ammo' slot where Blizzard counts ALL of that *type of ammo*
 -- regardless of where it is in your bags.
--- Thrown is placed in the actual weapon slot where Blizzard counts ALL of that *type of thrown*.
+-- Thrown is placed in the actual display.weapon slot where Blizzard counts ALL of that *type of thrown*.
 -- This forces a different routine to be used so the ammo must always be checked for type and count.
+--
+-- Note: Thrown has no durability. Not sure when Blizz implemented this
 --]]
 -- ******************************** Constants *******************************
 local _G = getfenv(0);
 local TITAN_AMMO_ID = "Ammo";
+local TITAN_BUTTON = "TitanPanel"..TITAN_AMMO_ID.."Button"

 local SHOOT_STACK = 200
 local ARROW_STACK = 200
@@ -27,6 +31,7 @@ local LIM_BAD  = .5
 local BOW = "INVTYPE_RANGED"
 local GUN = "INVTYPE_RANGEDRIGHT"
 local THROWN = "INVTYPE_THROWN"
+local NO_RANGED = "Nothing_Equipped"

 local TITAN_AMMO_THRESHOLD_TABLE = { -- Use ammo stack and threshold limits above to calc colored text
 	["INVTYPE_RANGEDRIGHT"] = {
@@ -43,28 +48,74 @@ local TITAN_AMMO_THRESHOLD_TABLE = { -- Use ammo stack and threshold limits abov
 	 },
 };

+local PLACE = { -- for debug output
+	["INVTYPE_RANGED"] = "Bow",
+	["INVTYPE_RANGEDRIGHT"] = "Gun",
+	["INVTYPE_THROWN"] = "Throw",
+	}
+
 -- ******************************** Variables *******************************
-local class = select(2, UnitClass("player"))
 local ammoSlotID = GetInventorySlotInfo("AmmoSlot")
 local rangedSlotID = GetInventorySlotInfo("RangedSlot")
-local ammo_count = 0;
-local ammo_type  = "";
-local ammo_name  = ""
-local weapon  = "";
-local weapon_type  = "";
-local ammo_show  = false -- show plugin based on class
+
+-- Info to show on the plugin
+local display = {
+	ammo_count = 0,
+	ammo_type  = "",
+	ammo_name  = "", -- L["TITAN_AMMO_BUTTON_NOAMMO"]
+	weapon  = "",
+	weapon_type  = "",
+	}

 local L = LibStub("AceLocale-3.0"):GetLocale("TitanClassic", true)
+
+local debug_flow = false
+
 -- ******************************** Functions *******************************
+--[[ local
+-- **************************************************************************
+-- NAME : debug_msg(Message)
+-- DESC : Debug function to print message to chat frame
+-- VARS : Message = message to print to chat frame
+-- **************************************************************************
+--]]
+local function debug_msg(Message)
+	local msg = ""
+	local stamp = date("%H:%M:%S") -- date("%m/%d/%y %H:%M:%S")
+	local milli = GetTime() -- seconds with millisecond precision (float)
+	milli = string.format("%0.2F", milli - math.modf(milli))
+	msg = msg..TitanUtils_GetGoldText(stamp..milli.." "..TITAN_AMMO_ID..": ")
+	msg = msg..TitanUtils_GetGreenText(Message)
+	DEFAULT_CHAT_FRAME:AddMessage(msg)
+--		DEFAULT_CHAT_FRAME:AddMessage(TITAN_AMMO_ID..": " .. Message, 1.00, 0.49, 0.04)
+end
+
 local function ClrAmmoInfo()
-	ammo_count = 0;
-	ammo_type  = L["TITAN_AMMO_BUTTON_NOAMMO"];
-	ammo_name  = L["TITAN_AMMO_BUTTON_NOAMMO"]
-	ammo_show  = false
+	display.ammo_count = 0;
+	display.ammo_type  = NO_RANGED
+	display.ammo_name  = ""
+	display.weapon = ""
+	display.weapon_type = ""
 end
+
 local function GetItemLink(rangedSlotID)
 	return GetInventoryItemLink("player", rangedSlotID)
 end
+
+local function IsAmmoClass()
+	local class = select(2, UnitClass("player"))
+	local res = false
+	if class == "ROGUE"
+	or class == "WARRIOR"
+	or class == "HUNTER"
+	then
+		res = true
+	else
+		res = false
+	end
+	return res
+end
+
 local function IsThrown(loc)
 	local res = false
 	if loc == "INVTYPE_THROWN" then
@@ -72,6 +123,7 @@ local function IsThrown(loc)
 	end
 	return res
 end
+
 local function IsAmmo(loc)
 	local res = false
 	if loc == "INVTYPE_RANGED" or loc == "INVTYPE_RANGEDRIGHT" then
@@ -82,64 +134,91 @@ end

 local function GetAmmoCount()
 	local ammo = "";
-	local w = "--";
-	local wt = "--";
+	local wpn = "--";
+	local wpnt = "--";

 	local weap = GetInventoryItemID("player", rangedSlotID)
 	if weap == nil then
---[[
-print("GetWeaponInfo"
-.." Not Found"
-)
---]]
+		-- nothing in slot
+		ammo = NO_RANGED
 	else
 		local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount,
 		itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType, expacID, setID, isCraftingReagent
 		   = GetItemInfo(weap)
-		w = itemName
-		wt = itemSubType
+		wpn = itemName
+		wpnt = itemSubType
 		ammo = itemEquipLoc

 		-- set ammo name and count
 		if IsThrown(ammo) then -- throwing knives, etc
-			ammo_name = itemName or _G["UNKNOWN"]
-			if ammo_name == _G["UNKNOWN"] then
-				ammo_count = 0
+			display.ammo_name = itemName or UNKNOWN
+			if display.ammo_name == UNKNOWN then
+				display.ammo_count = 0
 			else
-				ammo_count = GetInventoryItemCount("player", rangedSlotID) or ammo_count
+				display.ammo_count = GetInventoryItemCount("player", rangedSlotID) or display.ammo_count
 			end
-		else -- bullets or arrows
-			ammo_name = select(1, GetItemInfo(GetInventoryItemID("player", ammoSlotID))) or _G["UNKNOWN"]
-			if ammo_name == _G["UNKNOWN"] then
-				ammo_count = 0
+		elseif IsAmmo(ammo) then
+			display.ammo_name = select(1, GetItemInfo(GetInventoryItemID("player", ammoSlotID))) or UNKNOWN
+			if display.ammo_name == UNKNOWN then
+				display.ammo_count = 0
 			else
-				ammo_count = GetInventoryItemCount("player", ammoSlotID) or ammo_count
+				display.ammo_count = GetInventoryItemCount("player", ammoSlotID) or display.ammo_count
 			end
+		else -- bullets or arrows
+			display.ammo_name = UNKNOWN
+			display.ammo_count = 0
 		end
---[[
-print("GetWeaponInfo"
---.." '"..tostring(weap).."'"
-.." '"..tostring(w).."'"
---.." '"..tostring(wt).."'"
---.." '"..tostring(ammo).."'"
-.." '"..tostring(ammo_name).."'"
-.." '"..tostring(ammo_count).."'"
-)
---]]
 	end

-	-- Set display variables
-	weapon = w
-	weapon_type = wt
-	ammo_type = ammo
+	-- Set variables
+	display.weapon = wpn
+	display.weapon_type = wpnt
+	display.ammo_type = ammo

+	if debug_flow then
+		local msg =
+			"Count"
+			.." "..tostring(PLACE[ammo])..""
+			.." '"..tostring(wpnt).."'"
+			.." '"..tostring(wpn).."'"
+		debug_msg(msg)
+	else
+		-- not requested
+	end
 end

+local function Events(action, reason)
+--[[
+- Thrown has no durability so do not register for that event
+- Remove ACTIONBAR_HIDEGRID; this is triggered when dragging an item to actionbar
+  Not sure why this was implemented - use of event changed?
+--]]
+	if action == "register" then
+		TitanPanelAmmoButton:RegisterEvent("UNIT_INVENTORY_CHANGED")
+		TitanPanelAmmoButton:RegisterEvent("MERCHANT_CLOSED")
+	elseif action == "unregister" then
+		TitanPanelAmmoButton:UnregisterEvent("UNIT_INVENTORY_CHANGED")
+		TitanPanelAmmoButton:UnregisterEvent("MERCHANT_CLOSED")
+	else
+		-- action unknown ???
+	end
+
+	if debug_flow then
+		local msg =
+			"Events"
+			.." "..tostring(reason)..""
+		debug_msg(msg)
+	else
+		-- not requested
+	end
+end

+--[[
 -- **************************************************************************
 -- NAME : TitanPanelAmmoButton_OnLoad()
 -- DESC : Registers the plugin upon it loading
 -- **************************************************************************
+--]]
 function TitanPanelAmmoButton_OnLoad(self)
 	self.registry = {
 			id = TITAN_AMMO_ID,
@@ -166,160 +245,67 @@ function TitanPanelAmmoButton_OnLoad(self)
 			ShowAmmoName = false,
 			DisplayOnRightSide = false,
 		}
-	};
-
-	if class == "ROGUE"
-	or class == "WARRIOR"
-	or class == "HUNTER"
-	then
-		self:SetScript("OnEvent",  function(_, event, arg1, arg2, ...)
---[[
-print("OnEvent"
-.." '"..tostring(event).."'"
-.." '"..tostring(arg1).."'"
-.." '"..tostring(arg2).."'"
-)
---]]
-			if event == "PLAYER_ENTERING_WORLD" then
-				if arg1 == true then -- login
-					TitanPanelAmmoButton_PLAYER_LOGIN()
-				end
-				if arg2 == true then -- reload / zoning
-					TitanPanelAmmoButton_MERCHANT_CLOSED()
-				end
-			elseif event == "UNIT_INVENTORY_CHANGED" then
-				TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
-			elseif event == "UPDATE_INVENTORY_DURABILITY" then
-				TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
-			elseif event == "MERCHANT_CLOSED" then
-				TitanPanelAmmoButton_MERCHANT_CLOSED()
-			elseif event == "ACTIONBAR_HIDEGRID" then -- in case ammo is dropped into char slot
-				TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
-			end
-		end)
-
-		TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD")
-
-	else
-		ClrAmmoInfo()
-	end
-end
-
-function TitanPanelAmmoButton_PLAYER_LOGIN()
-	ammo_show = true
-	GetAmmoCount()
-
-	if IsThrown(ammo_type) then
-		TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
-	elseif IsAmmo(ammo_type) then
-		TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")
-	end
-	TitanPanelAmmoButton:RegisterEvent("UNIT_INVENTORY_CHANGED")
-	TitanPanelAmmoButton:RegisterEvent("MERCHANT_CLOSED")
-	TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD")
-
-	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
-end
-
-function TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
-	if arg1 == "player" then
-		TitanPanelAmmoUpdateDisplay();
-	end
-end
-
-function TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
-	TitanPanelAmmoUpdateDisplay();
-end
-
-function TitanPanelAmmoButton_MERCHANT_CLOSED()
-	TitanPanelAmmoUpdateDisplay();
-end
-
-function TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
-	local prev = 0
-	TitanPanelAmmoButton:SetScript("OnUpdate", function(_, e)
-		prev = prev + e
-		if prev > 2 then
-			TitanPanelAmmoButton:SetScript("OnUpdate", nil)
-			TitanPanelAmmoUpdateDisplay();
-		end
-	end)
-end
-
-function TitanPanelAmmoUpdateDisplay()
-	-- Manual Display update in case the rangedSlot it switched
-	GetAmmoCount()
-
-	-- Setup the events based on ammo type
-	if IsThrown(ammo_type) then
-		if not TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then
-			TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
-		end
-		if TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then
-			TitanPanelAmmoButton:UnregisterEvent("ACTIONBAR_HIDEGRID")
-			TitanPanelAmmoButton:SetScript("OnUpdate", nil)
-		end
-	elseif IsAmmo(ammo_type) then
-		if TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then
-			TitanPanelAmmoButton:UnregisterEvent("UPDATE_INVENTORY_DURABILITY")
-		end
-		if not TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then
-			TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")
-		end
-	end
-
-	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
+	}
 end

+--[[
 -- **************************************************************************
 -- NAME : TitanPanelAmmoButton_GetButtonText(id)
--- DESC : Calculate ammo/thrown logic then display data on button
+-- DESC : Calculate ammo/thrown logic then put on button
 -- VARS : id = button ID
 -- **************************************************************************
+--]]
 function TitanPanelAmmoButton_GetButtonText(id)

 	local labelText, ammoText, ammoRichText, color;

-	if (IsThrown(ammo_type)) then
+	if (IsThrown(display.ammo_type)) then
 		labelText = L["TITAN_AMMO_BUTTON_LABEL_THROWN"];
-		ammoText = format(L["TITAN_AMMO_FORMAT"], ammo_count);
-		labelText = weapon_type.." : "
-		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and ammo_name ~= "" then
-			ammoText = ammoText.."|cffffff9a".." ("..ammo_name..")".."|r"
+		ammoText = format(L["TITAN_AMMO_FORMAT"], display.ammo_count);
+		labelText = display.weapon_type.." : "
+		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and display.ammo_name ~= "" then
+			ammoText = ammoText.."|cffffff9a".." ("..display.ammo_name..")".."|r"
 		end
-	elseif IsAmmo(ammo_type) then
+	elseif IsAmmo(display.ammo_type) then
 		labelText = L["TITAN_AMMO_BUTTON_LABEL_AMMO"];
-		labelText = weapon_type.." : "
-		ammoText = format(L["TITAN_AMMO_FORMAT"], ammo_count);
-		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and ammo_name ~= "" then
-			ammoText = ammoText.."|cffffff9a".." ("..ammo_name..")".."|r"
+		labelText = display.weapon_type.." : "
+		ammoText = format(L["TITAN_AMMO_FORMAT"], display.ammo_count);
+		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and display.ammo_name ~= "" then
+			ammoText = ammoText.."|cffffff9a".." ("..display.ammo_name..")".."|r"
 		end
 	else
 		ClrAmmoInfo()
-		ammoText = ammo_name
-		labelText = weapon_type..""
+		ammoText = display.ammo_name
+		labelText = display.weapon_type..""
 	end

---[[
-print("_GetButtonText"
-.." '"..tostring(weapon_type).."'"
-.." '"..tostring(ammo_type).."'"
-)
---]]
 	if (TitanGetVar(TITAN_AMMO_ID, "ShowColoredText")) then
-		color = TitanUtils_GetThresholdColor(TITAN_AMMO_THRESHOLD_TABLE[ammo_type], ammo_count);
+		color = TitanUtils_GetThresholdColor(TITAN_AMMO_THRESHOLD_TABLE[display.ammo_type], display.ammo_count);
 		ammoRichText = TitanUtils_GetColoredText(ammoText, color);
 	else
 		ammoRichText = TitanUtils_GetHighlightText(ammoText);
 	end

+	if debug_flow then
+		local msg =
+			"Btn_Text"
+			.." '"..tostring(display.weapon_type).."'"
+			.." '"..tostring(PLACE[display.ammo_type]).."'"
+			.." '"..tostring(ammoRichText).."'"
+		debug_msg(msg)
+	else
+		-- not requested
+	end
+
 	return labelText, ammoRichText;
 end

+--[[
 -- **************************************************************************
 -- NAME : TitanPanelRightClickMenu_PrepareAmmoMenu()
 -- DESC : Display rightclick menu options
 -- **************************************************************************
+--]]
 function TitanPanelRightClickMenu_PrepareAmmoMenu()
 	TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_AMMO_ID].menuText);

@@ -344,14 +330,95 @@ end

 function TitanPanelAmmoButton_GetTooltipText()
 	local txt = ""
-	if IsThrown(ammo_type) then
-	txt = txt
-		..tostring(weapon)..""
+	if IsThrown(display.ammo_type) then
+		txt = txt
+			..tostring(display.weapon)..""
 	else
 		txt = txt
-			..tostring(weapon).."\n"
-			..tostring(ammo_name)..""
+			..tostring(display.weapon).."\n"
+			..tostring(display.ammo_name)..""
 	end
 	return txt
 end

+function OnShow()
+	ClrAmmoInfo()
+
+	if IsAmmoClass() then
+		-- No need to start events and consume cycles if no ammo
+		GetAmmoCount()
+
+		Events("register", "OnShow")
+	else
+		-- Just set the default text on button
+		-- for a class w/o ammo
+	end
+
+	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
+end
+
+function OnHide()
+	ClrAmmoInfo()
+
+	Events("unregister", "OnHide")
+end
+
+local function UpdateDisplay()
+	GetAmmoCount()
+
+	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
+end
+
+--[[
+-- **************************************************************************
+-- NAME : TitanPanelAmmoButton_OnEvent()
+-- DESC : React to any registered Events
+-- **************************************************************************
+--]]
+function TitanPanelAmmoButton_OnEvent(self, event, arg1, arg2, ...)
+	if event == "PLAYER_ENTERING_WORLD" then
+		if arg1 == true then -- login
+			EnterWorld()
+		end
+		if arg2 == true then -- reload / zoning
+			UpdateDisplay();
+		end
+	elseif event == "UNIT_INVENTORY_CHANGED" then
+		if arg1 == "player" then
+			UpdateDisplay();
+		end
+	elseif event == "MERCHANT_CLOSED" then
+		UpdateDisplay();
+	end
+end
+
+-- ====== Create needed frames
+local function Create_Frames()
+	if _G[TITAN_BUTTON] then
+		return -- if already created
+	end
+
+	-- general container frame
+	local f = CreateFrame("Frame", nil, UIParent)
+--	f:Hide()
+
+	-- Titan plugin button
+	local window = CreateFrame("Button", TITAN_BUTTON, f, "TitanPanelComboTemplate")
+	window:SetFrameStrata("FULLSCREEN")
+	-- Using SetScript("OnLoad",   does not work
+	TitanPanelAmmoButton_OnLoad(window);
+--	TitanPanelButton_OnLoad(window); -- Titan XML template calls this...
+
+	window:SetScript("OnEvent", function(self, event, ...)
+		TitanPanelAmmoButton_OnEvent(self, event, ...)
+	end)
+	window:SetScript("OnShow", function(self, button)
+		OnShow(self)
+	end)
+	window:SetScript("OnHide", function(self, button)
+		OnHide(self)
+	end)
+
+end
+
+Create_Frames() -- do the work
diff --git a/TitanAmmo/TitanClassicAmmo.xml b/TitanAmmo/TitanClassicAmmo.xml
deleted file mode 100644
index f9c6707..0000000
--- a/TitanAmmo/TitanClassicAmmo.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
-..\FrameXML\UI.xsd">
-	<Script file="TitanClassicAmmo.lua"/>
-	<Frame parent="UIParent">
-		<Frames>
-			<Button name="TitanPanelAmmoButton" inherits="TitanPanelComboTemplate" frameStrata="FULLSCREEN" toplevel="true">
-				<Scripts>
-					<OnLoad>
-						TitanPanelAmmoButton_OnLoad(self);
-						TitanPanelButton_OnLoad(self);
-					</OnLoad>
-				</Scripts>
-			</Button>
-		</Frames>
-	</Frame>
-</Ui>
\ No newline at end of file
diff --git a/TitanAmmo/TitanClassicAmmo_CE.lua b/TitanAmmo/TitanClassicAmmo_CE.lua
deleted file mode 100644
index 777be67..0000000
--- a/TitanAmmo/TitanClassicAmmo_CE.lua
+++ /dev/null
@@ -1,339 +0,0 @@
---[[
--- **************************************************************************
--- * TitanAmmo.lua
--- *
--- * By: Titan Panel Development Team
--- **************************************************************************
--- 2019 Aug - reverted and updated for Classic
---
--- This will track the count of ammo (bows and guns) or thrown (knives) equipped.
--- Ammo is placed in the 'ammo' slot where Blizzard counts ALL of that *type of ammo*
--- regardless of where it is in your bags.
--- Thrown is placed in the actual weapon slot where Blizzard counts ALL of that *type of thrown*.
--- This forces a different routine to be used so the ammo must always be checked for type and count.
---]]
--- ******************************** Constants *******************************
-local _G = getfenv(0);
-local TITAN_AMMO_ID = "Ammo";
-
-local SHOOT_STACK = 200
-local ARROW_STACK = 200
-local THROW_STACK = 200
-
-local LIM_GOOD = 2
-local LIM_OK   = 1.5
-local LIM_BAD  = .5
-
-local BOW = "INVTYPE_RANGED"
-local GUN = "INVTYPE_RANGEDRIGHT"
-local THROWN = "INVTYPE_THROWN"
-
-local TITAN_AMMO_THRESHOLD_TABLE = { -- Use ammo stack and threshold limits above to calc colored text
-	["INVTYPE_RANGEDRIGHT"] = {
-		 Values = { SHOOT_STACK*LIM_BAD, SHOOT_STACK*LIM_OK, SHOOT_STACK*LIM_GOOD }, -- 100,150,400
-		 Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR },
-	 },
-	["INVTYPE_RANGED"] = {
-		 Values = { ARROW_STACK*LIM_BAD, ARROW_STACK*LIM_OK, ARROW_STACK*LIM_GOOD }, -- 100,150,400
-		 Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR },
-	 },
-	["INVTYPE_THROWN"] = {
-		 Values = { THROW_STACK/10, THROW_STACK/4, THROW_STACK/2 }, -- 20, 50, 100
-		 Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR },
-	 },
-};
-
--- ******************************** Variables *******************************
-local class = select(2, UnitClass("player"))
-local ammoSlotID = GetInventorySlotInfo("AmmoSlot")
-local rangedSlotID = GetInventorySlotInfo("RangedSlot")
-local ammo_count = 0;
-local ammo_type  = "";
-local ammo_name  = ""
-local weapon  = "";
-local weapon_type  = "";
-local ammo_show  = false -- show plugin based on class
-
-local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
--- ******************************** Functions *******************************
-local function ClrAmmoInfo()
-	ammo_count = 0;
-	ammo_type  = L["TITAN_AMMO_BUTTON_NOAMMO"];
-	ammo_name  = L["TITAN_AMMO_BUTTON_NOAMMO"]
-	ammo_show  = false
-end
-local function GetItemLink(rangedSlotID)
-	return GetInventoryItemLink("player", rangedSlotID)
-end
-local function IsThrown(loc)
-	local res = false
-	if loc == "INVTYPE_THROWN" then
-		res = true
-	end
-	return res
-end
-local function IsAmmo(loc)
-	local res = false
-	if loc == "INVTYPE_RANGED" or loc == "INVTYPE_RANGEDRIGHT" then
-		res = true
-	end
-	return res
-end
-local function GetWeaponInfo()
-	local loc = "";
-	local w = "--";
-	local wt = "--";
-
-	local weap = GetInventoryItemID("player", rangedSlotID)
-	if weap == nil then
-	else
-		local itemName, itemLink, itemQuality, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount,
-		itemEquipLoc, itemTexture, sellPrice, classID, subclassID, bindType, expacID, setID, isCraftingReagent
-		   = GetItemInfo(GetInventoryItemID("player", rangedSlotID))
-		w = itemName
-		wt = itemSubType
-		loc = itemEquipLoc
-	end
-
---[[
-print("GetWeaponInfo"
-.." '"..tostring(weap).."'"
-.." '"..tostring(w).."'"
-.." '"..tostring(wt).."'"
-.." '"..tostring(loc).."'"
-)
---]]
-	return w, wt, loc
-end
-
-local function GetAmmoCount()
-	weapon, weapon_type, ammo_type = GetWeaponInfo(rangedSlotID)
---[[
-print("GetAmmoCount"
-.." '"..tostring(weapon).."'"
-)
---]]
-
-	if IsThrown(ammo_type) then
-		ammo_name = select(1, GetItemInfo(GetInventoryItemID("player", rangedSlotID))) or _G["UNKNOWN"]
-		if ammo_name == _G["UNKNOWN"] then
-			ammo_count = 0
-		else
-			ammo_count = GetInventoryItemCount("player", rangedSlotID) or ammo_count
-		end
-	else
-		ammo_name = select(1, GetItemInfo(GetInventoryItemID("player", ammoSlotID))) or _G["UNKNOWN"]
-		if ammo_name == _G["UNKNOWN"] then
-			ammo_count = 0
-		else
-			ammo_count = GetInventoryItemCount("player", ammoSlotID) or ammo_count
-		end
-	end
-end
-
-
--- **************************************************************************
--- NAME : TitanPanelAmmoButton_OnLoad()
--- DESC : Registers the plugin upon it loading
--- **************************************************************************
-function TitanPanelAmmoButton_OnLoad(self)
-	self.registry = {
-			id = TITAN_AMMO_ID,
-			--builtIn = 1,
-			category = "Built-ins",
-			version = TITAN_VERSION,
-			menuText = L["TITAN_AMMO_MENU_TEXT"],
-			buttonTextFunction = "TitanPanelAmmoButton_GetButtonText",
-			tooltipTitle = L["TITAN_AMMO_TOOLTIP"],
-            tooltipTextFunction = "TitanPanelAmmoButton_GetTooltipText",
-			icon = "Interface\\AddOns\\TitanAmmo\\TitanClassicThrown",
-			iconWidth = 16,
-			controlVariables = {
-			ShowIcon = true,
-			ShowLabelText = true,
-			ShowRegularText = false,
-			ShowColoredText = true,
-			DisplayOnRightSide = true
-		},
-		savedVariables = {
-			ShowIcon = 1,
-			ShowLabelText = 1,
-			ShowColoredText = 1,
-			ShowAmmoName = false,
-			DisplayOnRightSide = false,
-		}
-	};
-
-	self:SetScript("OnEvent",  function(_, event, arg1, ...)
-		if event == "PLAYER_LOGIN" then
-			TitanPanelAmmoButton_PLAYER_LOGIN()
-		elseif event == "UNIT_INVENTORY_CHANGED" then
-			TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
-		elseif event == "UPDATE_INVENTORY_DURABILITY" then
-			TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
-		elseif event == "MERCHANT_CLOSED" or event == "PLAYER_ENTERING_WORLD" then
-			TitanPanelAmmoButton_MERCHANT_CLOSED()
-		elseif event == "ACTIONBAR_HIDEGRID" then -- in case ammo is dropped into char slot
-			TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
-		end
-	end)
-
-	TitanPanelAmmoButton:RegisterEvent("PLAYER_LOGIN")
-end
-
-function TitanPanelAmmoButton_PLAYER_LOGIN()
-	-- Class check
-	if class ~= "ROGUE" and class ~= "WARRIOR" and class ~= "HUNTER" then
-		TitanPanelAmmoButton_PLAYER_LOGIN = nil
-		ClrAmmoInfo()
-		return
-	end
-
-	ammo_show = true
-	GetAmmoCount()
-
-	if IsThrown(ammo_type) then
-		TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
-	elseif IsAmmo(ammo_type) then
-		TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")
-	end
-	TitanPanelAmmoButton:RegisterEvent("UNIT_INVENTORY_CHANGED")
-	TitanPanelAmmoButton:RegisterEvent("MERCHANT_CLOSED")
-	TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD")
-	TitanPanelAmmoButton_PLAYER_LOGIN = nil
-end
-
-function TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
-	if arg1 == "player" then
-		TitanPanelAmmoUpdateDisplay();
-	end
-end
-
-function TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
-	TitanPanelAmmoUpdateDisplay();
-end
-
-function TitanPanelAmmoButton_MERCHANT_CLOSED()
-	TitanPanelAmmoUpdateDisplay();
-end
-
-function TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
-	local prev = 0
-	TitanPanelAmmoButton:SetScript("OnUpdate", function(_, e)
-		prev = prev + e
-		if prev > 2 then
-			TitanPanelAmmoButton:SetScript("OnUpdate", nil)
-			TitanPanelAmmoUpdateDisplay();
-		end
-	end)
-end
-
-function TitanPanelAmmoUpdateDisplay()
-	-- Manual Display update in case the rangedSlot it switched
-	GetAmmoCount()
-
-	-- Setup the events based on ammo type
-	if IsThrown(ammo_type) then
-		if not TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then
-			TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
-		end
-		if TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then
-			TitanPanelAmmoButton:UnregisterEvent("ACTIONBAR_HIDEGRID")
-			TitanPanelAmmoButton:SetScript("OnUpdate", nil)
-		end
-	elseif IsAmmo(ammo_type) then
-		if TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then
-			TitanPanelAmmoButton:UnregisterEvent("UPDATE_INVENTORY_DURABILITY")
-		end
-		if not TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then
-			TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")
-		end
-	end
-
-	TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
-end
-
--- **************************************************************************
--- NAME : TitanPanelAmmoButton_GetButtonText(id)
--- DESC : Calculate ammo/thrown logic then display data on button
--- VARS : id = button ID
--- **************************************************************************
-function TitanPanelAmmoButton_GetButtonText(id)
-
-	local labelText, ammoText, ammoRichText, color;
-
-	if (IsThrown(ammo_type)) then
-		labelText = L["TITAN_AMMO_BUTTON_LABEL_THROWN"];
-		ammoText = format(L["TITAN_AMMO_FORMAT"], ammo_count);
-		labelText = weapon_type.." : "
-		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and ammo_name ~= "" then
-			ammoText = ammoText.."|cffffff9a".." ("..ammo_name..")".."|r"
-		end
-	elseif IsAmmo(ammo_type) then
-		labelText = L["TITAN_AMMO_BUTTON_LABEL_AMMO"];
-		labelText = weapon_type.." : "
-		ammoText = format(L["TITAN_AMMO_FORMAT"], ammo_count);
-		if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and ammo_name ~= "" then
-			ammoText = ammoText.."|cffffff9a".." ("..ammo_name..")".."|r"
-		end
-	else
-		ClrAmmoInfo()
-		ammoText = ammo_name
-		labelText = weapon_type..""
-	end
-
---[[
-print("_GetButtonText"
-.." '"..tostring(weapon_type).."'"
-.." '"..tostring(ammo_type).."'"
-)
---]]
-	if (TitanGetVar(TITAN_AMMO_ID, "ShowColoredText")) then
-		color = TitanUtils_GetThresholdColor(TITAN_AMMO_THRESHOLD_TABLE[ammo_type], ammo_count);
-		ammoRichText = TitanUtils_GetColoredText(ammoText, color);
-	else
-		ammoRichText = TitanUtils_GetHighlightText(ammoText);
-	end
-
-	return labelText, ammoRichText;
-end
-
--- **************************************************************************
--- NAME : TitanPanelRightClickMenu_PrepareAmmoMenu()
--- DESC : Display rightclick menu options
--- **************************************************************************
-function TitanPanelRightClickMenu_PrepareAmmoMenu()
-	TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_AMMO_ID].menuText);
-
-	local info = {};
-	info.text = L["TITAN_AMMO_BULLET_NAME"];
-	info.func = function() TitanPanelRightClickMenu_ToggleVar({TITAN_AMMO_ID, "ShowAmmoName"})
-		TitanPanelButton_UpdateButton(TITAN_AMMO_ID);
-	end
-	info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName"), 1, nil);
-	TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel())
-	TitanPanelRightClickMenu_AddSpacer();
-
-	info = {};
-	TitanPanelRightClickMenu_AddToggleIcon(TITAN_AMMO_ID);
-	TitanPanelRightClickMenu_AddToggleLabelText(TITAN_AMMO_ID);
-	TitanPanelRightClickMenu_AddToggleColoredText(TITAN_AMMO_ID);
-
-	TitanPanelRightClickMenu_AddToggleRightSide(TITAN_AMMO_ID);
-	TitanPanelRightClickMenu_AddSpacer();
-	TitanPanelRightClickMenu_AddCommand(L["TITAN_PANEL_MENU_HIDE"], TITAN_AMMO_ID, TITAN_PANEL_MENU_FUNC_HIDE);
-end
-
-function TitanPanelAmmoButton_GetTooltipText()
-	local txt = ""
-	if IsThrown(ammo_type) then
-	txt = txt
-		..tostring(weapon)..""
-	else
-		txt = txt
-			..tostring(weapon).."\n"
-			..tostring(ammo_name)..""
-	end
-	return txt
-end
-
diff --git a/TitanAmmo/TitanClassicAmmo_CE.xml b/TitanAmmo/TitanClassicAmmo_CE.xml
deleted file mode 100644
index 5e88333..0000000
--- a/TitanAmmo/TitanClassicAmmo_CE.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
-..\FrameXML\UI.xsd">
-	<Script file="TitanClassicAmmo_CE.lua"/>
-	<Frame parent="UIParent">
-		<Frames>
-			<Button name="TitanPanelAmmoButton" inherits="TitanPanelComboTemplate" frameStrata="FULLSCREEN" toplevel="true">
-				<Scripts>
-					<OnLoad>
-						TitanPanelAmmoButton_OnLoad(self);
-						TitanPanelButton_OnLoad(self);
-					</OnLoad>
-				</Scripts>
-			</Button>
-		</Frames>
-	</Frame>
-</Ui>
\ No newline at end of file
diff --git a/TitanBag/TitanBag.lua b/TitanBag/TitanBag.lua
index 406b87a..a3e9d64 100644
--- a/TitanBag/TitanBag.lua
+++ b/TitanBag/TitanBag.lua
@@ -15,8 +15,8 @@ local TITAN_BAG_THRESHOLD_TABLE = {
 }
 local updateTable = {TITAN_BAG_ID, TITAN_PANEL_UPDATE_BUTTON};
 -- ******************************** Variables *******************************
-local L = {} -- For AceLocale
-local AceTimer = {}
+local AceTimer = LibStub("AceTimer-3.0")
+local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
 local BagTimer

 local bag_info = {
@@ -276,7 +276,6 @@ function TitanPanelBagButton_OnLoad(self)
 	end

 	self:RegisterEvent("PLAYER_ENTERING_WORLD");
-
 end

 --[[ plugin
@@ -287,11 +286,6 @@ end
 --]]
 function TitanPanelBagButton_OnEvent(self, event, a1, a2, ...)
 	if event == "PLAYER_ENTERING_WORLD" then
-
-		-- Register for bag updates and update the plugin text
-		self:RegisterEvent("BAG_UPDATE")
-		TitanPanelButton_UpdateButton(TITAN_BAG_ID);
-
 		if a1 == true and TITAN_ID == "Titan" then -- 10.* / Retail
 			-- initial login

@@ -315,16 +309,14 @@ function TitanPanelBagButton_OnEvent(self, event, a1, a2, ...)
 	end

 	if event == "BAG_UPDATE" then
-		-- Create only when the event is active
-		self:SetScript("OnUpdate", TitanPanelBagButton_OnUpdate)
+		-- update the plugin text
+		TitanPanelButton_UpdateButton(TITAN_BAG_ID);
 	end
-end
-
-function TitanPanelBagButton_OnUpdate(self)
-	-- update the button
-	TitanPanelPluginHandle_OnUpdate(updateTable)
-	-- remove until the next bag event
-	self:SetScript("OnUpdate", nil)
+--[[
+print("_OnEvent"
+.." "..tostring(event)..""
+)
+--]]
 end

 --[[ plugin
@@ -538,6 +530,16 @@ function TitanPanelBagButton_ShowDetailedInfo()
 	TitanToggleVar(TITAN_BAG_ID, "ShowDetailedInfo");
 end

+function TitanPanelBagButton_OnShow(self)
+	-- Register for bag updates and update the plugin text
+	self:RegisterEvent("BAG_UPDATE")
+	TitanPanelButton_UpdateButton(TITAN_BAG_ID);
+end
+
+function TitanPanelBagButton_OnHide(self)
+	self:UnregisterEvent("BAG_UPDATE")
+end
+
 -- ====== Create needed frames
 local function Create_Frames()
 	if _G[TITAN_BUTTON] then
@@ -555,6 +557,13 @@ local function Create_Frames()
 	TitanPanelBagButton_OnLoad(window);
 --	TitanPanelButton_OnLoad(window); -- Titan XML template calls this...

+	window:SetScript("OnShow", function(self)
+		TitanPanelBagButton_OnShow(self);
+		TitanPanelButton_OnShow(self);
+	end)
+	window:SetScript("OnHide", function(self)
+		TitanPanelBagButton_OnHide(self)
+	end)
 	window:SetScript("OnEvent", function(self, event, ...)
 		TitanPanelBagButton_OnEvent(self, event, ...)
 	end)
@@ -565,8 +574,4 @@ local function Create_Frames()
 end


-if TITAN_ID then -- it exists
-	AceTimer = LibStub("AceTimer-3.0")
-	L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
-	Create_Frames() -- do the work
-end
+Create_Frames() -- do the work
diff --git a/TitanGold/TitanGold.lua b/TitanGold/TitanGold.lua
index 4886b44..b96c9f6 100644
--- a/TitanGold/TitanGold.lua
+++ b/TitanGold/TitanGold.lua
@@ -25,8 +25,8 @@ local GOLD_SESS_STATUS;
 local GOLD_PERHOUR_STATUS;
 local GOLD_STARTINGGOLD;
 local GOLD_SESSIONSTART;
-local L = {} -- For AceLocale
-local TitanGold = {} -- For Ace
+local TitanGold = LibStub("AceAddon-3.0"):NewAddon("TitanGold", "AceTimer-3.0")
+local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
 local GoldTimer = nil;
 local _G = getfenv(0);
 local realmName = GetRealmName();
@@ -221,7 +221,6 @@ function TitanPanelGoldButton_OnLoad(self)
 		}
 	};

-	self:RegisterEvent("PLAYER_MONEY");
 	self:RegisterEvent("PLAYER_ENTERING_WORLD");

 	if (not GoldSave) then
@@ -238,7 +237,8 @@ end
 -- DESC : Create repeating timer when plugin is visible
 -- **************************************************************************
 --]]
-function TitanPanelGoldButton_OnShow()
+function TitanPanelGoldButton_OnShow(self)
+	self:RegisterEvent("PLAYER_MONEY");
 	if not GoldTimer and GoldSave and TitanGetVar(TITAN_GOLD_ID, "DisplayGoldPerHour") then
 		GoldTimer = TitanGold:ScheduleRepeatingTimer(TitanPanelPluginHandle_OnUpdate, 1, updateTable)
 	end
@@ -250,7 +250,8 @@ end
 -- DESC : Destroy repeating timer when plugin is hidden
 -- **************************************************************************
 --]]
-function TitanPanelGoldButton_OnHide()
+function TitanPanelGoldButton_OnHide(self)
+	self:UnregisterEvent("PLAYER_MONEY");
 	TitanGold:CancelTimer(GoldTimer, true)
 	GoldTimer = nil;
 end
@@ -262,6 +263,11 @@ end
 -- **************************************************************************
 --]]
 function TitanGold_OnEvent(self, event, ...)
+--[[
+print("_OnEvent"
+.." "..tostring(event)..""
+)
+--]]
 	if (event == "PLAYER_MONEY") then
 		if (GOLD_INITIALIZED) then
 			GoldSave[GOLD_INDEX].gold = GetMoney("player")
@@ -1240,8 +1246,4 @@ local function Create_Frames()
 end


-if TITAN_ID then -- it exists
-	TitanGold = LibStub("AceAddon-3.0"):NewAddon("TitanGold", "AceTimer-3.0")
-	L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
-	Create_Frames() -- do the work
-end
+Create_Frames() -- do the work
diff --git a/TitanXP/TitanXP.lua b/TitanXP/TitanXP.lua
index 2d41504..647e39a 100644
--- a/TitanXP/TitanXP.lua
+++ b/TitanXP/TitanXP.lua
@@ -76,12 +76,7 @@ function TitanPanelXPButton_OnLoad(self)
 			DisplayOnRightSide = false,
 		}
 	};
-
-	self:RegisterEvent("PLAYER_ENTERING_WORLD");
-	self:RegisterEvent("TIME_PLAYED_MSG");
-	self:RegisterEvent("PLAYER_XP_UPDATE");
-	self:RegisterEvent("PLAYER_LEVEL_UP");
-	self:RegisterEvent("CHAT_MSG_COMBAT_XP_GAIN");
+--	self:RegisterEvent("PLAYER_ENTERING_WORLD");
 end

 --[[
@@ -93,7 +88,22 @@ end
 --        added to the panel
 -- **************************************************************************
 --]]
-function TitanPanelXPButton_OnShow()
+function TitanPanelXPButton_OnShow(self)
+	if (not self.sessionTime) then -- initial login / PEW
+		self.sessionTime = time();
+	end
+	if (not self.initXP) then -- initial login / PEW
+		self.initXP = UnitXP("player");
+		self.accumXP = 0;
+		self.sessionXP = 0;
+		self.startSessionTime = time();
+		lastXP = self.initXP;
+	end
+	self:RegisterEvent("TIME_PLAYED_MSG");
+	self:RegisterEvent("PLAYER_XP_UPDATE");
+	self:RegisterEvent("PLAYER_LEVEL_UP");
+	self:RegisterEvent("CHAT_MSG_COMBAT_XP_GAIN");
+
 	TitanPanelXPButton_SetIcon();
 	found = nil;
 	if not TitanPanelXPButton_ButtonAdded then
@@ -103,7 +113,12 @@ function TitanPanelXPButton_OnShow()
 end


-function TitanPanelXPButton_OnHide()
+function TitanPanelXPButton_OnHide(self)
+	self:UnregisterEvent("TIME_PLAYED_MSG");
+	self:UnregisterEvent("PLAYER_XP_UPDATE");
+	self:UnregisterEvent("PLAYER_LEVEL_UP");
+	self:UnregisterEvent("CHAT_MSG_COMBAT_XP_GAIN");
+
 	if (TitanPanelSettings) then
 		for i = 1, table.getn(TitanPanelSettings.Buttons) do
 			if(TitanPanelSettings.Buttons[i] == TITAN_XP_ID) then
@@ -124,28 +139,22 @@ end
 -- **************************************************************************
 --]]
 function TitanPanelXPButton_OnEvent(self, event, a1, a2, ...)
+---[[
+print("XP _OnEvent"
+.." "..tostring(event)..""
+)
+--]]
 	if (event == "PLAYER_ENTERING_WORLD") then
-		if (not self.sessionTime) then
-			self.sessionTime = time();
-		end
-		if (not self.initXP) then
-			self.initXP = UnitXP("player");
-			self.accumXP = 0;
-			self.sessionXP = 0;
-			self.startSessionTime = time();
-			lastXP = self.initXP;
-		end
 	elseif (event == "TIME_PLAYED_MSG") then
 		-- Remember play time
 		self.totalTime = a1;
 		self.levelTime = a2;
 	elseif (event == "PLAYER_XP_UPDATE") then
-		if (not self.initXP) then
-			self.initXP = UnitXP("player");
-			self.accumXP = 0;
-			self.sessionXP = 0;
-			self.startSessionTime = time();
-		end
+		self.initXP = UnitXP("player");
+		self.accumXP = 0;
+		self.sessionXP = 0;
+		self.startSessionTime = time();
+
 		XPGain = UnitXP("player") - lastXP;
 		lastXP = UnitXP("player");
 		if XPGain < 0 then XPGain = 0 end
@@ -544,9 +553,12 @@ local function Create_Frames()
 --	TitanPanelButton_OnLoad(window); -- Titan XML template calls this...

 	window:SetScript("OnShow", function(self)
-		TitanPanelXPButton_OnShow()
+		TitanPanelXPButton_OnShow(self)
 		TitanPanelButton_OnShow(self)
 	end)
+	window:SetScript("OnHide", function(self)
+		TitanPanelXPButton_OnHide(self)
+	end)
 	window:SetScript("OnEvent", function(self, event, ...)
 		TitanPanelXPButton_OnEvent(self, event, ...)
 	end)