From b77f539ae11910aff36e161511b32778777de64d Mon Sep 17 00:00:00 2001 From: KlazHTT Date: Thu, 7 Mar 2024 21:27:04 -0500 Subject: [PATCH] Init --- Core/Config.lua | 60 ++++++++++++++++++++++++++ Core/Functions.lua | 92 ++++++++++++++++++++++++++++++++++++++++ Core/Launch.lua | 44 +++++++++++++++++++ Core/Localization.lua | 38 +++++++++++++++++ Core/Mover.lua | 39 +++++++++++++++++ KlazStats.toc | 14 ++++++ Media/KlazAddOnIcon.blp | Bin 0 -> 23060 bytes Modules/Stats.lua | 43 +++++++++++++++++++ 8 files changed, 330 insertions(+) create mode 100644 Core/Config.lua create mode 100644 Core/Functions.lua create mode 100644 Core/Launch.lua create mode 100644 Core/Localization.lua create mode 100644 Core/Mover.lua create mode 100644 KlazStats.toc create mode 100644 Media/KlazAddOnIcon.blp create mode 100644 Modules/Stats.lua diff --git a/Core/Config.lua b/Core/Config.lua new file mode 100644 index 0000000..ab9410d --- /dev/null +++ b/Core/Config.lua @@ -0,0 +1,60 @@ +local addon, ns = ... +local L = ns.L +local T = ns.T + +-------------------------------------------------------------------------------- +-- # CORE > CONFIG +-------------------------------------------------------------------------------- + +-- ## RESET +-------------------------------------------------------------------------------- + +StaticPopupDialogs.KLAZSTATS_RESET = { + text = L.CONFIG_POPUP_RESET, + button1 = ACCEPT, + button2 = CANCEL, + OnAccept = function() + KlazStatsDB.Position = {'TOP', 'TOP', 0, 0} + T.Anchor:ClearAllPoints() + T.Anchor:SetPoint(KlazStatsDB.Position[1], UIParent, KlazStatsDB.Position[2], KlazStatsDB.Position[3], KlazStatsDB.Position[4]) + KlazStatsDB.UserPlaced = true + print('Klaz|cff1994ffStats|r — |cnYELLOW_FONT_COLOR:'..L.CONFIG_POPUP_RESET_OK..'!|r') + end, + OnCancel = function() end, + showAlert = true, + timeout = 0, + whileDead = 1, + hideOnEscape = true, + preferredIndex = 5, +} + +-- ## SLASH COMMAND +-------------------------------------------------------------------------------- + +SlashCmdList['KLAZSTATS'] = function(msg, editbox) + if string.lower(msg) == 'reset' then + StaticPopup_Show('KLAZSTATS_RESET') + elseif string.lower(msg) == 'unlock' then + if not T.Anchor:IsShown() then + T.Anchor:Show() + KlazStatsDB.UserPlaced = false + print('Klaz|cff1994ffStats|r — |cnGREEN_FONT_COLOR:'..L.COMMAND_UNLOCK..'|r') + end + elseif string.lower(msg) == 'lock' then + if not KlazStatsDB.UserPlaced then + T.Anchor:Hide() + KlazStatsDB.UserPlaced = true + print('Klaz|cff1994ffStats|r — |cnRED_FONT_COLOR:'..L.COMMAND_LOCK..'|r') + end + else + print('------------------------------------------') + print('Klaz|cff1994ffStats|r') + print('------------------------------------------') + print('|cff1994ff/kstats|r — '..L.COMMAND_HELP_SHORT..'.') + print('|cnGREEN_FONT_COLOR:/kstats unlock|r — '..L.COMMAND_HELP_UNLOCK..'.') + print('|cnRED_FONT_COLOR:/kstats lock|r — '..L.COMMAND_HELP_LOCK..'.') + print('|cnYELLOW_FONT_COLOR:/kstats reset|r — '..L.COMMAND_HELP_RESET..'.') + end +end +SLASH_KLAZSTATS1 = '/klazstats' +SLASH_KLAZSTATS2 = '/kstats' diff --git a/Core/Functions.lua b/Core/Functions.lua new file mode 100644 index 0000000..f59d5d3 --- /dev/null +++ b/Core/Functions.lua @@ -0,0 +1,92 @@ +local addon, ns = ... +local T = {} +ns.T = T + +-------------------------------------------------------------------------------- +-- # CORE > FUNCTIONS +-------------------------------------------------------------------------------- + +-- ## FORMAT +-------------------------------------------------------------------------------- + +T.Backdrop = { + bgFile = 'Interface\\Buttons\\WHITE8x8', + edgeFile = 'Interface\\Buttons\\WHITE8x8', + tileEdge = false, + edgeSize = 1, + insets = { left = 1, right = 1, top = 1, bottom = 1 }, +} + +T.ClassColor = RAID_CLASS_COLORS[select(2, UnitClass('player'))] + +local function colorDurabilityPercent(perc) + perc = perc > 1 and 1 or perc < 0 and 0 or perc + local seg, relperc = math.modf(perc*2) + local r1, g1, b1, r2, g2, b2 = select(seg*3+1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0) + local r, g, b = r1+(r2-r1)*relperc, g1+(g2-g1)*relperc, b1+(b2-b1)*relperc + return format('|cff%02x%02x%02x', r*255, g*255, b*255), r, g, b +end + +-- ## MODULES +-------------------------------------------------------------------------------- + +T.GetLootSpec = function() + local currentSpec = GetSpecialization() + local currentSpecName = select(2, GetSpecializationInfo(currentSpec)) + local lootSpecID = GetLootSpecialization() + local lootSpec = select(2, GetSpecializationInfoByID(lootSpecID)) + + -- if loot spec was manually set + if lootSpec then + return '|cnWHITE_FONT_COLOR:Loot:|r '..lootSpec..' ' + -- otherwise use current loot spec + elseif currentSpec then + return '|cnWHITE_FONT_COLOR:Loot:|r '..currentSpecName..' ' + else + return '' + end +end + +T.GetLatency = function() + return '|cnWHITE_FONT_COLOR:'..select(3, GetNetStats())..' / '..select(4, GetNetStats())..'|r ms ' +end + +T.GetFPS = function() + return '|cnWHITE_FONT_COLOR:'..floor(GetFramerate())..'|r fps ' +end + +local SLOTS = {} +for _, slot in pairs({ + 'Head', + 'Shoulder', + 'Chest', + 'Waist', + 'Legs', + 'Feet', + 'Wrist', + 'Hands', + 'MainHand', + 'SecondaryHand' +}) do + SLOTS[slot] = GetInventorySlotInfo(slot..'Slot') +end + +T.GetDurability = function() + local l = 1 + for slot, id in pairs(SLOTS) do + local d, md = GetInventoryItemDurability(id) + if d and md and md ~= 0 then + l = math.min(d/md, l) + end + end + return format('%s%d|r dur ', colorDurabilityPercent(l), l*100) +end + +T.GetTime = function() + -- return 24-hour notation + -- local time = date('%H:%M') + -- return '|cnWHITE_FONT_COLOR:'..time..'|r ' + -- return 12-hour notation with AM/PM + local time = date('|cnWHITE_FONT_COLOR:%I:%M|r %p') + return time +end diff --git a/Core/Launch.lua b/Core/Launch.lua new file mode 100644 index 0000000..aa0b621 --- /dev/null +++ b/Core/Launch.lua @@ -0,0 +1,44 @@ +local addon, ns = ... +local C = {} +ns.C = C + +-------------------------------------------------------------------------------- +-- # CORE > LAUNCH +-------------------------------------------------------------------------------- + +C.Settings = { + Position = {'TOP', 'TOP', 0, 0}, + UserPlaced = true, + Font = { + Family = STANDARD_TEXT_FONT, + Size = 12, + Style = 'OUTLINE', + Align = 'CENTER', + }, +} + +local loader = CreateFrame('Frame') +loader:RegisterEvent('ADDON_LOADED') +loader:SetScript('OnEvent', function(self, addon) + if addon ~= KlazStats then + local function initDB(db, defaults) + if type(db) ~= 'table' then db = {} end + if type(defaults) ~= 'table' then return db end + + for k, v in pairs(defaults) do + if type(v) == 'table' then + db[k] = initDB(db[k], v) + elseif type(v) ~= type(db[k]) then + db[k] = v + end + end + + return db + end + + KlazStatsDB = initDB(KlazStatsDB, C.Settings) + C.Settings = KlazStatsDB + + self:UnregisterEvent('ADDON_LOADED') + end +end) diff --git a/Core/Localization.lua b/Core/Localization.lua new file mode 100644 index 0000000..4d844da --- /dev/null +++ b/Core/Localization.lua @@ -0,0 +1,38 @@ +local addon, ns = ... +local L = {} +ns.L = L + +-------------------------------------------------------------------------------- +-- # CORE > LOCALIZATION +-------------------------------------------------------------------------------- + +-- ## ENGLISH +-------------------------------------------------------------------------------- + +L['COMMAND_HELP_SHORT'] = 'Short command' +L['COMMAND_HELP_UNLOCK'] = 'Unlocks frame' +L['COMMAND_HELP_LOCK'] = 'Locks frame in current position' +L['COMMAND_HELP_RESET'] = 'Resets frame position to default position (top center of screen)' + +L['COMMAND_UNLOCK'] = 'Unlocked' +L['COMMAND_LOCK'] = 'Locked' + +L['CONFIG_POPUP_RESET'] = 'Klaz|cff1994ffStats|r\n|cnNORMAL_FONT_COLOR:Reset to default position?|r' +L['CONFIG_POPUP_RESET_OK'] = 'Reset completed' + +local locale = GetLocale() +if locale == 'en_GB' or locale == 'enUS' then return end -- ENGLISH + +-- ## OTHER +-------------------------------------------------------------------------------- + +-- if locale == 'esMX' then return end -- SPANISH (MEXICO) +-- if locale == 'pt_BR' then return end -- PORTUGEUSE +-- if locale == 'de_DE' then return end -- GERMAN +-- if locale == 'es_ES' then return end -- SPANISH (SPAIN) +-- if locale == 'fr_FR' then return end -- FRENCH +-- if locale == 'it_IT' then return end -- ITALIAN +-- if locale == 'ru_RU' then return end -- RUSSIAN +-- if locale == 'ko_KR' then return end -- KOREAN +-- if locale == 'zh_TW' then return end -- CHINESE (TRADITIONAL) +-- if locale == 'zh_CN' then return end -- CHINESE (SIMPLIFIED) diff --git a/Core/Mover.lua b/Core/Mover.lua new file mode 100644 index 0000000..9b01516 --- /dev/null +++ b/Core/Mover.lua @@ -0,0 +1,39 @@ +local addon, ns = ... +local T = ns.T + +-------------------------------------------------------------------------------- +-- # CORE > MOVER +-------------------------------------------------------------------------------- + +T.Anchor = CreateFrame('Frame', 'KlazStatsAnchor', UIParent) +T.Anchor:SetSize(400, 25) +if not T.Anchor.SetBackdrop then Mixin(T.Anchor, BackdropTemplateMixin) end +T.Anchor:SetBackdrop(T.Backdrop) +T.Anchor:SetBackdropColor(0.02, 0.02, 0.02, 0.8) +T.Anchor:SetBackdropBorderColor(T.ClassColor.r, T.ClassColor.g, T.ClassColor.b, 1) +T.Anchor:SetFrameStrata('HIGH') +T.Anchor:EnableMouse(true) +T.Anchor:SetMovable(true) +T.Anchor:SetUserPlaced(true) +T.Anchor:SetClampedToScreen(true) +T.Anchor:RegisterForDrag('LeftButton') +T.Anchor:RegisterEvent('PLAYER_LOGIN') +T.Anchor:SetScript('OnEvent', function(self, event) + self:ClearAllPoints() + self:SetPoint(KlazStatsDB.Position[1], UIParent, KlazStatsDB.Position[2], KlazStatsDB.Position[3], KlazStatsDB.Position[4]) + + if KlazStatsDB.UserPlaced then self:Hide() end +end) +T.Anchor:SetScript('OnDragStart', function(self) self:StartMoving() end) +T.Anchor:SetScript('OnDragStop', function(self) + self:StopMovingOrSizing() + local point, _, relativePoint, xOffset, yOffset = self:GetPoint() + KlazStatsDB.Position[1] = point + KlazStatsDB.Position[2] = relativePoint + KlazStatsDB.Position[3] = xOffset + KlazStatsDB.Position[4] = yOffset +end) + +T.Anchor.text = T.Anchor:CreateFontString(nil, 'OVERLAY', 'GameFontHighlight') +T.Anchor.text:SetAllPoints(T.Anchor) +T.Anchor.text:SetText('Klaz|cff1994ffStats|r — |cnRED_FONT_COLOR:/kstats lock|r') diff --git a/KlazStats.toc b/KlazStats.toc new file mode 100644 index 0000000..4af7b17 --- /dev/null +++ b/KlazStats.toc @@ -0,0 +1,14 @@ +## Interface: 100205 +## Title: Klaz|cff1994ffStats|r +## Author: Klaz +## Notes: Displays loot specialization, fps, latency, durability, and clock on screen. (/klazstats) +## IconTexture: Interface\AddOns\KlazStats\Media\KlazAddOnIcon.blp +## SavedVariables: KlazStatsDB + +Core\Launch.lua +Core\Localization.lua +Core\Functions.lua +Core\Config.lua +Core\Mover.lua + +Modules\Stats.lua diff --git a/Media/KlazAddOnIcon.blp b/Media/KlazAddOnIcon.blp new file mode 100644 index 0000000000000000000000000000000000000000..f65d21177bc7150f1f5ba477a7fb09df9de8192a GIT binary patch literal 23060 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 XtEvs`{CNi;k;pdK9uBW({Wtty!p1#{ literal 0 HcmV?d00001 diff --git a/Modules/Stats.lua b/Modules/Stats.lua new file mode 100644 index 0000000..100ba79 --- /dev/null +++ b/Modules/Stats.lua @@ -0,0 +1,43 @@ +local addon, ns = ... +local L = ns.L +local T = ns.T + +-------------------------------------------------------------------------------- +-- # MODULES > STATS +-------------------------------------------------------------------------------- + +local fontFamily = STANDARD_TEXT_FONT +local fontSize = 12 +local fontOutline = 'OUTLINE' +local fontAlign = 'CENTER' + +local stats = CreateFrame('Frame', 'KlazStats', UIParent) +stats:SetAllPoints(T.Anchor) + +stats.text = stats:CreateFontString(nil, 'BACKGROUND') +stats.text:SetPoint(fontAlign, stats) +stats.text:SetJustifyH(fontAlign) +stats.text:SetFont(fontFamily, fontSize, fontOutline) +stats.text:SetTextColor(T.ClassColor.r, T.ClassColor.g, T.ClassColor.b) + +-- ## UPDATE +-------------------------------------------------------------------------------- + +local lastUpdate = 0 +local function UpdateStats(self, elapsed) + lastUpdate = lastUpdate + elapsed + + if lastUpdate > 1 then + lastUpdate = 0 + stats.text:SetText(T.GetLootSpec()..T.GetFPS()..T.GetLatency()..T.GetDurability()..T.GetTime()) + end +end + +stats:RegisterEvent('PLAYER_LOGIN') +stats:RegisterEvent('PLAYER_ENTERING_WORLD') +stats:RegisterEvent('UPDATE_INVENTORY_DURABILITY') +stats:RegisterEvent('PLAYER_LOOT_SPEC_UPDATED') +stats:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED') +stats:SetScript('OnEvent', function(self, event) + self:SetScript('OnUpdate', UpdateStats) +end)