fix: harden learner spawn suppression
This commit is contained in:
+64
-4
@@ -68,6 +68,68 @@ local function MergeSpawnTables(baseSpawns, overrideSpawns)
|
|||||||
return merged
|
return merged
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function GetSpawnTable(entry, primaryKey, legacyKey)
|
||||||
|
if type(entry) ~= "table" then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local spawns = entry[primaryKey]
|
||||||
|
if type(spawns) == "table" then
|
||||||
|
return spawns
|
||||||
|
end
|
||||||
|
|
||||||
|
spawns = entry[legacyKey]
|
||||||
|
if type(spawns) == "table" then
|
||||||
|
return spawns
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function NormalizeLearnerSpawnEntry(entry, primaryKey, legacyKey)
|
||||||
|
if type(entry) ~= "table" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local changed = false
|
||||||
|
local currentSpawns = entry[primaryKey]
|
||||||
|
local legacySpawns = entry[legacyKey]
|
||||||
|
|
||||||
|
if currentSpawns ~= nil and type(currentSpawns) ~= "table" then
|
||||||
|
entry[primaryKey] = nil
|
||||||
|
currentSpawns = nil
|
||||||
|
changed = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if legacySpawns ~= nil and type(legacySpawns) ~= "table" then
|
||||||
|
entry[legacyKey] = nil
|
||||||
|
legacySpawns = nil
|
||||||
|
changed = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if type(currentSpawns) ~= "table" and type(legacySpawns) == "table" then
|
||||||
|
entry[primaryKey] = CopySpawnTable(legacySpawns)
|
||||||
|
entry[legacyKey] = nil
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if type(currentSpawns) == "table" and type(legacySpawns) == "table" then
|
||||||
|
entry[primaryKey] = MergeSpawnTables(currentSpawns, legacySpawns)
|
||||||
|
entry[legacyKey] = nil
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if type(currentSpawns) == "table" and legacySpawns ~= nil then
|
||||||
|
entry[legacyKey] = nil
|
||||||
|
changed = true
|
||||||
|
end
|
||||||
|
|
||||||
|
return changed
|
||||||
|
end
|
||||||
|
|
||||||
|
QuestieDB.private.GetLearnerSpawnTable = GetSpawnTable
|
||||||
|
QuestieDB.private.NormalizeLearnerSpawnEntry = NormalizeLearnerSpawnEntry
|
||||||
|
|
||||||
local function _MergeOverride(result, override, rawdata, keyMap)
|
local function _MergeOverride(result, override, rawdata, keyMap)
|
||||||
for stringKey, intKey in pairs(keyMap) do
|
for stringKey, intKey in pairs(keyMap) do
|
||||||
local overrideValue = override[stringKey]
|
local overrideValue = override[stringKey]
|
||||||
@@ -749,8 +811,7 @@ function QuestieDB.GetSuppressedNPCs(zoneId)
|
|||||||
local threshold = ld.settings.minConfidencePins or 2
|
local threshold = ld.settings.minConfidencePins or 2
|
||||||
local npcId, entry = next(ld.npcs)
|
local npcId, entry = next(ld.npcs)
|
||||||
while npcId do
|
while npcId do
|
||||||
-- Support both old format ([4]=spawns) and new format ([7]=spawns)
|
local spawns = GetSpawnTable(entry, 7, 4)
|
||||||
local spawns = entry[7] or entry[4]
|
|
||||||
if entry.mc and entry.mc >= threshold and spawns and spawns[zoneId] then
|
if entry.mc and entry.mc >= threshold and spawns and spawns[zoneId] then
|
||||||
suppressed[npcId] = true
|
suppressed[npcId] = true
|
||||||
end
|
end
|
||||||
@@ -771,8 +832,7 @@ function QuestieDB.GetSuppressedObjects(zoneId)
|
|||||||
local threshold = ld.settings.minConfidencePins or 2
|
local threshold = ld.settings.minConfidencePins or 2
|
||||||
local objId, entry = next(ld.objects)
|
local objId, entry = next(ld.objects)
|
||||||
while objId do
|
while objId do
|
||||||
-- Support both old format ([4]=spawns) and new format ([7]=spawns)
|
local spawns = GetSpawnTable(entry, 4, 7)
|
||||||
local spawns = entry[4] or entry[7]
|
|
||||||
if entry.mc and entry.mc >= threshold and spawns and spawns[zoneId] then
|
if entry.mc and entry.mc >= threshold and spawns and spawns[zoneId] then
|
||||||
suppressed[objId] = true
|
suppressed[objId] = true
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1690,6 +1690,26 @@ function QuestieLearner:InjectLearnedData()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local learned = Questie.dbLearner.global
|
local learned = Questie.dbLearner.global
|
||||||
|
-- Normalize malformed saved variables before any migration or injection.
|
||||||
|
-- This prevents old learner rows from carrying numeric spawn fields
|
||||||
|
-- into the suppression path and crashing the quest objective filter.
|
||||||
|
local sanitizedEntries = 0
|
||||||
|
if QuestieDB and QuestieDB.private and QuestieDB.private.NormalizeLearnerSpawnEntry then
|
||||||
|
for _, data in pairs(learned.npcs) do
|
||||||
|
if QuestieDB.private.NormalizeLearnerSpawnEntry(data, 7, 4) then
|
||||||
|
sanitizedEntries = sanitizedEntries + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, data in pairs(learned.objects) do
|
||||||
|
if QuestieDB.private.NormalizeLearnerSpawnEntry(data, 4, 7) then
|
||||||
|
sanitizedEntries = sanitizedEntries + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if sanitizedEntries > 0 then
|
||||||
|
Questie:Debug(Questie.DEBUG_INFO, "[QuestieLearner] Sanitized", sanitizedEntries, "malformed learned spawn entries")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Migrate old-format NPC data ([4]=spawns, [5]=zoneId) to new format ([7]=spawns, [9]=zoneId)
|
-- Migrate old-format NPC data ([4]=spawns, [5]=zoneId) to new format ([7]=spawns, [9]=zoneId)
|
||||||
-- Always merge [4] into [7], even when [7] already has partial data from a recent session.
|
-- Always merge [4] into [7], even when [7] already has partial data from a recent session.
|
||||||
for npcId, data in pairs(learned.npcs) do
|
for npcId, data in pairs(learned.npcs) do
|
||||||
|
|||||||
Reference in New Issue
Block a user