Mercurial > wow > worldplan
comparison WorldQuests.lua @ 49:dbd81d49af02
- Solve more frame data flagging issues
- Unify method for resolving filter and visibility states
- Flight Map modifications respect filter settings
- Solve initial draw issues with tag icon, filter state handling
- Solve issues with text layer synchronization during map changes
| author | Nenue |
|---|---|
| date | Thu, 29 Dec 2016 13:31:20 -0500 |
| parents | c0b88bd1e40b |
| children | 6439015d74b1 |
comparison
equal
deleted
inserted
replaced
| 48:c0b88bd1e40b | 49:dbd81d49af02 |
|---|---|
| 57 hooksecurefunc("ClickWorldMapActionButton", function () self:OnClickWorldMapActionButton() end) | 57 hooksecurefunc("ClickWorldMapActionButton", function () self:OnClickWorldMapActionButton() end) |
| 58 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function () self:Refresh() end) | 58 hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function () self:Refresh() end) |
| 59 hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function () self:OnUpdateQuestBonusObjectives() end) | 59 hooksecurefunc("WorldMap_UpdateQuestBonusObjectives", function () self:OnUpdateQuestBonusObjectives() end) |
| 60 end | 60 end |
| 61 | 61 |
| 62 function Module:OnConfigUpdate() | |
| 63 if db.Config.FadeWhileGrouped then | |
| 64 db.PinAlpha = 0.15 | |
| 65 else | |
| 66 db.PinAlpha = 1 | |
| 67 end | |
| 68 end | |
| 69 | |
| 62 local InternalHideButton = function(button, index) | 70 local InternalHideButton = function(button, index) |
| 63 button:Hide() | 71 button:Hide() |
| 64 if button.questID and db.QuestsByID[button.questID] then | 72 if button.questID and db.QuestsByID[button.questID] then |
| 65 if db.QuestsByID[button.questID].used and not db.QuestsByID[button.questID].filtered then | 73 if db.QuestsByID[button.questID].used and not db.QuestsByID[button.questID].filtered then |
| 66 db.QuestsByID[button.questID]:SetShown(true) | 74 db.QuestsByID[button.questID]:SetShown(true) |
| 115 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') | 123 self:RegisterEvent('WORLD_QUEST_COMPLETED_BY_SPELL') |
| 116 self:RegisterEvent('SKILL_LINES_CHANGED') | 124 self:RegisterEvent('SKILL_LINES_CHANGED') |
| 117 end | 125 end |
| 118 | 126 |
| 119 function Module:OnMapInfo() | 127 function Module:OnMapInfo() |
| 128 print('|cFFFFFF00'..self:GetName()..':OnMapInfo()|r visible =', self:IsVisible()) | |
| 120 if self:IsVisible() then | 129 if self:IsVisible() then |
| 121 self:Refresh(true) | 130 self:Refresh(true) |
| 122 else | 131 else |
| 123 self.isStale = true | 132 self.isStale = true |
| 124 end | 133 end |
| 159 | 168 |
| 160 if not QuestUtils_IsQuestWorldQuest(questID) then | 169 if not QuestUtils_IsQuestWorldQuest(questID) then |
| 161 return nil | 170 return nil |
| 162 end | 171 end |
| 163 | 172 |
| 164 | 173 -- if we're grabbing a pin, the filters need to be checked |
| 165 local pin = db.QuestsByID[questID] | 174 local pin = db.QuestsByID[questID] |
| 166 if not pin then | 175 if not pin then |
| 167 local numFree = #db.FreePins | 176 local numFree = #db.FreePins |
| 168 if numFree >= 1 then | 177 if numFree >= 1 then |
| 169 pin = tremove(db.FreePins, numFree) | 178 pin = tremove(db.FreePins, numFree) |
| 200 pin.y = info.y or pin.y | 209 pin.y = info.y or pin.y |
| 201 rprint('|cFFFF4400coords|r', info.x, info.y) | 210 rprint('|cFFFF4400coords|r', info.x, info.y) |
| 202 end | 211 end |
| 203 end | 212 end |
| 204 | 213 |
| 205 pin:GetData() | 214 if not pin.dataLoaded then |
| 206 C_TaskQuest.RequestPreloadRewardData(info.questId) | 215 pin:GetData() |
| 216 C_TaskQuest.RequestPreloadRewardData(info.questId) | |
| 217 end | |
| 218 | |
| 219 pin:IsFiltered() | |
| 220 pin:IsShowable() | |
| 221 pin.isStale = true | |
| 222 rprint(pin:GetID(), pin.filtered, pin.used) | |
| 223 | |
| 207 return pin | 224 return pin |
| 208 end | 225 end |
| 209 | 226 |
| 210 -- remove from index and add it to the recycling heap | 227 -- remove from index and add it to the recycling heap |
| 211 function Module:ReleasePin (pin) | 228 function Module:ReleasePin (pin) |
| 279 local scanner = _G.WorldPlanTooltip | 296 local scanner = _G.WorldPlanTooltip |
| 280 local print = qprint | 297 local print = qprint |
| 281 if not itemID then | 298 if not itemID then |
| 282 return | 299 return |
| 283 end | 300 end |
| 284 --print('GetRewardHeader', questID) | 301 qprint('GetRewardHeader', questID) |
| 285 | 302 |
| 286 scanner:SetOwner(WorldPlan, "ANCHOR_NONE") | 303 scanner:SetOwner(WorldPlan, "ANCHOR_NONE") |
| 287 scanner:SetItemByID(itemID) | 304 scanner:SetItemByID(itemID) |
| 288 scanner:Show() | 305 scanner:Show() |
| 289 local ttl1 = _G['WorldPlanTooltipTextLeft1'] | 306 local ttl1 = _G['WorldPlanTooltipTextLeft1'] |
| 312 elseif text:match("Item Level") then | 329 elseif text:match("Item Level") then |
| 313 --print('equipment!', text) | 330 --print('equipment!', text) |
| 314 quantity = text:match("Item Level ([%d\+]+)") | 331 quantity = text:match("Item Level ([%d\+]+)") |
| 315 return REWARD_GEAR, icon, quantity, name, itemID, quality | 332 return REWARD_GEAR, icon, quantity, name, itemID, quality |
| 316 elseif text:match("Crafting Reagent") then | 333 elseif text:match("Crafting Reagent") then |
| 317 --print('|cFFFF4400it is a reagent', text) | 334 qprint('|cFFFF4400it is a reagent', text) |
| 318 return REWARD_REAGENT, icon, quantity, name, itemID, quality | 335 return REWARD_REAGENT, icon, quantity, name, itemID, quality |
| 319 end | 336 end |
| 320 end | 337 end |
| 321 end | 338 end |
| 322 | 339 |
| 323 if ttl3 then | 340 if ttl3 then |
| 324 local text = ttl3:GetText() | 341 local text = ttl3:GetText() |
| 325 if text and text:match("Crafting Reagent") then | 342 if text and text:match("Crafting Reagent") then |
| 326 --print('|cFFFF4400it is a reagent', text) | 343 qprint('|cFFFF4400it is a reagent', text) |
| 327 return REWARD_REAGENT, icon, quantity, name, itemID, quality | 344 return REWARD_REAGENT, icon, quantity, name, itemID, quality |
| 328 end | 345 end |
| 329 end | 346 end |
| 330 return 128, icon, quantity, name, itemID, quality | 347 return 128, icon, quantity, name, itemID, quality |
| 331 end | 348 end |
| 392 db:print(id, pin.worldQuestType, pin.rewardType, pin.title) | 409 db:print(id, pin.worldQuestType, pin.rewardType, pin.title) |
| 393 end | 410 end |
| 394 end | 411 end |
| 395 | 412 |
| 396 function Module:Refresh(fromUser) | 413 function Module:Refresh(fromUser) |
| 414 self.isUserTriggered = fromUser | |
| 397 self.currentMapID = GetCurrentMapAreaID() | 415 self.currentMapID = GetCurrentMapAreaID() |
| 416 rprint('|cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') | |
| 398 print('|cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') | 417 print('|cFF00FF88'..self:GetName()..':Refresh()|r', fromUser or '|cFFFFFF00internal') |
| 399 if not self:IsVisible() then | 418 if not self:IsVisible() then |
| 400 print(' not visible, flag for later') | 419 print(' not visible, flag for later') |
| 401 self.isStale = true | 420 self.isStale = true |
| 402 return | 421 return |
| 405 | 424 |
| 406 for index, pin in pairs(db.QuestsByID) do | 425 for index, pin in pairs(db.QuestsByID) do |
| 407 pin.used = nil | 426 pin.used = nil |
| 408 end | 427 end |
| 409 | 428 |
| 410 self:SetFilteredPins(db.QuestsByID) | |
| 411 self:UpdateAnchors(nil, fromUser) | 429 self:UpdateAnchors(nil, fromUser) |
| 412 self:Cleanup (fromUser) | 430 self:Cleanup (fromUser) |
| 413 self.isStale = nil | 431 self.isStale = nil |
| 432 self.isUserTriggered = nil | |
| 414 end | 433 end |
| 415 | 434 |
| 416 -- update visibility states of all pins | 435 -- update visibility states of all pins |
| 417 function Module:SetFilteredPins(pins) | 436 function Module:SetFilteredPins(pins) |
| 418 print(' |cFFFFFF00'..self:GetName()..':SetFilteredPins()|r', pins) | 437 print(' |cFFFFFF00'..self:GetName()..':SetFilteredPins()|r', pins) |
| 419 pins = pins or db.QuestsByID | 438 pins = pins or db.QuestsByID |
| 420 for questID, pin in pairs(pins) do | 439 for questID, pin in pairs(pins) do |
| 421 pin.filtered = pin:IsFiltered() | |
| 422 pin.isStale = true | 440 pin.isStale = true |
| 423 rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) | 441 rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) |
| 424 end | 442 end |
| 425 end | 443 end |
| 426 | 444 |
| 431 if not pin then | 449 if not pin then |
| 432 return | 450 return |
| 433 end | 451 end |
| 434 | 452 |
| 435 | 453 |
| 436 print('~ ', pin.mapID, pin.questID, pin.title) | 454 --print('~ ', pin.mapID, pin.questID, pin.title) |
| 437 rprint('|cFF00FF00update|r', x, y, pin.title) | 455 rprint('|cFF00FF00update|r', x, y, pin.mapID, pin.questID, pin.title) |
| 438 pin:IsShowable() | |
| 439 | 456 |
| 440 if x and y then | 457 if x and y then |
| 441 | |
| 442 pin.x = x | 458 pin.x = x |
| 443 pin.y = y | 459 pin.y = y |
| 444 pin:SetFrameLevel(PinBaseIndex+numPins) | 460 pin.owningFrame = self.hostFrame |
| 445 pin:SetPoint('CENTER', self.hostFrame, 'TOPLEFT', self.hostWidth * pin.x, -self.hostHeight * pin.y) | |
| 446 pin.throttle = 1 | 461 pin.throttle = 1 |
| 447 pin:SetShown(pin.used) | 462 |
| 463 pin:SetParent(self.hostFrame) | |
| 464 pin:SetFrameLevel(PinBaseIndex+pin:GetID()) | |
| 465 pin:SetAnchor(pin.x, pin.y, self.hostWidth, self.hostHeight) | |
| 448 tinsert(self.UsedPositions, pin) | 466 tinsert(self.UsedPositions, pin) |
| 449 end | 467 end |
| 450 pin.owningFrame = self.hostFrame | |
| 451 pin:SetParent(self.hostFrame) | |
| 452 | 468 |
| 453 if mapID then | 469 if mapID then |
| 454 if not db.QuestsByZone[mapID] then | 470 if not db.QuestsByZone[mapID] then |
| 455 db.QuestsByZone[mapID] = {} | 471 db.QuestsByZone[mapID] = {} |
| 456 end | 472 end |
| 457 db.QuestsByZone[mapID][questID] = pin | 473 db.QuestsByZone[mapID][questID] = pin |
| 458 end | 474 end |
| 459 end | 475 end |
| 460 | 476 |
| 461 function Module:UpdateMap(taskInfo, mapID) | 477 function Module:UpdateMap(taskInfo, mapID) |
| 462 print('Map', GetMapNameByID(mapID), GetMapNameByID(self.currentMapID)) | 478 rprint('Map', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID)) |
| 463 for index, info in pairs(taskInfo) do | 479 for index, info in pairs(taskInfo) do |
| 464 self:UpdateQuestButton(info, mapID) | 480 self:UpdateQuestButton(info, mapID) |
| 465 end | 481 end |
| 466 end | 482 end |
| 467 | 483 |
| 468 function Module:UpdateAnchors (fromUser) | 484 function Module:UpdateAnchors (fromUser) |
| 469 | |
| 470 | |
| 471 wipe(self.UsedPositions) | 485 wipe(self.UsedPositions) |
| 472 print(' |cFF00FF00'..self:GetName()..':UpdateAnchors()', fromUser) | 486 print(' |cFF00FF00'..self:GetName()..':UpdateAnchors()', fromUser) |
| 473 self.hostFrame = WorldMapPOIFrame | 487 self.hostFrame = WorldMapPOIFrame |
| 474 self.hostWidth, self.hostHeight = self.hostFrame:GetSize() | 488 self.hostWidth, self.hostHeight = self.hostFrame:GetSize() |
| 475 self.nudgeThrescholdX = 16/self.hostWidth | 489 self.nudgeThrescholdX = 16/self.hostWidth |
| 480 if isMicroDungeon then | 494 if isMicroDungeon then |
| 481 return | 495 return |
| 482 end | 496 end |
| 483 | 497 |
| 484 numPins = 0 | 498 numPins = 0 |
| 485 local taskInfo = TQ_GetQuestsForPlayerByMapID(self.currentMapID) | 499 local taskInfo = TQ_GetQuestsForPlayerByMapID(db.currentMapID) |
| 486 if taskInfo then | 500 if taskInfo then |
| 487 self:UpdateMap(taskInfo, self.currentMapID) | 501 self:UpdateMap(taskInfo, db.currentMapID) |
| 488 end | 502 end |
| 489 local numZones = MC_GetNumZones(self.currentMapID) | 503 local numZones = MC_GetNumZones(db.currentMapID) |
| 490 if numZones then | 504 if numZones then |
| 491 for i = 1, numZones do | 505 for i = 1, numZones do |
| 492 local mapAreaID = MC_GetZoneInfo(self.currentMapID, i) | 506 local mapAreaID = MC_GetZoneInfo(self.currentMapID, i) |
| 493 local taskInfo = TQ_GetQuestsForPlayerByMapID(mapAreaID, self.currentMapID) | 507 local taskInfo = TQ_GetQuestsForPlayerByMapID(mapAreaID, db.currentMapID) |
| 494 if taskInfo then | 508 if taskInfo then |
| 495 self:UpdateMap(taskInfo, mapAreaID) | 509 self:UpdateMap(taskInfo, mapAreaID) |
| 496 end | 510 end |
| 497 end | 511 end |
| 498 end | |
| 499 if self.filtersDirty then | |
| 500 self:SetFilteredPins(db.QuestsByID) | |
| 501 end | 512 end |
| 502 end | 513 end |
| 503 | 514 |
| 504 -- shows, animates, or hides pins based on their current visibility flags | 515 -- shows, animates, or hides pins based on their current visibility flags |
| 505 function Module:Cleanup (fromUser) | 516 function Module:Cleanup (fromUser) |
| 509 print('|cFFFFFF00'..self:GetName()..':Cleanup()|r') | 520 print('|cFFFFFF00'..self:GetName()..':Cleanup()|r') |
| 510 --local showQuestPOI = db.Config.EnablePins | 521 --local showQuestPOI = db.Config.EnablePins |
| 511 for questID, pin in pairs(db.QuestsByID) do | 522 for questID, pin in pairs(db.QuestsByID) do |
| 512 local oV = pin:IsShown() | 523 local oV = pin:IsShown() |
| 513 if pin.used then | 524 if pin.used then |
| 514 | |
| 515 pin.throttle = 1 | 525 pin.throttle = 1 |
| 516 if oV == false then | 526 if oV == false then |
| 517 print('|cFF00FF00cleanup +|r', questID, pin.title) | 527 print('|cFF00FF00cleanup +|r', questID, pin.title) |
| 518 end | 528 end |
| 519 else | 529 else |
| 520 if oV == true then | 530 if oV == true then |
| 521 print('|cFFFF4400 -|r', questID, pin.title) | 531 print('|cFFFF4400 -|r', questID, pin.title) |
| 522 end | 532 end |
| 523 end | 533 pin.isStale = true |
| 524 pin:SetShown(pin.used or false) | 534 pin:SetShown(false) |
| 525 | 535 end |
| 526 if pin.worldQuest and (not C_TaskQuest.IsActive(pin.questID)) then | 536 end |
| 527 self:ReleasePin(pin) | 537 end |
| 528 end | 538 |
| 529 pin.isStale = true | |
| 530 end | |
| 531 end | |
| 532 |
