v9.7.2: Ebonhold Database integration and core logic refinements
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user