Files
Questie-X/Modules/Journey/QuestDetailsFrame.lua
T

424 lines
16 KiB
Lua

---@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