v9.7.2: Ebonhold Database integration and core logic refinements

This commit is contained in:
Xurkon
2026-02-14 21:13:44 -06:00
parent 0a2cc15641
commit 6ef85d4e2d
573 changed files with 1751730 additions and 2 deletions
File diff suppressed because it is too large Load Diff
+178
View File
@@ -0,0 +1,178 @@
-------------------------
--Import modules.
-------------------------
---@type QuestieDB
local QuestieDB = QuestieLoader:ImportModule("QuestieDB");
---@type QuestieComms
local QuestieComms = QuestieLoader:ImportModule("QuestieComms");
---@type QuestieLib
local QuestieLib = QuestieLoader:ImportModule("QuestieLib");
QuestieComms.data = {}
--[i_1337][playerName][questId] = objective
local commsTooltipLookup = {}
--[playerName] = {
--[questId] = {["i_1337"]=true,["o_1338"]=true,}
--}
local playerRegisteredTooltips = {}
---@param tooltipKey string @A key in the form of "i_1337"
---@return boolean @true if exist nil if not
function QuestieComms.data:KeyExists(tooltipKey)
if(commsTooltipLookup[tooltipKey]) then
return true;
else
return nil;
end
end
---@param tooltipKey string @A key in the form of "i_1337"
---@return table @tooltipData[questId][playerName][objectiveIndex].text
function QuestieComms.data:GetTooltip(tooltipKey)
local tooltipData = {}
for playerName, questData in pairs(commsTooltipLookup[tooltipKey]) do
for questId, objectives in pairs(questData) do
if(not tooltipData[questId]) then
tooltipData[questId] = {};
end
if(not tooltipData[questId][playerName]) then
tooltipData[questId][playerName] = {};
end
for objectiveIndex, objective in pairs(objectives) do
if(not tooltipData[questId][playerName][objectiveIndex]) then
tooltipData[questId][playerName][objectiveIndex] = {};
end
local oName = "";
if((objective.type == "monster" or objective.type == "m") and objective.id) then
oName = QuestieDB:GetNPC(objective.id).name;
elseif((objective.type == "object" or objective.type == "o") and objective.id) then
oName = QuestieDB:GetObject(objective.id).name;
elseif((objective.type == "item" or objective.type == "i") and objective.id) then
local dbItem = QuestieDB:GetItem(objective.id);
if(dbItem and dbItem.name and (not dbItem.Hidden)) then
oName = dbItem.name;-- this is capital letters for some reason...
else
local itemName = GetItemInfo(objective.id)
if(itemName) then
oName = itemName;
else
oName = "Item missing from DB, fetching from server!";
local item = Item:CreateFromItemID(objective.id)
item:ContinueOnItemLoad(function()
local name = item:GetItemName();
oName = name;
tooltipData[questId][playerName][objectiveIndex].text = name;
end)
end
end
end
tooltipData[questId][playerName][objectiveIndex].text = oName
tooltipData[questId][playerName][objectiveIndex].fulfilled = objective.fulfilled;
tooltipData[questId][playerName][objectiveIndex].required = objective.required;
end
end
end
return tooltipData;
end
---@param questId number
---@param playerName string
---@param objectives table @Contains objectives o[index].text
function QuestieComms.data:RegisterTooltip(questId, playerName, objectives)
if(not playerRegisteredTooltips[playerName]) then
playerRegisteredTooltips[playerName] = {}
end
if(not playerRegisteredTooltips[playerName][questId]) then
playerRegisteredTooltips[playerName][questId] = {}
end
for objectiveIndex, objective in pairs(objectives) do
if(objective.type and objective.id) then
local lookupKey = objective.type.."_"..objective.id;
--Questie:Debug(Questie.DEBUG_DEVELOP, "Adding tooltip lookup", lookupKey, questId, playerName);
if(objective.type == "i") then
local item = QuestieDB:GetItem(objective.id);
if not item or item.Hidden then
return
end
for index, source in pairs(item.Sources or {}) do
local sourceType = string.sub(source.Type, 1, 1);
local sourceId = source.Id;
local sourceLookupKey = sourceType.."_"..sourceId;
QuestieComms.data:AddTooltip(playerName, questId, sourceLookupKey, objectiveIndex, objective);
end
end
--[[if(not commsTooltipLookup[lookupKey]) then
commsTooltipLookup[lookupKey] = {}
end
if(not commsTooltipLookup[lookupKey][playerName]) then
commsTooltipLookup[lookupKey][playerName] = {};
end
if(not commsTooltipLookup[lookupKey][playerName][questId]) then
commsTooltipLookup[lookupKey][playerName][questId] = {};
end
commsTooltipLookup[lookupKey][playerName][questId][objectiveIndex] = objective;
playerRegisteredTooltips[playerName][questId][lookupKey] = true;]]--
QuestieComms.data:AddTooltip(playerName, questId, lookupKey, objectiveIndex, objective);
end
end
end
function QuestieComms.data:AddTooltip(playerName, questId, lookupKey, objectiveIndex, data)
if(not commsTooltipLookup[lookupKey]) then
commsTooltipLookup[lookupKey] = {}
end
if(not commsTooltipLookup[lookupKey][playerName]) then
commsTooltipLookup[lookupKey][playerName] = {};
end
if(not commsTooltipLookup[lookupKey][playerName][questId]) then
commsTooltipLookup[lookupKey][playerName][questId] = {};
end
commsTooltipLookup[lookupKey][playerName][questId][objectiveIndex] = data;
playerRegisteredTooltips[playerName][questId][lookupKey] = true;
end
--Totally removes a player from the tooltip lookups
function QuestieComms.data:RemovePlayer(playerName)
for questId, tooltipList in pairs(playerRegisteredTooltips[playerName] or {}) do
QuestieComms.data:RemoveQuestFromPlayer(questId, playerName);
end
if(playerRegisteredTooltips[playerName]) then
playerRegisteredTooltips[playerName] = nil;
end
end
function QuestieComms.data:RemoveQuestFromPlayer(questId, playerName)
--First check if the player exists and if it has tooltip related quests.
if(playerRegisteredTooltips[playerName] and playerRegisteredTooltips[playerName][questId]) then
--Loop through the tooltips to find which should be removed
for tooltip, active in pairs(playerRegisteredTooltips[playerName][questId]) do
--Check if the registered tooltip exists and if the player exists in it.
if(commsTooltipLookup[tooltip] and commsTooltipLookup[tooltip][playerName]) then
--Does the questId we want to remove exist?
if(commsTooltipLookup[tooltip][playerName][questId]) then
--Remove questID
commsTooltipLookup[tooltip][playerName][questId] = nil;
--Do we not have any quests left in the tooltip? If not remove it
if(QuestieLib:Count(commsTooltipLookup[tooltip][playerName]) == 0) then
commsTooltipLookup[tooltip][playerName] = nil;
--Are there any other players with this tooltip registered? If not remove it.
if(QuestieLib:Count(commsTooltipLookup[tooltip]) == 0) then
commsTooltipLookup[tooltip] = nil;
end
end
end
end
end
playerRegisteredTooltips[playerName][questId] = nil;
end
end
-- Resets everything.
function QuestieComms.data:ResetAll()
commsTooltipLookup = {}
playerRegisteredTooltips = {}
end