ElvUI/Modules/DataTexts/Missions.lua

358 lines
14 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local DT = E:GetModule('DataTexts')
local _G = _G
local next, wipe, ipairs = next, wipe, ipairs
local format, sort, select = format, sort, select
local GetMouseFocus = GetMouseFocus
local HideUIPanel = HideUIPanel
local IsShiftKeyDown = IsShiftKeyDown
local InCombatLockdown = InCombatLockdown
local BreakUpLargeNumbers = BreakUpLargeNumbers
local ShowGarrisonLandingPage = ShowGarrisonLandingPage
local C_Garrison_HasGarrison = C_Garrison.HasGarrison
local C_Garrison_GetBuildings = C_Garrison.GetBuildings
local C_Garrison_GetInProgressMissions = C_Garrison.GetInProgressMissions
local C_Garrison_GetLandingPageShipmentInfo = C_Garrison.GetLandingPageShipmentInfo
local C_Garrison_GetCompleteTalent = C_Garrison.GetCompleteTalent
local C_Garrison_GetFollowerShipments = C_Garrison.GetFollowerShipments
local C_Garrison_GetLandingPageShipmentInfoByContainerID = C_Garrison.GetLandingPageShipmentInfoByContainerID
local C_Garrison_RequestLandingPageShipmentInfo = C_Garrison.RequestLandingPageShipmentInfo
local C_Garrison_GetCompleteMissions = C_Garrison.GetCompleteMissions
local C_Garrison_GetLooseShipments = C_Garrison.GetLooseShipments
local C_Garrison_GetTalentTreeIDsByClassID = C_Garrison.GetTalentTreeIDsByClassID
local C_Garrison_GetTalentTreeInfo = C_Garrison.GetTalentTreeInfo
local C_QuestLog_IsQuestFlaggedCompleted = C_QuestLog.IsQuestFlaggedCompleted
local C_IslandsQueue_GetIslandsWeeklyQuestID = C_IslandsQueue.GetIslandsWeeklyQuestID
local C_CurrencyInfo_GetCurrencyInfo = C_CurrencyInfo.GetCurrencyInfo
local C_Covenants_GetActiveCovenantID = C_Covenants.GetActiveCovenantID
local C_CovenantCallings_AreCallingsUnlocked = C_CovenantCallings.AreCallingsUnlocked
local CovenantCalling_Create = CovenantCalling_Create
local GetMaxLevelForExpansionLevel = GetMaxLevelForExpansionLevel
local GetQuestObjectiveInfo = GetQuestObjectiveInfo
local SecondsToTime = SecondsToTime
local IsAltKeyDown = IsAltKeyDown
local GARRISON_LANDING_NEXT = GARRISON_LANDING_NEXT
local CAPACITANCE_WORK_ORDERS = CAPACITANCE_WORK_ORDERS
local FOLLOWERLIST_LABEL_TROOPS = FOLLOWERLIST_LABEL_TROOPS
local GARRISON_EMPTY_IN_PROGRESS_LIST = GARRISON_EMPTY_IN_PROGRESS_LIST
local GARRISON_LANDING_SHIPMENT_COUNT = GARRISON_LANDING_SHIPMENT_COUNT
local GOAL_COMPLETED = GOAL_COMPLETED
local GREEN_FONT_COLOR = GREEN_FONT_COLOR
local ISLANDS_HEADER = ISLANDS_HEADER
local ISLANDS_QUEUE_FRAME_TITLE = ISLANDS_QUEUE_FRAME_TITLE
local ISLANDS_QUEUE_WEEKLY_QUEST_PROGRESS = ISLANDS_QUEUE_WEEKLY_QUEST_PROGRESS
local LE_EXPANSION_BATTLE_FOR_AZEROTH = LE_EXPANSION_BATTLE_FOR_AZEROTH
local LE_FOLLOWER_TYPE_GARRISON_6_0 = Enum.GarrisonFollowerType.FollowerType_6_0
local LE_FOLLOWER_TYPE_GARRISON_7_0 = Enum.GarrisonFollowerType.FollowerType_7_0
local LE_FOLLOWER_TYPE_GARRISON_8_0 = Enum.GarrisonFollowerType.FollowerType_8_0
local LE_FOLLOWER_TYPE_GARRISON_6_2 = Enum.GarrisonFollowerType.FollowerType_6_2
local LE_FOLLOWER_TYPE_GARRISON_9_0 = Enum.GarrisonFollowerType.FollowerType_9_0
local LE_GARRISON_TYPE_6_0 = Enum.GarrisonType.Type_6_0
local LE_GARRISON_TYPE_7_0 = Enum.GarrisonType.Type_7_0
local LE_GARRISON_TYPE_8_0 = Enum.GarrisonType.Type_8_0
local LE_GARRISON_TYPE_9_0 = Enum.GarrisonType.Type_9_0
local RESEARCH_TIME_LABEL = RESEARCH_TIME_LABEL
local DATE_COMPLETED = DATE_COMPLETED:gsub('(%%s)', '|cFF33FF33%1|r') -- 'Completed: |cFF33FF33%s|r'
local EXPANSION_NAME5 = EXPANSION_NAME5 -- 'Warlords of Draenor'
local EXPANSION_NAME6 = EXPANSION_NAME6 -- 'Legion'
local EXPANSION_NAME7 = EXPANSION_NAME7 -- 'Battle for Azeroth'
local EXPANSION_NAME8 = EXPANSION_NAME8 -- 'Shadowlands'
local MAIN_CURRENCY = 1813
local iconString = '|T%s:16:16:0:0:64:64:4:60:4:60|t'
local numMissions = 0
local callingsData = {}
local covenantTreeIDs = {
[1] = {308, 312, 316, 320, 327},
[2] = {309, 314, 317, 324, 326},
[3] = {307, 311, 315, 319, 328},
[4] = {310, 313, 318, 321, 329}
}
local function sortFunction(a, b)
return a.missionEndTime < b.missionEndTime
end
local function LandingPage(_, ...)
if not C_Garrison_HasGarrison(...) then
return
end
HideUIPanel(_G.GarrisonLandingPage)
ShowGarrisonLandingPage(...)
end
local menuList = {
{text = _G.GARRISON_LANDING_PAGE_TITLE, func = LandingPage, arg1 = LE_GARRISON_TYPE_6_0, notCheckable = true},
{text = _G.ORDER_HALL_LANDING_PAGE_TITLE, func = LandingPage, arg1 = LE_GARRISON_TYPE_7_0, notCheckable = true},
{text = _G.WAR_CAMPAIGN, func = LandingPage, arg1 = LE_GARRISON_TYPE_8_0, notCheckable = true},
{text = _G.GARRISON_TYPE_9_0_LANDING_PAGE_TITLE, func = LandingPage, arg1 = LE_GARRISON_TYPE_9_0, notCheckable = true},
}
local data = {}
local function AddInProgressMissions(garrisonType)
wipe(data)
C_Garrison_GetInProgressMissions(data, garrisonType)
if next(data) then
sort(data, sortFunction) -- Sort by time left, lowest first
for _, mission in ipairs(data) do
local timeLeft = mission.timeLeftSeconds
local r, g, b = 1, 1, 1
if mission.isRare then
r, g, b = 0.09, 0.51, 0.81
end
if timeLeft and timeLeft == 0 then
DT.tooltip:AddDoubleLine(mission.name, GOAL_COMPLETED, r, g, b, GREEN_FONT_COLOR:GetRGB())
else
DT.tooltip:AddDoubleLine(mission.name, SecondsToTime(timeLeft), r, g, b, 1, 1, 1)
end
end
else
DT.tooltip:AddLine(GARRISON_EMPTY_IN_PROGRESS_LIST, 1, 1, 1)
end
end
local function AddFollowerInfo(garrisonType)
data = C_Garrison_GetFollowerShipments(garrisonType)
if next(data) then
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(FOLLOWERLIST_LABEL_TROOPS) -- 'Troops'
for _, followerShipments in ipairs(data) do
local name, _, _, shipmentsReady, shipmentsTotal, _, _, timeleftString = C_Garrison_GetLandingPageShipmentInfoByContainerID(followerShipments)
if name and shipmentsReady and shipmentsTotal then
if timeleftString then
DT.tooltip:AddDoubleLine(name, format(GARRISON_LANDING_SHIPMENT_COUNT, shipmentsReady, shipmentsTotal) .. ' ' .. format(GARRISON_LANDING_NEXT,timeleftString), 1, 1, 1, 1, 1, 1)
else
DT.tooltip:AddDoubleLine(name, format(GARRISON_LANDING_SHIPMENT_COUNT, shipmentsReady, shipmentsTotal), 1, 1, 1, 1, 1, 1)
end
end
end
end
end
local covenantInfo = {}
local function AddTalentInfo(garrisonType, currentCovenant)
if garrisonType == LE_GARRISON_TYPE_9_0 then
local current = covenantTreeIDs[currentCovenant]
if current then
wipe(covenantInfo)
data = E:CopyTable(covenantInfo, current)
else
wipe(data)
end
else
data = C_Garrison_GetTalentTreeIDsByClassID(garrisonType, E.myClassID)
end
if next(data) then
-- This is a talent that has completed, but has not been seen in the talent UI yet.
-- No longer provide relevant output in SL. Still used by old content.
local completeTalentID = C_Garrison_GetCompleteTalent(garrisonType)
if completeTalentID > 0 then
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(RESEARCH_TIME_LABEL) -- 'Research Time:'
for _, treeID in ipairs(data) do
local treeInfo = C_Garrison_GetTalentTreeInfo(treeID)
for _, talent in ipairs(treeInfo.talents) do
if talent.isBeingResearched or (talent.id == completeTalentID and garrisonType ~= LE_GARRISON_TYPE_9_0)then
if talent.timeRemaining and talent.timeRemaining == 0 then
DT.tooltip:AddDoubleLine(talent.name, GOAL_COMPLETED, 1, 1, 1, GREEN_FONT_COLOR:GetRGB())
else
DT.tooltip:AddDoubleLine(talent.name, SecondsToTime(talent.timeRemaining), 1, 1, 1, 1, 1, 1)
end
end
end
end
end
end
end
local function GetInfo(id)
local info = C_CurrencyInfo_GetCurrencyInfo(id)
return info.quantity, info.name, (info.iconFileID and format(iconString, info.iconFileID)) or '136012'
end
local function AddInfo(id)
local quantity, _, icon = GetInfo(id)
return format('%s %s', icon, BreakUpLargeNumbers(quantity))
end
local function OnEnter()
DT.tooltip:ClearLines()
DT.tooltip:AddLine(EXPANSION_NAME8, 1, .5, 0)
DT.tooltip:AddDoubleLine(L["Mission(s) Report:"], AddInfo(1813), nil, nil, nil, 1, 1, 1)
AddInProgressMissions(LE_FOLLOWER_TYPE_GARRISON_9_0)
if C_CovenantCallings_AreCallingsUnlocked() then
local questNum = 0
for _, calling in ipairs(callingsData) do
local callingObj = CovenantCalling_Create(calling)
if callingObj:GetState() == 0 then
questNum = questNum + 1
end
end
if questNum > 0 then
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(format('%s %s', questNum, L["Calling Quest(s) available."]))
end
end
local currentCovenant = C_Covenants_GetActiveCovenantID()
if currentCovenant and currentCovenant > 0 then
AddTalentInfo(LE_GARRISON_TYPE_9_0, currentCovenant)
end
if IsShiftKeyDown() then
-- Battle for Azeroth
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(EXPANSION_NAME7, 1, .5, 0)
DT.tooltip:AddDoubleLine(L["Mission(s) Report:"], AddInfo(1560), nil, nil, nil, 1, 1, 1)
AddInProgressMissions(LE_FOLLOWER_TYPE_GARRISON_8_0)
-- Island Expeditions
if E.mylevel >= GetMaxLevelForExpansionLevel(LE_EXPANSION_BATTLE_FOR_AZEROTH) then
local questID = C_IslandsQueue_GetIslandsWeeklyQuestID()
if questID then
local _, _, finished, numFulfilled, numRequired = GetQuestObjectiveInfo(questID, 1, false)
local text, r1, g1, b1
if finished or C_QuestLog_IsQuestFlaggedCompleted(questID) then
text = GOAL_COMPLETED
r1, g1, b1 = GREEN_FONT_COLOR:GetRGB()
else
text = ISLANDS_QUEUE_WEEKLY_QUEST_PROGRESS:format(numFulfilled, numRequired)
r1, g1, b1 = 1, 1, 1
end
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(ISLANDS_HEADER .. ':')
DT.tooltip:AddDoubleLine(ISLANDS_QUEUE_FRAME_TITLE, text, 1, 1, 1, r1, g1, b1)
end
end
AddFollowerInfo(LE_GARRISON_TYPE_7_0)
AddTalentInfo(LE_GARRISON_TYPE_7_0)
-- Legion
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(EXPANSION_NAME6, 1, .5, 0)
DT.tooltip:AddDoubleLine(L["Mission(s) Report:"], AddInfo(1220), nil, nil, nil, 1, 1, 1)
AddInProgressMissions(LE_FOLLOWER_TYPE_GARRISON_7_0)
AddFollowerInfo(LE_GARRISON_TYPE_7_0)
-- 'Loose Work Orders' (i.e. research, equipment)
data = C_Garrison_GetLooseShipments(LE_GARRISON_TYPE_7_0)
if next(data) then
DT.tooltip:AddLine(CAPACITANCE_WORK_ORDERS) -- 'Work Orders'
for _, looseShipments in ipairs(data) do
local name, _, _, shipmentsReady, shipmentsTotal, _, _, timeleftString = C_Garrison_GetLandingPageShipmentInfoByContainerID(looseShipments)
if name then
if timeleftString then
DT.tooltip:AddDoubleLine(name, format(GARRISON_LANDING_SHIPMENT_COUNT, shipmentsReady, shipmentsTotal) .. ' ' .. format(GARRISON_LANDING_NEXT,timeleftString), 1, 1, 1, 1, 1, 1)
else
DT.tooltip:AddDoubleLine(name, format(GARRISON_LANDING_SHIPMENT_COUNT, shipmentsReady, shipmentsTotal), 1, 1, 1, 1, 1, 1)
end
end
end
end
AddTalentInfo(LE_GARRISON_TYPE_7_0)
-- Warlords of Draenor
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(EXPANSION_NAME5, 1, .5, 0)
DT.tooltip:AddDoubleLine(L["Mission(s) Report:"], AddInfo(824), nil, nil, nil, 1, 1, 1)
AddInProgressMissions(LE_FOLLOWER_TYPE_GARRISON_6_0)
DT.tooltip:AddLine(' ')
DT.tooltip:AddDoubleLine(L["Naval Mission(s) Report:"], AddInfo(1101), nil, nil, nil, 1, 1 , 1)
AddInProgressMissions(LE_FOLLOWER_TYPE_GARRISON_6_2)
--Buildings
data = C_Garrison_GetBuildings(LE_GARRISON_TYPE_6_0)
if next(data) then
local AddLine = true
for _, buildings in ipairs(data) do
local name, _, _, shipmentsReady, shipmentsTotal, _, _, timeleftString = C_Garrison_GetLandingPageShipmentInfo(buildings.buildingID)
if name and shipmentsTotal then
if AddLine then
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine(L["Building(s) Report:"])
AddLine = false
end
if timeleftString then
DT.tooltip:AddDoubleLine(name, format(GARRISON_LANDING_SHIPMENT_COUNT, shipmentsReady, shipmentsTotal) .. ' ' .. format(GARRISON_LANDING_NEXT,timeleftString), 1, 1, 1, 1, 1, 1)
else
DT.tooltip:AddDoubleLine(name, format(GARRISON_LANDING_SHIPMENT_COUNT, shipmentsReady, shipmentsTotal), 1, 1, 1, 1, 1, 1)
end
end
end
end
else
DT.tooltip:AddLine(' ')
DT.tooltip:AddLine('Hold Shift - Show Previous Expansion', .66, .66, .66)
end
DT.tooltip:Show()
end
local function OnClick(self)
if InCombatLockdown() then _G.UIErrorsFrame:AddMessage(E.InfoColor.._G.ERR_NOT_IN_COMBAT) return end
DT:SetEasyMenuAnchor(DT.EasyMenu, self)
_G.EasyMenu(menuList, DT.EasyMenu, nil, nil, nil, 'MENU')
end
local function OnEvent(self, event, ...)
if event == 'CURRENCY_DISPLAY_UPDATE' and select(1, ...) ~= MAIN_CURRENCY then
return
end
if event == 'COVENANT_CALLINGS_UPDATED' then
wipe(callingsData)
callingsData = ...
end
if event == 'GARRISON_SHIPMENT_RECEIVED' or (event == 'SHIPMENT_UPDATE' and select(1, ...) == true) then
C_Garrison_RequestLandingPageShipmentInfo()
end
if event == 'GARRISON_MISSION_NPC_OPENED' then
self:RegisterEvent('GARRISON_MISSION_LIST_UPDATE')
elseif event == 'GARRISON_MISSION_NPC_CLOSED' then
self:UnregisterEvent('GARRISON_MISSION_LIST_UPDATE')
end
if event == 'GARRISON_LANDINGPAGE_SHIPMENTS' or event == 'GARRISON_MISSION_FINISHED' or event == 'GARRISON_MISSION_NPC_CLOSED' or event == 'GARRISON_MISSION_LIST_UPDATE' then
numMissions = #C_Garrison_GetCompleteMissions(LE_FOLLOWER_TYPE_GARRISON_9_0)
+ #C_Garrison_GetCompleteMissions(LE_FOLLOWER_TYPE_GARRISON_8_0)
+ #C_Garrison_GetCompleteMissions(LE_FOLLOWER_TYPE_GARRISON_7_0)
+ #C_Garrison_GetCompleteMissions(LE_FOLLOWER_TYPE_GARRISON_6_0)
+ #C_Garrison_GetCompleteMissions(LE_FOLLOWER_TYPE_GARRISON_6_2)
end
if numMissions > 0 then
self.text:SetFormattedText(DATE_COMPLETED, numMissions)
else
self.text:SetText(AddInfo(MAIN_CURRENCY))
end
if event == 'MODIFIER_STATE_CHANGED' and not IsAltKeyDown() and GetMouseFocus() == self then
OnEnter(self)
end
end
DT:RegisterDatatext('Missions', nil, {'CURRENCY_DISPLAY_UPDATE', 'GARRISON_LANDINGPAGE_SHIPMENTS', 'GARRISON_TALENT_UPDATE', 'GARRISON_TALENT_COMPLETE', 'GARRISON_SHIPMENT_RECEIVED', 'SHIPMENT_UPDATE', 'GARRISON_MISSION_FINISHED', 'GARRISON_MISSION_NPC_CLOSED', 'GARRISON_MISSION_NPC_OPENED', 'MODIFIER_STATE_CHANGED', 'COVENANT_CALLINGS_UPDATED'}, OnEvent, nil, OnClick, OnEnter, nil, _G.GARRISON_MISSIONS)