Mercurial > wow > worldplan
comparison QuestPOI.lua @ 33:be4db60219ca
WorldPlan:
- Toggling a reward filter cancels out other types by default. Use right mouse to clear.
- Fixed filter bar info falling out of sync after player-triggered world map updates.
ClassPlan:
- Available missions are now recorded; the mission list can be toggled between in-progress and available by clicking the heading.
| author | Nenue |
|---|---|
| date | Wed, 02 Nov 2016 17:25:07 -0400 |
| parents | d0114b51cdea |
| children | 0100d923d8c3 |
comparison
equal
deleted
inserted
replaced
| 32:e8679ecb48d8 | 33:be4db60219ca |
|---|---|
| 2 -- QuestPOI.lua | 2 -- QuestPOI.lua |
| 3 -- Created: 10/1/2016 7:21 PM | 3 -- Created: 10/1/2016 7:21 PM |
| 4 -- %file-revision% | 4 -- %file-revision% |
| 5 -- | 5 -- |
| 6 | 6 |
| 7 WorldPlanPOIMixin = {} | |
| 7 local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID | 8 local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID |
| 8 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation | 9 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation |
| 9 local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes | 10 local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes |
| 10 local TQ_IsActive = C_TaskQuest.IsActive | 11 local TQ_IsActive = C_TaskQuest.IsActive |
| 11 local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData | 12 local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData |
| 12 local QuestPOIGetIconInfo, WorldMapPOIFrame = QuestPOIGetIconInfo, WorldMapPOIFrame | 13 local QuestPOIGetIconInfo, WorldMapPOIFrame = QuestPOIGetIconInfo, WorldMapPOIFrame |
| 13 | 14 local WorldMap_DoesWorldQuestInfoPassFilters = WorldMap_DoesWorldQuestInfoPassFilters |
| 14 local print = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end | 15 local QuestMapFrame_IsQuestWorldQuest = QuestMapFrame_IsQuestWorldQuest |
| 16 local GameTooltip = GameTooltip | |
| 17 local GetItemIcon = GetItemIcon | |
| 18 | |
| 19 local print = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end | |
| 15 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end | 20 local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end |
| 21 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end | |
| 16 local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end | 22 local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end |
| 17 local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end | 23 local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end |
| 18 local QuestPOI = WorldPlanPOIMixin | 24 local QuestPOI = WorldPlanPOIMixin |
| 19 | 25 |
| 20 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" | 26 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" |
| 75 } | 81 } |
| 76 } | 82 } |
| 77 | 83 |
| 78 -- Pin color/display variables | 84 -- Pin color/display variables |
| 79 | 85 |
| 80 local familiars = { | 86 local familiars = { |
| 81 [42159] = {npc = 106552, name = 'Nightwatcher Merayl'}, | 87 [42159] = {npc = 106552, name = 'Nightwatcher Merayl'}, |
| 82 [40277] = {npc = 97804, name = 'Tiffany Nelson'}, | 88 [40277] = {npc = 97804, name = 'Tiffany Nelson'}, |
| 83 [40298] = {npc = 99182, name = 'Sir Galveston'}, | 89 [40298] = {npc = 99182, name = 'Sir Galveston'}, |
| 84 [40282] = {npc= 99150, name = 'Grixis Tinypop'}, | 90 [40282] = {npc= 99150, name = 'Grixis Tinypop'}, |
| 85 [40278] = {npc = 98270, name = 'Robert Craig'}, | 91 [40278] = {npc = 98270, name = 'Robert Craig'}, |
| 86 [48195] = {npc = 105250, name = 'Aulier'}, | 92 [48195] = {npc = 105250, name = 'Aulier'}, |
| 87 [41990] = {npc = 105674, name = 'Varenne'}, | 93 [41990] = {npc = 105674, name = 'Varenne'}, |
| 88 [41860] = {npc = 104970, name = 'Xorvasc'}, | 94 [41860] = {npc = 104970, name = 'Xorvasc'}, |
| 89 [40299] = {npc = 99210, name = 'Bodhi Sunwayver'}, | 95 [40299] = {npc = 99210, name = 'Bodhi Sunwayver'}, |
| 90 [42442] = {npc = 107489, name = 'Amalia'}, | 96 [42442] = {npc = 107489, name = 'Amalia'}, |
| 91 [40280] = {npc = 99077, name = 'Bredda Tenderhide'}, | 97 [40280] = {npc = 99077, name = 'Bredda Tenderhide'}, |
| 92 [41687] = {npc = 104553, name = 'Odrogg'}, | 98 [41687] = {npc = 104553, name = 'Odrogg'}, |
| 93 [41944] = {npc = 105455, name = 'Trapper Jarrun'}, | 99 [41944] = {npc = 105455, name = 'Trapper Jarrun'}, |
| 94 [40337] = {npc = 97709, name = 'Master Tamer Flummox'}, | 100 [40337] = {npc = 97709, name = 'Master Tamer Flummox'}, |
| 95 [40279] = {npc = 99035, name = 'Durian Strongfruit'} | 101 [40279] = {npc = 99035, name = 'Durian Strongfruit'} |
| 96 } | 102 } |
| 97 local familiars_id = 9696 | 103 local familiars_id = 9696 |
| 104 | |
| 105 | |
| 106 -- update a masked texture without messing up its blending mask | |
| 98 | 107 |
| 99 | 108 |
| 100 -- update a masked texture without messing up its blending mask | 109 -- update a masked texture without messing up its blending mask |
| 101 local SetMaskedTexture = function(region, file, mask) | 110 local SetMaskedTexture = function(region, file, mask) |
| 102 mask = mask or POI_BORDER_MASK | 111 mask = mask or "Interface\\Minimap\\UI-Minimap-Background" |
| 103 region:SetMask(nil) | 112 region:SetMask(nil) |
| 104 region:SetTexture(file) | 113 region:SetTexture(file) |
| 105 region:SetMask(mask) | 114 region:SetMask(mask) |
| 106 end | 115 end |
| 107 | 116 |
| 240 end | 249 end |
| 241 | 250 |
| 242 | 251 |
| 243 local questID = self:GetID() | 252 local questID = self:GetID() |
| 244 local questTitle, rewardIcon, rewardName, rewardCount, rewardStyle, rewardType, itemID, quantity, quality, _ | 253 local questTitle, rewardIcon, rewardName, rewardCount, rewardStyle, rewardType, itemID, quantity, quality, _ |
| 245 local hasUpdate, isPending = (self.hasUpdate or self.isNew), self.isPending | 254 local hasUpdate, isPending = (self.isStale or self.isNew), self.isPending |
| 246 | 255 |
| 247 | 256 |
| 248 if not HaveQuestData(questID) then | 257 if not HaveQuestData(questID) then |
| 249 TQ_RequestPreloadRewardData(questID) | 258 TQ_RequestPreloadRewardData(questID) |
| 250 isPending = true | 259 isPending = true |
| 315 end | 324 end |
| 316 | 325 |
| 317 self.title = questTitle or "|cFFFF0000Retrieving..." | 326 self.title = questTitle or "|cFFFF0000Retrieving..." |
| 318 self.itemTexture = rewardIcon or self.itemTexture | 327 self.itemTexture = rewardIcon or self.itemTexture |
| 319 self.itemName = rewardName or self.itemName | 328 self.itemName = rewardName or self.itemName |
| 320 self.hasUpdate = hasUpdate | 329 self.isStale = hasUpdate |
| 321 self.isPending = isPending | 330 self.isPending = isPending |
| 322 | 331 |
| 323 | 332 |
| 324 qprint(' |cFF00FFFF'..questID..'|r hasUpdate:', hasUpdate, 'isPending:', isPending) | 333 qprint(' |cFF00FFFF'..questID..'|r hasUpdate:', hasUpdate, 'isPending:', isPending) |
| 325 qprint(' ', 'rewardType:', self.rewardType, 'tag:', self.tagID) | 334 qprint(' ', 'rewardType:', self.rewardType, 'tag:', self.tagID) |
| 336 end | 345 end |
| 337 | 346 |
| 338 function WorldPlanPOIMixin:ShowNew() | 347 function WorldPlanPOIMixin:ShowNew() |
| 339 self:SetShown(true) | 348 self:SetShown(true) |
| 340 self.isNew = nil | 349 self.isNew = nil |
| 341 self.hasUpdate = true | 350 self.isStale = true |
| 342 self.FadeIn:Play() | 351 self.FadeIn:Play() |
| 343 end | 352 end |
| 344 | 353 |
| 345 function WorldPlanPOIMixin:OnShow () | 354 function WorldPlanPOIMixin:OnShow () |
| 346 qprint('|cFFFFFF00["'..tostring(self.title)..'"]|r:OnShow() update:', self.hasUpdate, 'new:', self.isNew, 'animation:', self.isAnimating) | 355 qprint('|cFFFFFF00["'..tostring(self.title)..'"]|r:OnShow() update:', self.isStale, 'new:', self.isNew, 'animation:', self.isAnimating) |
| 347 -- pop this on principle | 356 -- pop this on principle |
| 348 if self.hasUpdate then | 357 if self.isStale then |
| 349 self:Refresh() | 358 self:Refresh() |
| 350 end | 359 end |
| 351 | 360 |
| 352 end | 361 end |
| 353 function WorldPlanPOIMixin:OnHide() | 362 function WorldPlanPOIMixin:OnHide() |
| 354 qprint('|cFFFFFF00["'..tostring(self.title)..'"]|r:OnHide()') | 363 qprint('|cFFFFFF00["'..tostring(self.title)..'"]|r:OnHide()') |
| 355 end | 364 end |
| 356 | 365 |
| 357 function WorldPlanPOIMixin:SetAnchor(frame, mapID, mapWidth, mapHeight) | 366 function WorldPlanPOIMixin:SetAnchor(frame, mapID, mapWidth, mapHeight) |
| 358 qprint(' |cFF00FF00'..self:GetName()..':SetAnchor()|r', self.questID, mapID, mapWidth) | 367 --qprint(' |cFF00FF00'..self:GetName()..':SetAnchor()|r', self.questID, mapID, mapWidth) |
| 359 self:ClearAllPoints() | 368 self:ClearAllPoints() |
| 360 local dX, dY = TQ_GetQuestLocation(self.questID) | 369 local dX, dY = TQ_GetQuestLocation(self.questID) |
| 361 if not dX or dX == 0 then | 370 if not dX or dX == 0 then |
| 362 local _, x, y = QuestPOIGetIconInfo(self.questID) | 371 local _, x, y = QuestPOIGetIconInfo(self.questID) |
| 363 if x and floor(x) ~= 0 then | 372 if x and floor(x) ~= 0 then |
| 386 self.subStyle = WorldPlan.db.defaultPinStyle.continent | 395 self.subStyle = WorldPlan.db.defaultPinStyle.continent |
| 387 end | 396 end |
| 388 | 397 |
| 389 function WorldPlanPOIMixin:OnEvent(event, ...) | 398 function WorldPlanPOIMixin:OnEvent(event, ...) |
| 390 if event == 'SUPER_TRACKED_QUEST_CHANGED' then | 399 if event == 'SUPER_TRACKED_QUEST_CHANGED' then |
| 391 self.hasUpdate = true | 400 self.isStale = true |
| 392 end | 401 end |
| 393 end | 402 end |
| 394 | 403 |
| 395 | 404 |
| 396 local PIN_UPDATE_DELAY = .016 | 405 local PIN_UPDATE_DELAY = .016 |
| 397 local TOP_PIN_ID | 406 local TOP_PIN_ID |
| 398 function WorldPlanPOIMixin:OnUpdate (sinceLast) | 407 function WorldPlanPOIMixin:OnUpdate (sinceLast) |
| 399 | 408 |
| 400 if self.hasUpdate then | 409 if self.isStale then |
| 401 wqprint('|cFFFFFF00push poi update') | 410 print('|cFFFFFF00push poi update') |
| 402 self:Refresh() | 411 self:Refresh() |
| 403 return | 412 return |
| 404 end | 413 end |
| 405 -- control update check intervals | 414 -- control update check intervals |
| 406 self.throttle = (self.throttle or PIN_UPDATE_DELAY) - sinceLast | 415 self.throttle = (self.throttle or PIN_UPDATE_DELAY) - sinceLast |
| 455 | 464 |
| 456 | 465 |
| 457 | 466 |
| 458 function WorldPlanPOIMixin:Refresh () | 467 function WorldPlanPOIMixin:Refresh () |
| 459 local db = WorldPlan.db | 468 local db = WorldPlan.db |
| 460 local print = wqprint | |
| 461 print('|cFF00FF88'..self:GetName()..'|r:Refresh()') | 469 print('|cFF00FF88'..self:GetName()..'|r:Refresh()') |
| 462 | 470 |
| 463 | 471 |
| 464 | 472 |
| 465 local questID = self:GetID() | 473 local questID = self:GetID() |
| 490 if self.itemName then | 498 if self.itemName then |
| 491 | 499 |
| 492 | 500 |
| 493 if self.hasNumeric then | 501 if self.hasNumeric then |
| 494 if subStyle.numberFontObject then | 502 if subStyle.numberFontObject then |
| 495 wqprint('change font', _G[subStyle.numberFontObject]:GetName()) | 503 --wqprint('change font', _G[subStyle.numberFontObject]:GetName()) |
| 496 self.count:SetFontObject(_G[subStyle.numberFontObject]) | 504 self.count:SetFontObject(_G[subStyle.numberFontObject]) |
| 497 end | 505 end |
| 498 wqprint('filtered:', self.filtered, 'showNumber:', self.showNumber) | 506 --wqprint('filtered:', self.filtered, 'showNumber:', self.showNumber) |
| 499 | 507 |
| 500 self.count:SetShown(self.showNumber) | 508 self.count:SetShown(self.showNumber) |
| 501 self.count:SetText(self.itemNumber) | 509 self.count:SetText(self.itemNumber) |
| 502 self.count:SetTextColor(unpack(self.numberRGB)) | 510 self.count:SetTextColor(unpack(self.numberRGB)) |
| 503 else | 511 else |
| 538 --qprint('|cFF88FF00updated', questID, self.title, self.rewardType, (style.showNumber and self.itemNumber) or '') | 546 --qprint('|cFF88FF00updated', questID, self.title, self.rewardType, (style.showNumber and self.itemNumber) or '') |
| 539 --print(' - subStyle:', (self.filtered == true), self.subStyle) | 547 --print(' - subStyle:', (self.filtered == true), self.subStyle) |
| 540 | 548 |
| 541 | 549 |
| 542 self:UpdateSize() | 550 self:UpdateSize() |
| 543 self.hasUpdate = nil | 551 self.isStale = nil |
| 544 end | 552 end |
| 545 | 553 |
| 546 function WorldPlanFilterPinMixin:OnEnter () | 554 |
| 547 local filter = WorldPlan.FilterOptions[self:GetID()] | 555 |
| 548 local mapID = GetCurrentMapAreaID() | 556 |
| 549 local quests = (mapID == WorldPlan.BrokenIsleID) and WorldPlan.QuestsByID or WorldPlan.QuestsByZone[mapID] | 557 function QuestPOI:IsShowable () |
| 550 if quests then | 558 local print = wqprint |
| 551 GameTooltip:SetOwner(self, 'ANCHOR_RIGHT') | 559 local db = WorldPlan.db |
| 552 GameTooltip:AddLine(filter.label) | 560 local qType = self.worldQuestType |
| 553 local filterKey = self.filterKey | 561 local rType = self.rewardType |
| 554 local filterValue = self.filterValue | 562 self.filtered = nil |
| 555 if filterKey then | 563 self.used = true |
| 556 for questID, pin in pairs(quests) do | 564 |
| 557 if pin.used and not pin.filtered then | 565 |
| 558 if pin[filterKey] == filterValue then | 566 self.questId = self:GetID() |
| 559 local style = pin.style or WorldPlan.FilterStyle | 567 if not (WorldMap_DoesWorldQuestInfoPassFilters(self, false, true)) then |
| 560 | 568 self.filtered = true |
| 561 if familiars[questID] then | 569 end |
| 562 GameTooltip:AddLine(pin.title,0,1,0) | 570 |
| 563 else | 571 for filterKey, value in pairs(WorldPlan.UsedFilters) do |
| 564 GameTooltip:AddLine(pin.title,1,1,1) | 572 if self[filterKey] ~= value then |
| 565 end | 573 self.filtered = true |
| 566 | 574 end |
| 567 end | 575 end |
| 568 end | 576 |
| 569 end | 577 if not TQ_IsActive(self.questID) then |
| 570 else | 578 self.used = nil |
| 571 GameTooltip:AddLine('Reset all filters') | 579 elseif qType == LE_QUEST_TAG_TYPE_PROFESSION then |
| 572 end | 580 if not (db.ShowAllProfessionQuests or (self.tradeskillLineIndex and GetProfessionInfo(self.tradeskillLineIndex))) then |
| 573 GameTooltip:Show() | 581 self.used = nil |
| 574 end | 582 end |
| 575 end | 583 end |
| 584 print(' |cFFFF4400IsShowable()|r', self.used, self.filtered, self.title) | |
| 585 return self.used, self.filtered | |
| 586 end | |
| 587 | |
| 588 function QuestPOI:UpdateTimer (timeLeft, timeType) | |
| 589 print('|cFF0088FFUpdatePinTimer()|r') | |
| 590 end | |
| 591 | |
| 592 --- Fixes icons upon size update | |
| 593 function QuestPOI:UpdateSize (style, subStyle) | |
| 594 style = style or self.style | |
| 595 subStyle = subStyle or self.subStyle | |
| 596 | |
| 597 --qprint('|cFF00FF88'..self:GetName()..'|r:UpdateSize()', style, subStyle) | |
| 598 | |
| 599 self.currentWidth = subStyle.PinSize | |
| 600 self.borderSize = subStyle.Border | |
| 601 self.trackingBorderSize = subStyle.TrackingBorder | |
| 602 self.tagSize = subStyle.TagSize | |
| 603 self.TimeleftStage = subStyle.TimeleftStage | |
| 604 self.NoIcon = subStyle.NoIcon | |
| 605 | |
| 606 | |
| 607 self:SetSize(self.currentWidth, self.currentWidth) | |
| 608 | |
| 609 local icon = self.icon | |
| 610 local iconBorder = self.iconBorder | |
| 611 local trackingBorder = self.supertrackBorder | |
| 612 local tag = self.tagIcon | |
| 613 local pinMask = style.pinMask | |
| 614 local rewardMask = style.rewardMask | |
| 615 | |
| 616 if self.NoIcon then | |
| 617 self.icon:Hide() | |
| 618 else | |
| 619 self.icon:Show() | |
| 620 icon:SetMask(nil) | |
| 621 icon:SetMask(rewardMask) | |
| 622 icon:SetTexture(self.icon:GetTexture()) | |
| 623 end | |
| 624 iconBorder:SetMask(nil) | |
| 625 trackingBorder:SetMask(nil) | |
| 626 | |
| 627 | |
| 628 local borderWidth = self.borderSize | |
| 629 local trackingWidth = self.trackingBorderSize | |
| 630 | |
| 631 iconBorder:ClearAllPoints() | |
| 632 iconBorder:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', -borderWidth + (style.x or 0), -borderWidth + (style.y or 0)) | |
| 633 iconBorder:SetPoint('TOPRIGHT', self, 'TOPRIGHT', borderWidth + (style.x or 0), borderWidth + (style.y or 0)) | |
| 634 | |
| 635 trackingBorder:ClearAllPoints() | |
| 636 trackingBorder:SetPoint('BOTTOMLEFT', iconBorder, 'BOTTOMLEFT', -trackingWidth, -trackingWidth) | |
| 637 trackingBorder:SetPoint('TOPRIGHT', iconBorder, 'TOPRIGHT', trackingWidth, trackingWidth) | |
| 638 | |
| 639 if self.tagSize then | |
| 640 tag:Show() | |
| 641 tag:ClearAllPoints() | |
| 642 tag:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', borderWidth, -borderWidth) | |
| 643 else | |
| 644 tag:Hide() | |
| 645 end | |
| 646 | |
| 647 --qprint('using mask:', mask, self.name ) | |
| 648 iconBorder:SetMask(pinMask) | |
| 649 trackingBorder:SetMask(pinMask) | |
| 650 end |
