annotate WorldQuests.lua @ 98:d594c5c4a4a3 v1.4.10

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