comparison WorldQuests.lua @ 73:25f7dbc20a72

fix WorldMapTooltip getting stranded when flightmap is closed - quests that are not valid spell targets will have their icon go red - auto-complete scrolls will no longer hide pin frames; instead they become click through and blizzard POIs are activated beneath for taint-free interaction
author Nenue
date Fri, 07 Apr 2017 07:20:28 -0400
parents 6db0b9696936
children 2ba11b25aa7f
comparison
equal deleted inserted replaced
72:6db0b9696936 73:25f7dbc20a72
130 self:UpdateBounties('SETUP') 130 self:UpdateBounties('SETUP')
131 131
132 self:Show() 132 self:Show()
133 end 133 end
134 callbacks.ClickWorldMapActionButton = function(WorldQuests) 134 callbacks.ClickWorldMapActionButton = function(WorldQuests)
135 WorldQuests:GetUsedPOIs() 135 WorldQuests:Refresh('CLICK_MAP_ACTION_BUTTON')
136 end 136 end
137 callbacks.WorldMap_UpdateQuestBonusObjectives = function(WorldQuests) 137 callbacks.WorldMap_UpdateQuestBonusObjectives = function(WorldQuests)
138 WorldQuests:GetUsedPOIs() 138 WorldQuests:UpdateTaskPOIs()
139 end 139 end
140 callbacks.WorldMapFrame_UpdateMap = function(WorldQuests) 140 callbacks.WorldMapFrame_UpdateMap = function(WorldQuests)
141 WorldQuests:RefreshIfChanged() 141 WorldQuests:RefreshIfChanged()
142 end 142 end
143 callbacks.WorldMapScrollFrame_ReanchorQuestPOIs = function (WorldQuests) 143 callbacks.WorldMapScrollFrame_ReanchorQuestPOIs = function (WorldQuests)
145 end 145 end
146 146
147 callbacks[BountyBoard] = {} 147 callbacks[BountyBoard] = {}
148 callbacks[BountyBoard].SetSelectedBountyIndex = function(WorldQuests) 148 callbacks[BountyBoard].SetSelectedBountyIndex = function(WorldQuests)
149 WorldQuests:UpdateBounties('BOUNTY_SELECTED') 149 WorldQuests:UpdateBounties('BOUNTY_SELECTED')
150 WorldQuests:RefreshIfChanged() 150 WorldQuests:Refresh('BOUNTY_SELECTED')
151 end 151 end
152 152
153 callbacks[ActionButton] = {} 153 callbacks[ActionButton] = {}
154 callbacks[ActionButton].UpdateCastingState = function(WorldQuests) 154 callbacks[ActionButton].UpdateCastingState = function(WorldQuests)
155 WorldQuests:Refresh(true) 155 WorldQuests:Refresh('CASTING_STATE_CHANGED')
156 end 156 end
157 157
158 function Module:OnConfigUpdate() 158 function Module:OnConfigUpdate()
159 print('|cFFFFFF00OnConfigUpdate()|r') 159 print('|cFFFFFF00OnConfigUpdate()|r')
160 if db.Config.FadeWhileGrouped then 160 if db.Config.FadeWhileGrouped then
172 ToggleButton.OnShow(self.Toggle) 172 ToggleButton.OnShow(self.Toggle)
173 end 173 end
174 174
175 local InternalHideButton = function(button, index) 175 local InternalHideButton = function(button, index)
176 button:Hide() 176 button:Hide()
177 if button.questID and db.QuestsByID[button.questID] then
178 if db.QuestsByID[button.questID].used and not db.QuestsByID[button.questID].filtered then
179 db.QuestsByID[button.questID]:SetShown(true)
180 end
181 end
182 end 177 end
183 local InternalShowButton = function(button, index) 178 local InternalShowButton = function(button, index)
184 button:Show() 179 button:Show()
185 if button.questID and db.QuestsByID[button.questID] then
186 db.QuestsByID[button.questID]:SetShown(false)
187 end
188 end 180 end
189 181
190 db.UsedPOIs = {} 182 db.UsedPOIs = {}
191 function Module:GetUsedPOIs() 183 function Module:UpdateTaskPOIs()
192 db.canTargetQuests = SpellCanTargetQuest() 184 canTargetQuests = SpellCanTargetQuest()
193 local func = db.canTargetQuests and InternalShowButton or InternalHideButton 185 local func = canTargetQuests and 'Show' or 'Hide'
194 wipe(db.UsedPOIs)
195 for i = 1, NUM_WORLDMAP_TASK_POIS do 186 for i = 1, NUM_WORLDMAP_TASK_POIS do
196 local button = _G['WorldMapFrameTaskPOI'..i] 187 local button = _G['WorldMapFrameTaskPOI'..i]
197 if button and button.worldQuest then 188 if button and button.worldQuest then
198 func(button, i) 189 button[func](button)
199 db.UsedPOIs[button.questID] = button
200 end 190 end
201 end 191 end
202 end 192 end
203 193
204 function Module:OnSecureHook(callbackName, func, ...) 194 function Module:OnSecureHook(callbackName, func, ...)
222 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') 212 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL')
223 self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED') 213 self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED')
224 self:RegisterEvent('SKILL_LINES_CHANGED') 214 self:RegisterEvent('SKILL_LINES_CHANGED')
225 self:RegisterEvent('CURRENT_SPELL_CAST_CHANGED') 215 self:RegisterEvent('CURRENT_SPELL_CAST_CHANGED')
226 self:RegisterEvent('ARTIFACT_UPDATE') 216 self:RegisterEvent('ARTIFACT_UPDATE')
217 self:RegisterEvent('QUEST_LOG_UPDATE')
227 end 218 end
228 219
229 local artifactKnowledgeMultiplier 220 local artifactKnowledgeMultiplier
230 local superTrackedQuestID 221 local superTrackedQuestID
231 function Module:OnEvent (event, ...) 222 function Module:OnEvent (event, ...)
232 223
233 print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...) 224 print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...)
234 if (event == 'QUEST_LOG_UPDATE') then 225 if (event == 'QUEST_LOG_UPDATE') then
235 if self:IsVisible() then 226 self:UpdateBounties(event)
236 self:Refresh() 227 self:RefreshIfChanged(event)
237 else
238 self.isStale = true
239 end
240
241 print('WorldMapFrame', WorldMapFrame:IsVisible(), 'hasUpdates:', self.isStale)
242 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then 228 elseif event == 'WORLD_QUEST_COMPLETED_BY_SPELL' then
243 local questID = ... 229 local questID = ...
230 self:UpdateBounties(event)
244 if questID and db.QuestsByID[questID] then 231 if questID and db.QuestsByID[questID] then
245 self:ReleasePin(db.QuestsByID[questID]) 232 self:ReleasePin(db.QuestsByID[questID])
246 rprint('|cFFFF4400release|r', questID) 233 rprint('|cFFFF4400release|r', questID)
247 end 234 end
235 self:Refresh(event)
248 elseif event == 'SKILL_LINES_CHANGED' or event == 'CURRENT_SPELL_CAST_CHANGED' then 236 elseif event == 'SKILL_LINES_CHANGED' or event == 'CURRENT_SPELL_CAST_CHANGED' then
249 self:Refresh(event) 237 self:Refresh(event)
250 elseif event == 'ARTIFACT_UPDATE' then 238 elseif event == 'ARTIFACT_UPDATE' then
251 local akCheck = C_ArtifactUI.GetArtifactKnowledgeMultiplier() 239 local akCheck = C_ArtifactUI.GetArtifactKnowledgeMultiplier()
252 if akCheck and (akCheck ~= artifactKnowledgeMultiplier) then 240 if akCheck and (akCheck ~= artifactKnowledgeMultiplier) then
276 end 264 end
277 end 265 end
278 266
279 267
280 268
281 269 local bountyQuests = {}
282 local bountyInfo = {} 270 local bountyInfo = {}
283 local bountyDisplayLocation, bountyLockedQuestID, selectedBountyIndex, selectedBountyQuestID 271 local bountyDisplayLocation, bountyLockedQuestID, selectedBountyIndex, selectedBountyQuestID
284 function Module:UpdateBounties(...) 272 function Module:UpdateBounties(...)
285 print('|cFF00FF88BountyInfo()|r', ...) 273 print('|cFF00FF88BountyInfo()|r', ...)
286 wipe(db.BountiesByFactionID) 274 wipe(db.BountiesByFactionID)
287 275 wipe(bountyQuests)
288 bountiesDirty = nil 276
289 db.selectedBounty = nil 277 db.selectedBounty = nil
290 selectedBountyIndex = BountyBoard:GetSelectedBountyIndex() 278 selectedBountyIndex = BountyBoard:GetSelectedBountyIndex()
291 bountyInfo, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, bountyInfo) 279 bountyInfo, bountyDisplayLocation, bountyLockedQuestID = GetQuestBountyInfoForMapID(db.currentMapID, bountyInfo)
292 local numBounties = 0 280 local numBounties = 0
293 for index, data in ipairs(bountyInfo) do 281 for index, info in ipairs(bountyInfo) do
294 if data.factionID then 282 if info.factionID then
295 numBounties = numBounties + 1 283 numBounties = numBounties + 1
296 data.index = index 284 info.index = index
297 data.complete = IsQuestComplete(data.questID) 285 info.complete = IsQuestComplete(info.questID)
298 if not data.complete then 286 if not info.complete then
299 db.BountiesByFactionID[data.factionID] = data 287 db.BountiesByFactionID[info.factionID] = info
300 if index == selectedBountyIndex then 288 if index == selectedBountyIndex then
301 db.selectedBounty = data 289 db.selectedBounty = info
302 selectedBountyQuestID = data.questID 290 selectedBountyQuestID = info.questID
303 end 291 end
304 print(' ', index, data.factionID, GetQuestLogTitle(GetQuestLogIndexByID(data.questID)), data.complete, (index == selectedBountyIndex) and 'SELECTED' or '') 292 print(' ', index, info.factionID, GetQuestLogTitle(GetQuestLogIndexByID(info.questID)), info.complete, (index == selectedBountyIndex) and 'SELECTED' or '')
305 end 293 bountyQuests[info.questID] = info
306 end 294 end
307 end 295 end
308 296 end
309 local numUpdated = 0 297 bountiesDirty = nil
310 local numHidden = 0
311 for questID, pin in pairs(db.QuestsByID) do
312 end
313 --print(numUpdated, 'changes from Bounty Board ('..tostring(numHidden)..' hidden)')
314 end 298 end
315 299
316 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen) 300 function Module:OnMapInfo(isBrokenIsle, isZoomedOut, mapAreaID, isNewMap, isMapOpen)
317 if isNewMap then 301 if isNewMap then
318 print('|cFF00FF88'..self:GetName()..':OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap) 302 print('|cFF00FF88OnMapInfo()|r, mapAreaID =', mapAreaID,'visible =', isMapOpen, 'changed =', isNewMap)
319 if isMapOpen then 303 if isMapOpen then
320 self:Refresh(true) 304 self:Refresh(true)
321 else 305 else
322 self.isStale = true 306 self.isStale = true
323 end 307 end
441 425
442 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF' 426 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF'
443 function Module:Refresh(...) 427 function Module:Refresh(...)
444 428
445 rprint(msg, ...) 429 rprint(msg, ...)
446 print('|cFF00FF88WorldQuests:Refresh()|r', ...)
447 if not self:IsVisible() then 430 if not self:IsVisible() then
448 print(' not visible, flag for later') 431 rprint('|cFF00FF88WorldQuests:Refresh()|r', ...)
449 self.isStale = true 432 self.isStale = true
450 return self:MarkAllPins() 433 return self:MarkAllPins()
451 end 434 else
435 rprint('|cFF00FF88WorldQuests:Refresh()|r', ...)
436 print('|cFF00FF88WorldQuests:Refresh()|r', ...)
437 end
438
452 if not db.Config.EnablePins then 439 if not db.Config.EnablePins then
453 numShown = 0 440 numShown = 0
454 return 441 return
455 end 442 end
456 wprint(' '..msg) 443 wprint(' '..msg)
457 444
458 layoutDirty = nil
459 scaleConstant = db.isContinentMap and 2 or 3 445 scaleConstant = db.isContinentMap and 2 or 3
460 canTargetQuests = SpellCanTargetQuest() 446 canTargetQuests = SpellCanTargetQuest()
461 447
462 for index, pin in pairs(db.QuestsByID) do 448 for index, pin in pairs(db.QuestsByID) do
463 pin.used = nil 449 pin.used = nil
465 451
466 self:UpdateAnchors() 452 self:UpdateAnchors()
467 if bountiesDirty then 453 if bountiesDirty then
468 print(' bounties dirty, pushing that') 454 print(' bounties dirty, pushing that')
469 self:UpdateBounties() 455 self:UpdateBounties()
470 bountiesDirty = nil
471 end 456 end
472 457
473 458
474 -- calculate quests shown 459 -- calculate quests shown
475 numShown = 0 460 numShown = 0
496 end 481 end
497 end 482 end
498 483
499 484
500 485
501 print(numShown, 'shown,', numLoaded, 'with data') 486 print(' ', numShown, 'shown,', numLoaded, 'with data')
502 if numShown > numLoaded then 487 if numShown > numLoaded then
503 self.Status:Show() 488 self.Status:Show()
504 end 489 end
505 490
506 491
492 layoutDirty = nil
507 self.isStale = nil 493 self.isStale = nil
508 self.sizesDirty = nil 494 self.sizesDirty = nil
509 self.isZoomDirty = nil 495 self.isZoomDirty = nil
510 end 496 end
511 497
498 local refreshReason
512 function Module:RefreshIfChanged() 499 function Module:RefreshIfChanged()
513 local scaleCheck = WorldMapDetailFrame:GetScale() 500 local scaleCheck = WorldMapDetailFrame:GetScale()
501 refreshReason = nil
514 if scaleCheck ~= currentScale then 502 if scaleCheck ~= currentScale then
515 print('|cFF00FF88RefreshIfChanged()|r map scale updated') 503 refreshReason = 'map scale updated'
516 self:Refresh('WORLD_MAP_SCALE_CHANGED') 504 self:Refresh('WORLD_MAP_SCALE_CHANGED')
517 currentScale = scaleCheck 505 currentScale = scaleCheck
518 elseif self.isStale or layoutDirty then 506 elseif self.isStale or layoutDirty then
519 print('|cFF00FF88RefreshIfChanged()|r layout is dirty') 507 refreshReason = 'layout is marked dirty'
508 end
509 if not refreshReason then
510 return
511 end
512
513
514 if self:IsVisible() then
515 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason)
520 self:Refresh() 516 self:Refresh()
517 else
518 rprint('|cFF00FFFFRefreshIfChanged()|r flagging for later refresh', refreshReason)
519 self.isStale = true
521 end 520 end
522 end 521 end
523 522
524 -- update visibility states of all pins 523 -- update visibility states of all pins
525 function Module:MarkAllPins(pins) 524 function Module:MarkAllPins(pins)
546 pin.owningFrame = WorldMapFrame 545 pin.owningFrame = WorldMapFrame
547 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor) 546 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor)
548 --tinsert(self.UsedPositions, pin) 547 --tinsert(self.UsedPositions, pin)
549 end 548 end
550 549
551
552 local isCriteria, isBounty 550 local isCriteria, isBounty
553 if pin.factionID then 551 if pin.factionID then
554 if db.BountiesByFactionID[pin.factionID] then 552 if db.BountiesByFactionID[pin.factionID] then
555 isCriteria = true 553 isCriteria = true
556 end 554 end
557 if selectedBountyQuestID then 555 if selectedBountyQuestID then
558 isBounty = IsQuestCriteriaForBounty(pin.questID, selectedBountyQuestID) and true or nil 556 isBounty = IsQuestCriteriaForBounty(pin.questID, selectedBountyQuestID) and true or nil
559 end 557 end
560 end 558 end
561 559
562 if (pin.isBounty ~= isBounty) or (pin.isCriteria ~= isCriteria) then 560 local isSpellTarget
563 print(pin.isBounty, '~=', isBounty) 561 if canTargetQuests then
564 print(pin.isCriteria, '~=', isCriteria) 562 isSpellTarget = IsQuestIDValidSpellTarget(pin.questID)
563 end
564
565 if (pin.isBounty ~= isBounty) or (pin.isCriteria ~= isCriteria) or (pin.isSpellTarget ~= isSpellTarget) then
566 pin.isSpellTarget = isSpellTarget
565 pin.isBounty = isBounty 567 pin.isBounty = isBounty
566 pin.isCriteria = isCriteria 568 pin.isCriteria = isCriteria
567 if pin:IsVisible() then 569 if pin:IsVisible() then
568 --print(' changed', pin.title) 570 --print(' changed', pin.title)
569 --numUpdated = numUpdated + 1 571 --numUpdated = numUpdated + 1
570 pin:Refresh('BOUNTY_UPDATE') 572 pin:Refresh('BOUNTY_UPDATE')
571 else 573 else
572 --numHidden = numHidden + 1 574 --numHidden = numHidden + 1
573 pin.isStale = true 575 pin.isStale = true
574 end 576 end
575 layoutDirty = true
576 end 577 end
577 578
578 if self:IsVisible() and (pin.isStale) then 579 if self:IsVisible() and (pin.isStale) then
579 pin:Refresh() 580 pin:Refresh()
580 end 581 end