v9.7.2: Ebonhold Database integration and core logic refinements
This commit is contained in:
@@ -0,0 +1,423 @@
|
||||
---@type QuestieJourney
|
||||
local QuestieJourney = QuestieLoader:CreateModule("QuestieJourney")
|
||||
local _QuestieJourney = QuestieJourney.private
|
||||
-------------------------
|
||||
--Import modules.
|
||||
-------------------------
|
||||
---@type QuestieJourneyUtils
|
||||
local QuestieJourneyUtils = QuestieLoader:ImportModule("QuestieJourneyUtils")
|
||||
---@type QuestieDB
|
||||
local QuestieDB = QuestieLoader:ImportModule("QuestieDB")
|
||||
---@type QuestieLib
|
||||
local QuestieLib = QuestieLoader:ImportModule("QuestieLib")
|
||||
---@type l10n
|
||||
local l10n = QuestieLoader:ImportModule("l10n")
|
||||
|
||||
local AceGUI = LibStub("AceGUI-3.0")
|
||||
|
||||
|
||||
-- TODO remove again once the call in manageZoneTree was removed
|
||||
---@param container ScrollFrame
|
||||
---@param quest Quest
|
||||
function _QuestieJourney:DrawQuestDetailsFrame(container, quest)
|
||||
local questNameHeader = _QuestieJourney:CreateHeading(quest.name, true)
|
||||
container:AddChild(questNameHeader)
|
||||
|
||||
QuestieJourneyUtils:Spacer(container)
|
||||
|
||||
local obj = AceGUI:Create("Label")
|
||||
obj:SetText(_QuestieJourney:CreateObjectiveText(quest.Description))
|
||||
obj:SetFullWidth(true)
|
||||
container:AddChild(obj)
|
||||
|
||||
QuestieJourneyUtils:Spacer(container)
|
||||
|
||||
local questInfoHeader = _QuestieJourney:CreateHeading(l10n('Quest Information'), true)
|
||||
container:AddChild(questInfoHeader)
|
||||
|
||||
-- Generic Quest Information
|
||||
|
||||
local levelLabel = _QuestieJourney:CreateLabel(Questie:Colorize(l10n('Recommended Quest Level: '), 'yellow') .. quest.level, true)
|
||||
container:AddChild(levelLabel)
|
||||
|
||||
local minLevelLabel = _QuestieJourney:CreateLabel(Questie:Colorize(l10n('Minimum Required Level for Quest: '), 'yellow') .. quest.requiredLevel, true)
|
||||
container:AddChild(minLevelLabel)
|
||||
|
||||
local levelDiffString = _QuestieJourney:GetDifficultyString(quest.level, quest.requiredLevel)
|
||||
local levelDiffLabel = _QuestieJourney:CreateLabel(levelDiffString, true)
|
||||
container:AddChild(levelDiffLabel)
|
||||
|
||||
local questIdLabel = _QuestieJourney:CreateLabel(Questie:Colorize(l10n('Quest ID: '), 'yellow') .. quest.Id, true)
|
||||
container:AddChild(questIdLabel)
|
||||
|
||||
QuestieJourneyUtils:Spacer(container)
|
||||
|
||||
local preQuestCounter, preQuestInlineGroup = _QuestieJourney:CreatePreQuestGroup(quest)
|
||||
if preQuestCounter > 1 then -- Don't add the group if it doesn't contain a pre quest
|
||||
QuestieJourneyUtils:Spacer(preQuestInlineGroup)
|
||||
container:AddChild(preQuestInlineGroup)
|
||||
end
|
||||
|
||||
-- Get Quest Start NPC
|
||||
if quest.Starts and quest.Starts.NPC then
|
||||
local startNPCGroup = AceGUI:Create("InlineGroup")
|
||||
startNPCGroup:SetLayout("List")
|
||||
startNPCGroup:SetTitle(l10n('Quest Start NPC Information'))
|
||||
startNPCGroup:SetFullWidth(true)
|
||||
container:AddChild(startNPCGroup)
|
||||
|
||||
QuestieJourneyUtils:Spacer(startNPCGroup)
|
||||
|
||||
local startNpc = QuestieDB:GetNPC(quest.Starts.NPC[1])
|
||||
|
||||
local startNPCNameLabel = _QuestieJourney:CreateLabel(startNpc.name, true)
|
||||
startNPCNameLabel:SetFontObject(GameFontHighlight)
|
||||
startNPCNameLabel:SetColor(255, 165, 0)
|
||||
startNPCGroup:AddChild(startNPCNameLabel)
|
||||
|
||||
local startNPCZoneLabel = AceGUI:Create("Label")
|
||||
local startindex = 0
|
||||
if (not startNpc.spawns) then
|
||||
return
|
||||
end
|
||||
for i in pairs(startNpc.spawns) do
|
||||
startindex = i
|
||||
end
|
||||
|
||||
if startindex == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local continent = QuestieJourneyUtils:GetZoneName(startindex)
|
||||
|
||||
startNPCZoneLabel:SetText(l10n(continent))
|
||||
startNPCZoneLabel:SetFullWidth(true)
|
||||
startNPCGroup:AddChild(startNPCZoneLabel)
|
||||
|
||||
local startx = startNpc.spawns[startindex][1][1]
|
||||
local starty = startNpc.spawns[startindex][1][2]
|
||||
if (startx ~= -1 or starty ~= -1) then
|
||||
local startNPCLocLabel = AceGUI:Create("Label")
|
||||
startNPCLocLabel:SetText("X: ".. startx .." || Y: ".. starty)
|
||||
startNPCLocLabel:SetFullWidth(true)
|
||||
startNPCGroup:AddChild(startNPCLocLabel)
|
||||
end
|
||||
|
||||
local startNPCIdLabel = AceGUI:Create("Label")
|
||||
startNPCIdLabel:SetText("NPC ID: ".. startNpc.id)
|
||||
startNPCIdLabel:SetFullWidth(true)
|
||||
startNPCGroup:AddChild(startNPCIdLabel)
|
||||
|
||||
QuestieJourneyUtils:Spacer(startNPCGroup)
|
||||
|
||||
-- Also Starts
|
||||
if startNpc.questStarts then
|
||||
|
||||
local alsoStartsLabel = AceGUI:Create("Label")
|
||||
alsoStartsLabel:SetText(l10n('This NPC Also Starts the following quests:'))
|
||||
alsoStartsLabel:SetColor(255, 165, 0)
|
||||
alsoStartsLabel:SetFontObject(GameFontHighlight)
|
||||
alsoStartsLabel:SetFullWidth(true)
|
||||
startNPCGroup:AddChild(alsoStartsLabel)
|
||||
|
||||
local startQuests = {}
|
||||
local counter = 1
|
||||
for _, v in pairs(startNpc.questStarts) do
|
||||
if v ~= quest.Id then
|
||||
startQuests[counter] = {}
|
||||
local startQuest = QuestieDB.GetQuest(v)
|
||||
local label = _QuestieJourney:GetInteractiveQuestLabel(startQuest)
|
||||
startQuests[counter].frame = label
|
||||
startQuests[counter].quest = startQuest
|
||||
startNPCGroup:AddChild(label)
|
||||
counter = counter + 1
|
||||
end
|
||||
end
|
||||
|
||||
if #startQuests == 0 then
|
||||
local noQuestLabel = AceGUI:Create("Label")
|
||||
noQuestLabel:SetText(l10n('No Quests to List'))
|
||||
noQuestLabel:SetFullWidth(true)
|
||||
startNPCGroup:AddChild(noQuestLabel)
|
||||
end
|
||||
end
|
||||
|
||||
QuestieJourneyUtils:Spacer(startNPCGroup)
|
||||
|
||||
end
|
||||
|
||||
-- Get Quest Start GameObject
|
||||
if quest.Starts and quest.Starts.GameObject then
|
||||
local startObjectGroup = AceGUI:Create("InlineGroup")
|
||||
startObjectGroup:SetLayout("List")
|
||||
startObjectGroup:SetTitle(l10n('Quest Start Object Information'))
|
||||
startObjectGroup:SetFullWidth(true)
|
||||
container:AddChild(startObjectGroup)
|
||||
|
||||
QuestieJourneyUtils:Spacer(startObjectGroup)
|
||||
|
||||
for _, oid in pairs(quest.Starts.GameObject) do
|
||||
local startObj = QuestieDB:GetObject(oid)
|
||||
|
||||
local startObjectNameLabel = AceGUI:Create("Label")
|
||||
startObjectNameLabel:SetText(startObj.name)
|
||||
startObjectNameLabel:SetFontObject(GameFontHighlight)
|
||||
startObjectNameLabel:SetColor(255, 165, 0)
|
||||
startObjectNameLabel:SetFullWidth(true)
|
||||
startObjectGroup:AddChild(startObjectNameLabel)
|
||||
|
||||
local startObjectZoneLabel = AceGUI:Create("Label")
|
||||
local startindex = 0
|
||||
for i in pairs(startObj.spawns) do
|
||||
startindex = i
|
||||
end
|
||||
|
||||
local continent = QuestieJourneyUtils:GetZoneName(startindex)
|
||||
|
||||
startObjectZoneLabel:SetText(continent)
|
||||
startObjectZoneLabel:SetFullWidth(true)
|
||||
startObjectGroup:AddChild(startObjectZoneLabel)
|
||||
|
||||
local startx = startObj.spawns[startindex][1][1]
|
||||
local starty = startObj.spawns[startindex][1][2]
|
||||
if (startx ~= -1 or starty ~= -1) then
|
||||
local startObjectLocLabel = AceGUI:Create("Label")
|
||||
startObjectLocLabel:SetText("X: ".. startx .." || Y: ".. starty)
|
||||
startObjectLocLabel:SetFullWidth(true)
|
||||
startObjectGroup:AddChild(startObjectLocLabel)
|
||||
end
|
||||
|
||||
local startObjectIdLabel = AceGUI:Create("Label")
|
||||
startObjectIdLabel:SetText("Object ID: ".. startObj.id)
|
||||
startObjectIdLabel:SetFullWidth(true)
|
||||
startObjectGroup:AddChild(startObjectIdLabel)
|
||||
|
||||
QuestieJourneyUtils:Spacer(startObjectGroup)
|
||||
|
||||
-- Also Starts
|
||||
if startObj.questStarts then
|
||||
|
||||
local alsoStartsLabel = AceGUI:Create("Label")
|
||||
alsoStartsLabel:SetText(l10n('This Object Also Starts the following quests:'))
|
||||
alsoStartsLabel:SetColor(255, 165, 0)
|
||||
alsoStartsLabel:SetFontObject(GameFontHighlight)
|
||||
alsoStartsLabel:SetFullWidth(true)
|
||||
startObjectGroup:AddChild(alsoStartsLabel)
|
||||
|
||||
local startQuests = {}
|
||||
local counter = 1
|
||||
for _, v in pairs(startObj.questStarts) do
|
||||
if v ~= quest.Id then
|
||||
startQuests[counter] = {}
|
||||
local startQuest = QuestieDB.GetQuest(v)
|
||||
local label = _QuestieJourney:GetInteractiveQuestLabel(startQuest)
|
||||
startQuests[counter].frame = label
|
||||
startQuests[counter].quest = startQuest
|
||||
startObjectGroup:AddChild(label)
|
||||
counter = counter + 1
|
||||
end
|
||||
end
|
||||
|
||||
if #startQuests == 0 then
|
||||
local noQuestLabel = AceGUI:Create("Label")
|
||||
noQuestLabel:SetText(l10n('No Quests to List'))
|
||||
noQuestLabel:SetFullWidth(true)
|
||||
startObjectGroup:AddChild(noQuestLabel)
|
||||
end
|
||||
end
|
||||
|
||||
QuestieJourneyUtils:Spacer(startObjectGroup)
|
||||
end
|
||||
end
|
||||
|
||||
QuestieJourneyUtils:Spacer(container)
|
||||
|
||||
if quest.Finisher and quest.Finisher.Name and quest.Finisher.Type == "monster" then
|
||||
local endNPCGroup = AceGUI:Create("InlineGroup")
|
||||
endNPCGroup:SetLayout("Flow")
|
||||
endNPCGroup:SetTitle(l10n('Quest Turn-in NPC Information'))
|
||||
endNPCGroup:SetFullWidth(true)
|
||||
container:AddChild(endNPCGroup)
|
||||
QuestieJourneyUtils:Spacer(endNPCGroup)
|
||||
|
||||
local endNPC = QuestieDB:GetNPC(quest.Finisher.Id)
|
||||
|
||||
local endNPCNameLabel = AceGUI:Create("Label")
|
||||
endNPCNameLabel:SetText(endNPC.name)
|
||||
endNPCNameLabel:SetFontObject(GameFontHighlight)
|
||||
endNPCNameLabel:SetColor(255, 165, 0)
|
||||
endNPCNameLabel:SetFullWidth(true)
|
||||
endNPCGroup:AddChild(endNPCNameLabel)
|
||||
|
||||
local endNPCZoneLabel = AceGUI:Create("Label")
|
||||
local endindex = 0
|
||||
if (not endNPC.spawns) then
|
||||
return
|
||||
end
|
||||
for i in pairs(endNPC.spawns) do
|
||||
endindex = i
|
||||
end
|
||||
|
||||
local continent = QuestieJourneyUtils:GetZoneName(endindex)
|
||||
|
||||
endNPCZoneLabel:SetText(l10n(continent))
|
||||
endNPCZoneLabel:SetFullWidth(true)
|
||||
endNPCGroup:AddChild(endNPCZoneLabel)
|
||||
|
||||
if (next(endNPC.spawns)) then
|
||||
local endx = endNPC.spawns[endindex][1][1]
|
||||
local endy = endNPC.spawns[endindex][1][2]
|
||||
if (endx ~= -1 or endy ~= -1) then
|
||||
local endNPCLocLabel = AceGUI:Create("Label")
|
||||
endNPCLocLabel:SetText("X: ".. endx .." || Y: ".. endy)
|
||||
endNPCLocLabel:SetFullWidth(true)
|
||||
endNPCGroup:AddChild(endNPCLocLabel)
|
||||
end
|
||||
end
|
||||
|
||||
local endNPCIdLabel = AceGUI:Create("Label")
|
||||
endNPCIdLabel:SetText("NPC ID: ".. endNPC.id)
|
||||
endNPCIdLabel:SetFullWidth(true)
|
||||
endNPCGroup:AddChild(endNPCIdLabel)
|
||||
|
||||
QuestieJourneyUtils:Spacer(endNPCGroup)
|
||||
|
||||
-- Also ends
|
||||
if endNPC.endQuests then
|
||||
local alsoEndsLabel = AceGUI:Create("Label")
|
||||
alsoEndsLabel:SetText(l10n('This NPC Also Completes the following quests:'))
|
||||
alsoEndsLabel:SetFontObject(GameFontHighlight)
|
||||
alsoEndsLabel:SetColor(255, 165, 0)
|
||||
alsoEndsLabel:SetFullWidth(true)
|
||||
endNPCGroup:AddChild(alsoEndsLabel)
|
||||
|
||||
local endQuests = {}
|
||||
local counter = 1
|
||||
for _, v in ipairs(endNPC.endQuests) do
|
||||
if v ~= quest.Id then
|
||||
endQuests[counter] = {}
|
||||
local endQuest = QuestieDB.GetQuest(v)
|
||||
local label = _QuestieJourney:GetInteractiveQuestLabel(endQuest)
|
||||
endQuests[counter].frame = label
|
||||
endQuests[counter].quest = endQuest
|
||||
endNPCGroup:AddChild(label)
|
||||
counter = counter + 1
|
||||
end
|
||||
end
|
||||
|
||||
if #endQuests == 0 then
|
||||
local noQuestLabel = AceGUI:Create("Label")
|
||||
noQuestLabel:SetText(l10n('No Quests to List'))
|
||||
noQuestLabel:SetFullWidth(true)
|
||||
endNPCGroup:AddChild(noQuestLabel)
|
||||
end
|
||||
|
||||
QuestieJourneyUtils:Spacer(endNPCGroup)
|
||||
end
|
||||
|
||||
-- Fix for sometimes the scroll content will max out and not show everything until window is resized
|
||||
container.content:SetHeight(10000)
|
||||
end
|
||||
end
|
||||
|
||||
---@param text string
|
||||
---@param fullWidth boolean
|
||||
---@return AceHeader
|
||||
function _QuestieJourney:CreateHeading(text, fullWidth)
|
||||
---@class AceHeader
|
||||
local header = AceGUI:Create("Heading")
|
||||
header:SetFullWidth(fullWidth)
|
||||
header:SetText(text)
|
||||
|
||||
return header
|
||||
end
|
||||
|
||||
---@param text string
|
||||
---@param fullWidth boolean
|
||||
---@return AceLabel
|
||||
function _QuestieJourney:CreateLabel(text, fullWidth)
|
||||
---@class AceLabel
|
||||
local header = AceGUI:Create("Label")
|
||||
header:SetFullWidth(fullWidth)
|
||||
header:SetText(text)
|
||||
|
||||
return header
|
||||
end
|
||||
|
||||
---@param questLevel number
|
||||
---@param questMinLevel number
|
||||
---@return string
|
||||
function _QuestieJourney:GetDifficultyString(questLevel, questMinLevel)
|
||||
local red, orange, yellow, green, gray = _QuestieJourney:GetLevelDifficultyRanges(questLevel, questMinLevel)
|
||||
local diffStr = ''
|
||||
|
||||
if red then
|
||||
diffStr = diffStr .. "|cFFFF1A1A[".. red .."]|r "
|
||||
end
|
||||
|
||||
if orange then
|
||||
diffStr = diffStr .. "|cFFFF8040[".. orange .."]|r "
|
||||
end
|
||||
|
||||
diffStr = diffStr .. "|cFFFFFF00[".. yellow .."]|r "
|
||||
diffStr = diffStr .. "|cFF40C040[".. green .."]|r "
|
||||
diffStr = diffStr .. "|cFFC0C0C0[".. gray .."]|r "
|
||||
|
||||
return Questie:Colorize(l10n('Difficulty Range: %s', diffStr), 'yellow')
|
||||
end
|
||||
|
||||
---@param quest Quest
|
||||
---@return number @The number of pre quests added to the group
|
||||
---@return AceInlineGroup @The created Ace InlineGroup
|
||||
function _QuestieJourney:CreatePreQuestGroup(quest)
|
||||
---@class AceInlineGroup
|
||||
local preQuestInlineGroup = AceGUI:Create("InlineGroup")
|
||||
local preQuestCounter = 1
|
||||
|
||||
preQuestInlineGroup:SetLayout("List")
|
||||
preQuestInlineGroup:SetTitle(l10n('Pre Quests'))
|
||||
preQuestInlineGroup:SetFullWidth(true)
|
||||
|
||||
if (quest.preQuestSingle and next(quest.preQuestSingle)) then
|
||||
for _, v in pairs(quest.preQuestSingle) do
|
||||
if v ~= quest.Id then
|
||||
local preQuest = QuestieDB.GetQuest(v)
|
||||
local label = _QuestieJourney:GetInteractiveQuestLabel(preQuest)
|
||||
preQuestInlineGroup:AddChild(label)
|
||||
preQuestCounter = preQuestCounter + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (quest.preQuestGroup and next(quest.preQuestGroup)) then
|
||||
for _, v in pairs(quest.preQuestGroup) do
|
||||
if v ~= quest.Id then
|
||||
local preQuest = QuestieDB.GetQuest(v)
|
||||
local label = _QuestieJourney:GetInteractiveQuestLabel(preQuest)
|
||||
preQuestInlineGroup:AddChild(label)
|
||||
preQuestCounter = preQuestCounter + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return preQuestCounter, preQuestInlineGroup
|
||||
end
|
||||
|
||||
---@param quest Quest
|
||||
---@return AceInteractiveLabel
|
||||
function _QuestieJourney:GetInteractiveQuestLabel(quest)
|
||||
---@class AceInteractiveLabel
|
||||
local label = AceGUI:Create("InteractiveLabel")
|
||||
local questId = quest.Id
|
||||
|
||||
label:SetText(QuestieLib:GetColoredQuestName(questId, Questie.db.profile.enableTooltipsQuestLevel, false, true))
|
||||
label:SetUserData('id', questId)
|
||||
label:SetUserData('name', quest.name)
|
||||
label:SetCallback("OnClick", function()
|
||||
ItemRefTooltip:SetHyperlink("%|Hquestie:" .. questId .. ":.*%|h", "%[%[" .. quest.level .. "%] " .. quest.name .. " %(" .. questId .. "%)%]")
|
||||
end)
|
||||
label:SetCallback("OnEnter", _QuestieJourney.ShowJourneyTooltip)
|
||||
label:SetCallback("OnLeave", _QuestieJourney.HideJourneyTooltip)
|
||||
|
||||
return label
|
||||
end
|
||||
Reference in New Issue
Block a user