Mercurial > wow > worldplan
comparison WorldMap.lua @ 109:caa482329919
POI optimization
author | Nenue |
---|---|
date | Mon, 10 Jul 2017 18:34:11 -0400 |
parents | WorldQuests.lua@b67ba1078824 |
children | f6ef9a9f5476 |
comparison
equal
deleted
inserted
replaced
108:b67ba1078824 | 109:caa482329919 |
---|---|
1 -- WorldPlan | |
2 -- WorldMap.lua | |
3 -- Created: 11/2/2016 3:40 PM | |
4 -- %file-revision% | |
5 | |
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 nop | |
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 nop | |
10 local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or nop | |
11 local _, db = ... | |
12 local Module = { | |
13 UsedPositions = {}, | |
14 } | |
15 WorldPlanMapMixin = Module | |
16 | |
17 local _G = _G | |
18 local type, tostring, tonumber, pairs, ipairs = type, tostring, tonumber, pairs, ipairs | |
19 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo | |
20 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented | |
21 local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID | |
22 local TQ_IsActive = C_TaskQuest.IsActive | |
23 local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData | |
24 local pairs, ipairs, tinsert, tremove, wipe = pairs, ipairs, tinsert, tremove, table.wipe | |
25 local GetTaskInfo, GetTasksTable, HaveQuestData = GetTaskInfo, GetTasksTable, HaveQuestData | |
26 local GetTime = GetTime | |
27 local SpellCanTargetQuest, IsQuestIDValidSpellTarget = SpellCanTargetQuest, IsQuestIDValidSpellTarget | |
28 local tonumber, abs = tonumber, math.abs | |
29 local GetQuestLogRewardInfo = GetQuestLogRewardInfo | |
30 local GetCurrentMapAreaID, GetMapInfo, GetMapNameByID = GetCurrentMapAreaID, GetMapInfo, GetMapNameByID | |
31 local GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID, IsQuestComplete = GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID, IsQuestComplete | |
32 local HaveQuestRewardData = HaveQuestRewardData | |
33 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation | |
34 local InCombatLockdown, hooksecurefunc = InCombatLockdown, hooksecurefunc | |
35 | |
36 local ToggleButton = {} | |
37 local BROKEN_ISLES_ID, DALARAN_ID, AZSUNA_ID, VALSHARAH_ID, HIGHMOUNTAIN_ID, STORMHEIM_ID, SURAMAR_ID, EOA_ID = 1007, 1014, 1015,1018, 1024, 1017, 1033, 1096 | |
38 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", | |
39 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } | |
40 | |
41 local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD | |
42 local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER | |
43 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT | |
44 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES | |
45 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS | |
46 local SCALE_FACTORS = { 0.25, 0.7, 1 } | |
47 | |
48 local BountyBoard = WorldMapFrame.UIElementsFrame.BountyBoard | |
49 local ActionButton = WorldMapFrame.UIElementsFrame.ActionButton | |
50 local defaults = {} | |
51 local completedQuests = {} | |
52 | |
53 local continentScanned | |
54 local layoutDirty = true | |
55 local bountiesDirty = true | |
56 local artifactPowerDirty = true | |
57 local hooksDirty = true | |
58 local currentScale = WorldMapDetailFrame:GetScale() | |
59 local canTargetQuests | |
60 local isDataLoaded = true | |
61 local artifactKnowledgeLevel | |
62 local superTrackedQuestID | |
63 local lastRefresh | |
64 local refreshReason | |
65 | |
66 local bountyQuests = {} | |
67 local bountyInfo = {} | |
68 local bountyDisplayLocation, bountyLockedQuestID, selectedBountyIndex, selectedBountyQuestID | |
69 | |
70 local totalPins = 0 | |
71 local numShown = 0 | |
72 local numLoaded = 0 | |
73 local numOverlays = 1 | |
74 local scaleConstant = 1 | |
75 local pinBaseIndex = 1550 | |
76 local overlayBaseIndex = 1600 | |
77 | |
78 local artifactKnowldegeSpells = { | |
79 [207856] = true, | |
80 [209203] = true, | |
81 [209204] = true, | |
82 [209205] = true, | |
83 [209206] = true, | |
84 [209207] = true, | |
85 [209208] = true, | |
86 [209209] = true, | |
87 [209210] = true, | |
88 [209211] = true, | |
89 [209212] = true, | |
90 [219978] = true, | |
91 [227852] = true, | |
92 [236477] = true, | |
93 [236489] = true, | |
94 [236302] = true, | |
95 [236488] = true, | |
96 [236490] = true, | |
97 [240475] = true, | |
98 [243176] = true, | |
99 [243177] = true, | |
100 [243178] = true, | |
101 [243182] = true, | |
102 [243183] = true, | |
103 [243187] = true, | |
104 [245133] = true, | |
105 } | |
106 | |
107 --%debug% | |
108 local SetTimedCallbackForAllPins = function(seconds, callback) | |
109 C_Timer.After(seconds, function() | |
110 for id, pin in pairs(WorldPlanQuests.QuestsByID) do | |
111 callback(pin) | |
112 end | |
113 end) | |
114 end | |
115 | |
116 function Module:OnLoad() | |
117 --print('|cFFFF4400'..self:GetName()..':OnLoad()') | |
118 | |
119 self:SetParent(WorldMapFrame.UIElementsFrame) | |
120 WorldPlan:AddHandler(self, defaults) | |
121 | |
122 for areaID, fileName in pairs(WORLD_QUEST_MAPS) do | |
123 db.QuestsByZone[areaID] = {} | |
124 end | |
125 | |
126 -- WORLD_MAP_UPDATE and PLAYER_ENTERING_WORLD are passed down from a higher level | |
127 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') | |
128 self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED') | |
129 self:RegisterEvent('SKILL_LINES_CHANGED') | |
130 self:RegisterEvent('ARTIFACT_UPDATE') | |
131 self:RegisterEvent('QUEST_LOG_UPDATE') | |
132 self:RegisterEvent('UNIT_SPELLCAST_STOP') | |
133 end | |
134 | |
135 function Module:OnEvent (event, ...) | |
136 print('|cFFFFFF00OnEvent() '..event..'|r', GetTime(), ...) | |
137 if (event == 'QUEST_LOG_UPDATE') then | |
138 self:UpdateBounties(event) | |
139 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then | |
140 local questID = ... | |
141 if questID and db.QuestsByID[questID] then | |
142 completedQuests[questID] = true | |
143 db.QuestsByID[questID]:Release() | |
144 end | |
145 self:Refresh(event) | |
146 elseif event == 'SKILL_LINES_CHANGED' or event == 'CURRENT_SPELL_CAST_CHANGED' then | |
147 self:Refresh(event) | |
148 elseif event == 'ARTIFACT_UPDATE' then | |
149 self:UpdateArtifactPower() | |
150 elseif event == 'MODIFIER_STATE_CHANGED' then | |
151 self:UpdateModifierState() | |
152 elseif event == 'SUPER_TRACKED_QUEST_CHANGED' then | |
153 if superTrackedQuestID and db.QuestsByID[superTrackedQuestID] then | |
154 db.QuestsByID[superTrackedQuestID].isStale = true | |
155 end | |
156 local newID = GetSuperTrackedQuestID() | |
157 if newID and db.QuestsByID[newID] then | |
158 db.QuestsByID[newID].isStale = true | |
159 end | |
160 elseif event == 'UNIT_SPELLCAST_STOP' then | |
161 local name, _, _, _, spellID = ... | |
162 if artifactKnowldegeSpells[spellID] then | |
163 db.log('AK spellcast ended ' .. tostring(name) .. ' ('.. tostring(spellID)..')') | |
164 self:UpdateArtifactPower() | |
165 end | |
166 end | |
167 end | |
168 | |
169 function Module:OnUpdate(sinceLast) | |
170 if WorldPlanData.DebugEnabled then | |
171 if self.refreshBenchMarkTicker then | |
172 --print(self.refreshBenchMarkTicker) | |
173 self.refreshBenchMarkTicker = self.refreshBenchMarkTicker - 1 | |
174 | |
175 if self.refreshBenchMarkTicker == 0 then | |
176 | |
177 self.refreshTime = floor((GetTime() - self.refreshBenchMark) * 1000) | |
178 self.debugMessage:SetText(self.refreshTime) | |
179 self.refreshBenchMarkTicker = nil | |
180 end | |
181 else | |
182 self.refreshBenchMark = GetTime() | |
183 end | |
184 end | |
185 | |
186 if self.filtersDirty or self.isStale then | |
187 self:Refresh() | |
188 end | |
189 | |
190 if #db.UpdatedPins >= 1 then | |
191 --print('|cFF00FF88pending update', #db.UpdatedPins) | |
192 self:UpdateNext() | |
193 end | |
194 end | |
195 | |
196 local callbacks = {} | |
197 callbacks.ClickWorldMapActionButton = function(WorldQuests) | |
198 WorldQuests:Refresh('CLICK_MAP_ACTION_BUTTON') | |
199 end | |
200 callbacks.WorldMap_UpdateQuestBonusObjectives = function(WorldQuests) | |
201 WorldQuests:UpdateTaskPOIs() | |
202 end | |
203 callbacks.WorldMapFrame_UpdateMap = function(WorldQuests) | |
204 WorldQuests:RefreshIfChanged('WMF_UPDATE') | |
205 end | |
206 callbacks.WorldMapScrollFrame_ReanchorQuestPOIs = function (WorldQuests) | |
207 WorldQuests:RefreshIfChanged('WMF_REANCHOR') | |
208 end | |
209 | |
210 callbacks[BountyBoard] = {} | |
211 callbacks[BountyBoard].SetSelectedBountyIndex = function(WorldQuests) | |
212 WorldQuests:UpdateBounties('BOUNTY_SELECTED') | |
213 for questID, pin in pairs(db.QuestsByID) do | |
214 pin.checkCriteria = true | |
215 pin:Refresh() | |
216 end | |
217 end | |
218 | |
219 callbacks[ActionButton] = {} | |
220 callbacks[ActionButton].UpdateCastingState = function(WorldQuests) | |
221 for questID, pin in pairs(db.QuestsByID) do | |
222 pin.checkCursor = true | |
223 pin:Refresh() | |
224 end | |
225 end | |
226 | |
227 callbacks.UseWorldMapActionButtonSpellOnQuest = function(questID) | |
228 local pin = db.QuestsByID[questID] | |
229 -- calling this implies that the pin is used in some way | |
230 if pin then | |
231 db.log(pin.title .. ' completed by spell?', IsQuestComplete(pin.questID)) | |
232 pin:OnFilters() | |
233 pin.isStale = true | |
234 end | |
235 end | |
236 | |
237 function Module:SetupCallbacks() | |
238 if InCombatLockdown() then | |
239 return true | |
240 end | |
241 print('SetupCallbacks()') | |
242 for target, arg in pairs(callbacks) do | |
243 --print(type(target)) | |
244 if type(target) == 'table' then | |
245 local callerName = target:GetName() or tostring(target) | |
246 for name, method in pairs(arg) do | |
247 --print(callerName, arg) | |
248 hooksecurefunc(target, name, function(...) | |
249 self:OnSecureHook(callerName .. '.' .. name, method, ...) | |
250 end) | |
251 end | |
252 else | |
253 hooksecurefunc(target, function(...) | |
254 self:OnSecureHook(target, arg, ...) | |
255 end) | |
256 end | |
257 end | |
258 end | |
259 | |
260 function Module:Setup() | |
261 --print('|cFFFF4400'..self:GetName()..':Setup()') | |
262 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do | |
263 db.QuestsByZone[mapID] = {} | |
264 end | |
265 | |
266 hooksDirty = self:SetupCallbacks() | |
267 | |
268 self:SetAllPoints(WorldMapFrame.UIElementsFrame) | |
269 self:UpdateArtifactPower() | |
270 self:UpdateBounties('SETUP') | |
271 self:Show() | |
272 end | |
273 | |
274 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen) | |
275 if isNewMap or self.isStale then | |
276 print('|cFF0088FFOnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap) | |
277 layoutDirty = true | |
278 self:Refresh('WORLD_MAP_CHANGED') | |
279 end | |
280 end | |
281 | |
282 function Module:OnConfigUpdate() | |
283 --print('|cFFFFFF00OnConfigUpdate()|r') | |
284 if db.Config.FadeWhileGrouped then | |
285 db.PinAlpha = 0.15 | |
286 else | |
287 db.PinAlpha = 1 | |
288 end | |
289 | |
290 if not db.Config.EnablePins then | |
291 for _, pin in pairs(db.QuestsByID) do | |
292 pin:SetShown(false) | |
293 end | |
294 end | |
295 end | |
296 | |
297 function Module:OnSecureHook(callbackName, func, ...) | |
298 print('|cFFFF4400'..callbackName..'|r', ...) | |
299 func(self, ...) | |
300 end | |
301 | |
302 function Module:UpdateModifierState() | |
303 | |
304 end | |
305 | |
306 function Module:UpdateTaskPOIs() | |
307 canTargetQuests = SpellCanTargetQuest() | |
308 for i = 1, NUM_WORLDMAP_TASK_POIS do | |
309 local poiFrame = _G['WorldMapFrameTaskPOI'..i] | |
310 if poiFrame and poiFrame.worldQuest then | |
311 local pin = db.QuestsByID[poiFrame.questID] | |
312 if pin and pin.used and canTargetQuests and IsQuestIDValidSpellTarget(pin.questID) then | |
313 poiFrame:Show() | |
314 else | |
315 poiFrame:Hide() | |
316 end | |
317 end | |
318 end | |
319 end | |
320 -- re-anchors and scales pins that have had either of these changed due to data loading delays | |
321 function Module:UpdateNext() | |
322 --print('|cFF00FF88UpdateNext()') | |
323 local pin = tremove(db.UpdatedPins) | |
324 pin:OnFilters() | |
325 | |
326 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] | |
327 --print(pin.title, pin.dataLoaded and not pin.filtered, scaleFactor) | |
328 if pin.used then | |
329 pin:SetShown(true) | |
330 pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor) | |
331 pin:Refresh() | |
332 else | |
333 print('|cFFFF4400flagging queued pin that got hidden:', pin.title) | |
334 pin.isStale = true | |
335 end | |
336 end | |
337 | |
338 function Module:UpdateBounties(...) | |
339 bountiesDirty = nil | |
340 print('|cFF00FF88BountyInfo()|r', ...) | |
341 wipe(db.BountiesByFactionID) | |
342 wipe(db.BountiesByQuestID) | |
343 | |
344 db.selectedBounty = nil | |
345 selectedBountyIndex = BountyBoard:GetSelectedBountyIndex() | |
346 db.Bounties, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, db.Bounties) | |
347 local numBounties = 0 | |
348 for index, info in ipairs(db.Bounties) do | |
349 numBounties = numBounties + 1 | |
350 info.index = index | |
351 info.complete = IsQuestComplete(info.questID) | |
352 if not info.complete then | |
353 db.BountiesByFactionID[info.factionID] = info | |
354 db.BountiesByQuestID[info.questID] = info | |
355 if index == selectedBountyIndex then | |
356 db.selectedBounty = info | |
357 selectedBountyQuestID = info.questID | |
358 end | |
359 print(' ', index, info.factionID, GetQuestLogTitle(GetQuestLogIndexByID(info.questID)), info.complete, (index == selectedBountyIndex) and 'SELECTED' or '') | |
360 end | |
361 end | |
362 end | |
363 | |
364 -- check current artifact knowledge and update pins accordingly | |
365 function Module:UpdateArtifactPower(overrideLevel) | |
366 if InCombatLockdown() then | |
367 artifactPowerDirty = true | |
368 return | |
369 end | |
370 | |
371 print('|cFF00FF88UpdateArtifactPower()|r') | |
372 local _, akLevel = GetCurrencyInfo(1171) | |
373 if overrideLevel then | |
374 akLevel = overrideLevel | |
375 end | |
376 | |
377 --db.print('current AK', akLevel) | |
378 if akLevel and (akLevel ~= artifactKnowledgeLevel) or (not artifactKnowledgeLevel) then | |
379 --print('new ak level', akLevel) | |
380 db.log('AK update ' .. tostring(artifactKnowledgeLevel) .. ' to '.. tostring(akLevel)) | |
381 for _, pin in pairs(db.QuestsByID) do | |
382 if (pin.rewardType == REWARD_ARTIFACT_POWER) then | |
383 print(pin.title, pin.itemNumber) | |
384 local newAP = pin:UpdateArtifactPower() | |
385 if newAP then | |
386 pin.itemNumber = newAP | |
387 print(newAP) | |
388 else | |
389 pin.dataLoaded = nil | |
390 end | |
391 pin.isStale = true | |
392 end | |
393 end | |
394 artifactKnowledgeLevel = akLevel | |
395 end | |
396 artifactPowerDirty = nil | |
397 end | |
398 | |
399 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF' | |
400 function Module:Refresh(...) | |
401 | |
402 if hooksDirty then | |
403 hooksDirty = self:SetupCallbacks() | |
404 end | |
405 | |
406 | |
407 if not self:IsVisible() then | |
408 print('|cFFFF4400Refresh()|r', ...) | |
409 return | |
410 else | |
411 if lastRefresh == GetTime() then | |
412 print('|cFFFF4400multiple refreshes tried') | |
413 end | |
414 lastRefresh = GetTime() | |
415 print(msg, lastRefresh, ...) | |
416 end | |
417 | |
418 | |
419 if bountiesDirty then | |
420 self:UpdateBounties() | |
421 end | |
422 | |
423 if not db.Config.EnablePins then | |
424 numShown = 0 | |
425 self.refreshBenchMark = GetTime() | |
426 self.refreshBenchMarkTicker = 2 | |
427 print('starting bench', self.refreshBenchMark) | |
428 return | |
429 end | |
430 | |
431 scaleConstant = db.isContinentMap and 2 or 3 | |
432 canTargetQuests = SpellCanTargetQuest() | |
433 | |
434 for index, pin in pairs(db.QuestsByID) do | |
435 pin.used = nil | |
436 end | |
437 | |
438 self:UpdateAnchors(...) | |
439 | |
440 if artifactPowerDirty and not InCombatLockdown() then | |
441 self:UpdateArtifactPower() | |
442 end | |
443 -- calculate quests shown | |
444 numShown = 0 | |
445 numLoaded = 0 | |
446 for questID, pin in pairs(db.QuestsByID) do | |
447 local oV = pin:IsShown() | |
448 if pin.used then | |
449 print('show', pin.title) | |
450 pin.throttle = 1 | |
451 pin:SetShown(true) | |
452 numShown = numShown + 1 | |
453 if pin.dataLoaded then | |
454 numLoaded = numLoaded + 1 | |
455 end | |
456 | |
457 pin.checkCriteria = true | |
458 pin.checkFilters = true | |
459 pin:Refresh('WORLDMAP_REFRESH ' .. GetTime()) | |
460 | |
461 else | |
462 if pin:IsShown() then | |
463 print('|cFFFF4400need to remove', pin.title) | |
464 | |
465 end | |
466 | |
467 pin.hideReason = "Not used in map area " .. (db.currentMapID) | |
468 pin:SetShown(false) | |
469 end | |
470 | |
471 end | |
472 | |
473 | |
474 -- | |
475 self.refreshBenchMark = GetTime() | |
476 self.refreshBenchMarkTicker = 2 | |
477 print('starting bench', self.refreshBenchMark) | |
478 | |
479 -- | |
480 | |
481 layoutDirty = nil | |
482 self.isStale = nil | |
483 self.sizesDirty = nil | |
484 self.isZoomDirty = nil | |
485 | |
486 if WorldPlanSummary then | |
487 WorldPlanSummary.isStale = true | |
488 end | |
489 | |
490 end | |
491 | |
492 function Module:RefreshIfChanged(event) | |
493 local scaleCheck = WorldMapDetailFrame:GetScale() | |
494 refreshReason = nil | |
495 if scaleCheck ~= currentScale then | |
496 refreshReason = 'map scale updated' | |
497 currentScale = scaleCheck | |
498 layoutDirty = true | |
499 elseif self.isStale or layoutDirty then | |
500 refreshReason = 'layout is marked dirty' | |
501 end | |
502 if not refreshReason then | |
503 return | |
504 end | |
505 | |
506 if self:IsVisible() then | |
507 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) | |
508 self:Refresh(event) | |
509 else | |
510 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) | |
511 self.isStale = true | |
512 end | |
513 end | |
514 | |
515 -- Walks the current map tree and fires updates as needed | |
516 function Module:UpdateAnchors (event) | |
517 wipe(self.UsedPositions) | |
518 local hostWidth, hostHeight = WorldMapPOIFrame:GetSize() | |
519 | |
520 if (hostWidth ~= self.hostWidth) or (hostHeight ~= self.hostHeight) then | |
521 self.hostWidth, self.hostHeight = hostWidth, hostHeight | |
522 layoutDirty = true | |
523 end | |
524 | |
525 print('|cFF00FF00UpdateAnchors()', event) | |
526 local mapFileName, textureHeight, textureWidth, isMicroDungeon, microDungeonMapName = GetMapInfo() | |
527 if isMicroDungeon then | |
528 return | |
529 end | |
530 | |
531 isDataLoaded = true | |
532 local taskInfo = TQ_GetQuestsForPlayerByMapID(db.currentMapID) | |
533 if taskInfo then | |
534 self:UpdateQuestsForMap(taskInfo, db.currentMapID) | |
535 end | |
536 local numZones = MC_GetNumZones(db.currentMapID) | |
537 if numZones then | |
538 for i = 1, numZones do | |
539 local mapAreaID = MC_GetZoneInfo(db.currentMapID, i) | |
540 local taskInfo = TQ_GetQuestsForPlayerByMapID(mapAreaID, db.currentMapID) | |
541 | |
542 db.QuestsByZone[mapAreaID] = db.QuestsByZone[mapAreaID] or {} | |
543 | |
544 if taskInfo then | |
545 self:UpdateQuestsForMap(taskInfo, mapAreaID) | |
546 end | |
547 end | |
548 end | |
549 end | |
550 | |
551 -- Attempt to display the pins for quests in taskInfo | |
552 function Module:UpdateQuestsForMap(taskInfo, mapID) | |
553 print('|cFF00FF00UpdateQuestsForMap()|r', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID), layoutDirty) | |
554 if db.QuestsByZone[mapID] then | |
555 wipe(db.QuestsByZone[mapID]) | |
556 elseif db.isBrokenIsle then | |
557 continentScanned = true | |
558 end | |
559 db.PinStrata = WorldMapFrame_InWindowedMode() and 'HIGH' or 'FULLSCREEN' | |
560 print('layoutDirty =',layoutDirty) | |
561 | |
562 for index, info in pairs(taskInfo) do | |
563 local questID, x, y = info.questId, info.x, info.y | |
564 local pin = self:AcquirePin(info) | |
565 if pin then | |
566 if pin.canShow then | |
567 pin.used = true | |
568 print('using', pin.title, (pin.owningFrame ~= WorldMapFrame)) | |
569 if layoutDirty or (pin.owningFrame ~= WorldMapFrame) then | |
570 local scaleFactor = SCALE_FACTORS[(not pin.filtered and scaleConstant) or 1] | |
571 pin.owningFrame = WorldMapFrame | |
572 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor) | |
573 | |
574 end | |
575 if db.QuestsByZone[mapID] then | |
576 db.QuestsByZone[mapID][questID] = pin | |
577 end | |
578 else | |
579 print('|cFFFF4400discarding|r', pin.title) | |
580 end | |
581 end | |
582 end | |
583 end | |
584 | |
585 -- locates or creates a corresponding pin frame for the provided TaskInfo data | |
586 function Module:AcquirePin (info) | |
587 local questID = info.questId | |
588 if not (questID and QuestUtils_IsQuestWorldQuest(questID)) then | |
589 return nil | |
590 end | |
591 local pin = db.QuestsByID[questID] | |
592 -- check to avoid creating unnecessary frames | |
593 if IsQuestComplete(questID) or completedQuests[questID] then | |
594 completedQuests[questID] = true | |
595 if pin then | |
596 pin:Release() | |
597 end | |
598 return nil | |
599 end | |
600 | |
601 if not pin then | |
602 local numFree = #db.FreePins | |
603 if numFree >= 1 then | |
604 pin = tremove(db.FreePins, numFree) | |
605 print('|cFF00FF00Acquire()|r Re-using', pin:GetName()) | |
606 else | |
607 totalPins = totalPins + 1 | |
608 local name = 'WorldPlanQuestMarker' .. numOverlays | |
609 print('|cFF00FF00Acquire()|r Creating', name) | |
610 pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin') | |
611 | |
612 pin:SetID(totalPins) | |
613 numOverlays = numOverlays + 1 | |
614 --pin.iconBorder:SetVertexColor(0,0,0,1) | |
615 end | |
616 pin.questID = questID | |
617 pin.throttle = pin.updateRate | |
618 pin.currentWidth = nil | |
619 | |
620 db.QuestsByID[questID] = pin | |
621 tinsert(db.UsedPins, pin) | |
622 end | |
623 | |
624 if info then | |
625 pin.inProgress = info.inProgress | |
626 pin.floor = info.floor | |
627 pin.numObjectives = info.numObjectives or 0 | |
628 if info.x and info.y then | |
629 if (info.x ~= pin.x) or (info.y ~= pin.y) then | |
630 pin.isStale = true | |
631 --rprint('|cFFFF4400SetCoords|r', info.x, info.y) | |
632 end | |
633 end | |
634 end | |
635 | |
636 pin.x = info.x or pin.x | |
637 pin.y = info.y or pin.y | |
638 | |
639 if not HaveQuestRewardData(questID) then | |
640 TQ_RequestPreloadRewardData(questID); | |
641 end | |
642 | |
643 if (not pin.dataLoaded) then | |
644 local dataLoaded = pin:GetData() | |
645 if dataLoaded then | |
646 WorldPlan.dataFlush = true | |
647 else | |
648 isDataLoaded = false | |
649 end | |
650 end | |
651 | |
652 pin:OnFilters() | |
653 pin.isActive = TQ_IsActive(questID) | |
654 --rprint(pin:GetID(), pin.filtered, pin.used) | |
655 return pin | |
656 end | |
657 | |
658 function Module:Debug(...) | |
659 print(...) | |
660 end |