comparison QuestPOI.lua @ 95:b29b35cb8539

- 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 - ClassOrderPlan can be closed with the game menu button
author Nenue
date Mon, 08 May 2017 22:38:52 -0400
parents 98b5e08b75ed
children 8591401ec278
comparison
equal deleted inserted replaced
94:dfd53f7c0fe5 95:b29b35cb8539
42 42
43 local pinBaseIndex = 1320 43 local pinBaseIndex = 1320
44 local overlayBaseIndex = 1380 44 local overlayBaseIndex = 1380
45 local previousHighlight 45 local previousHighlight
46 46
47 local FADE_TIMING_MULTIPLIER = 3
47 local DATA_DEBUG = false 48 local DATA_DEBUG = false
48 local PIN_REFRESH_DELAY = 1 49 local PIN_REFRESH_DELAY = 1
49 local PIN_REQUEST_DELAY = .2 50 local PIN_REQUEST_DELAY = .2
50 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" 51 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark"
51 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" 52 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up"
91 scaleFactors = {0.25, 0.7, 1}, 92 scaleFactors = {0.25, 0.7, 1},
92 iconWidth = 18, 93 iconWidth = 18,
93 borderWidth = 2, 94 borderWidth = 2,
94 highlightWidth = 2, 95 highlightWidth = 2,
95 TagSize = 8, 96 TagSize = 8,
96 maxAlertLevel = 0, 97 maxAlertLevel = 3,
97 numberFontObject = 'WorldPlanFont' 98 numberFontObject = 'WorldPlanFont'
98 } 99 }
99 local MINIMIZED_STYLE = { 100 local MINIMIZED_STYLE = {
100 hideNumber = true, 101 hideNumber = true,
101 hideIcon = true, 102 hideIcon = true,
168 pet = petName, 169 pet = petName,
169 petID = petID 170 petID = petID
170 }} 171 }}
171 end 172 end
172 173
174
175 do
176 local timeStates = {
177 {maxSeconds = 60,
178 r=1, g=0.25, b =0, format = function (minutes) return '|cFFFF4400'.. minutes .. 'm' end,
179 },
180 {maxSeconds = 240,
181 r=1, g=.5, b=0, format = function(minutes) return '|cFFFF4400'.. floor(minutes/60) .. 'h' end,
182 },
183 {maxSeconds = 1440,
184 r=1, g=1, b=0, format = function(minutes) return '|cFFFFFF00'.. floor(minutes/60) .. 'h' end,
185 },
186 {maxSeconds = 10081,
187 r=0, g=1, b=0,
188 }, -- 7 days + 1 minute
189 }
190 -- Generates a timeleft string
191 function QuestPOI:GetTimeInfo(timeLeft, limit)
192 for index = 1, limit do
193 local state = timeStates[index]
194 if timeLeft <= state.maxSeconds then
195 local text
196 if state.format then
197 text = state.format(timeLeft)
198 end
199 return text, index, state
200 end
201 end
202 return
203 end
204 end
205
206
173 local GetAchievementTooltipExtras = function(info) 207 local GetAchievementTooltipExtras = function(info)
174 208
175 local hasInfo 209 local hasInfo
176 local achievementID = info.achievementID 210 local achievementID = info.achievementID
177 local _, name, _, completed, _, _, _, _, _, icon = GetAchievementInfo(achievementID) 211 local _, name, _, completed, _, _, _, _, _, icon = GetAchievementInfo(achievementID)
271 function QuestPOI:OnShow () 305 function QuestPOI:OnShow ()
272 if self.isStale then 306 if self.isStale then
273 --print('|cFF00FF00refresh on show') 307 --print('|cFF00FF00refresh on show')
274 self:Refresh('POI_ONSHOW_STALE') 308 self:Refresh('POI_ONSHOW_STALE')
275 end 309 end
310
311 if self.questID and IsQuestComplete(self.questID) then
312 self:Release()
313 return
314 end
315
276 self:RegisterEvent('QUEST_TURNED_IN') 316 self:RegisterEvent('QUEST_TURNED_IN')
277 self:RegisterEvent('QUEST_LOG_UPDATE') 317 self:RegisterEvent('QUEST_LOG_UPDATE')
278 self:HideOrShowFrames(true) 318 self:HideOrShowFrames(true)
279 end 319 end
280 320
391 431
392 local updateTime, markTime 432 local updateTime, markTime
393 function QuestPOI:OnUpdate (sinceLast) 433 function QuestPOI:OnUpdate (sinceLast)
394 -- control update check intervals 434 -- control update check intervals
395 435
396 if self.animating then 436 if self.toAlpha then
397 local alpha = self.icon:GetAlpha() + sinceLast*3 437 if not self.alphaStart then
398 438 self.alphaStart = GetTime()
399 self.animateTime = (self.animateTime or 0) + sinceLast 439 end
400 if alpha >= 1 then 440
401 alpha = 1 441
402 print('fade over', self.animateTime) 442 local alpha = self.icon:GetAlpha()
403 self.animating = nil 443 local alphaMod = ((GetTime()-self.alphaStart) *FADE_TIMING_MULTIPLIER)
404 self.animateTime = nil 444 if self:GetID() == 1 then
405 445 print(alpha, self.toAlpha, sinceLast, alphaMod)
446 end
447 if alpha > self.toAlpha then
448 alpha = alpha - (sinceLast*FADE_TIMING_MULTIPLIER)
449
450 if (alpha <= self.toAlpha) then
451 alpha = self.toAlpha
452 self.toAlpha = nil
453 elseif (alpha <= 0) then
454 alpha = 0
455 self.toAlpha = nil
456 end
457 elseif alpha < self.toAlpha then
458 alpha = alpha + alphaMod
459
460 if (alpha >= self.toAlpha) then
461 alpha = self.toAlpha
462 self.toAlpha = nil
463 elseif (alpha >= 1) then
464 alpha = 1
465 self.toAlpha = nil
466 end
467
468 else
469 self.toAlpha = nil
470 end
471
472 if not self.toAlpha then
473 self.alphaStart = nil
474 else
475 self.alphaStart = GetTime()
406 end 476 end
407 477
408 self.icon:SetAlpha(alpha) 478 self.icon:SetAlpha(alpha)
409 self.RewardBorder:SetAlpha(alpha) 479 self.RewardBorder:SetAlpha(alpha)
410 end 480 end
448 end 518 end
449 end 519 end
450 520
451 521
452 function QuestPOI:StartFading() 522 function QuestPOI:StartFading()
453 if not self.animating then 523 if not self.toAlpha then
454 self.animating = true 524 print('setting toAlpha')
525 self.toAlpha = 1
455 self.icon:SetAlpha(0) 526 self.icon:SetAlpha(0)
456 self.RewardBorder:SetAlpha(0) 527 self.RewardBorder:SetAlpha(0)
457 end 528 end
458 end 529 end
459 530
505 self.itemNumber = itemNumber 576 self.itemNumber = itemNumber
506 self.itemQuality = quality 577 self.itemQuality = quality
507 self.dataLoaded = true 578 self.dataLoaded = true
508 self.isStale = true 579 self.isStale = true
509 self.xpType, self.xpName, self.xpIcon, self.xpCount = xpType, xpName, xpIcon, xpCount 580 self.xpType, self.xpName, self.xpIcon, self.xpCount = xpType, xpName, xpIcon, xpCount
510 581 WorldPlan.dataFlush = true
511 end 582 end
512 end 583 end
513 584
514 585
515 return self.dataLoaded 586 return self.dataLoaded
681 WorldPlanTooltip:SetOwner(self, 'ANCHOR_NONE') 752 WorldPlanTooltip:SetOwner(self, 'ANCHOR_NONE')
682 WorldPlanTooltip:SetHyperlink(rewardLink or self.rewardLink) 753 WorldPlanTooltip:SetHyperlink(rewardLink or self.rewardLink)
683 for i = 1, WorldPlanTooltip:NumLines() do 754 for i = 1, WorldPlanTooltip:NumLines() do
684 local line = _G['WorldPlanTooltipTextLeft' .. i] 755 local line = _G['WorldPlanTooltipTextLeft' .. i]
685 local text = line and line:GetText() 756 local text = line and line:GetText()
686 local ap = text and text:gsub(',', ''):gsub(' million', '000000'):match('([%d%.]+) '..ARTIFACT_POWER) 757 local multiplier = (text:match('million') and 1000000) or 1
687 if ap then 758 if text then
688 rewardCount = tonumber(ap) 759 text = text:gsub(',', '')
760 local ap = text:match('([%d]+) '..ARTIFACT_POWER)
761 if not ap then
762 ap = text:match('([%d%.]+) million '..ARTIFACT_POWER)
763 if ap then
764 ap = tonumber(ap) * 1000000
765 end
766 end
767 if ap then
768 rewardCount = tonumber(ap)
769 end
689 end 770 end
690 end 771 end
691 return rewardCount 772 return rewardCount
692 end 773 end
693 774
855 936
856 local tagIcon = self.tagIcon 937 local tagIcon = self.tagIcon
857 self.maxAlertLevel = style.maxAlertLevel or DEFAULT_STYLE.maxAlertLevel 938 self.maxAlertLevel = style.maxAlertLevel or DEFAULT_STYLE.maxAlertLevel
858 939
859 if self.dataLoaded then 940 if self.dataLoaded then
860 print('new pin, has data, cue fade')
861 if self.isNew then 941 if self.isNew then
942 print('new pin, has data, cue fade')
862 self:StartFading() 943 self:StartFading()
863 self.isNew = nil 944 self.isNew = nil
864 end 945 end
865 else 946 else
866 if not self.animating then 947 if not self.toAlpha then
867 print('new pin, but no data, hide icon') 948 icon:SetAlpha(0)
868 self.icon:SetAlpha(0) 949 iconBorder:SetAlpha(0)
869 self.RewardBorder:SetAlpha(0)
870 end 950 end
871 end 951 end
872 952
873 if self.itemName then 953 if self.itemName then
874 if self.itemNumber and (self.itemNumber > 1) and (not hideNumbers) then 954 if self.itemNumber and (self.itemNumber > 1) and (not hideNumbers) then
985 1065
986 -- Called at static intervals and with Refresh 1066 -- Called at static intervals and with Refresh
987 function QuestPOI:UpdateStatus() 1067 function QuestPOI:UpdateStatus()
988 -- update time elements 1068 -- update time elements
989 self.isActive = TQ_IsActive(self.questID) 1069 self.isActive = TQ_IsActive(self.questID)
1070 --print(self.maxAlertLevel)
1071 local border = (self.isBounty or self.isCriteria) and self.RewardBorder or self.HighlightBorder
990 1072
991 if self.isActive then 1073 if self.isActive then
992 local tl = self.alertLevel 1074 local tl = self.alertLevel
993 local timeLeft = TQ_GetQuestTimeLeftMinutes(self.questID) 1075 local timeLeft = TQ_GetQuestTimeLeftMinutes(self.questID)
994 if timeLeft > 0 then 1076 if timeLeft > 0 then
995 1077
996 local text, timeState = WorldPlan:GetTimeInfo(timeLeft, self.maxAlertLevel) 1078 local text, timeState, style = self:GetTimeInfo(timeLeft, self.maxAlertLevel)
997 if tl ~= timeState then 1079 if tl ~= timeState then
998 tl = timeState 1080 tl = timeState
999 self.timeLabel:SetText(text) 1081 self.timeLabel:SetText(text)
1000 end 1082 end
1001 end 1083 if style then
1002 1084 self.RewardBorder:SetVertexColor(style.r, style.g, style.b, style.a)
1003 local border = (self.isBounty or self.isCriteria) and self.RewardBorder or self.HighlightBorder 1085 end
1004 1086 end
1005 if tl and (timeLeft < 120) then 1087
1006 border:SetVertexColor(1,0,0,0.7)
1007 else
1008 border:SetVertexColor(0,0,0,0.7)
1009 end
1010 self.alertLevel = tl 1088 self.alertLevel = tl
1011 self.timeLabel:SetShown(self.worldQuest and (self.maxAlertLevel >= 1)) 1089 self.timeLabel:SetShown(self.worldQuest and (self.maxAlertLevel >= 1))
1012 else 1090 else
1013 self.hideReason = "No longer active." 1091 self.hideReason = "No longer active."
1014 self:HideOrShowFrames(false) 1092 self:HideOrShowFrames(false)
1020 function QuestPOI:HideOrShowFrames(isShown) 1098 function QuestPOI:HideOrShowFrames(isShown)
1021 if not isShown then 1099 if not isShown then
1022 -- print('|cFFFFFF00' ..self:GetName()..':HideOrShowFrames()') 1100 -- print('|cFFFFFF00' ..self:GetName()..':HideOrShowFrames()')
1023 -- do not SetShown() here 1101 -- do not SetShown() here
1024 if not self.hideReason then 1102 if not self.hideReason then
1025 self.hideReason = "HideOrShowFrames() called" 1103 self.hideReason = "HideOrShowFrames() called without a reason."
1026 end 1104 end
1027 end 1105 end
1028 self.Overlay:SetShown(isShown) 1106 self.Overlay:SetShown(isShown)
1029 self.count:SetShown(isShown) 1107 self.count:SetShown(isShown)
1030 self.timeLabel:SetShown(isShown) 1108 self.timeLabel:SetShown(isShown)
1031 end 1109 end
1032 1110
1033 function QuestPOI:Release() 1111 function QuestPOI:Release()
1034 1112 print('|cFFFF4400'..self:GetID()..':Release()', self.hideReason)
1035 self.hideReason = 'Released by script.' 1113 self.hideReason = 'Released by script.'
1036 self:SetShown(false) 1114 self:HideOrShowFrames(false)
1037 if self.questID then 1115 if self.questID then
1038 db.QuestsByID[self.questID] = nil 1116 db.QuestsByID[self.questID] = nil
1039 for _, map in pairs(db.QuestsByZone) do 1117 for _, map in pairs(db.QuestsByZone) do
1040 map[self.questID] = nil 1118 map[self.questID] = nil
1041 end 1119 end
1056 self:UnregisterEvent('QUEST_TURNED_IN') 1134 self:UnregisterEvent('QUEST_TURNED_IN')
1057 self:UnregisterEvent('QUEST_LOG_UPDATE') 1135 self:UnregisterEvent('QUEST_LOG_UPDATE')
1058 1136
1059 for i, pin in ipairs(db.UsedPins) do 1137 for i, pin in ipairs(db.UsedPins) do
1060 if pin == self then 1138 if pin == self then
1139 print('|cFFFF4400cleared from UsedPins|r')
1061 tremove(db.UsedPins, i) 1140 tremove(db.UsedPins, i)
1062 break 1141 break
1063 end 1142 end
1064
1065 end 1143 end
1066 1144
1067 tinsert(db.FreePins, self) 1145 tinsert(db.FreePins, self)
1068 WorldPlan.dataFlush = true 1146 WorldPlan.dataFlush = true
1069 end 1147 WorldPlanSummary.isStale = true
1148
1149 return true
1150 end