annotate QuestPOI.lua @ 121:1fcc4fe645dc tip

- Removed legionfall war supplies from the list of reward currencies to display
author Nenue
date Fri, 16 Feb 2018 14:27:59 -0500
parents bf4a36378bb9
children
rev   line source
Nenue@7 1 -- WorldPlan
Nenue@7 2 -- QuestPOI.lua
Nenue@7 3 -- Created: 10/1/2016 7:21 PM
Nenue@7 4 -- %file-revision%
Nenue@65 5 -- Big TODOs:
Nenue@65 6 -- -- generate frames using `WorldMap_GetOrCreateTaskPOI' to remove tainting issues
Nenue@7 7 --
Nenue@40 8 local _, db = ...
Nick@64 9 local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID
Nenue@7 10 local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation
Nenue@7 11 local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes
Nenue@9 12 local TQ_IsActive = C_TaskQuest.IsActive
Nenue@29 13 local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData
Nenue@7 14 local QuestPOIGetIconInfo, WorldMapPOIFrame = QuestPOIGetIconInfo, WorldMapPOIFrame
Nenue@33 15 local WorldMap_DoesWorldQuestInfoPassFilters = WorldMap_DoesWorldQuestInfoPassFilters
Nenue@33 16 local QuestMapFrame_IsQuestWorldQuest = QuestMapFrame_IsQuestWorldQuest
Nenue@40 17 local GetAchievementNumCriteria, GetAchievementCriteriaInfo, GetAchievementInfo = GetAchievementNumCriteria, GetAchievementCriteriaInfo, GetAchievementInfo
Nick@64 18
Nick@64 19 local IsQuestFlaggedCompleted = IsQuestFlaggedCompleted
Nick@64 20 local GetFactionInfoByID, GetQuestObjectiveInfo = GetFactionInfoByID, GetQuestObjectiveInfo
Nick@64 21 local GetQuestTagInfo, GetProfessionInfo = GetQuestTagInfo, GetProfessionInfo
Nick@64 22 local GetNumQuestLogRewards, GetNumQuestLogRewardCurrencies, HaveQuestData = GetNumQuestLogRewards, GetNumQuestLogRewardCurrencies, HaveQuestData
Nick@64 23 local GetQuestLogRewardMoney, GetQuestLogRewardCurrencyInfo, GetMoneyString = GetQuestLogRewardMoney, GetQuestLogRewardCurrencyInfo, GetMoneyString
Nick@64 24 local SpellCanTargetQuest, GetCVarBool = SpellCanTargetQuest, GetCVarBool
Nick@64 25 local SetSuperTrackedQuestID = SetSuperTrackedQuestID
Nenue@65 26 local HaveQuestRewardData = HaveQuestRewardData
Nenue@96 27 local GetTime = GetTime
Nenue@65 28
Nenue@110 29 local totalPins = 0
Nenue@110 30 local completedQuests = {}
Nick@64 31
Nenue@93 32 local pairs, ipairs, tinsert, tremove, unpack, select = pairs, ipairs, tinsert, tremove, unpack, select
Nenue@40 33 local floor, mod, tostring, tonumber, GetSuperTrackedQuestID = floor, mod, tostring, tonumber, GetSuperTrackedQuestID
Nenue@33 34 local GameTooltip = GameTooltip
Nenue@33 35 local GetItemIcon = GetItemIcon
Nenue@7 36
Nenue@67 37 local print = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or nop
Nenue@67 38 local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or nop
Nenue@67 39 local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or nop
Nenue@67 40 local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or nop
Nenue@67 41 local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or nop
Nenue@67 42 local dprint = DEVIAN_WORKSPACE and function(...) _G.print('WQData', ...) end or nop
Nenue@7 43 local QuestPOI = WorldPlanPOIMixin
Nenue@7 44
Nenue@121 45 local shownCurrencies = {
Nenue@121 46 [1220] = true,
Nenue@121 47 --[1342] = true,
Nenue@121 48 [1508] = true, -- argunite
Nenue@121 49 [1506] = true, -- argus waystone
Nenue@121 50 }
Nenue@102 51 local pinBaseIndex = 1400
Nenue@102 52 local overlayBaseIndex = 1450
Nenue@56 53 local previousHighlight
Nenue@40 54
Nenue@95 55 local FADE_TIMING_MULTIPLIER = 3
Nenue@67 56 local DATA_DEBUG = false
Nenue@75 57 local PIN_REFRESH_DELAY = 1
Nenue@75 58 local PIN_REQUEST_DELAY = .2
Nenue@9 59 local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark"
Nenue@9 60 local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up"
Nenue@9 61
Nenue@40 62 local WORLD_QUEST_BORDER = "Interface\\UNITPOWERBARALT\\Generic1Target_Circular_Frame"
Nenue@47 63 local PENDING_BORDER = "Interface\\BUTTONS\\YELLOWORANGE64"
Nenue@40 64 local PENDING_ICON = "Interface\\BUTTONS\\YELLOWORANGE64"
Nenue@9 65
Nenue@29 66 local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD
Nenue@29 67 local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER
Nenue@29 68 local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT
Nenue@29 69 local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES
Nenue@29 70 local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS
Nenue@69 71
Nenue@69 72 local REWARD_TYPE_NAMES = {
Nenue@69 73 [REWARD_CASH] = 'Money',
Nenue@69 74 [REWARD_ARTIFACT_POWER] = 'AP',
Nenue@69 75 [REWARD_GEAR] = 'Equipment',
Nenue@69 76 [REWARD_CURRENCY] = 'Currency',
Nenue@69 77 [REWARD_REAGENT] = 'Trade Goods'
Nenue@69 78 }
Nenue@29 79
Nenue@29 80 local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
Nenue@29 81 local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
Nenue@29 82 local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
Nenue@29 83 local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
Nenue@29 84 local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
Nenue@29 85
Nenue@29 86 local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
Nenue@29 87 local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
Nenue@29 88 local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
Nenue@29 89 local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
Nenue@29 90 local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
Nenue@29 91
Nenue@66 92 local DEFAULT_STYLE = {
Nenue@66 93 border = {1,1,1},
Nenue@69 94 textColor = {1,1,1,1},
Nenue@66 95 x = 0, y = 0,
Nenue@66 96 desaturated = true,
Nenue@66 97 iconMask = "Interface\\Minimap\\UI-Minimap-Background",
Nenue@66 98 borderMask = "Interface\\Minimap\\UI-Minimap-Background",
Nenue@66 99 rewardMark = "Interface\\Minimap\\UI-Minimap-Background",
Nenue@66 100 scaleFactors = {0.25, 0.7, 1},
Nenue@66 101 iconWidth = 18,
Nenue@66 102 borderWidth = 2,
Nenue@66 103 highlightWidth = 2,
Nenue@66 104 TagSize = 8,
Nenue@95 105 maxAlertLevel = 3,
Nenue@108 106 numberFontObject = 'WorldPlanFont',
Nenue@108 107 showTime = true,
Nenue@66 108 }
Nenue@66 109 local MINIMIZED_STYLE = {
Nenue@66 110 hideNumber = true,
Nenue@66 111 hideIcon = true,
Nenue@108 112 showTime = false,
Nenue@67 113 iconWidth = 3,
Nenue@108 114 maxAlertLevel = 0,
Nenue@66 115 }
Nenue@66 116 local REWARD_TYPE_STYLES = {
Nenue@66 117 [REWARD_CASH] = {
Nenue@66 118 hideNumber = true,
Nenue@66 119 },
Nenue@66 120 [REWARD_ARTIFACT_POWER] = {},
Nenue@66 121 [REWARD_GEAR] = {
Nenue@66 122 hideNumber = true,
Nenue@66 123 },
Nenue@69 124 [REWARD_CURRENCY] = {
Nenue@111 125 textColor = {0,1,1,.75}
Nenue@69 126 },
Nenue@66 127 [REWARD_REAGENT] = {
Nenue@66 128
Nenue@66 129 hideNumber = true,
Nenue@66 130 },
Nenue@66 131 }
Nenue@74 132 local BORDER_SELECTED_BOUNTY = {1, 1, 0, 1 }
Nenue@74 133 local BORDER_CRITERIA = {.25, .5, 1, 1}
Nenue@66 134
Nenue@65 135 local LE_ITEM_CLASS_WEAPON, LE_ITEM_CLASS_ARMOR, LE_ITEM_CLASS_GEM, LE_ITEM_GEM_ARTIFACTRELIC, LE_ITEM_CLASS_TRADEGOODS = LE_ITEM_CLASS_WEAPON, LE_ITEM_CLASS_ARMOR, LE_ITEM_CLASS_GEM, LE_ITEM_GEM_ARTIFACTRELIC, LE_ITEM_CLASS_TRADEGOODS
Nenue@65 136
Nenue@65 137
Nenue@40 138 local STYLE_TYPE_PENDING = 768
Nenue@40 139
Nenue@31 140
Nenue@29 141 -- Pin color/display variables
Nenue@40 142 db.TooltipExtras = db.TooltipExtras or {} -- idiot-proofing
Nenue@49 143 db.PinAlpha = 1
Nenue@29 144
Nenue@33 145 local familiars = {
Nenue@40 146 [42159] = 'Nightwatcher Merayl',
Nenue@40 147 [40277] = 'Tiffany Nelson',
Nenue@40 148 [40298] = 'Sir Galveston',
Nenue@40 149 [40282] = 'Grixis Tinypop',
Nenue@40 150 [40278] = 'Robert Craig',
Nenue@40 151 [48195] = 'Aulier',
Nenue@40 152 [41990] = 'Varenne',
Nenue@40 153 [41860] = 'Xorvasc',
Nenue@40 154 [40299] = 'Bodhi Sunwayver',
Nenue@40 155 [42442] = 'Amalia',
Nenue@40 156 [40280] = 'Bredda Tenderhide',
Nenue@40 157 [41687] = 'Odrogg',
Nenue@40 158 [41944] = 'Trapper Jarrun',
Nenue@40 159 [40337] = 'Master Tamer Flummox',
Nenue@40 160 [40279] = 'Durian Strongfruit'
Nenue@40 161 }
Nenue@40 162 local falcosaurs = {
Nenue@40 163 [44895] = {44881, 'Sharptalon Hatchling', 115786},
Nenue@40 164 [44894] = {44882, 'Bloodgazer Hatchling', 115787},
Nenue@40 165 [44893] = {44880, 'Direbeak Hatchling', 115785},
Nenue@40 166 [44892] = {44879, 'Snowfeather Hatchling', 115784},
Nenue@33 167 }
Nenue@33 168 local familiars_id = 9696
Nenue@40 169 for questID, name in pairs(familiars) do
Nenue@40 170 db.TooltipExtras[questID] = {{
Nenue@40 171 achievementID = familiars_id,
Nenue@40 172 name = name
Nenue@40 173 }}
Nenue@40 174 end
Nenue@40 175 for questID, info in pairs(falcosaurs) do
Nenue@40 176 local trackingQuestID, petName, petID = unpack(info)
Nenue@33 177
Nenue@40 178 db.TooltipExtras[questID] = {{
Nenue@40 179 questID = trackingQuestID,
Nenue@40 180 pet = petName,
Nenue@40 181 petID = petID
Nenue@40 182 }}
Nenue@9 183 end
Nenue@7 184
Nenue@95 185
Nenue@95 186 do
Nenue@95 187 local timeStates = {
Nenue@95 188 {maxSeconds = 60,
Nenue@95 189 r=1, g=0.25, b =0, format = function (minutes) return '|cFFFF4400'.. minutes .. 'm' end,
Nenue@95 190 },
Nenue@95 191 {maxSeconds = 240,
Nenue@95 192 r=1, g=.5, b=0, format = function(minutes) return '|cFFFF4400'.. floor(minutes/60) .. 'h' end,
Nenue@95 193 },
Nenue@95 194 {maxSeconds = 1440,
Nenue@95 195 r=1, g=1, b=0, format = function(minutes) return '|cFFFFFF00'.. floor(minutes/60) .. 'h' end,
Nenue@95 196 },
Nenue@95 197 {maxSeconds = 10081,
Nenue@95 198 r=0, g=1, b=0,
Nenue@95 199 }, -- 7 days + 1 minute
Nenue@95 200 }
Nenue@95 201 -- Generates a timeleft string
Nenue@95 202 function QuestPOI:GetTimeInfo(timeLeft, limit)
Nenue@95 203 for index = 1, limit do
Nenue@95 204 local state = timeStates[index]
Nenue@95 205 if timeLeft <= state.maxSeconds then
Nenue@95 206 local text
Nenue@95 207 if state.format then
Nenue@95 208 text = state.format(timeLeft)
Nenue@95 209 end
Nenue@95 210 return text, index, state
Nenue@95 211 end
Nenue@95 212 end
Nenue@95 213 return
Nenue@95 214 end
Nenue@95 215 end
Nenue@95 216
Nenue@95 217
Nenue@40 218 local GetAchievementTooltipExtras = function(info)
Nenue@29 219
Nenue@40 220 local hasInfo
Nenue@40 221 local achievementID = info.achievementID
Nenue@40 222 local _, name, _, completed, _, _, _, _, _, icon = GetAchievementInfo(achievementID)
Nenue@40 223 if not completed then
Nenue@40 224
Nenue@40 225 local numItems = GetAchievementNumCriteria(achievementID)
Nenue@40 226 local numNeeded = 0
Nenue@40 227 local tooltipLines = {}
Nenue@40 228 for i =1, numItems do
Nenue@40 229 local criteriaName, criteriaType, completed, _, _, _, _, subAchievementID = GetAchievementCriteriaInfo(achievementID, i)
Nenue@49 230 --print(GetAchievementCriteriaInfo(achievementID, i))
Nenue@40 231
Nenue@40 232 if not completed then
Nenue@49 233 --print('::', criteriaName, completed, subAchievementID)
Nenue@40 234 if criteriaType == 8 then
Nenue@40 235 local _, _, _, completed, _, _, _, _, _, subIcon = GetAchievementInfo(subAchievementID)
Nenue@49 236 --print(' -', criteriaName, completed, subIcon)
Nenue@40 237 if not completed then
Nenue@40 238 local numCompleted = 0
Nenue@40 239 local numSubItems = GetAchievementNumCriteria(subAchievementID)
Nenue@40 240 local subCriteriaLine
Nenue@40 241 for j = 1, numSubItems do
Nenue@40 242 local subName, _, completed = GetAchievementCriteriaInfo(subAchievementID, j)
Nenue@40 243
Nenue@49 244 --print(' -',subName, completed)
Nenue@40 245 if completed then
Nenue@40 246 numCompleted = numCompleted + 1
Nenue@40 247 else
Nenue@40 248 numNeeded = numNeeded + 1
Nenue@40 249 if subName:match(info.name) then
Nenue@40 250 hasInfo = true
Nenue@40 251 subCriteriaLine = ' |T'..subIcon..':16:16|t ' .. criteriaName
Nenue@40 252 end
Nenue@40 253 end
Nenue@40 254
Nenue@40 255 end
Nenue@40 256 if subCriteriaLine then
Nenue@40 257 tinsert(tooltipLines, subCriteriaLine .. ' ('..numCompleted..'/'..numSubItems..')')
Nenue@40 258 end
Nenue@40 259 end
Nenue@40 260 elseif criteriaName:match(info.name) and (not completed) then
Nenue@40 261 numNeeded = numNeeded + 1
Nenue@40 262 tinsert(tooltipLines, criteriaName)
Nenue@40 263 end
Nenue@40 264 end
Nenue@40 265 end
Nenue@49 266 if hasInfo then
Nenue@49 267 WorldMapTooltip:AddLine(" ")
Nenue@49 268 WorldMapTooltip:AddLine("Achievements:")
Nenue@49 269 WorldMapTooltip:AddLine(' |T'..icon..':20:20|t '..name)
Nenue@40 270 for i, line in ipairs(tooltipLines) do
Nenue@40 271 WorldMapTooltip:AddLine(line)
Nenue@40 272 end
Nenue@40 273 end
Nenue@40 274 end
Nenue@40 275 return hasInfo
Nenue@40 276 end
Nenue@40 277
Nenue@40 278 local GetQuestTooltipExtras = function(info)
Nenue@40 279 local questID = info.questID
Nenue@40 280 local hasInfo
Nenue@40 281
Nenue@40 282 if info.pet then
Nenue@40 283 local index, guid = C_PetJournal.FindPetIDByName(info.pet)
Nenue@40 284 if not index then
Nenue@40 285 hasInfo = true
Nenue@40 286 WorldMapTooltip:AddLine('Pets:')
Nenue@40 287 WorldMapTooltip:AddLine(' - ' .. info.petName)
Nenue@40 288
Nenue@40 289 if not IsQuestFlaggedCompleted(questID) then
Nenue@40 290 WorldMapTooltip:AddLine(' Required Quest Flags', 1, 1, 0)
Nenue@40 291 else
Nenue@40 292 WorldMapTooltip:AddLine(' Quest Flags Complete!', 0, 1, 0)
Nenue@40 293 end
Nenue@40 294
Nenue@40 295 end
Nenue@29 296 end
Nenue@29 297
Nenue@29 298 end
Nenue@29 299
Nenue@93 300 function QuestPOI:OnLoad()
Nenue@100 301 --print('|cFF00FF88'..self:GetName()..':OnLoad()|r',db.Config)
Nenue@93 302 self.debugTimer = 4
Nenue@93 303 self.title = '|cFF0088FF' .. RETRIEVING_DATA..'|r'
Nenue@93 304 self.count = self.Overlay.count
Nenue@93 305 self.timeLabel = self.Overlay.timeLabel
Nenue@93 306 self.Description = self.Overlay.Description
Nenue@93 307 self.updateRate = PIN_REQUEST_DELAY
Nenue@93 308 self.itemName = '|cFF0088FF' .. RETRIEVING_DATA..'|r'
Nenue@100 309 self.checkFilters = true
Nenue@100 310 self.checkCriteria = true
Nenue@100 311 self.checkCursor = true
Nenue@100 312 self.worldQuest = true
Nenue@100 313 self.isNew = true
Nenue@93 314
Nenue@93 315 self.IconBackdrop:SetVertexColor(0,0,0,1)
Nenue@93 316 self.Overlay:SetPoint('TOPLEFT', self, 'TOPLEFT', 0, 4)
Nenue@93 317 self.Overlay:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', 0, -4)
Nenue@93 318 end
Nenue@93 319
Nenue@93 320 function QuestPOI:OnShow ()
Nenue@93 321 if self.isStale then
Nenue@93 322 --print('|cFF00FF00refresh on show')
Nenue@93 323 self:Refresh('POI_ONSHOW_STALE')
Nenue@93 324 end
Nenue@95 325
Nenue@95 326 if self.questID and IsQuestComplete(self.questID) then
Nenue@95 327 self:Release()
Nenue@95 328 return
Nenue@95 329 end
Nenue@95 330
Nenue@93 331 self:RegisterEvent('QUEST_LOG_UPDATE')
Nenue@110 332 --self:RegisterEvent('WORLD_MAP_UPDATE')
Nenue@93 333 self:HideOrShowFrames(true)
Nenue@93 334 end
Nenue@93 335
Nenue@93 336 function QuestPOI:OnEvent(event, questID)
Nenue@110 337 print(self:GetID()..':OnEvent()', event, questID)
Nenue@93 338 if (self.questID == questID) and IsQuestComplete(self.questID) then
Nenue@103 339 db.log(event .. ' for ' .. self:GetName().. ' triggered.')
Nenue@93 340 self:Release()
Nenue@110 341 return
Nenue@110 342 end
Nenue@110 343 if event == 'WORLD_MAP_UPDATE' then
Nenue@110 344 self.coordsDirty = true
Nenue@93 345 end
Nenue@93 346 end
Nenue@93 347
Nenue@93 348 function QuestPOI:OnHide()
Nenue@93 349 --DEFAULT_CHAT_FRAME:AddMessage('|cFFFFFF00'..self:GetName()..'|r:OnHide()')
Nenue@93 350 self:HideOrShowFrames(false)
Nenue@93 351 -- reset flags
Nenue@109 352 self.icon:SetAlpha(db.PinAlpha)
Nenue@109 353 self.RewardBorder:SetAlpha(db.PinAlpha)
Nenue@93 354 self.isAnimating = nil
Nenue@103 355 --if db.Config.DebugEnabled then
Nenue@103 356 -- db.log(tostring(self.questID) .. ' ' .. tostring(self.title) .. "\n" .. tostring(REWARD_TYPE_NAMES[self.rewardType]) .. ' ' .. tostring(self.itemName) .. ' ' .. tostring(self.itemNumber) .. "\n|cFFFF4400" .. (self.hideReason or 'NO_MESSAGE') .. "|r\n|cFF00FFFF" .. debugstack(2,3,0) .. '|r')
Nenue@103 357 --end
Nenue@93 358 self.hideReason = nil
Nenue@93 359 end
Nenue@40 360
Nenue@40 361 function QuestPOI:OnEnter()
Nenue@57 362 if self.filtered and (self.questID ~= GetSuperTrackedQuestID()) then
Nenue@49 363 return
Nenue@7 364 end
Nenue@57 365 WorldMap_HijackTooltip(self.owningFrame);
Nenue@56 366 self:SetFrameLevel(pinBaseIndex+100)
Nenue@78 367 self.Overlay:SetFrameLevel(overlayBaseIndex+100)
Nenue@56 368
Nenue@56 369 if previousHighlight then
Nenue@56 370 previousHighlight:SetFrameLevel(pinBaseIndex+previousHighlight:GetID())
Nenue@56 371 previousHighlight.Overlay:SetFrameLevel(overlayBaseIndex+previousHighlight:GetID())
Nenue@56 372 end
Nenue@56 373
Nenue@56 374 previousHighlight = self
Nenue@56 375
Nenue@56 376
Nenue@40 377 WorldMapTooltip:SetOwner(self, "ANCHOR_RIGHT");
Nenue@49 378 --print('doing tooltip stuff')
Nenue@40 379
Nenue@40 380 -- Can't add stuff after, so most of the blizzard tooltip hook is simply copied over
Nenue@40 381 local questID = self.questID
Nenue@40 382 local color = WORLD_QUEST_QUALITY_COLORS[self.rarity] or NORMAL_FONT_COLOR;
Nenue@40 383
Nenue@40 384
Nenue@40 385 WorldMapTooltip:SetText(self.title, color.r, color.g, color.b);
Nenue@40 386 QuestUtils_AddQuestTypeToTooltip(WorldMapTooltip, questID, NORMAL_FONT_COLOR);
Nenue@40 387
Nenue@40 388 if ( self.factionID ) then
Nenue@40 389 local factionName = GetFactionInfoByID(self.factionID);
Nenue@40 390 if ( factionName ) then
Nenue@40 391 if (self.capped) then
Nenue@40 392 WorldMapTooltip:AddLine(factionName, GRAY_FONT_COLOR:GetRGB());
Nenue@40 393 else
Nenue@40 394 WorldMapTooltip:AddLine(factionName);
Nenue@40 395 end
Nenue@40 396 end
Nenue@40 397 end
Nenue@40 398
Nenue@40 399 if self.worldQuest then
Nenue@40 400 WorldMap_AddQuestTimeToTooltip(questID);
Nenue@40 401 end
Nenue@40 402
Nenue@40 403
Nenue@40 404 for objectiveIndex = 1, self.numObjectives do
Nenue@40 405 local objectiveText, objectiveType, finished = GetQuestObjectiveInfo(questID, objectiveIndex, false);
Nenue@40 406 if ( objectiveText and #objectiveText > 0 ) then
Nenue@40 407 local color = finished and GRAY_FONT_COLOR or HIGHLIGHT_FONT_COLOR;
Nenue@40 408 WorldMapTooltip:AddLine(QUEST_DASH .. objectiveText, color.r, color.g, color.b, true);
Nenue@40 409 end
Nenue@40 410 end
Nenue@40 411
Nenue@40 412 local percent = C_TaskQuest.GetQuestProgressBarInfo(self.questID);
Nenue@40 413 if ( percent ) then
Nenue@40 414 GameTooltip_InsertFrame(WorldMapTooltip, WorldMapTaskTooltipStatusBar);
Nenue@40 415 WorldMapTaskTooltipStatusBar.Bar:SetValue(percent);
Nenue@40 416 WorldMapTaskTooltipStatusBar.Bar.Label:SetFormattedText(PERCENTAGE_STRING, percent);
Nenue@40 417 end
Nenue@40 418
Nenue@40 419 if db.TooltipExtras[self.questID] then
Nenue@40 420 for index, info in pairs(db.TooltipExtras[questID]) do
Nenue@40 421 if info.achievementID then
Nenue@40 422 GetAchievementTooltipExtras(info)
Nenue@40 423 end
Nenue@40 424 if info.questID then
Nenue@40 425 GetQuestTooltipExtras(info)
Nenue@40 426 end
Nenue@40 427 end
Nenue@40 428 end
Nenue@65 429 GameTooltip_AddQuestRewardsToTooltip(WorldMapTooltip, questID)
Nenue@40 430
Nenue@40 431 WorldMapTooltip:Show()
Nenue@40 432 --WorldMapTooltip.recalculatePadding = true;
Nenue@40 433 --print(WorldMapTooltip:GetParent())
Nenue@40 434 --print(WorldMapTooltip:IsVisible())
Nenue@7 435 end
Nenue@93 436
Nenue@93 437 function QuestPOI:OnMouseDown(button)
Nenue@100 438
Nenue@93 439 if button == 'RightButton' then
Nenue@100 440
Nenue@100 441 local timers = db.IgnoreTimers
Nenue@100 442 if timers[self.questID] then
Nenue@100 443 timers[self.questID] = nil
Nenue@100 444 else
Nenue@100 445 local tl = TQ_GetQuestTimeLeftMinutes(self.questID)
Nenue@100 446 if tl and (tl ~= 0) then
Nenue@100 447 timers[self.questID] = time() + (tl * 60)
Nenue@100 448 else
Nenue@100 449 timers[self.questID] = 0
Nenue@100 450 end
Nenue@100 451 end
Nenue@100 452 self:Refresh()
Nenue@93 453 else
Nenue@93 454 TaskPOI_OnClick(self, button)
Nenue@93 455 end
Nenue@93 456 end
Nenue@93 457
Nenue@40 458 function QuestPOI:OnLeave()
Nenue@57 459 if self.filtered and (self.questID ~= GetSuperTrackedQuestID()) then
Nenue@57 460 return
Nenue@57 461 end
Nenue@35 462 WorldMap_RestoreTooltip()
Nenue@40 463 WorldMapTooltip:Hide();
Nenue@7 464 end
Nenue@7 465
Nenue@96 466
Nenue@96 467
Nenue@93 468 local updateTime, markTime
Nenue@93 469 function QuestPOI:OnUpdate (sinceLast)
Nenue@93 470
Nenue@95 471 if self.toAlpha then
Nenue@95 472 if not self.alphaStart then
Nenue@95 473 self.alphaStart = GetTime()
Nenue@95 474 end
Nenue@93 475
Nenue@93 476
Nenue@95 477 local alpha = self.icon:GetAlpha()
Nenue@95 478 local alphaMod = ((GetTime()-self.alphaStart) *FADE_TIMING_MULTIPLIER)
Nenue@96 479
Nenue@95 480 if alpha > self.toAlpha then
Nenue@95 481 alpha = alpha - (sinceLast*FADE_TIMING_MULTIPLIER)
Nenue@95 482
Nenue@95 483 if (alpha <= self.toAlpha) then
Nenue@95 484 alpha = self.toAlpha
Nenue@95 485 self.toAlpha = nil
Nenue@95 486 elseif (alpha <= 0) then
Nenue@95 487 alpha = 0
Nenue@95 488 self.toAlpha = nil
Nenue@95 489 end
Nenue@95 490 elseif alpha < self.toAlpha then
Nenue@95 491 alpha = alpha + alphaMod
Nenue@95 492
Nenue@95 493 if (alpha >= self.toAlpha) then
Nenue@95 494 alpha = self.toAlpha
Nenue@95 495 self.toAlpha = nil
Nenue@95 496 elseif (alpha >= 1) then
Nenue@95 497 alpha = 1
Nenue@95 498 self.toAlpha = nil
Nenue@95 499 end
Nenue@95 500
Nenue@95 501 else
Nenue@95 502 self.toAlpha = nil
Nenue@95 503 self.alphaStart = nil
Nenue@93 504 end
Nenue@93 505
Nenue@93 506 self.icon:SetAlpha(alpha)
Nenue@93 507 self.RewardBorder:SetAlpha(alpha)
Nenue@93 508 end
Nenue@93 509
Nenue@109 510 -- control update check intervals
Nenue@93 511 self.throttle = (self.throttle or self.updateRate) + sinceLast
Nenue@93 512 if self.throttle >= self.updateRate then
Nenue@93 513 -- factor overtime into the throttle timer
Nenue@93 514 self.throttle = self.throttle - self.updateRate
Nenue@93 515 else
Nenue@93 516 return
Nenue@93 517 end
Nenue@93 518 --@debug@
Nenue@93 519 if DATA_DEBUG then
Nenue@93 520 self.debugTimer = self.debugTimer - sinceLast
Nenue@93 521 if self.debugTimer >= 0 then
Nenue@93 522 print(self.debugTimer)
Nenue@93 523 return
Nenue@93 524 end
Nenue@93 525 end
Nenue@93 526 --@end-debug@
Nenue@93 527
Nenue@93 528 -- query for reward data if it wasn't found in the original scan
Nenue@93 529
Nenue@93 530 if not self.dataLoaded then
Nenue@93 531 local dataLoaded = self:GetData()
Nenue@93 532 if dataLoaded and not tContains(db.UpdatedPins, self) then
Nenue@93 533 print('|cFF00FF88 queueing for update')
Nenue@93 534 self.isNew = true
Nenue@109 535 self.toAlpha = nil
Nenue@109 536 self.alphaStart = nil
Nenue@109 537 self:Refresh()
Nenue@93 538 end
Nenue@93 539 end
Nenue@93 540
Nenue@102 541 if self.isStale then
Nenue@102 542 self:Refresh()
Nenue@102 543 elseif self.maxAlertLevel then
Nenue@93 544 self:UpdateStatus()
Nenue@93 545 end
Nenue@93 546 end
Nenue@93 547
Nenue@93 548
Nenue@93 549 function QuestPOI:StartFading()
Nenue@95 550 if not self.toAlpha then
Nenue@95 551 print('setting toAlpha')
Nenue@95 552 self.toAlpha = 1
Nenue@93 553 self.icon:SetAlpha(0)
Nenue@93 554 self.RewardBorder:SetAlpha(0)
Nenue@93 555 end
Nenue@93 556 end
Nenue@93 557
Nenue@40 558 -- attempt to pull pin data
Nenue@40 559 function QuestPOI:GetData ()
Nenue@75 560 --dprint('|cFF00FF88'..self:GetID()..':GetData()|r')
Nenue@40 561 local questID = self.questID
Nenue@40 562 if not questID then
Nenue@75 563 --dprint('|cFFFF4400bad pin|r', self:GetName())
Nenue@40 564 return nil
Nenue@29 565 end
Nenue@29 566
Nenue@40 567 local questTitle, factionID, capped = TQ_GetQuestInfoByQuestID(questID)
Nenue@40 568 -- if the title is nil, then wait and try later
Nenue@40 569 if not questTitle then
Nenue@75 570 --dprint('|cFFBB8844dataLoaded|r = false|cFF00FFFF', self.questId)
Nenue@65 571 return false
Nenue@40 572 else
Nenue@40 573 self.title, self.factionID, self.capped = questTitle, factionID, capped
Nenue@93 574 --print(questTitle, factionID, capped)
Nenue@40 575 -- set tag details
Nenue@40 576 local worldQuestType
Nenue@40 577 self.tagID, self.tagName, worldQuestType, self.rarity, self.isElite, self.tradeskillLineIndex = GetQuestTagInfo(questID);
Nenue@40 578 local tagAtlas
Nenue@40 579 if worldQuestType == LE_QUEST_TAG_TYPE_PET_BATTLE then
Nenue@40 580 tagAtlas = "worldquest-icon-petbattle"
Nenue@40 581 elseif worldQuestType == LE_QUEST_TAG_TYPE_PVP then
Nenue@40 582 tagAtlas = "worldquest-icon-pvp-ffa"
Nenue@40 583 elseif worldQuestType == LE_QUEST_TAG_TYPE_PROFESSION then
Nenue@40 584 self.isKnownProfession = nil
Nenue@40 585 local id = self.tradeskillLineIndex and select(7, GetProfessionInfo(self.tradeskillLineIndex))
Nenue@40 586 if id then
Nenue@40 587 self.isKnownProfession = true
Nenue@100 588 --print('profession' , self.title, id)
Nenue@40 589 tagAtlas = WORLD_QUEST_ICONS_BY_PROFESSION[id]
Nenue@40 590 end
Nenue@40 591 elseif worldQuestType == LE_QUEST_TAG_TYPE_DUNGEON then
Nenue@40 592 tagAtlas = "worldquest-icon-dungeon"
Nenue@40 593 end
Nenue@40 594 self.worldQuestType = worldQuestType
Nenue@40 595 self.tagAtlas = tagAtlas
Nenue@29 596
Nenue@69 597 local dataLoaded, rewardType, itemName, itemTexture, itemNumber, quality, xpType, xpName, xpIcon, xpCount = self:UpdateRewards()
Nenue@75 598 --dprint('|cFFBB8844 dataLoaded|r =', dataLoaded, rewardType, itemName, itemTexture, itemNumber, quality)
Nenue@65 599 if dataLoaded then
Nenue@65 600 self.rewardType = rewardType
Nenue@65 601 self.itemName = itemName
Nenue@65 602 self.itemTexture = itemTexture
Nenue@65 603 self.itemNumber = itemNumber
Nenue@65 604 self.itemQuality = quality
Nenue@49 605 self.dataLoaded = true
Nenue@48 606 self.isStale = true
Nenue@69 607 self.xpType, self.xpName, self.xpIcon, self.xpCount = xpType, xpName, xpIcon, xpCount
Nenue@95 608 WorldPlan.dataFlush = true
Nenue@40 609 end
Nenue@40 610 end
Nenue@40 611
Nenue@40 612
Nenue@65 613 return self.dataLoaded
Nenue@40 614 end
Nenue@40 615
Nenue@69 616
Nenue@65 617 --- Returns true if data has changed (either from loading in or qualifications changed)
Nenue@65 618 function QuestPOI:UpdateRewards()
Nenue@116 619 dprint('UpdateRewards()', self.questTitle)
Nenue@40 620 local questID = self.questID
Nenue@65 621 if not HaveQuestRewardData(questID) then
Nenue@65 622 C_TaskQuest.RequestPreloadRewardData(questID);
Nenue@65 623 return false;
Nenue@29 624 else
Nenue@65 625 local rewardMoney, rewardAP, rewardHonor
Nenue@65 626 local rewardItems, rewardCurrency = {}, {}
Nenue@65 627 local rewardIcon, rewardName, rewardCount, rewardStyle, rewardType, itemID, quantity, quality
Nenue@65 628 local xpIcon, xpName, xpCount, xpType
Nenue@69 629 local foundPrimary
Nenue@29 630
Nenue@65 631 if (GetNumQuestLogRewardCurrencies(questID) > 0 or GetNumQuestLogRewards(questID) > 0 or GetQuestLogRewardMoney(questID) > 0 or GetQuestLogRewardArtifactXP(questID) > 0 or GetQuestLogRewardHonor(questID)) then
Nenue@65 632 local money = GetQuestLogRewardMoney(questID)
Nenue@65 633 if money > 0 then
Nenue@65 634 rewardMoney = money
Nenue@65 635 rewardIcon = ICON_MONEY
Nenue@65 636 rewardName = GetMoneyString(money)
Nenue@65 637 rewardCount = floor(money/10000)
Nenue@65 638 rewardType = REWARD_CASH
Nenue@65 639 end
Nenue@65 640
Nenue@65 641 local artifactXP = GetQuestLogRewardArtifactXP(questID);
Nenue@65 642 if artifactXP > 0 then
Nenue@65 643 rewardAP = artifactXP
Nenue@65 644 rewardIcon = "Interface\\ICONS\\inv_7xp_inscription_talenttome01"
Nenue@65 645 rewardCount = artifactXP
Nenue@65 646 rewardType = REWARD_ARTIFACT_POWER
Nenue@116 647 dprint(' artifactXP', artifactXP)
Nenue@69 648 foundPrimary = true
Nenue@65 649 end
Nenue@65 650
Nenue@65 651 local numQuestCurrencies = GetNumQuestLogRewardCurrencies(questID);
Nenue@65 652 for i = 1, numQuestCurrencies do
Nenue@69 653 local name, texture, numItems, currencyID = GetQuestLogRewardCurrencyInfo(i, questID);
Nenue@65 654 local text = BONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT:format(texture, numItems, name);
Nenue@65 655 tinsert(rewardCurrency, {
Nenue@65 656 name = name,
Nenue@65 657 texture = texture,
Nenue@65 658 numItems = numItems,
Nenue@65 659 text = text
Nenue@65 660 })
Nenue@69 661
Nenue@75 662 --dprint(' currency', i, currencyID, name, " |T"..tostring(texture)..":12:12|t")
Nenue@111 663 if shownCurrencies[currencyID] then
Nenue@69 664 rewardIcon = texture
Nenue@69 665 rewardCount = numItems
Nenue@69 666 rewardName = name
Nenue@69 667 rewardType = REWARD_CURRENCY
Nenue@69 668 foundPrimary = true
Nenue@69 669 end
Nenue@89 670 end
Nenue@69 671
Nenue@65 672 local honorAmount = GetQuestLogRewardHonor(questID);
Nenue@65 673 if honorAmount > 0 then
Nenue@89 674 xpIcon = "Interface\\ICONS\\Achievement_LegionPVPTier4"
Nenue@89 675 xpCount = honorAmount
Nenue@89 676 xpName = HONOR
Nenue@89 677 xpType = HONOR_CURRENCY
Nenue@88 678 -- let items override
Nenue@65 679 end
Nenue@65 680
Nenue@65 681 local numQuestRewards = GetNumQuestLogRewards(questID);
Nenue@65 682 if numQuestRewards > 0 then
Nenue@65 683 for i = 1, numQuestRewards do
Nenue@65 684 local name, texture, numItems, quality, isUsable, itemID = GetQuestLogRewardInfo(i, questID)
Nenue@65 685
Nenue@65 686 if itemID then
Nenue@65 687 local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, sellPrice, classID, subclassID = GetItemInfo(itemID);
Nenue@116 688 if IsArtifactPowerItem(itemID) then
Nenue@65 689 rewardType = REWARD_ARTIFACT_POWER
Nenue@65 690 rewardIcon = texture
Nenue@65 691 rewardName = name
Nenue@93 692 rewardCount = self:UpdateArtifactPower(itemLink)
Nenue@65 693 foundPrimary = true
Nenue@75 694 --dprint('is an AP token')
Nenue@116 695
Nenue@116 696
Nenue@116 697 elseif ( classID == LE_ITEM_CLASS_WEAPON or classID == LE_ITEM_CLASS_ARMOR or (classID == LE_ITEM_CLASS_GEM and subclassID == LE_ITEM_GEM_ARTIFACTRELIC) ) then
Nenue@116 698 rewardType = REWARD_GEAR
Nenue@116 699 rewardIcon = texture
Nenue@116 700 rewardName = name
Nenue@116 701 rewardCount = numItems
Nenue@116 702 foundPrimary = true
Nenue@65 703 elseif classID == LE_ITEM_CLASS_TRADEGOODS then
Nenue@65 704 rewardType = REWARD_REAGENT
Nenue@65 705 rewardIcon = texture
Nenue@65 706 rewardName = name
Nenue@65 707 rewardCount = numItems
Nenue@65 708 foundPrimary = true
Nenue@65 709 end
Nenue@116 710 dprint(' reward', i, name, " |T"..tostring(texture)..":12:12|t", rewardCount, rewardType, isUsable, itemID)
Nenue@65 711 tinsert(rewardItems, {
Nenue@65 712 name = name,
Nenue@65 713 texture = texture,
Nenue@65 714 numItems = numItems,
Nenue@65 715 quality = quality,
Nenue@65 716 isUsable = isUsable
Nenue@65 717 })
Nenue@65 718 if not foundPrimary then
Nenue@75 719 --print(' -updating primary')
Nenue@82 720 rewardType = REWARD_REAGENT
Nenue@65 721
Nenue@65 722 rewardIcon = texture
Nenue@65 723 rewardName = name
Nenue@65 724 rewardCount = numItems
Nenue@65 725 end
Nenue@65 726
Nenue@65 727 end
Nenue@65 728
Nenue@65 729 end
Nenue@65 730 end
Nenue@65 731
Nenue@75 732 --dprint(' '..self.questID..':|cFFFFFF00UpdateRewards():', numQuestRewards, rewardType)
Nenue@75 733 --dprint(' ', tostring(self.title), " |T"..tostring(self.itemTexture)..":12:12|t", tostring(self.itemName))
Nenue@65 734
Nenue@89 735 if rewardType and ((self.itemNumber ~= rewardCount) or (self.rewardType ~= rewardType) or (self.itemName ~= rewardName) or (self.itemTexture ~= rewardIcon)) then
Nenue@67 736 if DATA_DEBUG and (self.debugTimer <= 0) then
Nenue@67 737 return false
Nenue@67 738 end
Nenue@67 739
Nenue@89 740 return true, rewardType, rewardName, rewardIcon, rewardCount, quality, xpType, xpName, xpIcon, xpCount
Nenue@67 741
Nenue@65 742 else
Nenue@65 743 return false
Nenue@65 744 end
Nenue@65 745 end
Nenue@40 746 end
Nenue@7 747 end
Nenue@7 748
Nenue@34 749
Nenue@116 750 local ap_strings = {
Nenue@116 751 '([%d%.]+) billion ' .. ARTIFACT_POWER,
Nenue@116 752 '([%d%.]+) million ' .. ARTIFACT_POWER,
Nenue@116 753 '([%d]+) ' .. ARTIFACT_POWER,
Nenue@116 754 }
Nenue@116 755 local ap_factors = {1000000000, 1000000, 1}
Nenue@116 756
Nenue@93 757 function QuestPOI:UpdateArtifactPower(rewardLink)
Nenue@116 758 dprint('UpdateArtifactPower')
Nenue@93 759 if not (rewardLink or self.rewardLink) then
Nenue@75 760 return
Nenue@75 761 end
Nenue@75 762
Nenue@93 763 self.rewardLink = rewardLink or self.rewardLink
Nenue@49 764
Nenue@93 765 local rewardCount
Nenue@93 766 WorldPlanTooltip:SetOwner(self, 'ANCHOR_NONE')
Nenue@93 767 WorldPlanTooltip:SetHyperlink(rewardLink or self.rewardLink)
Nenue@93 768 for i = 1, WorldPlanTooltip:NumLines() do
Nenue@93 769 local line = _G['WorldPlanTooltipTextLeft' .. i]
Nenue@93 770 local text = line and line:GetText()
Nenue@116 771
Nenue@95 772 if text then
Nenue@116 773
Nenue@95 774 text = text:gsub(',', '')
Nenue@116 775 for j, format in ipairs(ap_strings) do
Nenue@116 776
Nenue@116 777 local ap = text:match(format)
Nenue@95 778 if ap then
Nenue@116 779
Nenue@116 780 rewardCount = tonumber(ap) * ap_factors[j]
Nenue@116 781 dprint(' ap text', format, tonumber(ap), ap_factors[j], rewardCount)
Nenue@116 782 break
Nenue@95 783 end
Nenue@116 784
Nenue@95 785 end
Nenue@69 786 end
Nenue@48 787 end
Nenue@93 788 return rewardCount
Nenue@27 789 end
Nenue@27 790
Nenue@67 791 -- Applies position and sizing parameters to the pin data
Nenue@66 792 function QuestPOI:SetAnchor(owner, dX, dY, mapWidth, mapHeight, scaleFactor)
Nenue@75 793 --dprint(self:GetName()..':SetAnchor()', owner, dX, dY, scaleFactor, self.filtered, self.used)
Nenue@116 794 --dprint(debugstack(1,1))
Nenue@116 795 --dprint(self:GetPoint(1))
Nick@62 796 if not self.used then
Nenue@69 797 self.hideReason = 'SetAnchor() on an unused frame.'
Nenue@93 798 self:HideOrShowFrames(false)
Nick@62 799 return
Nick@62 800 end
Nick@62 801
Nenue@67 802 if owner then
Nenue@67 803 self:SetParent(owner)
Nenue@67 804 self.Overlay:SetParent(owner)
Nenue@108 805 --self:SetFrameStrata('HIGH')
Nenue@78 806 self:SetFrameLevel(pinBaseIndex + self:GetID())
Nenue@108 807 --self.Overlay:SetFrameStrata('HIGH')
Nenue@78 808 self.Overlay:SetFrameLevel(overlayBaseIndex + self:GetID())
Nenue@74 809 self.isStale = true
Nenue@67 810 else
Nenue@67 811 owner = self:GetParent()
Nenue@67 812 end
Nenue@67 813
Nenue@108 814 self:SetFrameStrata(db.PinStrata)
Nenue@108 815 self.Overlay:SetFrameStrata(db.PinStrata)
Nenue@108 816
Nenue@74 817
Nenue@74 818 if scaleFactor then
Nenue@82 819 print('scaleFactor')
Nenue@67 820 self:SetScale(scaleFactor)
Nenue@67 821 self.Overlay:SetScale(scaleFactor)
Nenue@67 822 self.scaleFactor = scaleFactor
Nenue@67 823 end
Nenue@67 824
Nenue@74 825 mapWidth = mapWidth or owner:GetWidth()
Nenue@74 826 mapHeight = mapHeight or owner:GetHeight()
Nenue@74 827 dX = dX or self.x
Nenue@74 828 dY = dY or self.y
Nenue@74 829 --print(owner:GetName() or tostring(owner), self:GetName(), owner:GetScale(), scaleFactor)
Nenue@74 830 if (self.x ~= dX) or (self.y ~= dY) or scaleFactor then
Nenue@67 831
Nenue@74 832 self.x = dX
Nenue@74 833 self.y = dY
Nenue@74 834 local pX = (dX * mapWidth) * (1 / scaleFactor)
Nenue@74 835 local pY = (-dY * mapHeight) * (1 / scaleFactor)
Nenue@74 836 --print('to', pX, pY, self:GetScale())
Nenue@74 837 self:ClearAllPoints()
Nenue@74 838 self:SetPoint('CENTER', owner, 'TOPLEFT', pX, pY)
Nenue@53 839 end
Nick@62 840
Nick@62 841 end
Nick@62 842
Nenue@78 843 -- Non-hieriarchical display states, checked separately from used/filtered states
Nenue@100 844 function QuestPOI:OnCriteria()
Nenue@100 845 self.checkCriteria = nil
Nenue@74 846 local isCriteria, isBounty, isSpellTarget
Nenue@93 847
Nenue@103 848 print('|cFFFFFF00OnCriteria(' ..self:GetID() .. ')' )
Nenue@93 849
Nenue@93 850 for index, bounty in pairs(db.Bounties) do
Nenue@93 851 if (not IsQuestComplete(bounty.questID)) and IsQuestCriteriaForBounty(self.questID, bounty.questID) then
Nenue@93 852 isCriteria = true
Nenue@93 853 if db.selectedBounty == bounty then
Nenue@93 854 isBounty = true
Nenue@74 855 end
Nenue@93 856 --dprint('|cFF00FF88Criteria:|r', self.questID, bounty.questID, isCriteria, isBounty)
Nenue@74 857 end
Nenue@74 858 end
Nenue@74 859
Nenue@100 860 if (self.isBounty ~= isBounty) or (self.isCriteria ~= isCriteria) then
Nenue@75 861 --wqprint('|cFF00FF00criteria state changed')
Nenue@74 862 self.isBounty = isBounty
Nenue@74 863 self.isCriteria = isCriteria
Nenue@74 864 self.isSpellTarget = isSpellTarget
Nenue@74 865 end
Nenue@74 866 end
Nenue@74 867
Nenue@100 868 function QuestPOI:OnCursor()
Nenue@100 869 self.checkCursor = nil
Nenue@100 870 self.isSpellTarget = IsQuestIDValidSpellTarget(self.questID)
Nenue@100 871 end
Nenue@100 872
Nenue@35 873 local cvar_check = {
Nenue@35 874 [REWARD_CASH] = 'worldQuestFilterGold',
Nenue@35 875 [REWARD_ARTIFACT_POWER] = 'worldQuestFilterArtifactPower',
Nenue@35 876 [REWARD_CURRENCY] = 'worldQuestFilterOrderResources',
Nenue@35 877 [REWARD_REAGENT]= 'worldQuestFilterProfessionMaterials',
Nenue@35 878 [REWARD_GEAR] = 'worldQuestFilterEquipment',
Nenue@35 879 }
Nenue@8 880
Nick@64 881
Nenue@100 882 function QuestPOI:OnFilters ()
Nenue@33 883 local qType = self.worldQuestType
Nenue@96 884
Nenue@96 885 self.canShow = false
Nenue@100 886 self.checkFilters = nil
Nenue@96 887
Nenue@78 888 if not TQ_IsActive(self.questID) then
Nenue@78 889 self.hideReason = 'Filter check ended because quest is inactive.'
Nenue@78 890 self.used = nil
Nenue@78 891 self:SetShown(false)
Nenue@78 892 return
Nenue@78 893 end
Nenue@69 894
Nenue@69 895 if qType == LE_QUEST_TAG_TYPE_PROFESSION then
Nenue@57 896 if not(self.isKnownProfession or db.Config.ShowAllProfessionQuests) then
Nenue@78 897 self.hideReason = 'Failed profession check.'
Nenue@78 898 self.used = nil
Nenue@78 899 self:SetShown(false)
Nenue@78 900 return
Nenue@36 901 end
Nenue@36 902 end
Nenue@57 903
Nenue@78 904 local filtered
Nenue@78 905 for filterKey, value in pairs(db.UsedFilters) do
Nenue@78 906 if self[filterKey] ~= value then
Nenue@78 907 if not self.filtered then
Nenue@78 908 print('|cFFFF4400filtering', filterKey, value, '~=', self[filterKey], self.title)
Nenue@57 909 end
Nenue@78 910 filtered = true
Nenue@57 911 end
Nenue@78 912 end
Nenue@78 913 if self.rewardType and cvar_check[self.rewardType] then
Nenue@78 914 if not GetCVarBool(cvar_check[self.rewardType]) then
Nenue@78 915 filtered = true
Nenue@57 916 end
Nenue@57 917 end
Nenue@78 918
Nenue@100 919 print(' '..self.questID..':|cFFFFFF00OnFilters()|r', filtered, self.title)
Nenue@78 920 if self.filtered ~= filtered then
Nenue@82 921 wqprint('|cFF00FF00filter changed')
Nenue@78 922 self.isStale = true
Nenue@69 923 end
Nenue@78 924
Nenue@96 925 self.canShow = true
Nenue@82 926 self.filtered = filtered
Nenue@33 927 end
Nenue@33 928
Nenue@93 929 function QuestPOI:Refresh (event)
Nenue@93 930 print('|cFF00FF88Refresh(|r'..self:GetID()..'|cFF00FF88)|r', event, self.title)
Nenue@33 931
Nenue@100 932 if not self:IsShown() then
Nenue@100 933 print('queued for Refresh')
Nenue@100 934 self.isStale = true
Nenue@100 935 return nil
Nenue@102 936 elseif IsQuestComplete(self.questID) then
Nenue@102 937 self:Release()
Nenue@102 938 return nil
Nenue@100 939 end
Nenue@100 940 if self.checkCriteria then
Nenue@100 941 self:OnCriteria()
Nenue@100 942 end
Nenue@100 943 if self.checkFilters then
Nenue@100 944 self:OnFilters()
Nenue@100 945 end
Nenue@100 946 if self.checkCursor then
Nenue@100 947 self:OnCursor()
Nenue@100 948 end
Nenue@93 949
Nenue@93 950 local style = DEFAULT_STYLE
Nenue@100 951 if self.filtered or db.IgnoreTimers[self.questID] then
Nenue@116 952 print('minimized type')
Nenue@93 953 style = MINIMIZED_STYLE
Nenue@93 954 elseif self.dataLoaded then
Nenue@116 955 print('reward type', self.rewardType)
Nenue@93 956 style = REWARD_TYPE_STYLES[self.rewardType]
Nenue@93 957 else
Nenue@116 958 print('default type')
Nenue@93 959 end
Nenue@93 960
Nenue@93 961 local currentWidth = style.iconWidth or DEFAULT_STYLE.iconWidth
Nenue@93 962 local borderWidth = style.borderWidth or DEFAULT_STYLE.borderWidth
Nenue@93 963 local highlightWidth = style.highlightWidth or DEFAULT_STYLE.highlightWidth
Nenue@93 964 local tagSize = style.TagSize or DEFAULT_STYLE.TagSize
Nenue@93 965 local hideIcon = style.hideIcon or DEFAULT_STYLE.hideIcon
Nenue@108 966 local showtime = style.showTime or DEFAULT_STYLE.showTime
Nenue@93 967 local borderColor = style.border or DEFAULT_STYLE.border
Nenue@93 968 local textColor = style.textColor or DEFAULT_STYLE.textColor
Nenue@93 969 local questID = self.questID
Nenue@36 970 local iconBorder = self.RewardBorder
Nenue@36 971 local trackingBorder = self.HighlightBorder
Nenue@93 972 local icon = self.icon
Nenue@93 973 local count = self.count
Nenue@93 974 local hideNumbers = style.hideNumber or DEFAULT_STYLE.hideNumber
Nenue@108 975 self.showTime = (style.showTime ~= nil) and style.showTime or DEFAULT_STYLE.showTime
Nenue@33 976
Nenue@33 977
Nenue@93 978 local tagIcon = self.tagIcon
Nenue@93 979 self.maxAlertLevel = style.maxAlertLevel or DEFAULT_STYLE.maxAlertLevel
Nenue@47 980
Nenue@93 981 if self.dataLoaded then
Nenue@93 982 if self.isNew then
Nenue@95 983 print('new pin, has data, cue fade')
Nenue@93 984 self:StartFading()
Nenue@93 985 self.isNew = nil
Nenue@93 986 end
Nenue@93 987 else
Nenue@109 988 icon:SetAlpha(self.toAlpha or 0)
Nenue@109 989 iconBorder:SetAlpha(self.toAlpha or 0)
Nenue@93 990 end
Nenue@93 991
Nenue@93 992 if self.itemName then
Nenue@93 993 if self.itemNumber and (self.itemNumber > 1) and (not hideNumbers) then
Nenue@93 994 local numberString = self.itemNumber
Nenue@116 995 if self.itemNumber >= 1000000000 then
Nenue@116 996 numberString = (floor(self.itemNumber/100000000)/10) .. '|cFFFF8800B|r'
Nenue@116 997 elseif self.itemNumber >= 1000000 then
Nenue@116 998 numberString = (floor(self.itemNumber/100000)/10) .. '|cFFFFFF00M|r'
Nenue@93 999 elseif self.itemNumber >= 10000 then
Nenue@93 1000 numberString = floor(self.itemNumber/1000) .. 'k'
Nenue@93 1001 elseif self.itemNumber >= 1000 then
Nenue@93 1002 local numeral = floor(self.itemNumber/1000)
Nenue@93 1003 local decimal = mod(self.itemNumber, 1000)
Nenue@93 1004 numberString = numeral
Nenue@93 1005 if decimal > 100 then
Nenue@93 1006 numberString = numberString .. '.' .. tostring(floor(decimal/100))
Nenue@93 1007 end
Nenue@93 1008 numberString = numberString .. 'k'
Nenue@93 1009 end
Nenue@93 1010
Nenue@93 1011 self.count:SetText(numberString)
Nenue@93 1012 self.count:SetTextColor(unpack(textColor))
Nenue@93 1013 self.count:Show()
Nenue@57 1014 else
Nenue@93 1015 self.count:SetText(nil)
Nenue@93 1016 self.count:Hide()
Nenue@93 1017 end
Nenue@93 1018 else
Nenue@93 1019 self.count:Hide()
Nenue@93 1020 end
Nenue@93 1021
Nenue@93 1022 if db.Config.ShowVerboseInfo then
Nenue@93 1023 self.Description:SetText(self.title .. "\n" .. floor(self.x*100+.5) .. "," .. floor(self.y*100+.5))
Nenue@93 1024 end
Nenue@93 1025
Nenue@93 1026
Nenue@93 1027 icon:SetSize(currentWidth, currentWidth)
Nenue@93 1028 icon:SetMask(style.iconMask or DEFAULT_STYLE.iconMask)
Nenue@93 1029 if self.itemTexture then
Nenue@93 1030 --iconBorder:SetTexture(WORLD_QUEST_BORDER)
Nenue@93 1031
Nenue@93 1032 if hideIcon then
Nenue@93 1033 icon:SetTexture(PENDING_ICON)
Nenue@93 1034 icon:SetDesaturated(true)
Nenue@93 1035 icon:SetVertexColor(unpack(borderColor))
Nenue@93 1036 else
Nenue@93 1037 icon:SetTexture(self.itemTexture)
Nenue@93 1038 icon:SetDesaturated(false)
Nenue@93 1039 icon:SetVertexColor(1, 1, 1)
Nenue@93 1040 end
Nenue@93 1041 else
Nenue@93 1042 --
Nenue@93 1043 --icon:SetTexture(PENDING_ICON)
Nenue@93 1044 --icon:SetDesaturated(true)
Nenue@93 1045 --icon:SetVertexColor(unpack(borderColor))
Nenue@93 1046 end
Nenue@93 1047 local borderMask = style.borderMask or DEFAULT_STYLE.borderMask
Nenue@93 1048 local borderSize = currentWidth + (borderWidth * 2) + (self.isCriteria and 2 or 0)
Nenue@93 1049
Nenue@93 1050
Nenue@93 1051 iconBorder:SetSize(borderSize, borderSize)
Nenue@93 1052
Nenue@93 1053 iconBorder:SetMask(borderMask)
Nenue@93 1054 iconBorder:SetTexture(PENDING_BORDER)
Nenue@93 1055
Nenue@93 1056 iconBorder:SetDesaturated(true)
Nenue@93 1057
Nenue@93 1058 local highlightSize = borderSize + (highlightWidth * 2)
Nenue@93 1059 trackingBorder:SetSize(highlightSize, highlightSize)
Nenue@93 1060 trackingBorder:SetMask(borderMask)
Nenue@93 1061 trackingBorder:SetTexture(PENDING_BORDER)
Nenue@93 1062
Nenue@93 1063 self:SetSize(borderSize, borderSize)
Nenue@93 1064 self.IconBackdrop:SetSize(currentWidth, currentWidth)
Nenue@93 1065
Nenue@93 1066
Nenue@93 1067
Nenue@93 1068 iconBorder:SetPoint('CENTER', (style.x or 0), (style.y or 0))
Nenue@93 1069 trackingBorder:SetPoint('CENTER', (style.x or 0), (style.y or 0))
Nenue@93 1070
Nenue@93 1071 self.tagIcon:SetShown((not self.filtered) and true or false)
Nenue@93 1072 self.tagIcon:SetAtlas(self.tagAtlas)
Nenue@93 1073 self.EliteBorder:SetShown(self.isElite and not self.filtered)
Nenue@93 1074
Nenue@93 1075
Nenue@93 1076 if self.isBounty then
Nenue@102 1077 print('is bounty')
Nenue@93 1078 iconBorder:SetVertexColor(trackingBorder:GetVertexColor())
Nenue@93 1079 trackingBorder:SetVertexColor(unpack(BORDER_SELECTED_BOUNTY))
Nenue@93 1080 elseif self.isCriteria then
Nenue@102 1081 print('is criteria of a bounty')
Nenue@93 1082 iconBorder:SetVertexColor(trackingBorder:GetVertexColor())
Nenue@93 1083 trackingBorder:SetVertexColor(unpack(BORDER_CRITERIA))
Nenue@93 1084 else
Nenue@102 1085 print('is nothing')
Nenue@93 1086 iconBorder:SetVertexColor(unpack(borderColor))
Nenue@93 1087 trackingBorder:SetVertexColor(0,0,0,.5)
Nenue@93 1088 end
Nenue@108 1089
Nenue@108 1090 self.timeLabel:SetShown(style.showTime)
Nenue@102 1091 self:UpdateStatus()
Nenue@93 1092
Nenue@93 1093 if SpellCanTargetQuest() then
Nenue@100 1094 if self.isSpellTarget then
Nenue@93 1095 icon:SetVertexColor(1,1,1)
Nenue@100 1096 self:EnableMouse(false)
Nenue@93 1097 else
Nenue@100 1098 icon:SetVertexColor(0.5,0.5,0.5,1)
Nenue@100 1099 self:EnableMouse(true)
Nenue@93 1100 end
Nenue@93 1101 else
Nenue@100 1102 icon:SetVertexColor(1,1,1)
Nenue@93 1103 self:EnableMouse(true)
Nenue@93 1104 end
Nenue@100 1105
Nenue@93 1106 self.isStale = nil
Nenue@93 1107
Nenue@93 1108 -- signal filter info update
Nenue@93 1109 WorldPlanSummary.isStale = true
Nenue@100 1110 return true
Nenue@93 1111 end
Nenue@93 1112
Nenue@93 1113 -- Called at static intervals and with Refresh
Nenue@93 1114 function QuestPOI:UpdateStatus()
Nenue@93 1115 -- update time elements
Nenue@93 1116 self.isActive = TQ_IsActive(self.questID)
Nenue@95 1117 --print(self.maxAlertLevel)
Nenue@95 1118 local border = (self.isBounty or self.isCriteria) and self.RewardBorder or self.HighlightBorder
Nenue@93 1119
Nenue@93 1120 if self.isActive then
Nenue@100 1121
Nenue@93 1122 local tl = self.alertLevel
Nenue@93 1123 local timeLeft = TQ_GetQuestTimeLeftMinutes(self.questID)
Nenue@93 1124 if timeLeft > 0 then
Nenue@93 1125
Nenue@95 1126 local text, timeState, style = self:GetTimeInfo(timeLeft, self.maxAlertLevel)
Nenue@93 1127 if tl ~= timeState then
Nenue@93 1128 tl = timeState
Nenue@93 1129 self.timeLabel:SetText(text)
Nenue@93 1130 end
Nenue@93 1131 end
Nenue@93 1132
Nenue@93 1133 self.alertLevel = tl
Nenue@108 1134 self.timeLabel:SetShown(self.worldQuest and (self.maxAlertLevel >= 1) and self.showTime)
Nenue@93 1135 else
Nenue@93 1136 self.hideReason = "No longer active."
Nenue@93 1137 self:HideOrShowFrames(false)
Nenue@93 1138
Nenue@93 1139 end
Nenue@93 1140 end
Nenue@93 1141
Nenue@93 1142 -- Show/Hide the text overlays associated with the quest pin; they aren't hierarchically linked
Nenue@93 1143 function QuestPOI:HideOrShowFrames(isShown)
Nenue@93 1144 if not isShown then
Nenue@93 1145 -- print('|cFFFFFF00' ..self:GetName()..':HideOrShowFrames()')
Nenue@93 1146 -- do not SetShown() here
Nenue@93 1147 if not self.hideReason then
Nenue@95 1148 self.hideReason = "HideOrShowFrames() called without a reason."
Nenue@93 1149 end
Nenue@93 1150 end
Nenue@93 1151 self.Overlay:SetShown(isShown)
Nenue@93 1152 self.count:SetShown(isShown)
Nenue@93 1153 self.timeLabel:SetShown(isShown)
Nenue@93 1154 end
Nenue@93 1155
Nenue@98 1156 function QuestPOI:Release(msg)
Nenue@103 1157 print('|cFFFF4400Release('..self:GetID()..')', self.hideReason)
Nenue@98 1158 self.hideReason = msg or 'Released by script.'
Nenue@103 1159 self:ClearAllPoints()
Nenue@98 1160 self:SetShown(false)
Nenue@95 1161 self:HideOrShowFrames(false)
Nenue@98 1162
Nenue@93 1163 if self.questID then
Nenue@93 1164 db.QuestsByID[self.questID] = nil
Nenue@93 1165 for _, map in pairs(db.QuestsByZone) do
Nenue@93 1166 map[self.questID] = nil
Nenue@93 1167 end
Nenue@93 1168 self.questID = nil
Nenue@93 1169 end
Nenue@93 1170 self.isActive = nil
Nenue@93 1171 self.complete = nil
Nenue@93 1172 self.used = nil
Nenue@93 1173 self.dataLoaded = nil
Nenue@93 1174 self.rewardType = nil
Nenue@93 1175 self.itemTexture = nil
Nenue@93 1176 self.itemName = nil
Nenue@93 1177 self.itemNumber = nil
Nenue@93 1178 self.animating = nil
Nenue@93 1179 self.icon:SetAlpha(0)
Nenue@93 1180 self.RewardBorder:SetAlpha(0)
Nenue@93 1181 self:UnregisterEvent('QUEST_TURNED_IN')
Nenue@93 1182 self:UnregisterEvent('QUEST_LOG_UPDATE')
Nenue@93 1183
Nenue@100 1184 self.checkCursor = true
Nenue@100 1185 self.checkFilters = true
Nenue@100 1186 self.checkCriteria = true
Nenue@100 1187
Nenue@93 1188 for i, pin in ipairs(db.UsedPins) do
Nenue@93 1189 if pin == self then
Nenue@95 1190 print('|cFFFF4400cleared from UsedPins|r')
Nenue@93 1191 tremove(db.UsedPins, i)
Nenue@93 1192 break
Nenue@57 1193 end
Nenue@47 1194 end
Nenue@47 1195
Nenue@93 1196 tinsert(db.FreePins, self)
Nenue@93 1197 WorldPlan.dataFlush = true
Nenue@95 1198 WorldPlanSummary.isStale = true
Nenue@95 1199
Nenue@95 1200 return true
Nenue@7 1201 end