---@diagnostic disable: duplicate-set-field
--[[
-- **************************************************************************
-- * TitanXP.lua
-- *
-- * By: The Titan Panel Development Team
-- **************************************************************************
--]]
-- ******************************** Constants *******************************
local TITAN_XP_ID = "XP";
local TITAN_XP_BUTTON = "TitanPanel" .. TITAN_XP_ID .. "Button"
local _G = getfenv(0);
--local TITAN_XP_FREQUENCY = 1;
--local updateTable = { TITAN_XP_ID, TITAN_PANEL_UPDATE_ALL };
-- ******************************** Variables *******************************
local L = LibStub("AceLocale-3.0"):GetLocale(TITAN_ID, true)
local AceTimer = LibStub("AceTimer-3.0")
local XPTimer = {}
---@diagnostic disable-next-line: missing-fields
XPTimer.timer = nil -- set & cancelled as needed
XPTimer.delay = 30 -- seconds
XPTimer.running = false
XPTimer.last = 0
local trace = false
local trace_update = false
--****** overload the 'time played' text to Chat - if XP requested the API call
local requesting
-- collect the various XP variables in one place
local txp = {
frame = {},
lastMobXP = 0,
XPGain = 0,
initXP = 0,
accumXP = 0,
sessionXP = 0,
startSessionTime = 0,
totalTime = 0,
levelTime = 0,
sessionTime = 0,
}
-- Save orignal output to Chat
local orig_ChatFrame_DisplayTimePlayed = ChatFrame_DisplayTimePlayed
-- Override the output to Chat
ChatFrame_DisplayTimePlayed = function(...)
if requesting then
-- XP requested time played, do not spam Chat
requesting = false
else
-- XP did not request time played so output
orig_ChatFrame_DisplayTimePlayed(...)
end
end
--****** Override
-- ******************************** Functions *******************************
---local Set icon based on faction
local function SetIcon()
local icon = TitanPanelXPButtonIcon;
local factionGroup, factionName = UnitFactionGroup("player");
if (factionGroup == "Alliance") then
icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-Alliance");
icon:SetTexCoord(0.046875, 0.609375, 0.03125, 0.59375);
elseif (factionGroup == "Horde") then
icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-Horde");
icon:SetTexCoord(0.046875, 0.609375, 0.015625, 0.578125);
else
icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA");
icon:SetTexCoord(0.046875, 0.609375, 0.03125, 0.59375);
end
end
---local Add commas or period in the value given per user options
---@param amount number
---@return string
local function comma_value(amount)
local sep = ""
local dec = ""
if (TitanGetVar(TITAN_XP_ID, "UseSeperatorComma")) then
sep = ","
dec = "."
else
sep = "."
dec = ","
end
return TitanUtils_NumToString(amount, sep, dec)
end
---local Reset session and accumulated variables
---@param self Button
local function ResetSession(self)
txp.accumXP = 0
txp.sessionXP = 0
txp.startSessionTime = time() -- clock time
local xp = UnitXP("player")
if xp == nil then
txp.initXP = 0
else
txp.initXP = xp
end
txp.lastXP = txp.initXP
end
---local Wrapper for menu to use
local function ResetThisSession()
ResetSession(_G[TITAN_XP_BUTTON])
end
--[[ 2024 Apr
Change to a repeating timer instead of OnUpdate to reduce cycles
The timer, started OnShow, will update session time here
The prior scheme used OnUpdate which is related to FPS.
XP does not need that level of precision.
--]]
---local Reset session and accumulated variables; used by timer
local function XPTimeUpdate()
local elapsed = GetTime() - XPTimer.last
XPTimer.last = GetTime()
txp.totalTime = txp.totalTime + elapsed
txp.levelTime = txp.levelTime + elapsed
TitanPanelButton_UpdateButton(TITAN_XP_ID)
if trace then
local txt = "XP Text"
.. " " .. tostring(format("%0.2f", elapsed)) .. ""
TitanPluginDebug(TITAN_XP_ID, txt)
end
end
---local Get total time played
-- Do not send RequestTimePlayed output to Chat if XP requested the info.
-- Override ChatFrame_DisplayTimePlayed used by RequestTimePlayed().
-- TIME_PLAYED_MSG used to send response.
local function RefreshPlayed()
txp.frame:RequestTimePlayed()
end
---local Display the plugin on selected Titan bar; register events; start timer; and init vars
---@param self Button
local function OnShow(self)
local txt = ""
self:RegisterEvent("TIME_PLAYED_MSG");
self:RegisterEvent("PLAYER_XP_UPDATE");
self:RegisterEvent("PLAYER_LEVEL_UP");
self:RegisterEvent("CHAT_MSG_COMBAT_XP_GAIN");
RefreshPlayed() -- TIME_PLAYED_MSG
SetIcon();
txt = txt .. " | Events"
if XPTimer.running then
-- Do not create a new one
else
XPTimer.timer = AceTimer:ScheduleRepeatingTimer(XPTimeUpdate, XPTimer.delay)
XPTimer.running = true
XPTimer.last = GetTime() -- No need for millisecond precision
end
if trace then
local dbg = "XP _OnShow"
.. " " .. tostring(txt) .. ""
TitanPluginDebug(TITAN_XP_ID, dbg)
end
end
---local Hide the plugin; unregister events; stop timer; and init vars
---@param self Button
local function OnHide(self)
self:UnregisterEvent("TIME_PLAYED_MSG");
self:UnregisterEvent("PLAYER_XP_UPDATE");
self:UnregisterEvent("PLAYER_LEVEL_UP");
self:UnregisterEvent("CHAT_MSG_COMBAT_XP_GAIN");
AceTimer:CancelTimer(XPTimer.timer)
XPTimer.running = false
XPTimer.timer = nil
end
---local Handle events registered to plugin
---@param self Button
---@param event string
---@param ... any
local function OnEvent(self, event, a1, a2, ...)
local txt = ""
if trace then
txt = "_OnEvent"
.. " " .. tostring(event) .. ""
-- .." "..tostring(a1)..""
-- .." "..tostring(a2)..""
TitanPluginDebug(TITAN_XP_ID, txt)
end
if (event == "PLAYER_ENTERING_WORLD") then
if a1 == true then
-- Initial login so start session
ResetSession(self)
end
elseif (event == "TIME_PLAYED_MSG") then
-- Remember play time
txp.totalTime = a1;
txp.levelTime = a2;
TitanPanelButton_UpdateButton(TITAN_XP_ID)
elseif (event == "PLAYER_XP_UPDATE") then
-- XP data init on plugin load and PEW (first time)
txp.XPGain = UnitXP("player") - txp.lastXP;
txp.lastXP = UnitXP("player");
if txp.XPGain < 0 then
txp.XPGain = 0
else
-- Assume it is valid
end
txp.sessionXP = UnitXP("player") - txp.initXP + txp.accumXP;
TitanPanelButton_UpdateButton(TITAN_XP_ID)
if trace then
txt = "XP Ev "
.. " unit " .. tostring(format("%0.1f", UnitXP("player"))) .. ""
.. " init " .. tostring(format("%0.1f", txp.initXP)) .. ""
.. " acc " .. tostring(format("%0.1f", txp.accumXP)) .. ""
TitanPluginDebug(TITAN_XP_ID, txt)
end
elseif (event == "PLAYER_LEVEL_UP") then
txp.levelTime = 0;
txp.accumXP = txp.accumXP + UnitXPMax("player") - txp.initXP;
txp.initXP = 0;
TitanPanelButton_UpdateButton(TITAN_XP_ID)
elseif (event == "CHAT_MSG_COMBAT_XP_GAIN") then
local _, _, _, killXP = string.find(a1, "^" .. L["TITAN_XP_GAIN_PATTERN"])
if killXP then
txp.lastMobXP = tonumber(killXP)
if txp.lastMobXP < 0 then -- sanity check
txp.lastMobXP = 0
else
-- Assume valid
end
TitanPanelButton_UpdateButton(TITAN_XP_ID)
end
end
end
---local Display XP / hour to level data.
local function ShowXPPerHourLevel()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowXPPerHourLevel");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
TitanSetVar(TITAN_XP_ID, "ShowSimpleRested", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleToLevel", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", false);
end
---local Determine the plugin button text based on user preferences.
---@param id string
---@return string text_label
---@return string text
---@return string | nil labelrested
---@return string | nil rest
---@return string | nil labeltolevel
---@return string | nil toLevelXPText
---@return string | nil labelnumofgains
---@return string | nil numofgains
local function GetButtonText(id)
local txt = ""
local button, id = TitanUtils_GetButton(id) -- sanity check, also get plugin frame
if button and (txp.startSessionTime == nil) then
if trace then
txt = "XP "
.. " " .. tostring("start not set - too early") .. ""
TitanPluginDebug(TITAN_XP_ID, txt)
end
return "XP", ""
elseif button then
local totalXP = UnitXPMax("player");
local currentXP = UnitXP("player");
local toLevelXP = totalXP - currentXP;
local sessionXP = button and txp.sessionXP;
local xpPerHour, xpPerHourText, timeToLevel, timeToLevelText;
local sessionTime = time() - txp.startSessionTime;
local levelTime = txp.levelTime;
local numofkills, numofgains;
if txp.lastMobXP ~= 0 then
numofkills = math.ceil(toLevelXP / txp.lastMobXP)
else
numofkills = 0 --_G["UNKNOWN"]
end
if txp.XPGain ~= 0 then
numofgains = math.ceil(toLevelXP / txp.XPGain)
else
numofgains = 0 --_G["UNKNOWN"]
end
if trace_update then
txt = "XP / Hr"
.. " sxp" .. tostring(format("%0.1f", sessionXP)) .. ""
.. " st" .. tostring(format("%0.1f", txp.startSessionTime)) .. ""
TitanPluginDebug(TITAN_XP_ID, txt)
end
if (levelTime) then
if (TitanGetVar(TITAN_XP_ID, "DisplayType") == "ShowXPPerHourSession") then
if sessionXP <= 0 then
xpPerHour = 0
else
xpPerHour = sessionXP / sessionTime * 3600
end
-- timeToLevel = TitanUtils_Ternary((sessionXP == 0), -1, toLevelXP / sessionXP * sessionTime);
timeToLevel = (sessionXP == 0) and -1 or toLevelXP / sessionXP * sessionTime;
xpPerHourText = comma_value(math.floor(xpPerHour + 0.5));
timeToLevelText = TitanUtils_GetEstTimeText(timeToLevel);
if trace_update then
txt = "XP / Hr"
.. " hr: " .. tostring(format("%0.1f", xpPerHour)) .. ""
.. " '" .. tostring(xpPerHourText) .. "'"
.. " lvl: " .. tostring(format("%0.1f", timeToLevel)) .. ""
.. " '" .. tostring(timeToLevelText) .. "'"
TitanPluginDebug(TITAN_XP_ID, txt)
end
return L["TITAN_XP_BUTTON_LABEL_XPHR_SESSION"], TitanUtils_GetHighlightText(xpPerHourText),
L["TITAN_XP_BUTTON_LABEL_TOLEVEL_TIME_LEVEL"], TitanUtils_GetHighlightText(timeToLevelText);
elseif (TitanGetVar(TITAN_XP_ID, "DisplayType") == "ShowXPPerHourLevel") then
xpPerHour = currentXP / levelTime * 3600;
timeToLevel = (currentXP == 0) and -1 or toLevelXP / currentXP * levelTime;
xpPerHourText = comma_value(math.floor(xpPerHour + 0.5));
timeToLevelText = TitanUtils_GetEstTimeText(timeToLevel);
return L["TITAN_XP_BUTTON_LABEL_XPHR_LEVEL"], TitanUtils_GetHighlightText(xpPerHourText),
L["TITAN_XP_BUTTON_LABEL_TOLEVEL_TIME_LEVEL"], TitanUtils_GetHighlightText(timeToLevelText);
elseif (TitanGetVar(TITAN_XP_ID, "DisplayType") == "ShowSessionTime") then
return L["TITAN_XP_BUTTON_LABEL_SESSION_TIME"],
TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(sessionTime));
elseif (TitanGetVar(TITAN_XP_ID, "DisplayType") == "ShowXPSimple") then
local toLevelXPText = "";
local rest = "";
local labelrested = "";
local labeltolevel = "";
local labelnumofkills = "";
local labelnumofgains = "";
local percent = floor(10000 * (currentXP / totalXP) + 0.5) / 100;
if TitanGetVar(TITAN_XP_ID, "ShowSimpleToLevel") then
toLevelXPText = TitanUtils_GetColoredText(
format(L["TITAN_XP_FORMAT"], comma_value(math.floor(toLevelXP + 0.5))), _G["GREEN_FONT_COLOR"]);
labeltolevel = L["TITAN_XP_XPTOLEVELUP"];
end
if TitanGetVar(TITAN_XP_ID, "ShowSimpleRested") then
rest = TitanUtils_GetColoredText(comma_value(GetXPExhaustion() == nil and "0" or GetXPExhaustion()),
{ r = 0.44, g = 0.69, b = 0.94 });
labelrested = L["TITAN_XP_TOTAL_RESTED"];
end
if TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfKills") then
numofkills = TitanUtils_GetColoredText(comma_value(numofkills), { r = 0.24, g = 0.7, b = 0.44 })
labelnumofkills = L["TITAN_XP_KILLS_LABEL_SHORT"];
else
numofkills = ""
end
if TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfGains") then
numofgains = TitanUtils_GetColoredText(comma_value(numofgains), { r = 1, g = 0.49, b = 0.04 })
labelnumofgains = L["TITAN_XP_XPGAINS_LABEL_SHORT"];
else
numofgains = ""
end
if TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfGains") then
return L["TITAN_XP_LEVEL_COMPLETE"], TitanUtils_GetHighlightText(percent .. "%"),
labelrested, rest,
labeltolevel, toLevelXPText,
labelnumofgains, numofgains
else
return L["TITAN_XP_LEVEL_COMPLETE"], TitanUtils_GetHighlightText(percent .. "%"),
labelrested, rest,
labeltolevel, toLevelXPText,
labelnumofkills, numofkills
end
end
else
if trace_update then
TitanPluginDebug(TITAN_XP_ID, "pending")
end
return "", "(" .. L["TITAN_XP_UPDATE_PENDING"] .. ")"
end
else
-- Invalid button - frame not created?
end
return "", ""
end
---local Generate tooltip text
---@return string
local function GetTooltipText()
local res = ""
local button, id = TitanUtils_GetButton(TITAN_XP_ID) -- sanity check, also get plugin frame
if button then
local totalTime = txp.totalTime;
local sessionTime = time() - txp.startSessionTime;
local levelTime = txp.levelTime;
-- failsafe to ensure that an error wont be returned
if levelTime then
local totalXP = UnitXPMax("player");
local currentXP = UnitXP("player");
local toLevelXP = totalXP - currentXP;
local currentXPPercent = currentXP / totalXP * 100;
local toLevelXPPercent = toLevelXP / totalXP * 100;
local xpPerHourThisLevel = currentXP / levelTime * 3600;
local xpPerHourThisSession = txp.sessionXP / sessionTime * 3600;
local estTimeToLevelThisLevel = TitanUtils_Ternary((currentXP == 0), -1,
toLevelXP / (max(currentXP, 1)) * levelTime);
local estTimeToLevelThisSession = 0;
if txp.sessionXP > 0 then
estTimeToLevelThisSession = TitanUtils_Ternary((txp.sessionXP == 0), -1,
toLevelXP / txp.sessionXP * sessionTime);
end
local numofkills, numofgains;
if txp.lastMobXP ~= 0 then
numofkills = math.ceil(toLevelXP / txp.lastMobXP)
else
numofkills = 0 --_G["UNKNOWN"]
end
if txp.XPGain ~= 0 then
numofgains = math.ceil(toLevelXP / txp.XPGain)
else
numofgains = 0 --_G["UNKNOWN"]
end
res = "" ..
L["TITAN_XP_TOOLTIP_TOTAL_TIME"] ..
"\t" .. TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(totalTime)) .. "\n" ..
L["TITAN_XP_TOOLTIP_LEVEL_TIME"] ..
"\t" .. TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(levelTime)) .. "\n" ..
L["TITAN_XP_TOOLTIP_SESSION_TIME"] ..
"\t" .. TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(sessionTime)) .. "\n" ..
"\n" ..
L["TITAN_XP_TOOLTIP_TOTAL_XP"] .. "\t" .. TitanUtils_GetHighlightText(comma_value(totalXP)) .. "\n" ..
L["TITAN_XP_TOTAL_RESTED"] ..
"\t" ..
TitanUtils_GetHighlightText(comma_value(GetXPExhaustion() == nil and "0" or GetXPExhaustion())) .. "\n" ..
L["TITAN_XP_TOOLTIP_LEVEL_XP"] ..
"\t" ..
TitanUtils_GetHighlightText(comma_value(currentXP) .. " " ..
format(L["TITAN_XP_PERCENT_FORMAT"], currentXPPercent)) .. "\n" ..
L["TITAN_XP_TOOLTIP_TOLEVEL_XP"] ..
"\t" ..
TitanUtils_GetHighlightText(comma_value(toLevelXP) .. " " ..
format(L["TITAN_XP_PERCENT_FORMAT"], toLevelXPPercent)) .. "\n" ..
L["TITAN_XP_TOOLTIP_SESSION_XP"] ..
"\t" .. TitanUtils_GetHighlightText(comma_value(txp.sessionXP)) .. "\n" ..
format(L["TITAN_XP_KILLS_LABEL"], comma_value(txp.lastMobXP)) ..
"\t" .. TitanUtils_GetHighlightText(comma_value(numofkills)) .. "\n" ..
format(L["TITAN_XP_XPGAINS_LABEL"], comma_value(txp.XPGain)) ..
"\t" .. TitanUtils_GetHighlightText(comma_value(numofgains)) .. "\n" ..
"\n" ..
L["TITAN_XP_TOOLTIP_XPHR_LEVEL"] ..
"\t" ..
TitanUtils_GetHighlightText(format(L["TITAN_XP_FORMAT"], comma_value(math.floor(xpPerHourThisLevel + 0.5)))) ..
"\n" ..
L["TITAN_XP_TOOLTIP_XPHR_SESSION"] ..
"\t" ..
TitanUtils_GetHighlightText(format(L["TITAN_XP_FORMAT"], comma_value(math.floor(xpPerHourThisSession + 0.5)))) ..
"\n" ..
L["TITAN_XP_TOOLTIP_TOLEVEL_LEVEL"] ..
"\t" .. TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(estTimeToLevelThisLevel)) .. "\n" ..
L["TITAN_XP_TOOLTIP_TOLEVEL_SESSION"] ..
"\t" .. TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(estTimeToLevelThisSession));
else
end
else
-- No button - not created?
end
return res
end
---local Place commas or periods in the number per user options.
---@param chosen string
local function Seperator(chosen)
if chosen == "UseSeperatorComma" then
TitanSetVar(TITAN_XP_ID, "UseSeperatorComma", true);
TitanSetVar(TITAN_XP_ID, "UseSeperatorPeriod", false);
end
if chosen == "UseSeperatorPeriod" then
TitanSetVar(TITAN_XP_ID, "UseSeperatorComma", false);
TitanSetVar(TITAN_XP_ID, "UseSeperatorPeriod", true);
end
TitanPanelButton_UpdateButton(TITAN_XP_ID);
end
---local Display XP per hour this session.
local function ShowXPPerHourSession()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowXPPerHourSession");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
TitanSetVar(TITAN_XP_ID, "ShowSimpleRested", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleToLevel", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", false);
end
---local Display session time.
local function ShowSessionTime()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowSessionTime");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
TitanSetVar(TITAN_XP_ID, "ShowSimpleRested", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleToLevel", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", false);
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", false);
end
---local Display simple XP data (% level, rest, xp to level).
local function ShowXPSimple()
TitanSetVar(TITAN_XP_ID, "DisplayType", "ShowXPSimple");
TitanPanelButton_UpdateButton(TITAN_XP_ID);
end
---local Generate right click menu.
local function CreateMenu()
local info = {};
if TitanPanelRightClickMenu_GetDropdownLevel() == 2 then
TitanPanelRightClickMenu_AddTitle(L["TITAN_XP_MENU_SIMPLE_BUTTON_TITLE"], 2);
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_RESTED"];
info.func = function() TitanPanelRightClickMenu_ToggleVar({ TITAN_XP_ID, "ShowSimpleRested" }) end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleRested"), 1, nil);
info.keepShownOnClick = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_TOLEVELUP"];
info.func = function() TitanPanelRightClickMenu_ToggleVar({ TITAN_XP_ID, "ShowSimpleToLevel" }) end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleToLevel"), 1, nil);
info.keepShownOnClick = 1;
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_KILLS"];
info.func = function()
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", true)
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", false)
end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfKills"), 1, nil);
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_XP_MENU_SIMPLE_BUTTON_XPGAIN"];
info.func = function()
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfGains", true)
TitanSetVar(TITAN_XP_ID, "ShowSimpleNumOfKills", false)
end
info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_XP_ID, "ShowSimpleNumOfGains"), 1, nil);
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
return
elseif TitanPanelRightClickMenu_GetDropdownLevel() == 1 then
TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_XP_ID].menuText);
info = {};
info.text = L["TITAN_XP_MENU_SHOW_XPHR_THIS_SESSION"];
info.func = ShowXPPerHourSession;
info.checked = TitanUtils_Ternary("ShowXPPerHourSession" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_XP_MENU_SHOW_XPHR_THIS_LEVEL"];
info.func = ShowXPPerHourLevel;
info.checked = TitanUtils_Ternary("ShowXPPerHourLevel" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_XP_MENU_SHOW_SESSION_TIME"];
info.func = ShowSessionTime;
info.checked = TitanUtils_Ternary("ShowSessionTime" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_XP_MENU_SHOW_RESTED_TOLEVELUP"];
info.func = ShowXPSimple;
info.hasArrow = 1;
info.checked = TitanUtils_Ternary("ShowXPSimple" == TitanGetVar(TITAN_XP_ID, "DisplayType"), 1, nil);
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddSpacer();
TitanPanelRightClickMenu_AddCommand(L["TITAN_XP_MENU_RESET_SESSION"], TITAN_XP_ID, ResetThisSession);
TitanPanelRightClickMenu_AddCommand(L["TITAN_XP_MENU_REFRESH_PLAYED"], TITAN_XP_ID, RefreshPlayed);
end
TitanPanelRightClickMenu_AddSpacer();
info = {};
info.text = L["TITAN_PANEL_USE_COMMA"];
info.checked = TitanGetVar(TITAN_XP_ID, "UseSeperatorComma");
info.func = function()
Seperator("UseSeperatorComma")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
info = {};
info.text = L["TITAN_PANEL_USE_PERIOD"];
info.checked = TitanGetVar(TITAN_XP_ID, "UseSeperatorPeriod");
info.func = function()
Seperator("UseSeperatorPeriod")
end
TitanPanelRightClickMenu_AddButton(info, TitanPanelRightClickMenu_GetDropdownLevel());
TitanPanelRightClickMenu_AddControlVars(TITAN_XP_ID)
end
---local Create plugin .registry and and init some variables and register for first events
---@param self Button
local function OnLoad(self)
local notes = ""
.. "Adds information to Titan Panel about XP earned and time to level.\n"
.."- Updates XP per hour statistics every "..XPTimer.delay.." sec.\n"
self.registry = {
id = TITAN_XP_ID,
category = "Built-ins",
version = TITAN_VERSION,
menuText = L["TITAN_XP_MENU_TEXT"],
menuTextFunction = CreateMenu,
buttonTextFunction = GetButtonText,
tooltipTitle = L["TITAN_XP_TOOLTIP"],
tooltipTextFunction = GetTooltipText,
iconWidth = 16,
notes = notes,
controlVariables = {
ShowIcon = true,
ShowLabelText = true,
ShowColoredText = false,
DisplayOnRightSide = true
},
savedVariables = {
DisplayType = "ShowXPPerHourSession",
ShowIcon = 1,
ShowLabelText = 1,
ShowSimpleRested = false,
ShowSimpleToLevel = false,
ShowSimpleNumOfKills = false,
ShowSimpleNumOfGains = false,
UseSeperatorComma = true,
UseSeperatorPeriod = false,
DisplayOnRightSide = false,
}
};
self:RegisterEvent("PLAYER_ENTERING_WORLD")
ResetSession(self)
end
---local Create needed frames
local function Create_Frames()
if _G[TITAN_XP_BUTTON] then
-- if already created
else
-- general container frame
local f = CreateFrame("Frame", nil, UIParent)
-- f:Hide()
-- Titan plugin button
local window = CreateFrame("Button", TITAN_XP_BUTTON, f, "TitanPanelComboTemplate")
txp.frame = window
window:SetFrameStrata("FULLSCREEN")
-- Using SetScript("OnLoad", does not work
OnLoad(window);
-- TitanPanelButton_OnLoad(window); -- Titan XML template calls this...
window:SetScript("OnShow", function(self)
OnShow(self)
TitanPanelButton_OnShow(self)
end)
window:SetScript("OnHide", function(self)
OnHide(self)
end)
window:SetScript("OnEvent", function(self, event, ...)
OnEvent(self, event, ...)
end)
-- window:SetScript("OnUpdate", function(self, elapsed)
-- OnUpdate(self, elapsed)
-- end)
-- Do not output Chat messages when using RequestTimePlayed
function window:RequestTimePlayed()
requesting = true
RequestTimePlayed()
end
end
end
if TITAN_ID then -- it exists
Create_Frames() -- do the work
end