Mercurial > wow > worldplan
comparison WorldQuests.lua @ 45:db570c6a0ffb v1.0-rc12
- Fixed filter buttons losing their anchor after FlightMap interactions
- Fixed flickering tooltips
- Fixed a source of hangs while opening the world map, particularly in non-Broken-Isle continents.
- Workaround for World Map Action Button: Temporarily activate blizzard POI buttons while a quest-targeting spell is on the cursor.
| author | Nenue |
|---|---|
| date | Mon, 26 Dec 2016 10:20:52 -0500 |
| parents | 77c2ffb5c7f5 |
| children | 733785e306a3 |
comparison
equal
deleted
inserted
replaced
| 44:59e9d66195dd | 45:db570c6a0ffb |
|---|---|
| 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 local _, db = ... | 5 local _, db = ... |
| 6 local WorldQuests = WorldPlanQuestsMixin | 6 local Module = WorldPlanQuestsMixin |
| 7 | 7 |
| 8 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo | 8 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo |
| 9 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented | 9 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented |
| 10 local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID | 10 local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID |
| 11 local GetMapInfo = GetMapInfo | 11 local GetMapInfo = GetMapInfo |
| 12 local print = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end | 12 local print = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end |
| 13 local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or function() end | 13 local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or function() end |
| 14 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end | 14 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end |
| 15 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end | 15 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end |
| 16 local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or function() end | 16 local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or function() end |
| 17 | 17 local pairs = pairs |
| 18 | 18 |
| 19 local PinBaseIndex = 1200 | 19 local PinBaseIndex = 1200 |
| 20 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 | 20 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 |
| 21 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", | 21 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", |
| 22 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } | 22 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } |
| 28 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS | 28 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS |
| 29 | 29 |
| 30 | 30 |
| 31 local numPins = 0 | 31 local numPins = 0 |
| 32 local NumPinFrames = 1 | 32 local NumPinFrames = 1 |
| 33 WorldQuests.TasksByID = {} | 33 Module.TasksByID = {} |
| 34 | 34 |
| 35 --%debug% | 35 --%debug% |
| 36 local SetTimedCallbackForAllPins = function(seconds, callback) | 36 local SetTimedCallbackForAllPins = function(seconds, callback) |
| 37 C_Timer.After(seconds, function() | 37 C_Timer.After(seconds, function() |
| 38 for id, pin in pairs(WorldPlanQuests.QuestsByID) do | 38 for id, pin in pairs(WorldPlanQuests.QuestsByID) do |
| 39 callback(pin) | 39 callback(pin) |
| 40 end | 40 end |
| 41 end) | 41 end) |
| 42 end | 42 end |
| 43 | 43 |
| 44 function WorldQuests:OnUpdate(sinceLast) | 44 function Module:OnUpdate(sinceLast) |
| 45 if self.filtersDirty or self.isStale then | 45 if self.filtersDirty or self.isStale then |
| 46 self:Refresh() | 46 self:Refresh() |
| 47 end | 47 end |
| 48 end | 48 end |
| 49 | 49 |
| 50 function WorldQuests:Setup() | 50 function Module:Setup() |
| 51 print('|cFFFF4400'..self:GetName()..':Setup()') | 51 print('|cFFFF4400'..self:GetName()..':Setup()') |
| 52 | 52 |
| 53 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do | 53 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do |
| 54 db.QuestsByZone[mapID] = {} | 54 db.QuestsByZone[mapID] = {} |
| 55 end | 55 end |
| 56 | 56 |
| 57 | 57 hooksecurefunc("ClickWorldMapActionButton", function () self:OnClickWorldMapActionButton() end) |
| 58 -- refresh positions any time blizzard does so (i.e. mousewheel zoom) | 58 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function () self:Refresh() end) |
| 59 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function() | 59 hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function () self:OnUpdateQuestBonusObjectives() end) |
| 60 print('|cFFFF4400WorldMapScrollFrame_ReanchorQuestPOIs') | 60 end |
| 61 self:Refresh(true) | 61 |
| 62 end) | 62 local InternalHideButton = function(button, index) |
| 63 | 63 button:Hide() |
| 64 | 64 if button.questID and db.QuestsByID[button.questID] then |
| 65 -- hide the original world quest POIs | 65 if db.QuestsByID[button.questID].used and not db.QuestsByID[button.questID].filtered then |
| 66 | 66 db.QuestsByID[button.questID]:SetShown(true) |
| 67 hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function() | 67 end |
| 68 print('|cFFFF4400WorldMap_UpdateQuestBonusObjectives') | 68 end |
| 69 for i = 1, NUM_WORLDMAP_TASK_POIS do | 69 end |
| 70 local button = _G['WorldMapFrameTaskPOI'..i] | 70 local InternalShowButton = function(button, index) |
| 71 if button and button.worldQuest then | 71 button:Show() |
| 72 button:Hide() | 72 if button.questID and db.QuestsByID[button.questID] then |
| 73 end | 73 db.QuestsByID[button.questID]:SetShown(false) |
| 74 end | 74 end |
| 75 end) | 75 end |
| 76 end | 76 |
| 77 function Module:OnUpdateQuestBonusObjectives() | |
| 78 print('|cFFFF4400WorldMap_UpdateQuestBonusObjectives') | |
| 79 local func = SpellCanTargetQuest() and InternalShowButton or InternalHideButton | |
| 80 print(SpellCanTargetQuest()) | |
| 81 for i = 1, NUM_WORLDMAP_TASK_POIS do | |
| 82 local button = _G['WorldMapFrameTaskPOI'..i] | |
| 83 if button and button.worldQuest then | |
| 84 func(button, i) | |
| 85 end | |
| 86 end | |
| 87 end | |
| 88 | |
| 89 function Module:OnClickWorldMapActionButton() | |
| 90 self.IsTargeting = SpellCanTargetQuest() | |
| 91 self:OnUpdateQuestBonusObjectives() | |
| 92 end | |
| 93 | |
| 77 local defaults = {} | 94 local defaults = {} |
| 78 local REWARD_UNKNOWN = 768 | 95 local REWARD_UNKNOWN = 768 |
| 79 function WorldQuests:OnLoad() | 96 function Module:OnLoad() |
| 80 print('|cFFFF4400'..self:GetName()..':OnLoad()') | 97 print('|cFFFF4400'..self:GetName()..':OnLoad()') |
| 81 | 98 |
| 82 self:SetParent(WorldMapFrame) | 99 self:SetParent(WorldMapFrame) |
| 83 WorldPlan:AddHandler(self, defaults) | 100 WorldPlan:AddHandler(self, defaults) |
| 84 | 101 |
| 100 | 117 |
| 101 WorldMapPOIFrame = _G.WorldMapPOIFrame | 118 WorldMapPOIFrame = _G.WorldMapPOIFrame |
| 102 | 119 |
| 103 end | 120 end |
| 104 | 121 |
| 105 function WorldQuests:OnMapInfo() | 122 function Module:OnMapInfo() |
| 106 if self:IsVisible() then | 123 if self:IsVisible() then |
| 107 self:Refresh() | 124 self:Refresh() |
| 108 else | 125 else |
| 109 self.isStale = true | 126 self.isStale = true |
| 110 end | 127 end |
| 111 end | 128 end |
| 112 | 129 |
| 113 function WorldQuests:OnEvent (event, ...) | 130 function Module:OnEvent (event, ...) |
| 114 | 131 |
| 115 print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...) | 132 print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...) |
| 116 if event == 'QUEST_LOG_UPDATE' then | 133 if event == 'QUEST_LOG_UPDATE' then |
| 117 local questID, added = ... | 134 local questID, added = ... |
| 118 if questID and added then | 135 if questID and added then |
| 135 end | 152 end |
| 136 end | 153 end |
| 137 | 154 |
| 138 local totalPins = 0 | 155 local totalPins = 0 |
| 139 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation | 156 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation |
| 140 function WorldQuests:AcquirePin (info) | 157 function Module:AcquirePin (info) |
| 141 local questID = info.questId | 158 local questID = info.questId |
| 142 if not questID then | 159 if not questID then |
| 143 return nil | 160 return nil |
| 144 end | 161 end |
| 145 | 162 |
| 192 C_TaskQuest.RequestPreloadRewardData(info.questId) | 209 C_TaskQuest.RequestPreloadRewardData(info.questId) |
| 193 return pin | 210 return pin |
| 194 end | 211 end |
| 195 | 212 |
| 196 -- remove from index and add it to the recycling heap | 213 -- remove from index and add it to the recycling heap |
| 197 function WorldQuests:ReleasePin (pin) | 214 function Module:ReleasePin (pin) |
| 198 | 215 |
| 199 local id = pin.questID | 216 local id = pin.questID |
| 200 if id then | 217 if id then |
| 201 db.QuestsByID[id] = nil | 218 db.QuestsByID[id] = nil |
| 202 | 219 |
| 211 tinsert(db.FreePins, pin) | 228 tinsert(db.FreePins, pin) |
| 212 | 229 |
| 213 print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title) | 230 print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title) |
| 214 end | 231 end |
| 215 | 232 |
| 216 function WorldQuests:GetBonusObjectives() | 233 function Module:GetBonusObjectives() |
| 217 | 234 |
| 218 | 235 |
| 219 local tasksTable = GetTasksTable() | 236 local tasksTable = GetTasksTable() |
| 220 if tasksTable ~= nil then | 237 if tasksTable ~= nil then |
| 221 print('|cFF00FF88'..self:GetName()..':BonusObjectives()|r ') | 238 print('|cFF00FF88'..self:GetName()..':BonusObjectives()|r ') |
| 258 | 275 |
| 259 | 276 |
| 260 | 277 |
| 261 | 278 |
| 262 -- use tooltip object to extract item details | 279 -- use tooltip object to extract item details |
| 263 function WorldQuests:GetRewardHeader(questID) | 280 function Module:GetRewardHeader(questID) |
| 264 local name, icon, quantity, quality, _, itemID = GetQuestLogRewardInfo(1, questID) | 281 local name, icon, quantity, quality, _, itemID = GetQuestLogRewardInfo(1, questID) |
| 265 local scanner = _G.WorldPlanTooltip | 282 local scanner = _G.WorldPlanTooltip |
| 266 local print = qprint | 283 local print = qprint |
| 267 if not itemID then | 284 if not itemID then |
| 268 return | 285 return |
| 317 end | 334 end |
| 318 | 335 |
| 319 local GetCurrentMapAreaID, GetMapNameByID= GetCurrentMapAreaID, GetMapNameByID | 336 local GetCurrentMapAreaID, GetMapNameByID= GetCurrentMapAreaID, GetMapNameByID |
| 320 local wipe, pairs = wipe, pairs | 337 local wipe, pairs = wipe, pairs |
| 321 -- create of update quest pins for a map and its underlying zones | 338 -- create of update quest pins for a map and its underlying zones |
| 322 function WorldQuests:UpdateWorldQuests (mapID) | 339 function Module:UpdateWorldQuests (mapID) |
| 323 | 340 |
| 324 mapID = mapID or db.currentMapID | 341 mapID = mapID or db.currentMapID |
| 325 if not mapID then | 342 if not mapID then |
| 326 -- info not available yet | 343 -- info not available yet |
| 327 return | 344 return |
| 367 if self.isStale and self:IsVisible() then | 384 if self.isStale and self:IsVisible() then |
| 368 self:Refresh() | 385 self:Refresh() |
| 369 end | 386 end |
| 370 end | 387 end |
| 371 | 388 |
| 372 function WorldQuests:Report() | 389 function Module:Report() |
| 373 for i, pin in ipairs(db.UsedPins) do | 390 for i, pin in ipairs(db.UsedPins) do |
| 374 db:print(i, pin.questID, pin.title) | 391 db:print(i, pin.questID, pin.title) |
| 375 end | 392 end |
| 376 | 393 |
| 377 for id, pin in pairs(db.QuestsByID) do | 394 for id, pin in pairs(db.QuestsByID) do |
| 378 db:print(id, pin.worldQuestType, pin.rewardType, pin.title) | 395 db:print(id, pin.worldQuestType, pin.rewardType, pin.title) |
| 379 end | 396 end |
| 380 end | 397 end |
| 381 | 398 |
| 382 function WorldQuests:Refresh(fromUser) | 399 function Module:Refresh(fromUser) |
| 383 self.currentMapID = GetCurrentMapAreaID() | 400 self.currentMapID = GetCurrentMapAreaID() |
| 384 print('|cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') | 401 print('|cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') |
| 385 if not self:IsVisible() then | 402 if not self:IsVisible() then |
| 386 print(' not visible, flag for later') | 403 print(' not visible, flag for later') |
| 387 self.isStale = true | 404 self.isStale = true |
| 389 end | 406 end |
| 390 wprint(' |cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') | 407 wprint(' |cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') |
| 391 | 408 |
| 392 for index, pin in pairs(db.QuestsByID) do | 409 for index, pin in pairs(db.QuestsByID) do |
| 393 pin.used = nil | 410 pin.used = nil |
| 394 pin:SetShown(false) | |
| 395 end | 411 end |
| 396 | 412 |
| 397 self:SetFilteredPins(db.QuestsByID) | 413 self:SetFilteredPins(db.QuestsByID) |
| 398 self:UpdateAnchors(nil, fromUser) | 414 self:UpdateAnchors(nil, fromUser) |
| 399 self:Cleanup (fromUser) | 415 self:Cleanup (fromUser) |
| 400 self.isStale = nil | 416 self.isStale = nil |
| 401 end | 417 end |
| 402 | 418 |
| 403 -- update visibility states of all pins | 419 -- update visibility states of all pins |
| 404 function WorldQuests:SetFilteredPins(pins) | 420 function Module:SetFilteredPins(pins) |
| 405 print(' |cFFFFFF00'..self:GetName()..':SetFilteredPins()|r', pins) | 421 print(' |cFFFFFF00'..self:GetName()..':SetFilteredPins()|r', pins) |
| 406 pins = pins or db.QuestsByID | 422 pins = pins or db.QuestsByID |
| 407 for questID, pin in pairs(pins) do | 423 for questID, pin in pairs(pins) do |
| 408 pin.filtered = pin:IsFiltered() | 424 pin.filtered = pin:IsFiltered() |
| 409 pin.isStale = true | 425 pin.isStale = true |
| 410 rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) | 426 rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) |
| 411 end | 427 end |
| 412 end | 428 end |
| 413 | 429 |
| 414 local abs = math.abs | 430 local abs = math.abs |
| 415 function WorldQuests:UpdateQuestButton(info, mapID) | 431 function Module:UpdateQuestButton(info, mapID) |
| 416 local questID, x, y = info.questId, info.x, info.y | 432 local questID, x, y = info.questId, info.x, info.y |
| 417 local pin = self:AcquirePin(info) | 433 local pin = self:AcquirePin(info) |
| 418 if not pin then | 434 if not pin then |
| 419 return | 435 return |
| 420 end | 436 end |
| 443 end | 459 end |
| 444 db.QuestsByZone[mapID][questID] = pin | 460 db.QuestsByZone[mapID][questID] = pin |
| 445 end | 461 end |
| 446 end | 462 end |
| 447 | 463 |
| 448 function WorldQuests:UpdateMap(taskInfo, mapID) | 464 function Module:UpdateMap(taskInfo, mapID) |
| 449 print('Map', GetMapNameByID(mapID), GetMapNameByID(self.currentMapID)) | 465 print('Map', GetMapNameByID(mapID), GetMapNameByID(self.currentMapID)) |
| 450 for index, info in pairs(taskInfo) do | 466 for index, info in pairs(taskInfo) do |
| 451 self:UpdateQuestButton(info, mapID) | 467 self:UpdateQuestButton(info, mapID) |
| 452 end | 468 end |
| 453 end | 469 end |
| 454 | 470 |
| 455 function WorldQuests:UpdateAnchors (fromUser) | 471 function Module:UpdateAnchors (fromUser) |
| 456 | 472 |
| 457 | 473 |
| 458 wipe(self.UsedPositions) | 474 wipe(self.UsedPositions) |
| 459 print(' |cFF00FF00'..self:GetName()..':UpdateAnchors()', fromUser) | 475 print(' |cFF00FF00'..self:GetName()..':UpdateAnchors()', fromUser) |
| 460 self.hostFrame = WorldMapPOIFrame | 476 self.hostFrame = WorldMapPOIFrame |
| 487 self:SetFilteredPins(db.QuestsByID) | 503 self:SetFilteredPins(db.QuestsByID) |
| 488 end | 504 end |
| 489 end | 505 end |
| 490 | 506 |
| 491 -- shows, animates, or hides pins based on their current visibility flags | 507 -- shows, animates, or hides pins based on their current visibility flags |
| 492 function WorldQuests:Cleanup (fromUser) | 508 function Module:Cleanup (fromUser) |
| 493 | 509 |
| 494 print('|cFFFFFF00'..self:GetName()..':Cleanup()|r') | 510 print('|cFFFFFF00'..self:GetName()..':Cleanup()|r') |
| 495 local print = rprint | 511 local print = rprint |
| 496 print('|cFFFFFF00'..self:GetName()..':Cleanup()|r') | 512 print('|cFFFFFF00'..self:GetName()..':Cleanup()|r') |
| 497 --local showQuestPOI = db.Config.EnablePins | 513 --local showQuestPOI = db.Config.EnablePins |
| 498 for questID, pin in pairs(db.QuestsByID) do | 514 for questID, pin in pairs(db.QuestsByID) do |
| 499 local oV = pin:IsShown() | 515 local oV = pin:IsShown() |
| 500 if pin.used then | 516 if pin.used then |
| 501 pin:SetShown(true) | 517 |
| 502 pin.throttle = 1 | 518 pin.throttle = 1 |
| 503 if oV == false then | 519 if oV == false then |
| 504 print('|cFF00FF00cleanup +|r', questID, pin.title) | 520 print('|cFF00FF00cleanup +|r', questID, pin.title) |
| 505 end | 521 end |
| 506 else | 522 else |
| 507 if oV == true then | 523 if oV == true then |
| 508 print('|cFFFF4400 -|r', questID, pin.title) | 524 print('|cFFFF4400 -|r', questID, pin.title) |
| 509 end | 525 end |
| 510 end | 526 end |
| 527 pin:SetShown(pin.used or false) | |
| 511 | 528 |
| 512 if pin.worldQuest and (not C_TaskQuest.IsActive(pin.questID)) then | 529 if pin.worldQuest and (not C_TaskQuest.IsActive(pin.questID)) then |
| 513 self:ReleasePin(pin) | 530 self:ReleasePin(pin) |
| 514 end | 531 end |
| 515 pin.isStale = true | 532 pin.isStale = true |
