local addonname, shared = ... ---@cast shared CykaShared ---@cast addonname string ---@class CykaPersistentData ---@field config CykaConfig ---@field data CykaData ---@class CykaShared ---@field config CykaConfig ---@field data CykaData ---@field GetOrDefault fun(table: table, keys: string[], default: any): any ---@field DumpTable fun(table: table, depth: number) ---@field TableContains fun(table: table, value: any): boolean ---@field Autoloot Autoloot ---@field CameraSettings CameraSettings ---@field SpellQSettings SpellQSettings ---@class CykaData ---@class CykaConfig ---@field autoloot CykaAutolootConfig ---@field camera { enabled: boolean, speed: number } ---@field spellQueue { enabled: boolean, queue: number } ---@class CykaAutolootConfig ---@field enabled boolean ---@field filter CykaAutoLootFilterConfig ---@class CykaAutoLootFilterConfig ---@field gold { enabled: boolean } ---@field orderResource { enabled: boolean } ---@field mount { enabled: boolean } ---@field ilvl { enabled: boolean, value: number } ---@field profession { enabled: boolean, professions: string } ---@field value { enabled: boolean, byStack: boolean, value: number } ---@field greyvalue { enabled: boolean, byStack: boolean, value: number } ---@field questItem { enabled: boolean } ---@field classGear { enabled: boolean, ilvlThreshold: number, qualityThreshold: number } ---@field name { enabled: boolean, exact: boolean, caseSensitive: boolean, whitelist: string } ---@field boe { enabled: boolean, ilvlThreshold: number, qualityThreshold: number } ---@field ap { enabled: boolean } ---@field everything { enabled: boolean } local function init() if not CykaPersistentData then CykaPersistentData = {} end if not CykaPersistentData.config then CykaPersistentData.config = {} end shared.GetOrDefault = function(table, keys, default) local value = default if not table then return value end if not keys then return value end local traverse = table for i = 1, #keys do local key = keys[i] if traverse[key] ~= nil then traverse = traverse[key] else break end if i == #keys then value = traverse end end return value end ---@param table table ---@param depth number? shared.DumpTable = function(table, depth) if not table then print(tostring(table)) return end if depth == nil then depth = 0 end if depth > 200 then print("Error: Depth > 200 in dumpTable()") return end for k, v in pairs(table) do if type(v) == "table" then print(string.rep(" ", depth) .. k .. ":") shared.DumpTable(v, depth + 1) else print(string.rep(" ", depth) .. k .. ": ", v) end end end ---@param table table ---@param value any shared.TableContains = function(table, value) for _, v in pairs(table) do if v == value then return true end end return false end shared.config = { camera = { enabled = shared.GetOrDefault(CykaPersistentData.config, { "camera", "enabled" }, true), speed = shared.GetOrDefault(CykaPersistentData.config, { "camera", "speed" }, 30), }, spellQueue = { enabled = shared.GetOrDefault(CykaPersistentData.config, { "spellQueue", "enabled" }, true), queue = shared.GetOrDefault(CykaPersistentData.config, { "spellQueue", "queue" }, 1), }, autoloot = { enabled = shared.GetOrDefault(CykaPersistentData.config, { "autoloot", "enabled" }, true), filter = { gold = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "gold", "enabled" }, true ), }, orderResource = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "orderResource", "enabled" }, true ), }, mount = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "mount", "enabled" }, true ), }, ilvl = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "ilvl", "enabled" }, true ), value = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "ilvl", "value" }, 910 ), }, profession = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "profession", "enabled" }, true ), professions = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "profession", "professions" }, "" ), }, value = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "value", "enabled" }, true ), byStack = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "value", "byStack" }, false ), value = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "value", "value" }, 10000 ), }, greyvalue = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "greyvalue", "enabled" }, true ), byStack = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "greyvalue", "byStack" }, false ), value = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "greyvalue", "value" }, 100000 ), }, questItem = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "questItem", "enabled" }, true ), }, classGear = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "classGear", "enabled" }, true ), ilvlThreshold = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "classGear", "ilvlThreshold" }, 910 ), qualityThreshold = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "classGear", "qualityThreshold" }, 3 ), }, boe = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "boe", "enabled" }, true ), ilvlThreshold = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "boe", "ilvlThreshold" }, 910 ), qualityThreshold = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "boe", "qualityThreshold" }, 3 ), }, ap = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "ap", "enabled" }, true ), }, name = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "name", "enabled" }, false ), exact = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "name", "exact" }, false ), caseSensitive = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "name", "caseSensitive" }, false ), whitelist = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "name", "whitelist" }, "" ), }, everything = { enabled = shared.GetOrDefault( CykaPersistentData.config, { "autoloot", "filter", "everything", "enabled" }, true ), }, }, }, } shared.Autoloot.Init() shared.CameraSettings.Init() shared.SpellQSettings.Init() print("Cyka loaded!") end local loadedFrame = CreateFrame("Frame") loadedFrame:RegisterEvent("ADDON_LOADED") loadedFrame:SetScript("OnEvent", function(self, event, addonName) if addonName == addonname then init() end end) -- local loaded = 0 -- local ticker -- ticker = C_Timer.NewTicker(1, function() -- -- IT JUST WONT FUCKING RUN JUST FUCKING RUN THE FUCKING FUNCTION GOD DAMN IT -- loaded = loaded + 1 -- init() -- if loaded > 100 then ticker:Cancel() end -- end) local logoutFrame = CreateFrame("Frame") logoutFrame:RegisterEvent("PLAYER_LOGOUT") logoutFrame:SetScript("OnEvent", function(self, event, ...) CykaPersistentData.config = shared.config end)