Mercurial > wow > worldplan
comparison WorldQuests.lua @ 96:8591401ec278
- Fixed quest markers for other maps becoming visible due to ambiguous interpretations of pin.used.
- Removed some redundant filter checking calls on pins obtained through Acquire()
| author | Nenue |
|---|---|
| date | Sun, 14 May 2017 23:45:08 -0400 |
| parents | b29b35cb8539 |
| children | 5d90d09cb7b7 |
comparison
equal
deleted
inserted
replaced
| 95:b29b35cb8539 | 96:8591401ec278 |
|---|---|
| 26 local GetQuestLogRewardInfo = GetQuestLogRewardInfo | 26 local GetQuestLogRewardInfo = GetQuestLogRewardInfo |
| 27 local GetCurrentMapAreaID, GetMapInfo, GetMapNameByID = GetCurrentMapAreaID, GetMapInfo, GetMapNameByID | 27 local GetCurrentMapAreaID, GetMapInfo, GetMapNameByID = GetCurrentMapAreaID, GetMapInfo, GetMapNameByID |
| 28 local GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID, IsQuestComplete = GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID, IsQuestComplete | 28 local GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID, IsQuestComplete = GetQuestBountyInfoForMapID, GetQuestLogTitle, GetQuestLogIndexByID, IsQuestComplete |
| 29 local HaveQuestRewardData = HaveQuestRewardData | 29 local HaveQuestRewardData = HaveQuestRewardData |
| 30 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation | 30 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation |
| 31 local InCombatLockdown, hooksecurefunc = InCombatLockdown, hooksecurefunc | |
| 31 | 32 |
| 32 local ToggleButton = {} | 33 local ToggleButton = {} |
| 33 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 | 34 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 |
| 34 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", | 35 local WORLD_QUEST_MAPS = { [DALARAN_ID] = 'Dalaran70', [AZSUNA_ID] = 'Azsuna', [VALSHARAH_ID] = "Val'sharah", |
| 35 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } | 36 [HIGHMOUNTAIN_ID] = 'Highmountain', [STORMHEIM_ID] = 'Stormheim', [SURAMAR_ID] = 'Suramar', [EOA_ID] = 'EyeOfAszhara', } |
| 47 | 48 |
| 48 local continentScanned | 49 local continentScanned |
| 49 local layoutDirty = true | 50 local layoutDirty = true |
| 50 local bountiesDirty = true | 51 local bountiesDirty = true |
| 51 local artifactPowerDirty = true | 52 local artifactPowerDirty = true |
| 53 local hooksDirty = true | |
| 52 local currentScale = WorldMapDetailFrame:GetScale() | 54 local currentScale = WorldMapDetailFrame:GetScale() |
| 53 local canTargetQuests | 55 local canTargetQuests |
| 54 local isDataLoaded = true | 56 local isDataLoaded = true |
| 55 local artifactKnowledgeLevel | 57 local artifactKnowledgeLevel |
| 56 local superTrackedQuestID | 58 local superTrackedQuestID |
| 209 callbacks[ActionButton] = {} | 211 callbacks[ActionButton] = {} |
| 210 callbacks[ActionButton].UpdateCastingState = function(WorldQuests) | 212 callbacks[ActionButton].UpdateCastingState = function(WorldQuests) |
| 211 WorldQuests:Refresh('CASTING_STATE_CHANGED') | 213 WorldQuests:Refresh('CASTING_STATE_CHANGED') |
| 212 end | 214 end |
| 213 | 215 |
| 214 function Module:Setup() | 216 callbacks.UseWorldMapActionButtonSpellOnQuest = function(questID) |
| 215 --print('|cFFFF4400'..self:GetName()..':Setup()') | 217 if db.QuestsByID[questID] then |
| 216 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do | 218 db.QuestsByID[questID].isStale = true |
| 217 db.QuestsByZone[mapID] = {} | 219 end |
| 218 end | 220 end |
| 221 | |
| 222 function Module:SetupCallbacks() | |
| 223 if InCombatLockdown() then | |
| 224 return nil | |
| 225 end | |
| 226 print('SetupCallbacks()') | |
| 219 for target, arg in pairs(callbacks) do | 227 for target, arg in pairs(callbacks) do |
| 220 --print(type(target)) | 228 --print(type(target)) |
| 221 if type(target) == 'table' then | 229 if type(target) == 'table' then |
| 222 local callerName = target:GetName() or tostring(target) | 230 local callerName = target:GetName() or tostring(target) |
| 223 for name, method in pairs(arg) do | 231 for name, method in pairs(arg) do |
| 231 self:OnSecureHook(target, arg, ...) | 239 self:OnSecureHook(target, arg, ...) |
| 232 end) | 240 end) |
| 233 end | 241 end |
| 234 end | 242 end |
| 235 | 243 |
| 244 | |
| 245 end | |
| 246 | |
| 247 function Module:Setup() | |
| 248 --print('|cFFFF4400'..self:GetName()..':Setup()') | |
| 249 for mapID, mapName in pairs(WORLD_QUEST_MAPS) do | |
| 250 db.QuestsByZone[mapID] = {} | |
| 251 end | |
| 252 | |
| 253 hooksDirty = self:SetupCallbacks() | |
| 236 | 254 |
| 237 self:SetAllPoints(WorldMapFrame.UIElementsFrame) | 255 self:SetAllPoints(WorldMapFrame.UIElementsFrame) |
| 238 self:UpdateArtifactPower() | 256 self:UpdateArtifactPower() |
| 239 self:UpdateBounties('SETUP') | 257 self:UpdateBounties('SETUP') |
| 240 self:Show() | 258 self:Show() |
| 288 end | 306 end |
| 289 -- re-anchors and scales pins that have had either of these changed due to data loading delays | 307 -- re-anchors and scales pins that have had either of these changed due to data loading delays |
| 290 function Module:UpdateNext() | 308 function Module:UpdateNext() |
| 291 --print('|cFF00FF88UpdateNext()') | 309 --print('|cFF00FF88UpdateNext()') |
| 292 local pin = tremove(db.UpdatedPins) | 310 local pin = tremove(db.UpdatedPins) |
| 293 | |
| 294 -- criteria state is asserted independently | |
| 295 pin:CheckFilterRules() | 311 pin:CheckFilterRules() |
| 312 | |
| 296 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] | 313 local scaleFactor = SCALE_FACTORS[(pin.dataLoaded and not pin.filtered) and scaleConstant or 1] |
| 297 --print(pin.title, pin.dataLoaded and not pin.filtered, scaleFactor) | 314 --print(pin.title, pin.dataLoaded and not pin.filtered, scaleFactor) |
| 298 if pin.used then | 315 if pin.used then |
| 316 pin:SetShown(true) | |
| 299 pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor) | 317 pin:SetAnchor(nil, pin.x, pin.y, self.hostWidth, self.hostHeight, scaleFactor) |
| 300 if pin:IsVisible() then | 318 pin:Refresh() |
| 301 pin:Refresh() | 319 else |
| 302 else | 320 print('|cFFFF4400flagging queued pin that got hidden:', pin.title) |
| 303 pin.isStale = true | 321 pin.isStale = true |
| 304 end | |
| 305 end | 322 end |
| 306 end | 323 end |
| 307 | 324 |
| 308 function Module:UpdateBounties(...) | 325 function Module:UpdateBounties(...) |
| 309 print('|cFF00FF88BountyInfo()|r', ...) | 326 print('|cFF00FF88BountyInfo()|r', ...) |
| 366 artifactPowerDirty = nil | 383 artifactPowerDirty = nil |
| 367 end | 384 end |
| 368 | 385 |
| 369 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF' | 386 local msg = '|cFF00FF88WorldQuests:Refresh()|r|cFF00FFFF' |
| 370 function Module:Refresh(...) | 387 function Module:Refresh(...) |
| 388 | |
| 389 if hooksDirty then | |
| 390 hooksDirty = self:SetupCallbacks() | |
| 391 end | |
| 392 | |
| 393 | |
| 371 if not self:IsVisible() then | 394 if not self:IsVisible() then |
| 372 print('|cFFFF4400Refresh()|r', ...) | 395 print('|cFFFF4400Refresh()|r', ...) |
| 373 --layoutDirty = true | |
| 374 return | 396 return |
| 375 else | 397 else |
| 376 -- | |
| 377 if lastRefresh == GetTime() then | 398 if lastRefresh == GetTime() then |
| 378 print('|cFFFF4400multiple refreshes tried') | 399 print('|cFFFF4400multiple refreshes tried') |
| 379 end | 400 end |
| 380 lastRefresh = GetTime() | 401 lastRefresh = GetTime() |
| 381 --rprint(msg, ...) | |
| 382 print(msg, lastRefresh, ...) | 402 print(msg, lastRefresh, ...) |
| 383 end | 403 end |
| 384 | 404 |
| 385 if not db.Config.EnablePins then | 405 if not db.Config.EnablePins then |
| 386 numShown = 0 | 406 numShown = 0 |
| 387 self.refreshBenchMark = GetTime() | 407 self.refreshBenchMark = GetTime() |
| 388 self.refreshBenchMarkTicker = 2 | 408 self.refreshBenchMarkTicker = 2 |
| 389 print('starting bench', self.refreshBenchMark) | 409 print('starting bench', self.refreshBenchMark) |
| 390 return | 410 return |
| 391 end | 411 end |
| 392 --wprint(' '..msg) | |
| 393 | 412 |
| 394 scaleConstant = db.isContinentMap and 2 or 3 | 413 scaleConstant = db.isContinentMap and 2 or 3 |
| 395 canTargetQuests = SpellCanTargetQuest() | 414 canTargetQuests = SpellCanTargetQuest() |
| 396 | 415 |
| 397 for index, pin in pairs(db.QuestsByID) do | 416 for index, pin in pairs(db.QuestsByID) do |
| 398 pin.used = nil | 417 pin.used = nil |
| 399 end | 418 end |
| 400 | 419 |
| 401 self:UpdateAnchors(...) | 420 self:UpdateAnchors(...) |
| 402 --[[ | |
| 403 if bountiesDirty then | |
| 404 --print(' bounties dirty, pushing that') | |
| 405 self:UpdateBounties() | |
| 406 end | |
| 407 --]] | |
| 408 | 421 |
| 409 if artifactPowerDirty and not InCombatLockdown() then | 422 if artifactPowerDirty and not InCombatLockdown() then |
| 410 self:UpdateArtifactPower() | 423 self:UpdateArtifactPower() |
| 411 end | 424 end |
| 412 -- calculate quests shown | 425 -- calculate quests shown |
| 413 numShown = 0 | 426 numShown = 0 |
| 414 numLoaded = 0 | 427 numLoaded = 0 |
| 415 for questID, pin in pairs(db.QuestsByID) do | 428 for questID, pin in pairs(db.QuestsByID) do |
| 416 local oV = pin:IsShown() | 429 local oV = pin:IsShown() |
| 417 if pin.used then | 430 if pin.used then |
| 431 print('show', pin.title) | |
| 418 pin.throttle = 1 | 432 pin.throttle = 1 |
| 419 --[[ | |
| 420 if oV == false then | |
| 421 --rprint('|cFF00FF00cleanup +|r', questID, pin.title) | |
| 422 end | |
| 423 --]] | |
| 424 pin:SetShown(true) | 433 pin:SetShown(true) |
| 425 numShown = numShown + 1 | 434 numShown = numShown + 1 |
| 426 if pin.dataLoaded then | 435 if pin.dataLoaded then |
| 427 numLoaded = numLoaded + 1 | 436 numLoaded = numLoaded + 1 |
| 428 end | 437 end |
| 429 | 438 |
| 430 else | 439 else |
| 431 --[[ | 440 if pin:IsShown() then |
| 432 if oV == true then | 441 print('|cFFFF4400need to remove', pin.title) |
| 433 rprint('|cFFFF4400 -|r', questID, pin.title) | 442 |
| 434 end | 443 end |
| 435 --]] | 444 |
| 436 pin.hideReason = "Not used in map area " .. (db.currentMapID) | 445 pin.hideReason = "Not used in map area " .. (db.currentMapID) |
| 437 pin:SetShown(false) | 446 pin:SetShown(false) |
| 438 end | 447 end |
| 439 | 448 |
| 440 end | 449 end |
| 441 --print('flags ', layoutDirty, self.isStale) | |
| 442 --print(' ', numShown, 'shown,', numLoaded, 'with data') | |
| 443 | 450 |
| 444 | 451 |
| 445 -- | 452 -- |
| 446 self.refreshBenchMark = GetTime() | 453 self.refreshBenchMark = GetTime() |
| 447 self.refreshBenchMarkTicker = 2 | 454 self.refreshBenchMarkTicker = 2 |
| 481 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) | 488 print('|cFF00FFFFRefreshIfChanged()|r', refreshReason) |
| 482 self.isStale = true | 489 self.isStale = true |
| 483 end | 490 end |
| 484 end | 491 end |
| 485 | 492 |
| 486 -- marks a pin set for passive update | |
| 487 function Module:MarkAllPins(pins) | |
| 488 --print(' |cFFFFFF00'..self:GetName()..':MarkAllPins()|r', pins) | |
| 489 pins = pins or db.QuestsByID | |
| 490 for questID, pin in pairs(pins) do | |
| 491 pin.isStale = true | |
| 492 --rprint('|cFF00FF00filter', pin.questID, pin.filtered, 'used:', pin.used) | |
| 493 end | |
| 494 end | |
| 495 | |
| 496 -- Walks the current map tree and fires updates as needed | 493 -- Walks the current map tree and fires updates as needed |
| 497 function Module:UpdateAnchors (event) | 494 function Module:UpdateAnchors (event) |
| 498 wipe(self.UsedPositions) | 495 wipe(self.UsedPositions) |
| 499 local hostWidth, hostHeight = WorldMapPOIFrame:GetSize() | 496 local hostWidth, hostHeight = WorldMapPOIFrame:GetSize() |
| 500 | 497 |
| 527 end | 524 end |
| 528 end | 525 end |
| 529 end | 526 end |
| 530 end | 527 end |
| 531 | 528 |
| 532 -- Applies map association to the pins corresponding with each TaskInfo item | 529 -- Attempt to display the pins for quests in taskInfo |
| 533 function Module:UpdateQuestsForMap(taskInfo, mapID) | 530 function Module:UpdateQuestsForMap(taskInfo, mapID) |
| 534 print('|cFF00FF00UpdateQuestsForMap()|r', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID), layoutDirty) | 531 print('|cFF00FF00UpdateQuestsForMap()|r', GetMapNameByID(mapID), GetMapNameByID(db.currentMapID), layoutDirty) |
| 535 if db.QuestsByZone[mapID] then | 532 if db.QuestsByZone[mapID] then |
| 536 wipe(db.QuestsByZone[mapID]) | 533 wipe(db.QuestsByZone[mapID]) |
| 537 elseif db.isBrokenIsle then | 534 elseif db.isBrokenIsle then |
| 538 continentScanned = true | 535 continentScanned = true |
| 539 end | 536 end |
| 537 print('layoutDirty =',layoutDirty) | |
| 540 | 538 |
| 541 for index, info in pairs(taskInfo) do | 539 for index, info in pairs(taskInfo) do |
| 542 local questID, x, y = info.questId, info.x, info.y | 540 local questID, x, y = info.questId, info.x, info.y |
| 543 local pin = self:AcquirePin(info) | 541 local pin = self:AcquirePin(info) |
| 544 | 542 |
| 545 if pin then | 543 if pin.canShow then |
| 546 pin.used = true | 544 pin.used = true |
| 547 print(pin.title, pin.isStale, layoutDirty, (pin.owningFrame ~= WorldMapFrame)) | 545 print('using', pin.title, (pin.owningFrame ~= WorldMapFrame)) |
| 548 if pin:IsShown() and (layoutDirty or pin.isStale or (pin.owningFrame ~= WorldMapFrame)) then | 546 if layoutDirty or (pin.owningFrame ~= WorldMapFrame) then |
| 549 local scaleFactor = SCALE_FACTORS[(not pin.filtered and scaleConstant) or 1] | 547 local scaleFactor = SCALE_FACTORS[(not pin.filtered and scaleConstant) or 1] |
| 550 pin.owningFrame = WorldMapFrame | 548 pin.owningFrame = WorldMapFrame |
| 551 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor) | 549 pin:SetAnchor(WorldMapPOIFrame, x, y, self.hostWidth, self.hostHeight, scaleFactor) |
| 552 if pin.isStale then | 550 if pin.isStale then |
| 553 pin:Refresh('WORLDMAP_REFRESH ' .. GetTime()) | 551 pin:Refresh('WORLDMAP_REFRESH ' .. GetTime()) |
| 554 end | 552 end |
| 555 else | 553 end |
| 556 if layoutDirty then | 554 if db.QuestsByZone[mapID] then |
| 557 pin.isStale = true | |
| 558 end | |
| 559 end | |
| 560 | |
| 561 if db.QuestsByZone[mapID] and pin.used then | |
| 562 db.QuestsByZone[mapID][questID] = pin | 555 db.QuestsByZone[mapID][questID] = pin |
| 563 end | 556 end |
| 557 else | |
| 558 print('|cFFFF4400not using|r', pin.title) | |
| 564 end | 559 end |
| 565 end | 560 end |
| 566 end | 561 end |
| 567 | 562 |
| 568 -- locates or creates a corresponding pin frame for the provided TaskInfo data | 563 -- locates or creates a corresponding pin frame for the provided TaskInfo data |
