-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathPrintQuests.lua
More file actions
180 lines (161 loc) · 6.17 KB
/
Copy pathPrintQuests.lua
File metadata and controls
180 lines (161 loc) · 6.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
PrintQuests = {}
PrintQuestsSavedData = {
completedQuests = {
},
firstRun = true
}
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:RegisterEvent("PLAYER_LEAVING_WORLD")
frame:RegisterEvent("QUEST_DATA_LOAD_RESULT")
frame:RegisterEvent("CRITERIA_UPDATE")
frame:RegisterEvent("QUEST_ACCEPTED")
frame:RegisterEvent("QUEST_TURNED_IN")
frame:RegisterEvent("QUEST_REMOVED")
frame:RegisterEvent("QUEST_WATCH_UPDATE")
frame:RegisterEvent("QUEST_LOG_UPDATE")
frame:RegisterEvent("UNIT_QUEST_LOG_CHANGED")
local questEvents = { "accepted", "completed", "turned in", "rewarded", "removed", "reverted" }
local printQueue = {}
local function GetQuestMessageData(questID)
local questName = C_QuestLog.GetTitleForQuestID(questID)
if questName then
return { id = questID, color = "FF00FF00", name = questName, prefix = "", nameFromServer = true }
elseif PrintQuests.ConfidentlyNamedTrackingQuests[questID] then
return { id = questID, color = "FF00FF00", name = PrintQuests.ConfidentlyNamedTrackingQuests[questID], prefix = "TRACKING ", nameFromServer = false }
elseif PrintQuests.UnsurelyNamedTrackingQuests[questID] then
return { id = questID, color = "FFFFFF00", name = PrintQuests.UnsurelyNamedTrackingQuests[questID], prefix = "TRACKING ", nameFromServer = false }
else
return { id = questID, color = "FFFF0000", name = "(Tracking)", prefix = "", nameFromServer = false }
end
end
local function DoPrintQuest(printType, messageData)
print("Quest ".. printType ..": |c" .. messageData.color .. messageData.prefix .. messageData.name .. "|r (ID: " .. messageData.id .. ")")
end
local function ProcessPrintQuestQueuedItem(questID, success)
local questStatus = printQueue[questID]
if not questStatus then
return
end
if success then
local messageData = GetQuestMessageData(questID);
for _, printType in ipairs(questEvents) do
if questStatus[printType] then
DoPrintQuest(printType, messageData)
end
end
end
printQueue[questID] = nil
end
local function PrintQuest(printType, questID)
-- dont print quests which are spammed since 12.0.0
if PrintQuests.IgnoredQuests[questID] then
return
end
-- print whatever we have immediately to make it easier to associate what happens ingame with the quest
local messageData = GetQuestMessageData(questID);
DoPrintQuest(printType, messageData)
if not messageData.nameFromServer then
local isAlreadyInQueue = true
local questStatus = printQueue[questID]
if not questStatus then
questStatus = {}
printQueue[questID] = questStatus
isAlreadyInQueue = false
end
questStatus[printType] = true
if not isAlreadyInQueue then
C_QuestLog.RequestLoadQuestByID(questID)
-- Timeout fallback after 20 seconds
C_Timer.After(20, function()
ProcessPrintQuestQueuedItem(questID, false)
end)
end
end
end
local function QueryCompletedQuests(suppressOutput)
local currentCompletedQuests = {}
local completedQuestIDs = C_QuestLog.GetAllCompletedQuestIDs()
if completedQuestIDs then
for _, questID in ipairs(completedQuestIDs) do
currentCompletedQuests[questID] = true
if not suppressOutput then
if not PrintQuestsSavedData.completedQuests[questID] then
PrintQuest("rewarded", questID)
end
end
end
end
if not suppressOutput then
for questID, _ in pairs(PrintQuestsSavedData.completedQuests) do
if not currentCompletedQuests[questID] then
PrintQuest("reverted", questID)
end
end
end
PrintQuestsSavedData.completedQuests = currentCompletedQuests
end
local isReady = false
local lastQueryTime = 0
local QUERY_THROTTLE_INTERVAL = 0.25 -- in seconds
local queryTimer
local function ThrottledQueryCompletedQuests()
if not isReady then
return
end
local currentTime = GetTime()
if currentTime - lastQueryTime > QUERY_THROTTLE_INTERVAL then
QueryCompletedQuests(false)
lastQueryTime = currentTime
elseif not queryTimer then
queryTimer = C_Timer.NewTimer(QUERY_THROTTLE_INTERVAL, function()
queryTimer = nil
ThrottledQueryCompletedQuests()
end)
end
end
local questWatchUpdates = {}
frame:SetScript("OnEvent", function(self, event, ...)
if event == "PLAYER_ENTERING_WORLD" then
QueryCompletedQuests(PrintQuestsSavedData.firstRun)
PrintQuestsSavedData.firstRun = false
isReady = true
elseif event == "PLAYER_LEAVING_WORLD" then
isReady = false;
elseif event == "CRITERIA_UPDATE" or event == "QUEST_LOG_UPDATE" then
ThrottledQueryCompletedQuests()
elseif event == "QUEST_DATA_LOAD_RESULT" then
local questID, success = ...
ProcessPrintQuestQueuedItem(questID, success)
elseif event == "QUEST_ACCEPTED" then
local questID = ...
PrintQuest("accepted", questID)
ThrottledQueryCompletedQuests()
elseif event == "QUEST_TURNED_IN" then
local questID = ...
PrintQuest("turned in", questID)
ThrottledQueryCompletedQuests()
elseif event == "QUEST_REMOVED" then
local questID = ...
PrintQuest("removed", questID)
ThrottledQueryCompletedQuests()
elseif event == "QUEST_WATCH_UPDATE" then
local questID = ...
-- quest completion status returned by C_QuestLog.ReadyForTurnIn is not updated until UNIT_QUEST_LOG_CHANGED
questWatchUpdates[questID] = true;
elseif event == "UNIT_QUEST_LOG_CHANGED" then
local unitTarget = ...
if unitTarget == "player" then
local anyCompleted = false
for questID, _ in pairs(questWatchUpdates) do
if C_QuestLog.ReadyForTurnIn(questID) then
PrintQuest("completed", questID)
end
end
questWatchUpdates = {}
if anyCompleted then
ThrottledQueryCompletedQuests()
end
end
end
end)