annotate FlightMap.lua @ 93:98b5e08b75ed v1.4.9

- Fixed quest completion checking and handling - Changed animation method to hopefully stop weird flickering. - Pins are now visible before full reward data is loaded - Filter bar redesigned: - aligned horizontally along the top of the map display - filter buttons display a '+' when there are matches in both current and other zones, and '*' when there only matches in other zones - button tooltips separate local and global quests - button categories are highlighted and labeled when the cursor is over them - Fixed invalid POI targets appearing when the spell targeting cursor is active
author Nenue
date Sat, 15 Apr 2017 11:04:54 -0400
parents effb42f6fabd
children 8591401ec278
rev   line source
Nenue@40 1 local _, db = ...
Nenue@36 2 local print = DEVIAN_WORKSPACE and function(...) _G.print('Canvas', ...) end or function() end
Nenue@36 3 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end
Nenue@36 4 local wipe, pairs, ipairs = wipe, pairs, ipairs
Nenue@36 5 local HaveQuestData, QuestUtils_IsQuestWorldQuest, C_MapCanvas, C_TaskQuest = HaveQuestData, QuestUtils_IsQuestWorldQuest, C_MapCanvas, C_TaskQuest
Nenue@36 6
Nenue@36 7 WorldPlanFlightMapHandler = {
Nenue@36 8 TaskQueue = {}
Nenue@36 9 }
Nenue@36 10 WorldPlanDataProvider = {}
Nenue@36 11 WorldPlanDataPinMixin = {}
Nenue@36 12
Nenue@36 13 function WorldPlanFlightMapHandler:OnLoad()
Nenue@36 14 print('MapCanvas Module')
Nenue@36 15 self:RegisterEvent('ADDON_LOADED')
Nenue@36 16 end
Nenue@36 17 function WorldPlanFlightMapHandler:OnEvent(event, arg)
Nenue@36 18 if arg == "Blizzard_FlightMap" then
Nenue@36 19 print('sending data provider')
Nenue@36 20 local dataProvider = Mixin(MapCanvasDataProviderMixin, WorldPlanDataProvider)
Nenue@36 21 WorldPlanDataPinMixin = Mixin(MapCanvasPinMixin, WorldPlanDataPinMixin)
Nenue@36 22 WorldPlanDataPinMixin.OnNext = function(...) self:OnNext(...) end
Nenue@36 23 FlightMapFrame:AddDataProvider(dataProvider)
Nenue@36 24 end
Nenue@36 25 end
Nenue@36 26
Nenue@36 27 function WorldPlanFlightMapHandler:OnNext(func)
Nenue@36 28 tinsert(self.TaskQueue, func)
Nenue@36 29 end
Nenue@36 30
Nenue@36 31 function WorldPlanFlightMapHandler:OnUpdate()
Nenue@36 32 if #self.TaskQueue >= 1 then
Nenue@36 33 print('firing scheduled task ('.. tostring(#self.TaskQueue) ..' remaining)')
Nenue@36 34 local func = tremove(self.TaskQueue, 1)
Nenue@36 35 func()
Nenue@36 36 end
Nenue@36 37 end
Nenue@36 38
Nenue@40 39 function WorldPlanDataProvider:OnLoad()
Nenue@40 40
Nenue@40 41 self:SetNudgeTargetFactor(0.015);
Nenue@53 42 self:SetNudgeZoomedOutFactor(0.5);
Nenue@53 43 self:SetNudgeZoomedInFactor(0.15);
Nenue@40 44 end
Nenue@40 45
Nenue@36 46 function WorldPlanDataProvider:OnShow()
Nenue@36 47 assert(self.ticker == nil);
Nenue@36 48 self.ticker = C_Timer.NewTicker(10, function() self:RefreshAllData() end);
Nenue@36 49 end
Nenue@36 50 function WorldPlanDataProvider:OnHide()
Nenue@36 51 self.ticker:Cancel();
Nenue@36 52 self.ticker = nil;
Nenue@36 53 end
Nenue@36 54
Nenue@74 55
Nenue@36 56 function WorldPlanDataProvider:OnAdded(mapCanvas)
Nenue@36 57 self.activePins = {};
Nenue@36 58 self.owningMap = mapCanvas
Nenue@37 59 self:RegisterEvent('QUEST_LOG_UPDATE')
Nenue@37 60
Nenue@38 61 -- get rid of blizzard's widgery-joob
Nenue@37 62 for frame in pairs(FlightMapFrame.dataProviders) do
Nenue@37 63 if frame.OnAdded == WorldQuestDataProviderMixin.OnAdded then
Nenue@37 64 FlightMapFrame:RemoveDataProvider(frame)
Nenue@37 65 break
Nenue@37 66 end
Nenue@37 67 end
Nenue@36 68 end
Nenue@36 69
Nenue@36 70
Nenue@36 71 function WorldPlanDataProvider:RefreshAllData()
Nenue@36 72 local print = print
Nenue@36 73 print('|cFFFF0088'..self.owningMap:GetName()..':RefreshAllData()|r')
Nenue@36 74
Nenue@36 75
Nenue@36 76 local pinsToRemove = {};
Nenue@36 77 for questId in pairs(self.activePins) do
Nenue@36 78 pinsToRemove[questId] = true;
Nenue@36 79 end
Nenue@40 80 print(unpack(db.Config.FlightMapAlphaLimits))
Nenue@40 81 local alpha1, alpha2, alpha3 = unpack(db.Config.FlightMapAlphaLimits)
Nenue@40 82 local scale1, scale2, scale3 = unpack(db.Config.FlightMapScalingLimits)
Nenue@36 83
Nenue@36 84 local mapAreaID = self:GetMap():GetMapID();
Nenue@86 85 WorldPlanQuests.isStale = true
Nenue@36 86 for zoneIndex = 1, C_MapCanvas.GetNumZones(mapAreaID) do
Nenue@36 87 local zoneMapID, zoneName, zoneDepth, left, right, top, bottom = C_MapCanvas.GetZoneInfo(mapAreaID, zoneIndex);
Nenue@36 88 print(zoneMapID, zoneName)
Nenue@36 89 if zoneDepth <= 1 then -- Exclude subzones
Nenue@36 90 local taskInfo = C_TaskQuest.GetQuestsForPlayerByMapID(zoneMapID, mapAreaID);
Nenue@36 91
Nenue@36 92 if taskInfo then
Nenue@36 93 for i, info in ipairs(taskInfo) do
Nenue@36 94 if HaveQuestData(info.questId) then
Nenue@36 95 if QuestUtils_IsQuestWorldQuest(info.questId) then
Nenue@49 96 local pin = WorldPlanQuests:AcquirePin(info, zoneMapID)
Nenue@49 97 if pin then
Nenue@49 98
Nenue@49 99 print(pin:GetID(), pin.used, pin.filtered)
Nenue@49 100
Nenue@49 101 if pin.used then
Nenue@49 102 pinsToRemove[info.questId] = nil;
Nenue@49 103
Nenue@49 104 local frame = self.activePins[info.questId]
Nenue@49 105 if not frame then
Nenue@49 106 frame = self:GetMap():AcquirePin("WorldPlanFlightPin")
Nenue@49 107 frame:SetAlphaLimits(alpha1, alpha2, alpha3)
Nenue@49 108 frame:SetScalingLimits(scale1, scale2, scale3);
Nenue@49 109 frame:SetFrameLevel(1000 + self:GetMap():GetNumActivePinsByTemplate("WorldPlanFlightPin"));
Nenue@49 110 frame:Show()
Nenue@49 111 self.activePins[info.questId] = frame
Nenue@49 112 end
Nenue@49 113 frame:SetPosition(info.x, info.y)
Nenue@49 114 frame.pin = pin
Nenue@49 115
Nenue@74 116 -- fix the scale
Nenue@86 117 pin.owningFrame = frame:GetMap()
Nenue@74 118 pin:SetAnchor(frame, nil, nil, nil, nil, 1)
Nenue@49 119 pin.throttle = 1
Nenue@67 120 pin:ClearAllPoints()
Nenue@67 121 pin:SetPoint('CENTER', frame, 'CENTER')
Nenue@93 122 frame:SetSize(pin:GetSize())
Nenue@52 123 --print(pin.Overlay:IsShown(), pin.Overlay:GetPoint(1))
Nenue@49 124 end
Nenue@40 125 end
Nenue@40 126
Nenue@36 127 end
Nenue@36 128 end
Nenue@36 129 end
Nenue@36 130 end
Nenue@36 131 end
Nenue@36 132 end
Nenue@36 133
Nenue@36 134 for questId in pairs(pinsToRemove) do
Nenue@36 135 self:GetMap():RemovePin(self.activePins[questId]);
Nenue@36 136 self.activePins[questId] = nil;
Nenue@36 137 end
Nenue@36 138 --self:GetMap():RemoveAllPinsByTemplate("WorldQuestPinTemplate");
Nenue@37 139 for pin in self:GetMap():EnumeratePinsByTemplate("WorldQuestPinTemplate") do
Nenue@37 140 pin:Hide()
Nenue@37 141 end
Nenue@36 142
Nenue@36 143 end
Nenue@49 144
Nenue@49 145
Nenue@49 146
Nenue@37 147 function WorldPlanDataProvider:OnEvent()
Nenue@37 148 end
Nenue@36 149
Nenue@49 150 function WorldPlanDataPinMixin:OnLoad()
Nenue@49 151 self.UpdateTooltip = self.OnMouseEnter;
Nenue@49 152
Nenue@49 153 -- Flight points can nudge world quests.
Nenue@49 154 self:SetNudgeTargetFactor(0.015);
Nenue@49 155 self:SetNudgeZoomedOutFactor(1.0);
Nenue@49 156 self:SetNudgeZoomedInFactor(0.25);
Nenue@49 157 end
Nenue@49 158
Nenue@74 159 function WorldPlanDataPinMixin:OnUpdate()
Nenue@74 160 local pin = self.pin
Nenue@74 161 if pin and pin.isStale then
Nenue@74 162 print(pin.questID, 'is stale')
Nenue@74 163 pin:SetAnchor(nil, nil, nil, nil, nil, pin.filtered and 0.5 or 1)
Nenue@74 164 if pin.isNew then
Nenue@74 165 pin:OnShow()
Nenue@74 166 end
Nenue@74 167 end
Nenue@74 168 end
Nenue@74 169
Nenue@74 170
Nenue@36 171 function WorldPlanDataPinMixin:OnShow()
Nenue@36 172 end
Nenue@36 173
Nenue@36 174 function WorldPlanDataPinMixin:OnMouseEnter ()
Nenue@52 175 WorldMap_HijackTooltip(self:GetMap())
Nenue@36 176 end
Nenue@36 177
Nenue@36 178 function WorldPlanDataPinMixin:OnMouseLeave ()
Nenue@73 179 WorldMap_RestoreTooltip()
Nenue@73 180 WorldMapTooltip:Hide()
Nenue@36 181 end
Nenue@36 182
Nenue@36 183 function WorldPlanDataPinMixin:RemoveAllData()
Nenue@36 184 wipe(self.activePins);
Nenue@36 185 self:GetMap():RemoveAllPinsByTemplate("WorldPlanFlightPin");
Nenue@36 186 end