424 lines
16 KiB
Lua
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
|