----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local _detalhes = _G._detalhes local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) local _ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> On Details! Load: --> load default keys into the main object function _detalhes:ApplyBasicKeys() --> we are not in debug mode self.debug = false --> connected to realm channel self.is_connected = false --> who is self.playername = UnitName ("player") self.playerserial = UnitGUID ("player") --> player faction and enemy faction self.faction = UnitFactionGroup ("player") if (self.faction == PLAYER_FACTION_GROUP[0]) then --> player is horde self.faction_against = PLAYER_FACTION_GROUP[1] --> ally self.faction_id = 0 elseif (self.faction == PLAYER_FACTION_GROUP[1]) then --> player is alliance self.faction_against = PLAYER_FACTION_GROUP[0] --> horde self.faction_id = 1 end self.zone_type = nil _detalhes.temp_table1 = {} --> combat self.encounter = {} self.in_combat = false self.combat_id = 0 --> instances (windows) self.solo = self.solo or nil self.raid = self.raid or nil self.opened_windows = 0 self.default_texture = [[Interface\AddOns\Details\images\bar4]] self.default_texture_name = "Details D'ictum" self.class_coords_version = 1 self.class_colors_version = 1 self.school_colors = { [1] = {1.00, 1.00, 0.00}, [2] = {1.00, 0.90, 0.50}, [4] = {1.00, 0.50, 0.00}, [8] = {0.30, 1.00, 0.30}, [16] = {0.50, 1.00, 1.00}, [32] = {0.50, 0.50, 1.00}, [64] = {1.00, 0.50, 1.00}, ["unknown"] = {0.5, 0.75, 0.75, 1} } --> load default profile keys for key, value in pairs (_detalhes.default_profile) do if (type (value) == "table") then local ctable = Details.CopyTable (value) self [key] = ctable else self [key] = value end end --> end return true end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> On Details! Load: --> check if this is a first run, reset, or just load the saved data. function _detalhes:LoadGlobalAndCharacterData() --> check and build the default container for character database --> it exists? if (not _detalhes_database) then _detalhes_database = Details.CopyTable (_detalhes.default_player_data) end --> load saved values for key, value in pairs (_detalhes.default_player_data) do --> check if key exists, e.g. a new key was added if (_detalhes_database [key] == nil) then if (type (value) == "table") then _detalhes_database [key] = Details.CopyTable (_detalhes.default_player_data [key]) else _detalhes_database [key] = value end elseif (type (_detalhes_database [key]) == "table") then if (type(_detalhes.default_player_data [key]) == "string") then print("|cFFFFAA00Details!|r error 0x8538, report on discord", key, _detalhes_database [key], _detalhes.default_player_data [key]) end for key2, value2 in pairs (_detalhes.default_player_data [key]) do if (_detalhes_database [key] [key2] == nil) then if (type (value2) == "table") then _detalhes_database [key] [key2] = Details.CopyTable (_detalhes.default_player_data [key] [key2]) else _detalhes_database [key] [key2] = value2 end end end end --> copy the key from saved table to details object if (type (value) == "table") then _detalhes [key] = Details.CopyTable (_detalhes_database [key]) else _detalhes [key] = _detalhes_database [key] end end --> check and build the default container for account database if (not _detalhes_global) then _detalhes_global = Details.CopyTable (_detalhes.default_global_data) end for key, value in pairs (_detalhes.default_global_data) do --> check if key exists if (_detalhes_global [key] == nil) then if (type (value) == "table") then _detalhes_global [key] = Details.CopyTable (_detalhes.default_global_data [key]) else _detalhes_global [key] = value end elseif (type (_detalhes_global [key]) == "table") then if (type(_detalhes.default_global_data [key]) == "string") then C_Timer.After(5, function() print("|cFFFFAA00Details!|r error 0x8547, report on discord", key, _detalhes_global [key], _detalhes.default_global_data [key]) end) end if (key == "always_use_profile_name") then _detalhes_global ["always_use_profile_name"] = "" end if (type (_detalhes_global [key]) == "table") then for key2, value2 in pairs (_detalhes.default_global_data [key]) do if (_detalhes_global [key] [key2] == nil) then if (type (value2) == "table") then _detalhes_global [key] [key2] = Details.CopyTable (_detalhes.default_global_data [key] [key2]) else _detalhes_global [key] [key2] = value2 end end end end end --> copy the key from saved table to details object if (type (value) == "table") then _detalhes [key] = Details.CopyTable (_detalhes_global [key]) else _detalhes [key] = _detalhes_global [key] end end --> end return true end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> On Details! Load: --> load previous saved combat data function _detalhes:LoadCombatTables() --> if isn't nothing saved, build a new one if (not _detalhes_database.tabela_historico) then _detalhes.tabela_historico = _detalhes.historico:NovoHistorico() _detalhes.tabela_overall = _detalhes.combate:NovaTabela() _detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall) _detalhes.tabela_pets = _detalhes.container_pets:NovoContainer() _detalhes:UpdateContainerCombatentes() else --> build basic containers -- segments _detalhes.tabela_historico = _detalhes_database.tabela_historico or _detalhes.historico:NovoHistorico() -- overall _detalhes.tabela_overall = _detalhes.combate:NovaTabela() -- pets _detalhes.tabela_pets = _detalhes.container_pets:NovoContainer() if (_detalhes_database.tabela_pets) then _detalhes.tabela_pets.pets = Details.CopyTable (_detalhes_database.tabela_pets) end _detalhes:UpdateContainerCombatentes() --> if the core revision was incremented, reset all combat data if (_detalhes_database.last_realversion and _detalhes_database.last_realversion < _detalhes.realversion) then --> details was been hard upgraded _detalhes.tabela_historico = _detalhes.historico:NovoHistorico() _detalhes.tabela_overall = _detalhes.combate:NovaTabela() _detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall) _detalhes.tabela_pets = _detalhes.container_pets:NovoContainer() _detalhes:UpdateContainerCombatentes() _detalhes_database.tabela_historico = nil _detalhes_database.tabela_overall = nil else --> check integrity local combat = _detalhes.tabela_historico.tabelas [1] if (combat) then if (not combat[1] or not combat[2] or not combat[3] or not combat[4]) then --> something went wrong in last logon, let's just reset and we are good to go _detalhes.tabela_historico = _detalhes.historico:NovoHistorico() _detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall) _detalhes.tabela_pets = _detalhes.container_pets:NovoContainer() _detalhes:UpdateContainerCombatentes() end end end if (not _detalhes.overall_clear_logout) then if (_detalhes_database.tabela_overall) then _detalhes.tabela_overall = _detalhes_database.tabela_overall _detalhes:RestauraOverallMetaTables() end else _detalhes.tabela_overall = _detalhes.combate:NovaTabela() end --> re-build all indexes and metatables _detalhes:RestauraMetaTables() --> get last combat table local historico_UM = _detalhes.tabela_historico.tabelas[1] if (historico_UM) then _detalhes.tabela_vigente = historico_UM --> significa que elas eram a mesma tabela, ent�o aqui elas se tornam a mesma tabela else _detalhes.tabela_vigente = _detalhes.combate:NovaTabela (_, _detalhes.tabela_overall) end --> need refresh for all containers for _, container in ipairs (_detalhes.tabela_overall) do container.need_refresh = true end for _, container in ipairs (_detalhes.tabela_vigente) do container.need_refresh = true end --> erase combat data from the database _detalhes_database.tabela_vigente = nil _detalhes_database.tabela_historico = nil _detalhes_database.tabela_pets = nil -- double check for pet container if (not _detalhes.tabela_pets or not _detalhes.tabela_pets.pets) then _detalhes.tabela_pets = _detalhes.container_pets:NovoContainer() end _detalhes:UpdateContainerCombatentes() end end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> On Details! Load: --> load the saved config on the addon function _detalhes:LoadConfig() --> plugins data _detalhes.plugin_database = _detalhes_database.plugin_database or {} --> startup --> set the nicktag cache host _detalhes:NickTagSetCache (_detalhes_database.nick_tag_cache) --> count data _detalhes:CountDataOnLoad() --> solo e raid plugin if (_detalhes_database.SoloTablesSaved) then if (_detalhes_database.SoloTablesSaved.Mode) then _detalhes.SoloTables.Mode = _detalhes_database.SoloTablesSaved.Mode _detalhes.SoloTables.LastSelected = _detalhes_database.SoloTablesSaved.LastSelected else _detalhes.SoloTables.Mode = 1 end end --> switch tables _detalhes.switch.slots = _detalhes_global.switchSaved.slots _detalhes.switch.table = _detalhes_global.switchSaved.table if (_detalhes.switch.table) then for i = 1, #_detalhes.switch.table do if (not _detalhes.switch.table [i]) then _detalhes.switch.table [i] = {} end end end --> last boss _detalhes.last_encounter = _detalhes_database.last_encounter --> buffs _detalhes.savedbuffs = _detalhes_database.savedbuffs _detalhes.Buffs:BuildTables() --> initialize parser _detalhes.capture_current = {} for captureType, captureValue in pairs (_detalhes.capture_real) do _detalhes.capture_current [captureType] = captureValue end --> row animations _detalhes:SetUseAnimations() --> initialize spell cache _detalhes:ClearSpellCache() --> version first run if (not _detalhes_database.last_version or _detalhes_database.last_version ~= _detalhes.userversion) then _detalhes.is_version_first_run = true end --_detalhes.is_version_first_run = true --_detalhes_database.last_realversion = 126 --> profile local unitname = UnitName ("player") --> fix for old versions if (type (_detalhes.always_use_profile) == "string") then _detalhes.always_use_profile = false _detalhes.always_use_profile_name = "" end if (type (_detalhes.always_use_profile_name) ~= "string") then _detalhes.always_use_profile = false _detalhes.always_use_profile_name = "" end --> check for "always use this profile" if (_detalhes.always_use_profile and not _detalhes.always_use_profile_exception [unitname]) then local profile_name = _detalhes.always_use_profile_name if (profile_name and profile_name ~= "" and _detalhes:GetProfile (profile_name)) then _detalhes_database.active_profile = profile_name end end --> old version -- if (_detalhes.always_use_profile and type (_detalhes.always_use_profile) == "string") then -- _detalhes_database.active_profile = _detalhes.always_use_profile -- end --> character first run if (_detalhes_database.active_profile == "") then _detalhes.character_first_run = true --> � a primeira vez que este character usa profiles, precisa copiar as keys existentes local current_profile_name = _detalhes:GetCurrentProfileName() _detalhes:GetProfile (current_profile_name, true) _detalhes:SaveProfileSpecial() end --> load profile and active instances local current_profile_name = _detalhes:GetCurrentProfileName() --> check if exists, if not, create one local profile = _detalhes:GetProfile (current_profile_name, true) --> instances _detalhes.tabela_instancias = _detalhes_database.tabela_instancias or {} --so if the instances are loaded, the taint happen --if I break the tabela_instancias the addon won't taint --if true then return end --if I return here, the addon taints --> fix for version 1.21.0 if (#_detalhes.tabela_instancias > 0) then --> only happens once after the character logon --if (current_profile_name:find (UnitName ("player"))) then for index, saved_skin in ipairs (profile.instances) do local instance = _detalhes.tabela_instancias [index] if (instance) then saved_skin.__was_opened = instance.ativa saved_skin.__pos = Details.CopyTable (instance.posicao) saved_skin.__locked = instance.isLocked saved_skin.__snap = Details.CopyTable (instance.snap) saved_skin.__snapH = instance.horizontalSnap saved_skin.__snapV = instance.verticalSnap for key, value in pairs (instance) do if (_detalhes.instance_defaults [key] ~= nil) then if (type (value) == "table") then saved_skin [key] = Details.CopyTable (value) else saved_skin [key] = value end end end end end for index, instance in _detalhes:ListInstances() do _detalhes.local_instances_config [index] = { pos = Details.CopyTable (instance.posicao), is_open = instance.ativa, attribute = instance.atributo, sub_attribute = instance.sub_atributo, mode = instance.modo or 2, modo = instance.modo or 2, segment = instance.segmento, snap = Details.CopyTable (instance.snap), horizontalSnap = instance.horizontalSnap, verticalSnap = instance.verticalSnap, sub_atributo_last = instance.sub_atributo_last, isLocked = instance.isLocked } if (_detalhes.local_instances_config [index].isLocked == nil) then _detalhes.local_instances_config [index].isLocked = false end end --end _detalhes.tabela_instancias = {} end --_detalhes:ReativarInstancias() --> apply the profile _detalhes:ApplyProfile (current_profile_name, true) --> custom _detalhes.custom = _detalhes_global.custom _detalhes.refresh:r_atributo_custom() end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> On Details! Load: --> count logons, tutorials, etc function _detalhes:CountDataOnLoad() --> basic if (not _detalhes_global.got_first_run) then _detalhes.is_first_run = true end --> tutorial self.tutorial = self.tutorial or {} self.tutorial.logons = self.tutorial.logons or 0 self.tutorial.logons = self.tutorial.logons + 1 self.tutorial.unlock_button = self.tutorial.unlock_button or 0 self.tutorial.version_announce = self.tutorial.version_announce or 0 self.tutorial.main_help_button = self.tutorial.main_help_button or 0 self.tutorial.alert_frames = self.tutorial.alert_frames or {false, false, false, false, false, false} self.tutorial.main_help_button = self.tutorial.main_help_button + 1 self.character_data = self.character_data or {logons = 0} self.character_data.logons = self.character_data.logons + 1 end