Files
florian.berthold f4f3de929b
release / release (push) Successful in 5s
coa.28: fix login scan in 9 DataStore modules (the 'data not saved' root cause)
Quests, Achievements, Reputations, Pets, Stats, Skills, Crafts, Spells, Talents all had
the ghost-gated PLAYER_ALIVE scan (DEBUG 2025-07-21 leftover): they only scanned when the
player died and released spirit, so their data never populated on a normal login. Now
scan once per session at login (addon.coaScannedThisSession guard), matching the earlier
DataStore_Characters/_Inventory fix. This is why reputations/recipes/quests/pets/etc were
'not saved'.
2026-05-29 23:55:29 +02:00

117 lines
2.8 KiB
Lua

--[[ *** DataStore_Spells ***
Written by : Thaoky, EU-Marécages de Zangar
July 6th, 2009
--]]
if not DataStore then return end
local addonName = "DataStore_Spells"
_G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0")
local addon = _G[addonName]
local THIS_ACCOUNT = "Default"
local AddonDB_Defaults = {
global = {
Characters = {
['*'] = { -- ["Account.Realm.Name"]
lastUpdate = nil,
Spells = {
['*'] = { -- "General", "Arcane", "Fire", etc...
['*'] = nil
}
},
}
}
}
}
-- ** Mixins **
local function _GetNumSpells(character, school)
return #character.Spells[school]
end
local function _GetSpellInfo(character, school, index)
local spellID, rank = strsplit("|", character.Spells[school][index])
return tonumber(spellID), rank
end
local function _IsSpellKnown(character, spellID)
for schoolName, _ in pairs(character.Spells) do
for i = 1, _GetNumSpells(character, schoolName) do
local id = _GetSpellInfo(character, schoolName, i)
if id == spellID then
return true
end
end
end
end
local PublicMethods = {
GetNumSpells = _GetNumSpells,
GetSpellInfo = _GetSpellInfo,
IsSpellKnown = _IsSpellKnown,
}
function addon:OnInitialize()
addon.db = LibStub("AceDB-3.0"):New(addonName .. "DB", AddonDB_Defaults)
DataStore:RegisterModule(addonName, addon, PublicMethods)
DataStore:SetCharacterBasedMethod("GetNumSpells")
DataStore:SetCharacterBasedMethod("GetSpellInfo")
DataStore:SetCharacterBasedMethod("IsSpellKnown")
end
function addon:OnEnable()
addon:RegisterEvent("PLAYER_ALIVE")
addon:RegisterEvent("LEARNED_SPELL_IN_TAB")
end
function addon:OnDisable()
addon:UnregisterEvent("PLAYER_ALIVE")
addon:UnregisterEvent("LEARNED_SPELL_IN_TAB")
end
-- *** Scanning functions ***
local function ScanSpellTab(tabID)
local tabName, _, offset, numSpells = GetSpellTabInfo(tabID);
if not tabName then return end
local spells = addon.ThisCharacter.Spells
wipe(spells[tabName])
local spell, rank, link, spellID
for s = offset + 1, offset + numSpells do
spell, rank = GetSpellName(s, BOOKTYPE_SPELL);
if spell and rank then
link = GetSpellLink(spell, rank)
if link then
spellID = tonumber(link:match("spell:(%d+)"))
table.insert(spells[tabName], spellID .. "|" .. rank) -- ex: "43017|Rank 1",
end
end
end
end
local function ScanSpells()
for tabID = 1, GetNumSpellTabs() do
ScanSpellTab(tabID)
end
addon.ThisCharacter.lastUpdate = time()
end
-- *** EVENT HANDLERS ***
function addon:PLAYER_ALIVE()
-- print("DataStore_Spells.lua") -- DEBUG 2025 07 21
if addon.coaScannedThisSession then return end -- CoA: scan once at login (was ghost-gated, so data never saved on a normal login - the cause of "data not saved")
addon.coaScannedThisSession = true
ScanSpells()
end
function addon:LEARNED_SPELL_IN_TAB()
ScanSpells()
end