Mercurial > wow > worldplan
comparison WorldQuests.lua @ 75:78d78dc77822
update conditional tweaks
author | Nenue |
---|---|
date | Mon, 10 Apr 2017 07:13:29 -0400 |
parents | 2ba11b25aa7f |
children | 836cd54c84b3 |
comparison
equal
deleted
inserted
replaced
74:2ba11b25aa7f | 75:78d78dc77822 |
---|---|
1 -- WorldPlan | 1 -- WorldPlan |
2 -- WorldQuests.lua | 2 -- WorldQuests.lua |
3 -- Created: 11/2/2016 3:40 PM | 3 -- Created: 11/2/2016 3:40 PM |
4 -- %file-revision% | 4 -- %file-revision% |
5 | 5 |
6 local print = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end | 6 local print = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or nop |
7 local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or function() end | 7 local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or nop |
8 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end | 8 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or nop |
9 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end | 9 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or nop |
10 local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or function() end | 10 local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or nop |
11 local _, db = ... | 11 local _, db = ... |
12 local Module = WorldPlanQuestsMixin | 12 local Module = WorldPlanQuestsMixin |
13 | 13 |
14 local _G = _G | 14 local _G = _G |
15 local type, tostring, tonumber, pairs, ipairs = type, tostring, tonumber, pairs, ipairs | 15 local type, tostring, tonumber, pairs, ipairs = type, tostring, tonumber, pairs, ipairs |
16 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo | 16 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo |
17 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented | 17 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented |
18 local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID | 18 local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID |
19 local TQ_IsActive = C_TaskQuest.IsActive | 19 local TQ_IsActive = C_TaskQuest.IsActive |
20 local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData | |
20 local pairs, ipairs, tinsert, tremove, wipe = pairs, ipairs, tinsert, tremove, table.wipe | 21 local pairs, ipairs, tinsert, tremove, wipe = pairs, ipairs, tinsert, tremove, table.wipe |
21 local GetTaskInfo, GetTasksTable, HaveQuestData = GetTaskInfo, GetTasksTable, HaveQuestData | 22 local GetTaskInfo, GetTasksTable, HaveQuestData = GetTaskInfo, GetTasksTable, HaveQuestData |
22 local GetTime = GetTime | 23 local GetTime = GetTime |
23 local SpellCanTargetQuest, IsQuestIDValidSpellTarget = SpellCanTargetQuest, IsQuestIDValidSpellTarget | 24 local SpellCanTargetQuest, IsQuestIDValidSpellTarget = SpellCanTargetQuest, IsQuestIDValidSpellTarget |
24 local tonumber, abs = tonumber, math.abs | 25 local tonumber, abs = tonumber, math.abs |
42 local SCALE_FACTORS = { 0.25, 0.7, 1 } | 43 local SCALE_FACTORS = { 0.25, 0.7, 1 } |
43 | 44 |
44 local BountyBoard = WorldMapFrame.UIElementsFrame.BountyBoard | 45 local BountyBoard = WorldMapFrame.UIElementsFrame.BountyBoard |
45 local ActionButton = WorldMapFrame.UIElementsFrame.ActionButton | 46 local ActionButton = WorldMapFrame.UIElementsFrame.ActionButton |
46 | 47 |
48 local pinBaseIndex = 1500 | |
49 local overlayBaseIndex = 1580 | |
47 local layoutDirty = true | 50 local layoutDirty = true |
48 local bountiesDirty = true | 51 local bountiesDirty = true |
49 local currentScale = WorldMapDetailFrame:GetScale() | 52 local currentScale = WorldMapDetailFrame:GetScale() |
50 local canTargetQuests | 53 local canTargetQuests |
51 local numShown = 0 | 54 local numShown = 0 |
62 callback(pin) | 65 callback(pin) |
63 end | 66 end |
64 end) | 67 end) |
65 end | 68 end |
66 | 69 |
67 function Module:OnUpdate(sinceLast) | |
68 | |
69 if self.filtersDirty or self.isStale then | |
70 self:Refresh() | |
71 end | |
72 if #db.UpdatedPins >= 1 then | |
73 print('|cFF00FF88pending updates', #db.UpdatedPins) | |
74 self:RefreshIfQueued() | |
75 end | |
76 | |
77 end | |
78 | |
79 | 70 |
80 function Module:Setup() | 71 function Module:Setup() |
81 print('|cFFFF4400'..self:GetName()..':Setup()') | 72 --print('|cFFFF4400'..self:GetName()..':Setup()') |
82 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do | 73 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do |
83 db.QuestsByZone[mapID] = {} | 74 db.QuestsByZone[mapID] = {} |
84 end | 75 end |
85 for target, arg in pairs(callbacks) do | 76 for target, arg in pairs(callbacks) do |
86 print(type(target)) | 77 --print(type(target)) |
87 if type(target) == 'table' then | 78 if type(target) == 'table' then |
88 local callerName = target:GetName() or tostring(target) | 79 local callerName = target:GetName() or tostring(target) |
89 for name, method in pairs(arg) do | 80 for name, method in pairs(arg) do |
90 print(callerName, arg) | 81 --print(callerName, arg) |
91 hooksecurefunc(target, name, function(...) | 82 hooksecurefunc(target, name, function(...) |
92 self:OnSecureHook(callerName .. '.' .. name, method, ...) | 83 self:OnSecureHook(callerName .. '.' .. name, method, ...) |
93 end) | 84 end) |
94 end | 85 end |
95 else | 86 else |
98 end) | 89 end) |
99 end | 90 end |
100 end | 91 end |
101 | 92 |
102 self.Status = CreateFrame('Frame', nil, self) | 93 self.Status = CreateFrame('Frame', nil, self) |
103 self.Status:SetPoint('TOPLEFT', WorldMapPOIFrame, 'TOPLEFT', 0, 0) | 94 self.Status:SetPoint('TOPLEFT', WorldMapFrame.UIElementsFrame, 'TOPLEFT', 0, 0) |
104 self.Status:SetPoint('BOTTOMRIGHT', WorldMapPOIFrame, 'TOPRIGHT', 0, -4) | 95 self.Status:SetPoint('BOTTOMRIGHT', WorldMapFrame.UIElementsFrame, 'TOPRIGHT', 0, -4) |
105 self.Status.t = self.Status:CreateTexture(nil, 'OVERLAY') | 96 self.Status.t = self.Status:CreateTexture(nil, 'OVERLAY') |
106 self.Status.b = self.Status:CreateTexture(nil, 'BACKGROUND') | 97 self.Status.b = self.Status:CreateTexture(nil, 'BACKGROUND') |
107 self.Status.b:SetColorTexture(0,0,0,.25) | 98 self.Status.b:SetColorTexture(0,0,0,.25) |
108 self.Status.b:SetAllPoints(self.Status) | 99 self.Status.b:SetAllPoints(self.Status) |
109 self.Status.t:SetColorTexture(1,1,1,.5) | 100 self.Status.t:SetColorTexture(1,1,1,.5) |
112 self.Status.t:SetPoint('LEFT') | 103 self.Status.t:SetPoint('LEFT') |
113 local translationEnd, translationStart | 104 local translationEnd, translationStart |
114 self.Status:SetScript('OnUpdate', function(status) | 105 self.Status:SetScript('OnUpdate', function(status) |
115 local translateTo | 106 local translateTo |
116 if numLoaded < numShown then | 107 if numLoaded < numShown then |
117 translateTo = numLoaded/numShown * status:GetWidth() | 108 translateTo = (numLoaded/numShown) * status:GetWidth() |
118 status.t:SetWidth(translateTo) | 109 status.t:SetWidth(translateTo) |
119 else | 110 else |
120 translateTo = numShown * status:GetWidth() | 111 translateTo = status:GetWidth() |
121 status.t:SetWidth(translateTo) | 112 status.t:SetWidth(translateTo) |
122 end | 113 end |
123 end) | 114 end) |
124 | 115 |
125 self:SetAllPoints(WorldMapPOIFrame) | 116 self:SetAllPoints(WorldMapFrame.UIElementsFrame) |
126 for k,v in pairs( ToggleButton) do | 117 for k,v in pairs( ToggleButton) do |
127 self.Toggle:SetScript(k,v) | 118 self.Toggle:SetScript(k,v) |
128 end | 119 end |
129 | 120 |
130 self:UpdateBounties('SETUP') | 121 self:UpdateBounties('SETUP') |
136 end | 127 end |
137 callbacks.WorldMap_UpdateQuestBonusObjectives = function(WorldQuests) | 128 callbacks.WorldMap_UpdateQuestBonusObjectives = function(WorldQuests) |
138 WorldQuests:UpdateTaskPOIs() | 129 WorldQuests:UpdateTaskPOIs() |
139 end | 130 end |
140 callbacks.WorldMapFrame_UpdateMap = function(WorldQuests) | 131 callbacks.WorldMapFrame_UpdateMap = function(WorldQuests) |
141 WorldQuests:RefreshIfChanged() | 132 WorldQuests:RefreshIfChanged('WMF_UPDATE') |
142 end | 133 end |
143 callbacks.WorldMapScrollFrame_ReanchorQuestPOIs = function (WorldQuests) | 134 callbacks.WorldMapScrollFrame_ReanchorQuestPOIs = function (WorldQuests) |
144 WorldQuests:RefreshIfChanged() | 135 WorldQuests:RefreshIfChanged('WMF_REANCHOR') |
145 end | 136 end |
146 | 137 |
147 callbacks[BountyBoard] = {} | 138 callbacks[BountyBoard] = {} |
148 callbacks[BountyBoard].SetSelectedBountyIndex = function(WorldQuests) | 139 callbacks[BountyBoard].SetSelectedBountyIndex = function(WorldQuests) |
149 WorldQuests:UpdateBounties('BOUNTY_SELECTED') | 140 WorldQuests:UpdateBounties('BOUNTY_SELECTED') |
154 callbacks[ActionButton].UpdateCastingState = function(WorldQuests) | 145 callbacks[ActionButton].UpdateCastingState = function(WorldQuests) |
155 WorldQuests:Refresh('CASTING_STATE_CHANGED') | 146 WorldQuests:Refresh('CASTING_STATE_CHANGED') |
156 end | 147 end |
157 | 148 |
158 function Module:OnConfigUpdate() | 149 function Module:OnConfigUpdate() |
159 print('|cFFFFFF00OnConfigUpdate()|r') | 150 --print('|cFFFFFF00OnConfigUpdate()|r') |
160 if db.Config.FadeWhileGrouped then | 151 if db.Config.FadeWhileGrouped then |
161 db.PinAlpha = 0.15 | 152 db.PinAlpha = 0.15 |
162 else | 153 else |
163 db.PinAlpha = 1 | 154 db.PinAlpha = 1 |
164 end | 155 end |
177 end | 168 end |
178 local InternalShowButton = function(button, index) | 169 local InternalShowButton = function(button, index) |
179 button:Show() | 170 button:Show() |
180 end | 171 end |
181 | 172 |
182 db.UsedPOIs = {} | |
183 function Module:UpdateTaskPOIs() | |
184 canTargetQuests = SpellCanTargetQuest() | |
185 local func = canTargetQuests and 'Show' or 'Hide' | |
186 for i = 1, NUM_WORLDMAP_TASK_POIS do | |
187 local button = _G['WorldMapFrameTaskPOI'..i] | |
188 if button and button.worldQuest then | |
189 button[func](button) | |
190 end | |
191 end | |
192 end | |
193 | |
194 function Module:OnSecureHook(callbackName, func, ...) | 173 function Module:OnSecureHook(callbackName, func, ...) |
195 rprint('|cFFFF4400'..callbackName..'|r', ...) | 174 --rprint('|cFFFF4400'..callbackName..'|r', ...) |
196 func(self, ...) | 175 func(self, ...) |
197 end | 176 end |
198 | 177 |
199 local defaults = {} | 178 local defaults = {} |
200 local REWARD_UNKNOWN = 768 | 179 local REWARD_UNKNOWN = 768 |
201 function Module:OnLoad() | 180 function Module:OnLoad() |
202 print('|cFFFF4400'..self:GetName()..':OnLoad()') | 181 --print('|cFFFF4400'..self:GetName()..':OnLoad()') |
203 | 182 |
204 self:SetParent(WorldMapPOIFrame) | 183 self:SetParent(WorldMapFrame.UIElementsFrame) |
205 WorldPlan:AddHandler(self, defaults) | 184 WorldPlan:AddHandler(self, defaults) |
206 | 185 |
207 for areaID, fileName in pairs(WORLD_QUEST_MAPS) do | 186 for areaID, fileName in pairs(WORLD_QUEST_MAPS) do |
208 db.QuestsByZone[areaID] = {} | 187 db.QuestsByZone[areaID] = {} |
209 end | 188 end |
210 | 189 |
211 -- WORLD_MAP_UPDATE and PLAYER_ENTERING_WORLD are passed down from a higher level | 190 -- WORLD_MAP_UPDATE and PLAYER_ENTERING_WORLD are passed down from a higher level |
212 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') | 191 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') |
213 self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED') | 192 self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED') |
214 self:RegisterEvent('SKILL_LINES_CHANGED') | 193 self:RegisterEvent('SKILL_LINES_CHANGED') |
215 self:RegisterEvent('CURRENT_SPELL_CAST_CHANGED') | 194 --self:RegisterEvent('CURRENT_SPELL_CAST_CHANGED') |
216 self:RegisterEvent('ARTIFACT_UPDATE') | 195 self:RegisterEvent('ARTIFACT_UPDATE') |
217 self:RegisterEvent('QUEST_LOG_UPDATE') | 196 self:RegisterEvent('QUEST_LOG_UPDATE') |
218 end | 197 end |
219 | 198 |
220 local artifactKnowledgeMultiplier | 199 local artifactKnowledgeMultiplier |
221 local superTrackedQuestID | 200 local superTrackedQuestID |
222 function Module:OnEvent (event, ...) | 201 function Module:OnEvent (event, ...) |
223 | 202 |
224 print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...) | 203 print('|cFFFFFF00OnEvent() '..event..'|r', GetTime(), ...) |
225 if (event == 'QUEST_LOG_UPDATE') then | 204 if (event == 'QUEST_LOG_UPDATE') then |
226 self:UpdateBounties(event) | 205 self:UpdateBounties(event) |
227 self:RefreshIfChanged(event) | |
228 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then | 206 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then |
229 local questID = ... | 207 local questID = ... |
230 self:UpdateBounties(event) | |
231 if questID and db.QuestsByID[questID] then | 208 if questID and db.QuestsByID[questID] then |
232 db.QuestsByID[questID].complete = true | 209 db.QuestsByID[questID].complete = true |
210 self:ReleasePin(db.QuestsByID[questID]) | |
233 end | 211 end |
234 self:Refresh(event) | 212 self:Refresh(event) |
235 elseif event == 'SKILL_LINES_CHANGED' or event == 'CURRENT_SPELL_CAST_CHANGED' then | 213 elseif event == 'SKILL_LINES_CHANGED' or event == 'CURRENT_SPELL_CAST_CHANGED' then |
236 self:Refresh(event) | 214 self:Refresh(event) |
237 elseif event == 'ARTIFACT_UPDATE' then | 215 elseif event == 'ARTIFACT_UPDATE' then |
238 local akCheck = C_ArtifactUI.GetArtifactKnowledgeMultiplier() | 216 local akCheck = C_ArtifactUI.GetArtifactKnowledgeMultiplier() |
239 if akCheck and (akCheck ~= artifactKnowledgeMultiplier) then | 217 if akCheck and (akCheck ~= artifactKnowledgeMultiplier) then |
240 if artifactKnowledgeMultiplier then | 218 if artifactKnowledgeMultiplier then |
241 print('push artifact knowledge update', artifactKnowledgeMultiplier, 'to', akCheck) | 219 --print('push artifact knowledge update', artifactKnowledgeMultiplier, 'to', akCheck) |
242 for index, pin in pairs( db.QuestsByID) do | 220 for index, pin in pairs( db.QuestsByID) do |
243 if pin.rewardType == REWARD_ARTIFACT_POWER then | 221 if pin.rewardType == REWARD_ARTIFACT_POWER then |
244 db.log(pin.questID .. ' ' .. tostring(pin.title) .. ' Flagged for artifact power.') | 222 db.log(pin.questID .. ' ' .. tostring(pin.title) .. ' Flagged for artifact power.') |
245 pin.itemNumber = 0 | 223 pin.itemNumber = 0 |
246 pin.dataLoaded = nil | 224 pin.dataLoaded = nil |
262 end | 240 end |
263 end | 241 end |
264 end | 242 end |
265 | 243 |
266 | 244 |
245 function Module:OnUpdate(sinceLast) | |
246 | |
247 if self.refreshBenchMarkTicker then | |
248 --print(self.refreshBenchMarkTicker) | |
249 self.refreshBenchMarkTicker = self.refreshBenchMarkTicker - 1 | |
250 | |
251 if self.refreshBenchMarkTicker == 0 then | |
252 | |
253 self.refreshTime = floor((GetTime() - self.refreshBenchMark) * 1000)/1000 | |
254 self.debugMessage:SetText(self.refreshTime) | |
255 self.refreshBenchMarkTicker = nil | |
256 end | |
257 else | |
258 self.refreshBenchMark = GetTime() | |
259 end | |
260 | |
261 if self.filtersDirty or self.isStale then | |
262 self:Refresh() | |
263 end | |
264 if #db.UpdatedPins >= 1 then | |
265 --print('|cFF00FF88pending update', #db.UpdatedPins) | |
266 self:UpdateNext() | |
267 end | |
268 | |
269 end | |
270 | |
271 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen) | |
272 if isNewMap then | |
273 print('|cFF0088FFOnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap) | |
274 layoutDirty = true | |
275 self:Refresh('WORLD_MAP_CHANGED') | |
276 else | |
277 | |
278 --print('|cFFFFFF00'..self:GetName()..':OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap) | |
279 end | |
280 end | |
281 | |
282 | |
283 function Module:UpdateTaskPOIs() | |
284 canTargetQuests = SpellCanTargetQuest() | |
285 local func = canTargetQuests and 'Show' or 'Hide' | |
286 for i = 1, NUM_WORLDMAP_TASK_POIS do | |
287 local button = _G['WorldMapFrameTaskPOI'..i] | |
288 if button and button.worldQuest then | |
289 button[func](button) | |
290 end | |
291 end | |
292 end | |
267 | 293 |
268 local bountyQuests = {} | 294 local bountyQuests = {} |
269 local bountyInfo = {} | 295 local bountyInfo = {} |
296 | |
270 local bountyDisplayLocation, bountyLockedQuestID, selectedBountyIndex, selectedBountyQuestID | 297 local bountyDisplayLocation, bountyLockedQuestID, selectedBountyIndex, selectedBountyQuestID |
271 function Module:UpdateBounties(...) | 298 function Module:UpdateBounties(...) |
272 print('|cFF00FF88BountyInfo()|r', ...) | 299 print('|cFF00FF88BountyInfo()|r', ...) |
273 wipe(db.BountiesByFactionID) | 300 wipe(db.BountiesByFactionID) |
274 wipe(bountyQuests) | 301 wipe(db.BountiesByQuestID) |
275 | 302 |
276 db.selectedBounty = nil | 303 db.selectedBounty = nil |
277 selectedBountyIndex = BountyBoard:GetSelectedBountyIndex() | 304 selectedBountyIndex = BountyBoard:GetSelectedBountyIndex() |
278 bountyInfo, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, bountyInfo) | 305 db.Bounties, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, db.Bounties) |
279 local numBounties = 0 | 306 local numBounties = 0 |
280 for index, info in ipairs(bountyInfo) do | 307 for index, info in ipairs(db.Bounties) do |
281 if info.factionID then | |
282 numBounties = numBounties + 1 | 308 numBounties = numBounties + 1 |
283 info.index = index | 309 info.index = index |
284 info.complete = IsQuestComplete(info.questID) | 310 info.complete = IsQuestComplete(info.questID) |
285 if not info.complete then | 311 if not info.complete then |
286 db.BountiesByFactionID[info.factionID] = info | 312 db.BountiesByFactionID[info.factionID] = info |
313 db.BountiesByQuestID[info.questID] = info | |
287 if index == selectedBountyIndex then | 314 if index == selectedBountyIndex then |
288 db.selectedBounty = info | 315 db.selectedBounty = info |
289 selectedBountyQuestID = info.questID | 316 selectedBountyQuestID = info.questID |
290 end | 317 end |
291 print(' ', index, info.factionID, GetQuestLogTitle(GetQuestLogIndexByID(info.questID)), info.complete, (index == selectedBountyIndex) and 'SELECTED' or '') | 318 print(' ', index, info.factionID, GetQuestLogTitle(GetQuestLogIndexByID(info.questID)), info.complete, (index == selectedBountyIndex) and 'SELECTED' or '') |
292 bountyQuests[info.questID] = info | 319 end |
293 end | |
294 end | |
295 end | 320 end |
296 bountiesDirty = nil | 321 bountiesDirty = nil |
297 end | |
298 | |
299 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen) | |
300 if isNewMap then | |
301 print('|cFF00FF88OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap) | |
302 if isMapOpen then | |
303 self:Refresh(true) | |
304 else | |
305 self.isStale = true | |
306 end | |
307 else | |
308 | |
309 rprint('|cFFFFFF00'..self:GetName()..':OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap) | |
310 end | |
311 end | 322 end |
312 | 323 |
313 | 324 |
314 local totalPins = 0 | 325 local totalPins = 0 |
315 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation | 326 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation |
334 totalPins = totalPins + 1 | 345 totalPins = totalPins + 1 |
335 local name = 'WorldPlanQuestMarker' .. numOverlays | 346 local name = 'WorldPlanQuestMarker' .. numOverlays |
336 --print('|cFF00FF00Creating', name) | 347 --print('|cFF00FF00Creating', name) |
337 pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin') | 348 pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin') |
338 | 349 |
350 pin:SetID(totalPins) | |
339 pin:SetFrameStrata('HIGH') | 351 pin:SetFrameStrata('HIGH') |
340 pin.GetTypeInfo = function(frame, typeID) | |
341 return self:GetTypeInfo(typeID) | |
342 end | |
343 pin:SetID(totalPins) | |
344 numOverlays = numOverlays + 1 | 352 numOverlays = numOverlays + 1 |
345 --pin.iconBorder:SetVertexColor(0,0,0,1) | 353 --pin.iconBorder:SetVertexColor(0,0,0,1) |
346 end | 354 end |
347 pin.questID = questID | 355 pin.questID = questID |
348 pin.worldQuest = true | 356 pin.worldQuest = true |
349 pin.throttle = 1 | 357 pin.throttle = pin.updateRate |
350 pin.isNew = true | 358 pin.isNew = true |
351 pin.currentWidth = nil | 359 pin.currentWidth = nil |
352 db.QuestsByID[questID] = pin | 360 db.QuestsByID[questID] = pin |
353 tinsert(db.UsedPins, pin) | 361 tinsert(db.UsedPins, pin) |
362 | |
354 end | 363 end |
355 | 364 |
356 if pin and info then | 365 if pin and info then |
357 pin.inProgress = info.inProgress | 366 pin.inProgress = info.inProgress |
358 pin.floor = info.floor | 367 pin.floor = info.floor |
359 pin.numObjectives = info.numObjectives or 0 | 368 pin.numObjectives = info.numObjectives or 0 |
360 if info.x and info.y then | 369 if info.x and info.y then |
361 pin.x = info.x or pin.x | 370 if (info.x ~= pin.x) or (info.y ~= pin.y) then |
362 pin.y = info.y or pin.y | 371 pin.isStale = true |
363 --rprint('|cFFFF4400coords|r', info.x, info.y) | 372 --rprint('|cFFFF4400SetCoords|r', info.x, info.y) |
364 end | 373 end |
365 end | 374 |
375 end | |
376 end | |
377 | |
378 pin.x = info.x or pin.x | |
379 pin.y = info.y or pin.y | |
380 | |
381 if not HaveQuestData(questID) then | |
382 TQ_RequestPreloadRewardData(questID); | |
383 end | |
384 | |
366 | 385 |
367 if (not pin.dataLoaded) then | 386 if (not pin.dataLoaded) then |
368 local dataLoaded = pin:GetData() | 387 local dataLoaded = pin:GetData() |
369 isDataLoaded = (isDataLoaded and dataLoaded) | 388 isDataLoaded = (isDataLoaded and dataLoaded) |
370 WorldPlan.dataFlush = true | 389 WorldPlan.dataFlush = true |
371 end | 390 end |
372 | 391 |
373 | 392 |
374 pin.isActive = TQ_IsActive(questID) | 393 pin.isActive = TQ_IsActive(questID) |
394 pin:GetCriteriaState() | |
375 pin:CheckFilterRules() | 395 pin:CheckFilterRules() |
376 rprint(pin:GetID(), pin.filtered, pin.used) | 396 --rprint(pin:GetID(), pin.filtered, pin.used) |
377 | 397 |
378 return pin | 398 return pin |
379 end | 399 end |
380 | 400 |
381 -- remove from index and add it to the recycling heap | 401 -- remove from index and add it to the recycling heap |
384 local id = pin.questID | 404 local id = pin.questID |
385 if id then | 405 if id then |
386 db.QuestsByID[id] = nil | 406 db.QuestsByID[id] = nil |
387 | 407 |
388 for i, zone in pairs(db.QuestsByZone) do | 408 for i, zone in pairs(db.QuestsByZone) do |
389 print('-', i, zone[i]) | 409 --print('-', i, zone[i]) |
390 zone[id] = nil | 410 zone[id] = nil |
391 end | 411 end |
392 db.TasksByID[id] = nil | 412 db.TasksByID[id] = nil |
393 end | 413 end |
394 pin.isActive = nil | 414 pin.isActive = nil |
395 pin.dataLoaded = nil | 415 pin.dataLoaded = nil |
396 pin:HideFrames() | 416 pin:HideFrames() |
397 tinsert(db.FreePins, pin) | 417 tinsert(db.FreePins, pin) |
398 | 418 |
399 WorldPlan.dataFlush = true | 419 WorldPlan.dataFlush = true |
400 print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title) | 420 --print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title) |
401 end | 421 end |
402 | 422 |
403 -- re-anchors and scales pins that have had either of these changed due to data loading delays | 423 -- re-anchors and scales pins that have had either of these changed due to data loading delays |
404 function Module:RefreshIfQueued() | 424 function Module:UpdateNext() |
405 print('|cFF00FF88RefreshIfQueued()') | 425 --print('|cFF00FF88UpdateNext()') |
406 local pin = tremove(db.UpdatedPins) | 426 local pin = tremove(db.UpdatedPins) |
407 while pin do | |
408 pin:CheckFilterRules() | 427 pin:CheckFilterRules() |
409 | 428 |
410 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] | 429 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] |
411 print(pin.title, pin.dataLoaded and not pin.filtered, scaleFactor) | 430 --print(pin.title, pin.dataLoaded and not pin.filtered, scaleFactor) |
412 if pin.used then | 431 if pin.used then |
413 pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor) | 432 pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor) |
414 if pin.isNew then | 433 pin:OnShow() |
415 pin:OnShow() | 434 end |
416 end | 435 |
417 end | 436 |
418 | 437 end |
419 pin = tremove(db.UpdatedPins) | 438 |
420 | 439 function Module:Debug(...) |
421 end | 440 print(...) |
422 end | 441 end |
423 | |
424 | 442 |
425 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF' | 443 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF' |
444 local lastRefresh | |
426 function Module:Refresh(...) | 445 function Module:Refresh(...) |
427 | 446 -- |
428 rprint(msg, ...) | 447 |
429 if not self:IsVisible() then | 448 if not self:IsVisible() then |
430 rprint('|cFF00FF88WorldQuests:Refresh()|r', ...) | 449 print('|cFFFF4400Refresh()|r', ...) |
431 self.isStale = true | 450 --layoutDirty = true |
432 return self:MarkAllPins() | 451 return |
433 else | 452 else |
434 rprint('|cFF00FF88WorldQuests:Refresh()|r', ...) | 453 -- |
435 print('|cFF00FF88WorldQuests:Refresh()|r', ...) | 454 if lastRefresh == GetTime() then |
455 print('|cFFFF4400multiple refreshes tried') | |
456 end | |
457 lastRefresh = GetTime() | |
458 --rprint(msg, ...) | |
459 print(msg, lastRefresh, ...) | |
436 end | 460 end |
437 | 461 |
438 if not db.Config.EnablePins then | 462 if not db.Config.EnablePins then |
439 numShown = 0 | 463 numShown = 0 |
440 return | 464 return |
441 end | 465 end |
442 wprint(' '..msg) | 466 --wprint(' '..msg) |
443 | 467 |
444 scaleConstant = db.isContinentMap and 2 or 3 | 468 scaleConstant = db.isContinentMap and 2 or 3 |
445 canTargetQuests = SpellCanTargetQuest() | 469 canTargetQuests = SpellCanTargetQuest() |
446 | 470 |
447 for index, pin in pairs(db.QuestsByID) do | 471 for index, pin in pairs(db.QuestsByID) do |
448 pin.used = nil | 472 pin.used = nil |
449 end | 473 end |
450 | 474 |
451 self:UpdateAnchors() | 475 self:UpdateAnchors() |
476 --[[ | |
452 if bountiesDirty then | 477 if bountiesDirty then |
453 print(' bounties dirty, pushing that') | 478 --print(' bounties dirty, pushing that') |
454 self:UpdateBounties() | 479 self:UpdateBounties() |
455 end | 480 end |
481 --]] | |
456 | 482 |
457 | 483 |
458 -- calculate quests shown | 484 -- calculate quests shown |
459 numShown = 0 | 485 numShown = 0 |
460 numLoaded = 0 | 486 numLoaded = 0 |
461 for questID, pin in pairs(db.QuestsByID) do | 487 for questID, pin in pairs(db.QuestsByID) do |
462 local oV = pin:IsShown() | 488 local oV = pin:IsShown() |
463 if pin.used then | 489 if pin.used then |
464 pin.throttle = 1 | 490 pin.throttle = 1 |
491 --[[ | |
465 if oV == false then | 492 if oV == false then |
466 rprint('|cFF00FF00cleanup +|r', questID, pin.title) | 493 --rprint('|cFF00FF00cleanup +|r', questID, pin.title) |
467 end | 494 end |
495 --]] | |
468 pin:SetShown(true) | 496 pin:SetShown(true) |
469 numShown = numShown + 1 | 497 numShown = numShown + 1 |
470 if pin.dataLoaded then | 498 if pin.dataLoaded then |
471 numLoaded = numLoaded + 1 | 499 numLoaded = numLoaded + 1 |
472 end | 500 end |
473 | 501 |
474 else | 502 else |
503 --[[ | |
475 if oV == true then | 504 if oV == true then |
476 rprint('|cFFFF4400 -|r', questID, pin.title) | 505 rprint('|cFFFF4400 -|r', questID, pin.title) |
477 end | 506 end |
507 --]] | |
478 pin.hideReason = "Not used in map area " .. (db.currentMapID) | 508 pin.hideReason = "Not used in map area " .. (db.currentMapID) |
479 pin:HideFrames() | 509 pin:SetShown(false) |
480 end | 510 end |
481 end | 511 end |
482 | 512 |
483 | 513 |
484 | 514 --print('flags ', layoutDirty, self.isStale) |
485 print(' ', numShown, 'shown,', numLoaded, 'with data') | 515 --print(' ', numShown, 'shown,', numLoaded, 'with data') |
486 if numShown > numLoaded then | 516 if numShown > numLoaded then |
487 self.Status:Show() | 517 self.Status:Show() |
488 end | 518 end |
489 | 519 |
520 -- | |
521 if layoutDirty or self.isStale then | |
522 | |
523 self.refreshBenchMark = GetTime() | |
524 self.refreshBenchMarkTicker = 2 | |
525 print('starting bench', self.refreshBenchMark) | |
526 end | |
527 -- | |
490 | 528 |
491 layoutDirty = nil | 529 layoutDirty = nil |
492 self.isStale = nil | 530 self.isStale = nil |
493 self.sizesDirty = nil | 531 self.sizesDirty = nil |
494 self.isZoomDirty = nil | 532 self.isZoomDirty = nil |
533 | |
495 end | 534 end |
496 | 535 |
497 local refreshReason | 536 local refreshReason |
498 function Module:RefreshIfChanged() | 537 function Module:RefreshIfChanged(event) |
499 local scaleCheck = WorldMapDetailFrame:GetScale() | 538 local scaleCheck = WorldMapDetailFrame:GetScale() |
500 refreshReason = nil | 539 refreshReason = nil |
501 if scaleCheck ~= currentScale then | 540 if scaleCheck ~= currentScale then |
502 refreshReason = 'map scale updated' | 541 refreshReason = 'map scale updated' |
503 self:Refresh('WORLD_MAP_SCALE_CHANGED') | |
504 currentScale = scaleCheck | 542 currentScale = scaleCheck |
543 layoutDirty = true | |
505 elseif self.isStale or layoutDirty then | 544 elseif self.isStale or layoutDirty then |
506 refreshReason = 'layout is marked dirty' | 545 refreshReason = 'layout is marked dirty' |
507 end | 546 end |
508 if not refreshReason then | 547 if not refreshReason then |
509 return | 548 return |
510 end | 549 end |
511 | 550 |
512 | 551 |
513 if self:IsVisible() then | 552 if self:IsVisible() then |
514 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) | 553 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) |
515 self:Refresh('WORLDMAP_QUEUED') | 554 self:Refresh(event) |
516 else | 555 else |
517 rprint('|cFF00FFFFRefreshIfChanged()|r flagging for later refresh', refreshReason) | 556 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) |
518 self.isStale = true | 557 self.isStale = true |
519 end | 558 end |
520 end | 559 end |
521 | 560 |
522 -- update visibility states of all pins | 561 -- update visibility states of all pins |
523 function Module:MarkAllPins(pins) | 562 function Module:MarkAllPins(pins) |
524 print(' |cFFFFFF00'..self:GetName()..':MarkAllPins()|r', pins) | 563 --print(' |cFFFFFF00'..self:GetName()..':MarkAllPins()|r', pins) |
525 pins = pins or db.QuestsByID | 564 pins = pins or db.QuestsByID |
526 for questID, pin in pairs(pins) do | 565 for questID, pin in pairs(pins) do |
527 pin.isStale = true | 566 pin.isStale = true |
528 rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) | 567 --rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) |
529 end | |
530 end | |
531 | |
532 function Module:UpdateQuestButton(info, mapID) | |
533 local questID, x, y = info.questId, info.x, info.y | |
534 local pin = self:AcquirePin(info) | |
535 if not pin then | |
536 return | |
537 end | |
538 | |
539 | |
540 local doUpdate = pin:GetCriteriaState() or pin.isStale | |
541 --print(' |- ', pin.questID, pin.title) | |
542 rprint('|cFF00FF00update|r', pin.questID, pin.title) | |
543 | |
544 print(doUpdate) | |
545 | |
546 if x and y then | |
547 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] | |
548 pin:SetFrameLevel(PinBaseIndex+pin:GetID()) | |
549 pin.owningFrame = WorldMapFrame | |
550 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor) | |
551 doUpdate = true | |
552 --tinsert(self.UsedPositions, pin) | |
553 end | |
554 | |
555 if doUpdate then | |
556 print(' changed', pin.title, pin.isCriteria, pin.isBounty, pin.scaleFactor) | |
557 if pin:IsVisible() then | |
558 --numUpdated = numUpdated + 1 | |
559 pin:Refresh('WORLDMAP_REFRESH') | |
560 else | |
561 --numHidden = numHidden + 1 | |
562 pin.isStale = true | |
563 end | |
564 end | |
565 | |
566 if mapID then | |
567 if not db.QuestsByZone[mapID] then | |
568 db.QuestsByZone[mapID] = {} | |
569 end | |
570 db.QuestsByZone[mapID][questID] = pin | |
571 end | 568 end |
572 end | 569 end |
573 | 570 |
574 -- Updates quest markers in taskInfo while associating them with the given map | 571 -- Updates quest markers in taskInfo while associating them with the given map |
575 function Module:UpdateQuestsForMap(taskInfo, mapID) | 572 function Module:UpdateQuestsForMap(taskInfo, mapID) |
576 rprint('Map', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID)) | 573 if mapID then |
574 db.QuestsByZone[mapID] = db.QuestsByZone[mapID] or {} | |
575 wipe(db.QuestsByZone[mapID]) | |
576 end | |
577 print('UpdateQuestsForMap()', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID), layoutDirty) | |
577 for index, info in pairs(taskInfo) do | 578 for index, info in pairs(taskInfo) do |
578 self:UpdateQuestButton(info, mapID) | 579 |
580 local questID, x, y = info.questId, info.x, info.y | |
581 local pin = self:AcquirePin(info) | |
582 if pin then | |
583 print(pin.title, pin.isStale) | |
584 if pin:IsShown() and (layoutDirty or pin.isStale) then | |
585 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] | |
586 pin.owningFrame = WorldMapFrame | |
587 pin:SetFrameLevel(PinBaseIndex+pin:GetID()) | |
588 pin.Overlay:SetFrameLevel(overlayBaseIndex+pin:GetID()) | |
589 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor) | |
590 if pin.isStale then | |
591 pin:Refresh('WORLDMAP_REFRESH ' .. GetTime()) | |
592 end | |
593 if mapID then | |
594 db.QuestsByZone[mapID][questID] = pin | |
595 end | |
596 else | |
597 if layoutDirty then | |
598 pin.isStale = true | |
599 end | |
600 end | |
601 | |
602 | |
603 end | |
579 end | 604 end |
580 end | 605 end |
581 | 606 |
582 -- Used to refresh the visible quest markers | 607 -- Used to refresh the visible quest markers |
583 function Module:UpdateAnchors () | 608 function Module:UpdateAnchors () |
589 self.hostWidth, self.hostHeight = hostWidth, hostHeight | 614 self.hostWidth, self.hostHeight = hostWidth, hostHeight |
590 layoutDirty = true | 615 layoutDirty = true |
591 end | 616 end |
592 | 617 |
593 | 618 |
594 rprint('|cFF00FF00'..self:GetName()..':UpdateAnchors()') | 619 --rprint('|cFF00FF00'..self:GetName()..':UpdateAnchors()') |
595 local mapFileName, textureHeight, textureWidth, isMicroDungeon, microDungeonMapName = GetMapInfo() | 620 local mapFileName, textureHeight, textureWidth, isMicroDungeon, microDungeonMapName = GetMapInfo() |
596 if isMicroDungeon then | 621 if isMicroDungeon then |
597 return | 622 return |
598 end | 623 end |
599 | 624 |
616 | 641 |
617 function ToggleButton:OnShow() | 642 function ToggleButton:OnShow() |
618 self:SetChecked(db.Config.EnablePins and true or false) | 643 self:SetChecked(db.Config.EnablePins and true or false) |
619 end | 644 end |
620 function ToggleButton:OnClick() | 645 function ToggleButton:OnClick() |
621 print(self:GetChecked()) | 646 --print(self:GetChecked()) |
622 db.Config.EnablePins = self:GetChecked() | 647 db.Config.EnablePins = self:GetChecked() |
623 _G.WorldPlan:OnConfigUpdate() | 648 _G.WorldPlan:OnConfigUpdate() |
624 end | 649 end |