diff 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
line wrap: on
line diff
--- a/WorldQuests.lua	Sun Dec 25 15:48:24 2016 -0500
+++ b/WorldQuests.lua	Mon Dec 26 10:20:52 2016 -0500
@@ -3,7 +3,7 @@
 -- Created: 11/2/2016 3:40 PM
 -- %file-revision%
 local _, db = ...
-local WorldQuests = WorldPlanQuestsMixin
+local Module = WorldPlanQuestsMixin
 
 local MC_GetNumZones, MC_GetZoneInfo = C_MapCanvas.GetNumZones, C_MapCanvas.GetZoneInfo
 local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented
@@ -14,7 +14,7 @@
 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end
 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end
 local mprint = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or function() end
-
+local pairs = pairs
 
 local PinBaseIndex = 1200
 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
@@ -30,7 +30,7 @@
 
 local numPins = 0
 local NumPinFrames = 1
-WorldQuests.TasksByID = {}
+Module.TasksByID = {}
 
 --%debug%
 local SetTimedCallbackForAllPins = function(seconds, callback)
@@ -41,42 +41,59 @@
   end)
 end
 
-function WorldQuests:OnUpdate(sinceLast)
+function Module:OnUpdate(sinceLast)
   if self.filtersDirty or self.isStale then
     self:Refresh()
   end
 end
 
-function WorldQuests:Setup()
+function Module:Setup()
   print('|cFFFF4400'..self:GetName()..':Setup()')
 
   for mapID, mapName in pairs(WORLD_QUEST_MAPS) do
     db.QuestsByZone[mapID] = {}
   end
 
+  hooksecurefunc("ClickWorldMapActionButton", function () self:OnClickWorldMapActionButton() end)
+  hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function () self:Refresh() end)
+  hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function () self:OnUpdateQuestBonusObjectives() end)
+end
 
-  -- refresh positions any time blizzard does so (i.e. mousewheel zoom)
-  hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function()
-    print('|cFFFF4400WorldMapScrollFrame_ReanchorQuestPOIs')
-    self:Refresh(true)
-  end)
+local InternalHideButton = function(button, index)
+  button:Hide()
+  if button.questID and db.QuestsByID[button.questID] then
+    if db.QuestsByID[button.questID].used and not db.QuestsByID[button.questID].filtered then
+      db.QuestsByID[button.questID]:SetShown(true)
+    end
+  end
+end
+local InternalShowButton = function(button, index)
+  button:Show()
+  if button.questID and db.QuestsByID[button.questID] then
+    db.QuestsByID[button.questID]:SetShown(false)
+  end
+end
 
+function Module:OnUpdateQuestBonusObjectives()
+  print('|cFFFF4400WorldMap_UpdateQuestBonusObjectives')
+  local func = SpellCanTargetQuest() and InternalShowButton or InternalHideButton
+  print(SpellCanTargetQuest())
+  for i = 1, NUM_WORLDMAP_TASK_POIS do
+    local button = _G['WorldMapFrameTaskPOI'..i]
+    if button and button.worldQuest then
+      func(button, i)
+    end
+  end
+end
 
-  -- hide the original world quest POIs
+function Module:OnClickWorldMapActionButton()
+  self.IsTargeting = SpellCanTargetQuest()
+  self:OnUpdateQuestBonusObjectives()
+end
 
-  hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function()
-    print('|cFFFF4400WorldMap_UpdateQuestBonusObjectives')
-    for i = 1, NUM_WORLDMAP_TASK_POIS do
-      local button = _G['WorldMapFrameTaskPOI'..i]
-      if button and button.worldQuest then
-        button:Hide()
-      end
-    end
-  end)
-end
 local defaults = {}
 local REWARD_UNKNOWN = 768
-function WorldQuests:OnLoad()
+function Module:OnLoad()
   print('|cFFFF4400'..self:GetName()..':OnLoad()')
 
   self:SetParent(WorldMapFrame)
@@ -102,7 +119,7 @@
 
 end
 
-function WorldQuests:OnMapInfo()
+function Module:OnMapInfo()
   if self:IsVisible() then
     self:Refresh()
   else
@@ -110,7 +127,7 @@
   end
 end
 
-function WorldQuests:OnEvent (event, ...)
+function Module:OnEvent (event, ...)
 
   print('|cFFFFFF00'..self:GetName()..':OnEvent() '..event..'|r', GetTime(), ...)
   if event == 'QUEST_LOG_UPDATE' then
@@ -137,7 +154,7 @@
 
 local totalPins = 0
 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation
-function WorldQuests:AcquirePin (info)
+function Module:AcquirePin (info)
   local questID = info.questId
   if not questID then
     return nil
@@ -194,7 +211,7 @@
 end
 
 -- remove from index and add it to the recycling heap
-function WorldQuests:ReleasePin (pin)
+function Module:ReleasePin (pin)
 
   local id = pin.questID
   if id then
@@ -213,7 +230,7 @@
   print('|cFF00FF00-'.. (pin.mapID and GetMapNameByID(pin.mapID) or '???') ..'|r', id, pin.title)
 end
 
-function WorldQuests:GetBonusObjectives()
+function Module:GetBonusObjectives()
 
 
   local tasksTable = GetTasksTable()
@@ -260,7 +277,7 @@
 
 
 -- use tooltip object to extract item details
-function WorldQuests:GetRewardHeader(questID)
+function Module:GetRewardHeader(questID)
   local name, icon, quantity, quality, _, itemID = GetQuestLogRewardInfo(1, questID)
   local scanner = _G.WorldPlanTooltip
   local print = qprint
@@ -319,7 +336,7 @@
 local GetCurrentMapAreaID, GetMapNameByID= GetCurrentMapAreaID, GetMapNameByID
 local wipe, pairs = wipe, pairs
 -- create of update quest pins for a map and its underlying zones
-function WorldQuests:UpdateWorldQuests (mapID)
+function Module:UpdateWorldQuests (mapID)
 
   mapID = mapID or db.currentMapID
   if not mapID then
@@ -369,7 +386,7 @@
   end
 end
 
-function WorldQuests:Report()
+function Module:Report()
   for i, pin in ipairs(db.UsedPins) do
     db:print(i, pin.questID, pin.title)
   end
@@ -379,7 +396,7 @@
   end
 end
 
-function WorldQuests:Refresh(fromUser)
+function Module:Refresh(fromUser)
   self.currentMapID = GetCurrentMapAreaID()
   print('|cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal')
   if not self:IsVisible() then
@@ -391,7 +408,6 @@
 
   for index, pin in pairs(db.QuestsByID) do
     pin.used = nil
-    pin:SetShown(false)
   end
 
   self:SetFilteredPins(db.QuestsByID)
@@ -401,7 +417,7 @@
 end
 
 -- update visibility states of all pins
-function WorldQuests:SetFilteredPins(pins)
+function Module:SetFilteredPins(pins)
   print('  |cFFFFFF00'..self:GetName()..':SetFilteredPins()|r', pins)
   pins = pins or db.QuestsByID
   for questID, pin in pairs(pins) do
@@ -412,7 +428,7 @@
 end
 
 local abs = math.abs
-function WorldQuests:UpdateQuestButton(info, mapID)
+function Module:UpdateQuestButton(info, mapID)
   local questID, x, y = info.questId, info.x, info.y
   local pin = self:AcquirePin(info)
   if not pin then
@@ -445,14 +461,14 @@
   end
 end
 
-function WorldQuests:UpdateMap(taskInfo, mapID)
+function Module:UpdateMap(taskInfo, mapID)
   print('Map', GetMapNameByID(mapID), GetMapNameByID(self.currentMapID))
   for index, info in pairs(taskInfo) do
     self:UpdateQuestButton(info, mapID)
   end
 end
 
-function WorldQuests:UpdateAnchors (fromUser)
+function Module:UpdateAnchors (fromUser)
 
 
   wipe(self.UsedPositions)
@@ -489,7 +505,7 @@
 end
 
 -- shows, animates, or hides pins based on their current visibility flags
-function WorldQuests:Cleanup (fromUser)
+function Module:Cleanup (fromUser)
 
   print('|cFFFFFF00'..self:GetName()..':Cleanup()|r')
   local print = rprint
@@ -498,7 +514,7 @@
   for questID, pin in pairs(db.QuestsByID) do
     local oV = pin:IsShown()
     if pin.used then
-      pin:SetShown(true)
+
       pin.throttle = 1
       if oV == false then
         print('|cFF00FF00cleanup +|r', questID, pin.title)
@@ -508,6 +524,7 @@
         print('|cFFFF4400 -|r', questID, pin.title)
       end
     end
+    pin:SetShown(pin.used or false)
 
     if pin.worldQuest and (not C_TaskQuest.IsActive(pin.questID)) then
       self:ReleasePin(pin)