379 lines
13 KiB
Lua
379 lines
13 KiB
Lua
|
||
local Details = _G.Details
|
||
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
|
||
local _
|
||
local addonName, Details222 = ...
|
||
local C_Timer = C_Timer
|
||
local UnitName = UnitName
|
||
|
||
--On Details! Load load default keys into the main object
|
||
function Details222.LoadSavedVariables.DefaultProfile()
|
||
for key, value in pairs(Details.default_profile) do
|
||
if (type(value) == "table") then
|
||
Details[key] = Details.CopyTable(value)
|
||
else
|
||
Details[key] = value
|
||
end
|
||
end
|
||
end
|
||
|
||
function Details222.LoadSavedVariables.CharacterData()
|
||
local defaultCharacterData = Details.default_player_data
|
||
local currentCharacterData = _detalhes_database
|
||
|
||
--check if the player data exists, if not, load from default
|
||
if (not currentCharacterData) then --NOT EXISTS
|
||
currentCharacterData = Details.CopyTable(defaultCharacterData)
|
||
--[[GLOBAL]] _detalhes_database = currentCharacterData
|
||
end
|
||
|
||
--verify if there's new data added to 'default_player_data' and copy it to the savedvariable table
|
||
--do this up to a deepness level of 2, example: currentCharacterData[key][subKey] = any
|
||
for key, value in pairs(defaultCharacterData) do
|
||
if (currentCharacterData[key] == nil) then --the key doesn't exists, add it
|
||
if (type(value) == "table") then
|
||
currentCharacterData[key] = Details.CopyTable(defaultCharacterData[key])
|
||
else
|
||
currentCharacterData[key] = value
|
||
end
|
||
|
||
elseif (type(currentCharacterData[key]) == "table") then
|
||
for subKey, subValue in pairs(defaultCharacterData[key]) do
|
||
if (currentCharacterData[key][subKey] == nil) then
|
||
if (type(subValue) == "table") then
|
||
currentCharacterData[key][subKey] = Details.CopyTable(defaultCharacterData[key][subKey])
|
||
else
|
||
currentCharacterData[key][subKey] = subValue
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
--copy the key from saved table to Details object
|
||
if (type(value) == "table") then
|
||
Details[key] = Details.CopyTable(currentCharacterData[key])
|
||
else
|
||
Details[key] = currentCharacterData[key]
|
||
end
|
||
end
|
||
end
|
||
|
||
--check if this is a first run, reset, or just load the saved data.
|
||
function Details222.LoadSavedVariables.SharedData()
|
||
local defaultAccountData = Details.default_global_data
|
||
local currentAccountData = _detalhes_global
|
||
|
||
if (not currentAccountData) then
|
||
currentAccountData = Details.CopyTable(defaultAccountData)
|
||
--[[GLOBAL]] _detalhes_global = currentAccountData
|
||
end
|
||
|
||
for key, value in pairs(defaultAccountData) do
|
||
if (currentAccountData[key] == nil) then
|
||
if (type(value) == "table") then
|
||
currentAccountData[key] = Details.CopyTable(defaultAccountData[key])
|
||
else
|
||
currentAccountData[key] = value
|
||
end
|
||
|
||
elseif (type(currentAccountData[key]) == "table") then
|
||
if (key == "always_use_profile_name") then
|
||
currentAccountData["always_use_profile_name"] = ""
|
||
end
|
||
|
||
if (type(currentAccountData[key]) == "table") then
|
||
for subKey, subValue in pairs(defaultAccountData[key]) do
|
||
if (currentAccountData[key][subKey] == nil) then
|
||
if (type(subValue) == "table") then
|
||
currentAccountData[key][subKey] = Details.CopyTable(defaultAccountData[key][subKey])
|
||
else
|
||
currentAccountData[key][subKey] = subValue
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
--copy the key from savedvariables to Details object
|
||
if (type(value) == "table") then
|
||
Details[key] = Details.CopyTable(currentAccountData[key])
|
||
else
|
||
Details[key] = currentAccountData[key]
|
||
end
|
||
end
|
||
end
|
||
|
||
--load previous saved combat data
|
||
function Details222.LoadSavedVariables.CombatSegments()
|
||
--this is the table where the character data is saved as well the combat data
|
||
local currentCharacterData = _G["_detalhes_database"] --no need to check if it exists, it's already checked
|
||
if (currentCharacterData == nil) then
|
||
currentCharacterData = {}
|
||
end
|
||
|
||
--custom displays - if there's no saved custom display, they will be filled from the StartMeUp() when a new version is installed
|
||
if (_detalhes_global.custom) then
|
||
Details.custom = _detalhes_global.custom
|
||
Details.refresh:r_atributo_custom()
|
||
end
|
||
|
||
local bShouldClearAndExit = not currentCharacterData.tabela_historico
|
||
|
||
--check integrity of the sub table 'tabelas' and its first index 'current segment'
|
||
if (not bShouldClearAndExit) then
|
||
if (not currentCharacterData.tabela_historico.tabelas or not currentCharacterData.tabela_historico.tabelas[1]) then
|
||
bShouldClearAndExit = true
|
||
end
|
||
end
|
||
|
||
--check if is a major version upgrade (usualy API or low level changes)
|
||
if (not bShouldClearAndExit) then
|
||
bShouldClearAndExit = currentCharacterData.last_realversion and currentCharacterData.last_realversion < Details.realversion
|
||
end
|
||
|
||
--if can just clear all data and exit
|
||
if (bShouldClearAndExit) then
|
||
Details.tabela_historico = Details.historico:CreateNewSegmentDatabase()
|
||
Details.tabela_overall = Details.combate:NovaTabela()
|
||
Details.tabela_vigente = Details.combate:NovaTabela(_, Details.tabela_overall)
|
||
Details.tabela_pets = Details.container_pets:NovoContainer()
|
||
Details:UpdatePetCache()
|
||
|
||
if (currentCharacterData.tabela_pets) then
|
||
Details:Destroy(currentCharacterData.tabela_pets) --saved pet data
|
||
currentCharacterData.tabela_pets = nil
|
||
end
|
||
if (currentCharacterData.tabela_overall) then --saved overall data
|
||
Details:Destroy(currentCharacterData.tabela_overall)
|
||
currentCharacterData.tabela_overall = nil
|
||
end
|
||
if (currentCharacterData.tabela_historico) then
|
||
Details:Destroy(currentCharacterData.tabela_historico)
|
||
currentCharacterData.tabela_historico = nil
|
||
end
|
||
|
||
return
|
||
else
|
||
--pet owners cache saved on logout
|
||
do
|
||
Details.tabela_pets = Details.container_pets:NovoContainer()
|
||
if (currentCharacterData.tabela_pets) then
|
||
--pet ownership table only exists if the player logoff inside a raid or dungeon
|
||
Details.tabela_pets.pets = Details.CopyTable(currentCharacterData.tabela_pets)
|
||
Details:Destroy(currentCharacterData.tabela_pets)
|
||
currentCharacterData.tabela_pets = nil
|
||
end
|
||
end
|
||
|
||
--restore saved overall data
|
||
do
|
||
if (currentCharacterData.tabela_overall) then
|
||
Details.tabela_overall = Details.CopyTable(currentCharacterData.tabela_overall)
|
||
Details:RestoreOverallMetatables()
|
||
else
|
||
Details.tabela_overall = Details.combate:NovaTabela()
|
||
Details.tabela_overall.overall_refreshed = true
|
||
end
|
||
end
|
||
|
||
--restore saved segments
|
||
do
|
||
Details.tabela_historico = Details.CopyTable(currentCharacterData.tabela_historico)
|
||
Details:Destroy(currentCharacterData.tabela_historico)
|
||
currentCharacterData.tabela_historico = nil
|
||
end
|
||
|
||
--get the first segment saved and use it as current segment
|
||
Details.tabela_vigente = Details.tabela_historico.tabelas[1] --only low level access to this table allowed
|
||
|
||
--need refresh for all containers
|
||
for _, actorContainer in ipairs(Details.tabela_overall) do
|
||
actorContainer.need_refresh = true
|
||
end
|
||
for _, actorContainer in ipairs(Details.tabela_vigente) do
|
||
actorContainer.need_refresh = true
|
||
end
|
||
|
||
Details:UpdatePetCache()
|
||
Details:RestoreMetatables()
|
||
end
|
||
end
|
||
|
||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||
--On Details! Load:
|
||
--load the saved config on the addon
|
||
|
||
function Details:LoadConfig()
|
||
|
||
--plugins data
|
||
Details.plugin_database = _detalhes_database.plugin_database or {}
|
||
|
||
--startup
|
||
|
||
--set the nicktag cache host
|
||
Details:NickTagSetCache (_detalhes_database.nick_tag_cache)
|
||
|
||
--count data
|
||
Details:CountDataOnLoad()
|
||
|
||
--solo e raid plugin
|
||
if (_detalhes_database.SoloTablesSaved) then
|
||
if (_detalhes_database.SoloTablesSaved.Mode) then
|
||
Details.SoloTables.Mode = _detalhes_database.SoloTablesSaved.Mode
|
||
Details.SoloTables.LastSelected = _detalhes_database.SoloTablesSaved.LastSelected
|
||
else
|
||
Details.SoloTables.Mode = 1
|
||
end
|
||
end
|
||
|
||
--switch tables
|
||
Details.switch.slots = _detalhes_global.switchSaved.slots
|
||
Details.switch.table = _detalhes_global.switchSaved.table
|
||
|
||
if (Details.switch.table) then
|
||
for i = 1, #Details.switch.table do
|
||
if (not Details.switch.table [i]) then
|
||
Details.switch.table [i] = {}
|
||
end
|
||
end
|
||
end
|
||
|
||
--last boss
|
||
Details.last_encounter = _detalhes_database.last_encounter
|
||
|
||
--buffs
|
||
Details.savedbuffs = _detalhes_database.savedbuffs
|
||
Details.Buffs:BuildTables()
|
||
|
||
--initialize parser
|
||
Details.capture_current = {}
|
||
for captureType, captureValue in pairs(Details.capture_real) do
|
||
Details.capture_current [captureType] = captureValue
|
||
end
|
||
|
||
--row animations
|
||
Details:SetUseAnimations()
|
||
|
||
--initialize spell cache
|
||
Details:ClearSpellCache()
|
||
|
||
--version first run
|
||
if (not _detalhes_database.last_version or _detalhes_database.last_version ~= Details.userversion) then
|
||
Details.is_version_first_run = true
|
||
end
|
||
|
||
--profile
|
||
|
||
local unitname = UnitName ("player")
|
||
|
||
--fix for old versions
|
||
if (type(Details.always_use_profile) == "string") then
|
||
Details.always_use_profile = false
|
||
Details.always_use_profile_name = ""
|
||
end
|
||
|
||
if (type(Details.always_use_profile_name) ~= "string") then
|
||
Details.always_use_profile = false
|
||
Details.always_use_profile_name = ""
|
||
end
|
||
|
||
--check for "always use this profile"
|
||
if (Details.always_use_profile and not Details.always_use_profile_exception [unitname]) then
|
||
local profile_name = Details.always_use_profile_name
|
||
if (profile_name and profile_name ~= "" and Details:GetProfile (profile_name)) then
|
||
_detalhes_database.active_profile = profile_name
|
||
end
|
||
end
|
||
|
||
--character first run
|
||
if (_detalhes_database.active_profile == "") then
|
||
Details.character_first_run = true
|
||
--<2D> a primeira vez que este character usa profiles, precisa copiar as keys existentes
|
||
local current_profile_name = Details:GetCurrentProfileName()
|
||
Details:GetProfile (current_profile_name, true)
|
||
Details:SaveProfileSpecial()
|
||
end
|
||
|
||
--load profile and active instances
|
||
local current_profile_name = Details:GetCurrentProfileName()
|
||
--check if exists, if not, create one
|
||
local profile = Details:GetProfile (current_profile_name, true)
|
||
|
||
--instances
|
||
Details.tabela_instancias = _detalhes_database.tabela_instancias or {}
|
||
|
||
--fix for version 1.21.0
|
||
if (#Details.tabela_instancias > 0) then --only happens once after the character logon
|
||
for index, saved_skin in ipairs(profile.instances) do
|
||
local instance = Details.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 (Details.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 Details:ListInstances() do
|
||
Details.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 (Details.local_instances_config [index].isLocked == nil) then
|
||
Details.local_instances_config [index].isLocked = false
|
||
end
|
||
end
|
||
|
||
Details.tabela_instancias = {}
|
||
end
|
||
|
||
--apply the profile
|
||
Details:ApplyProfile(current_profile_name, true)
|
||
end
|
||
|
||
--On Details! Load count logons, tutorials, etc
|
||
function Details:CountDataOnLoad()
|
||
--basic
|
||
if (not _detalhes_global.got_first_run) then
|
||
Details.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
|