Nenue@7: -- WorldPlan Nenue@7: -- QuestPOI.lua Nenue@7: -- Created: 10/1/2016 7:21 PM Nenue@7: -- %file-revision% Nenue@7: -- Nenue@40: local _, db = ... Nenue@29: Nenue@29: local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID Nenue@7: local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation Nenue@7: local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes Nenue@9: local TQ_IsActive = C_TaskQuest.IsActive Nenue@29: local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData Nenue@7: local QuestPOIGetIconInfo, WorldMapPOIFrame = QuestPOIGetIconInfo, WorldMapPOIFrame Nenue@33: local WorldMap_DoesWorldQuestInfoPassFilters = WorldMap_DoesWorldQuestInfoPassFilters Nenue@33: local QuestMapFrame_IsQuestWorldQuest = QuestMapFrame_IsQuestWorldQuest Nenue@40: local GetAchievementNumCriteria, GetAchievementCriteriaInfo, GetAchievementInfo = GetAchievementNumCriteria, GetAchievementCriteriaInfo, GetAchievementInfo Nenue@40: local pairs, ipairs, tinsert, unpack, select = pairs, ipairs, tinsert, unpack, select Nenue@40: local floor, mod, tostring, tonumber, GetSuperTrackedQuestID = floor, mod, tostring, tonumber, GetSuperTrackedQuestID Nenue@33: local GameTooltip = GameTooltip Nenue@33: local GetItemIcon = GetItemIcon Nenue@7: Nenue@33: local print = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end Nenue@7: local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end Nenue@33: local wprint = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end Nenue@30: local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuests', ...) end or function() end Nenue@7: local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end Nenue@40: local rprint = DEVIAN_WORKSPACE and function(...) _G.print('WQRefresh', ...) end or function() end Nenue@7: local QuestPOI = WorldPlanPOIMixin Nenue@7: Nenue@40: Nenue@40: local PIN_REFRESH_DELAY = .5 Nenue@40: local PIN_REQUEST_DELAY = .2 Nenue@9: local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark" Nenue@9: local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up" Nenue@9: Nenue@40: local WORLD_QUEST_BORDER = "Interface\\UNITPOWERBARALT\\Generic1Target_Circular_Frame" Nenue@40: local PENDING_BORDER Nenue@40: local PENDING_ICON = "Interface\\BUTTONS\\YELLOWORANGE64" Nenue@9: Nenue@29: local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD Nenue@29: local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER Nenue@29: local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT Nenue@29: local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES Nenue@29: local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS Nenue@29: Nenue@29: local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP Nenue@29: local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE Nenue@29: local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON Nenue@29: local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION Nenue@29: local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL Nenue@29: Nenue@29: local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP Nenue@29: local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE Nenue@29: local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON Nenue@29: local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION Nenue@29: local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL Nenue@29: Nenue@40: local STYLE_TYPE_PENDING = 768 Nenue@40: Nenue@31: Nenue@29: -- Pin color/display variables Nenue@40: db.TooltipExtras = db.TooltipExtras or {} -- idiot-proofing Nenue@40: Nenue@29: Nenue@33: local familiars = { Nenue@40: [42159] = 'Nightwatcher Merayl', Nenue@40: [40277] = 'Tiffany Nelson', Nenue@40: [40298] = 'Sir Galveston', Nenue@40: [40282] = 'Grixis Tinypop', Nenue@40: [40278] = 'Robert Craig', Nenue@40: [48195] = 'Aulier', Nenue@40: [41990] = 'Varenne', Nenue@40: [41860] = 'Xorvasc', Nenue@40: [40299] = 'Bodhi Sunwayver', Nenue@40: [42442] = 'Amalia', Nenue@40: [40280] = 'Bredda Tenderhide', Nenue@40: [41687] = 'Odrogg', Nenue@40: [41944] = 'Trapper Jarrun', Nenue@40: [40337] = 'Master Tamer Flummox', Nenue@40: [40279] = 'Durian Strongfruit' Nenue@40: } Nenue@40: local falcosaurs = { Nenue@40: [44895] = {44881, 'Sharptalon Hatchling', 115786}, Nenue@40: [44894] = {44882, 'Bloodgazer Hatchling', 115787}, Nenue@40: [44893] = {44880, 'Direbeak Hatchling', 115785}, Nenue@40: [44892] = {44879, 'Snowfeather Hatchling', 115784}, Nenue@33: } Nenue@33: local familiars_id = 9696 Nenue@40: for questID, name in pairs(familiars) do Nenue@40: db.TooltipExtras[questID] = {{ Nenue@40: achievementID = familiars_id, Nenue@40: name = name Nenue@40: }} Nenue@40: end Nenue@40: for questID, info in pairs(falcosaurs) do Nenue@40: local trackingQuestID, petName, petID = unpack(info) Nenue@33: Nenue@40: db.TooltipExtras[questID] = {{ Nenue@40: questID = trackingQuestID, Nenue@40: pet = petName, Nenue@40: petID = petID Nenue@40: }} Nenue@9: end Nenue@7: Nenue@40: local GetAchievementTooltipExtras = function(info) Nenue@29: Nenue@40: local hasInfo Nenue@40: local achievementID = info.achievementID Nenue@40: local _, name, _, completed, _, _, _, _, _, icon = GetAchievementInfo(achievementID) Nenue@40: if not completed then Nenue@40: Nenue@40: WorldMapTooltip:AddLine(" ") Nenue@40: WorldMapTooltip:AddLine("Achievements:") Nenue@40: WorldMapTooltip:AddLine(' |T'..icon..':20:20|t '..name) Nenue@40: Nenue@40: local numItems = GetAchievementNumCriteria(achievementID) Nenue@40: local numNeeded = 0 Nenue@40: local tooltipLines = {} Nenue@40: for i =1, numItems do Nenue@40: local criteriaName, criteriaType, completed, _, _, _, _, subAchievementID = GetAchievementCriteriaInfo(achievementID, i) Nenue@40: print(GetAchievementCriteriaInfo(achievementID, i)) Nenue@40: Nenue@40: if not completed then Nenue@40: print('::', criteriaName, completed, subAchievementID) Nenue@40: if criteriaType == 8 then Nenue@40: local _, _, _, completed, _, _, _, _, _, subIcon = GetAchievementInfo(subAchievementID) Nenue@40: print(' -', criteriaName, completed, subIcon) Nenue@40: if not completed then Nenue@40: local numCompleted = 0 Nenue@40: local numSubItems = GetAchievementNumCriteria(subAchievementID) Nenue@40: local subCriteriaLine Nenue@40: for j = 1, numSubItems do Nenue@40: local subName, _, completed = GetAchievementCriteriaInfo(subAchievementID, j) Nenue@40: Nenue@40: print(' -',subName, completed) Nenue@40: if completed then Nenue@40: numCompleted = numCompleted + 1 Nenue@40: else Nenue@40: numNeeded = numNeeded + 1 Nenue@40: if subName:match(info.name) then Nenue@40: hasInfo = true Nenue@40: subCriteriaLine = ' |T'..subIcon..':16:16|t ' .. criteriaName Nenue@40: end Nenue@40: end Nenue@40: Nenue@40: end Nenue@40: if subCriteriaLine then Nenue@40: tinsert(tooltipLines, subCriteriaLine .. ' ('..numCompleted..'/'..numSubItems..')') Nenue@40: end Nenue@40: end Nenue@40: elseif criteriaName:match(info.name) and (not completed) then Nenue@40: numNeeded = numNeeded + 1 Nenue@40: tinsert(tooltipLines, criteriaName) Nenue@40: end Nenue@40: end Nenue@40: end Nenue@40: if numNeeded >= 1 then Nenue@40: for i, line in ipairs(tooltipLines) do Nenue@40: WorldMapTooltip:AddLine(line) Nenue@40: end Nenue@40: else Nenue@40: WorldMapTooltip:AddLine('Criteria completed!', 0, 1, 0) Nenue@40: end Nenue@40: Nenue@40: end Nenue@40: return hasInfo Nenue@40: end Nenue@40: Nenue@40: local GetQuestTooltipExtras = function(info) Nenue@40: local questID = info.questID Nenue@40: local hasInfo Nenue@40: Nenue@40: if info.pet then Nenue@40: local index, guid = C_PetJournal.FindPetIDByName(info.pet) Nenue@40: if not index then Nenue@40: hasInfo = true Nenue@40: WorldMapTooltip:AddLine('Pets:') Nenue@40: WorldMapTooltip:AddLine(' - ' .. info.petName) Nenue@40: Nenue@40: if not IsQuestFlaggedCompleted(questID) then Nenue@40: WorldMapTooltip:AddLine(' Required Quest Flags', 1, 1, 0) Nenue@40: else Nenue@40: WorldMapTooltip:AddLine(' Quest Flags Complete!', 0, 1, 0) Nenue@40: end Nenue@40: Nenue@40: end Nenue@29: end Nenue@29: Nenue@29: end Nenue@29: Nenue@40: local GetFactionInfoByID, GetQuestObjectiveInfo = GetFactionInfoByID, GetQuestObjectiveInfo Nenue@40: Nenue@40: function QuestPOI:OnEnter() Nenue@40: if not WorldMapFrame:IsVisible() then Nenue@40: WorldMap_HijackTooltip(self.owningFrame) Nenue@37: else Nenue@40: if self.filtered then Nenue@7: return Nenue@7: end Nenue@7: end Nenue@40: WorldMapTooltip:SetOwner(self, "ANCHOR_RIGHT"); Nenue@40: print('doing tooltip stuff') Nenue@40: Nenue@40: -- Can't add stuff after, so most of the blizzard tooltip hook is simply copied over Nenue@40: local questID = self.questID Nenue@40: local color = WORLD_QUEST_QUALITY_COLORS[self.rarity] or NORMAL_FONT_COLOR; Nenue@40: Nenue@40: Nenue@40: WorldMapTooltip:SetText(self.title, color.r, color.g, color.b); Nenue@40: QuestUtils_AddQuestTypeToTooltip(WorldMapTooltip, questID, NORMAL_FONT_COLOR); Nenue@40: Nenue@40: if ( self.factionID ) then Nenue@40: local factionName = GetFactionInfoByID(self.factionID); Nenue@40: if ( factionName ) then Nenue@40: if (self.capped) then Nenue@40: WorldMapTooltip:AddLine(factionName, GRAY_FONT_COLOR:GetRGB()); Nenue@40: else Nenue@40: WorldMapTooltip:AddLine(factionName); Nenue@40: end Nenue@40: end Nenue@40: end Nenue@40: Nenue@40: if self.worldQuest then Nenue@40: WorldMap_AddQuestTimeToTooltip(questID); Nenue@40: end Nenue@40: Nenue@40: Nenue@40: for objectiveIndex = 1, self.numObjectives do Nenue@40: local objectiveText, objectiveType, finished = GetQuestObjectiveInfo(questID, objectiveIndex, false); Nenue@40: if ( objectiveText and #objectiveText > 0 ) then Nenue@40: local color = finished and GRAY_FONT_COLOR or HIGHLIGHT_FONT_COLOR; Nenue@40: WorldMapTooltip:AddLine(QUEST_DASH .. objectiveText, color.r, color.g, color.b, true); Nenue@40: end Nenue@40: end Nenue@40: Nenue@40: local percent = C_TaskQuest.GetQuestProgressBarInfo(self.questID); Nenue@40: if ( percent ) then Nenue@40: GameTooltip_InsertFrame(WorldMapTooltip, WorldMapTaskTooltipStatusBar); Nenue@40: WorldMapTaskTooltipStatusBar.Bar:SetValue(percent); Nenue@40: WorldMapTaskTooltipStatusBar.Bar.Label:SetFormattedText(PERCENTAGE_STRING, percent); Nenue@40: end Nenue@40: Nenue@40: if db.TooltipExtras[self.questID] then Nenue@40: for index, info in pairs(db.TooltipExtras[questID]) do Nenue@40: if info.achievementID then Nenue@40: GetAchievementTooltipExtras(info) Nenue@40: end Nenue@40: if info.questID then Nenue@40: GetQuestTooltipExtras(info) Nenue@40: end Nenue@40: end Nenue@40: end Nenue@40: WorldMap_AddQuestRewardsToTooltip(questID) Nenue@40: Nenue@40: self.MouseGlow:Show() Nenue@40: WorldMapTooltip:Show() Nenue@40: --WorldMapTooltip.recalculatePadding = true; Nenue@40: --print(WorldMapTooltip:GetParent()) Nenue@40: --print(WorldMapTooltip:IsVisible()) Nenue@7: end Nenue@40: function QuestPOI:OnLeave() Nenue@35: WorldMap_RestoreTooltip() Nenue@40: self.MouseGlow:Hide() Nenue@40: WorldMapTooltip:Hide(); Nenue@7: end Nenue@40: function QuestPOI:OnMouseDown() Nenue@7: TaskPOI_OnClick(self) Nenue@7: end Nenue@7: Nenue@40: -- attempt to pull pin data Nenue@40: local GetQuestTagInfo, GetProfessionInfo = GetQuestTagInfo, GetProfessionInfo Nenue@40: function QuestPOI:GetData () Nenue@40: qprint('|cFF00FF88'..self:GetName()..':GetWorldQuestInfo()|r') Nenue@40: local questID = self.questID Nenue@40: if not questID then Nenue@40: rprint('|cFFFF4400bad pin|r', self:GetName()) Nenue@40: return nil Nenue@29: end Nenue@29: Nenue@40: local questTitle, factionID, capped = TQ_GetQuestInfoByQuestID(questID) Nenue@40: -- if the title is nil, then wait and try later Nenue@40: if not questTitle then Nenue@40: self.isPending = true Nenue@40: rprint('|cFFBB8844nodata|r|cFF00FFFF', self.questId) Nenue@40: else Nenue@40: self.title, self.factionID, self.capped = questTitle, factionID, capped Nenue@40: rprint('|cFFBB8844 data|r|cFF00FFFF', (self.isPending and 'late|r' or 'jit|r'), self.title, '|r', self.factionID) Nenue@40: -- set tag details Nenue@40: local worldQuestType Nenue@40: self.tagID, self.tagName, worldQuestType, self.rarity, self.isElite, self.tradeskillLineIndex = GetQuestTagInfo(questID); Nenue@40: local tagAtlas Nenue@40: if worldQuestType == LE_QUEST_TAG_TYPE_PET_BATTLE then Nenue@40: tagAtlas = "worldquest-icon-petbattle" Nenue@40: elseif worldQuestType == LE_QUEST_TAG_TYPE_PVP then Nenue@40: tagAtlas = "worldquest-icon-pvp-ffa" Nenue@40: elseif worldQuestType == LE_QUEST_TAG_TYPE_PROFESSION then Nenue@40: self.isKnownProfession = nil Nenue@40: local id = self.tradeskillLineIndex and select(7, GetProfessionInfo(self.tradeskillLineIndex)) Nenue@40: if id then Nenue@40: self.isKnownProfession = true Nenue@40: qprint('profession' , self.title, id) Nenue@40: tagAtlas = WORLD_QUEST_ICONS_BY_PROFESSION[id] Nenue@40: end Nenue@40: elseif worldQuestType == LE_QUEST_TAG_TYPE_DUNGEON then Nenue@40: tagAtlas = "worldquest-icon-dungeon" Nenue@40: end Nenue@40: self.worldQuestType = worldQuestType Nenue@29: Nenue@40: self.tagAtlas = tagAtlas Nenue@29: Nenue@29: Nenue@40: self:SetRewardInfo() Nenue@40: Nenue@40: -- force throttle on success Nenue@40: --qprint(' |cFF00FFFF'..questID..'|r hasUpdate:', hasUpdate, 'isPending:', isPending, 'isShown', self:IsShown()) Nenue@40: --qprint(' ', 'rewardType:', self.rewardType, 'tag:', self.tagID) Nenue@40: qprint(' ', tostring(self.title), " |T"..tostring(self.itemTexture)..":12:12|t", tostring(self.itemName)) Nenue@40: Nenue@40: if self.itemTexture and self.itemName and self.title then Nenue@40: self.isPending = nil Nenue@40: self.throttle = 1 Nenue@40: self.updateRate = PIN_REFRESH_DELAY Nenue@40: end Nenue@40: end Nenue@40: Nenue@40: self.isCriteria = WorldMapFrame.UIElementsFrame.BountyBoard:IsWorldQuestCriteriaForSelectedBounty(questID) Nenue@40: Nenue@40: return self.isStale, self.isPending Nenue@40: end Nenue@40: Nenue@40: local GetNumQuestLogRewards, GetNumQuestLogRewardCurrencies, HaveQuestData = GetNumQuestLogRewards, GetNumQuestLogRewardCurrencies, HaveQuestData Nenue@40: local GetQuestLogRewardMoney, GetQuestLogRewardCurrencyInfo, GetMoneyString = GetQuestLogRewardMoney, GetQuestLogRewardCurrencyInfo, GetMoneyString Nenue@40: function QuestPOI:SetRewardInfo() Nenue@40: local questID = self.questID Nenue@29: if not HaveQuestData(questID) then Nenue@40: self.isPending = true Nenue@29: else Nenue@29: Nenue@40: local rewardIcon, rewardName, rewardCount, rewardStyle, rewardType, itemID, quantity, quality Nenue@29: -- set reward category Nenue@29: local numRewards = GetNumQuestLogRewards(questID) Nenue@29: local numCurrency = GetNumQuestLogRewardCurrencies(questID) Nenue@29: local money = GetQuestLogRewardMoney(questID) Nenue@29: if numRewards >= 1 then Nenue@40: rewardType, rewardIcon, rewardCount, rewardName, itemID, quality = WorldPlanQuests:GetRewardHeader(questID) Nenue@29: elseif numCurrency >= 1 then Nenue@29: rewardName, rewardIcon, rewardCount = GetQuestLogRewardCurrencyInfo(1, questID) Nenue@29: rewardType = REWARD_CURRENCY Nenue@29: elseif money >= 1 then Nenue@29: rewardIcon = ICON_MONEY Nenue@29: rewardName = GetMoneyString(money) Nenue@29: rewardType = REWARD_CASH Nenue@29: end Nenue@29: Nenue@40: print(' '..self.questID..':|cFFFFFF00SetRewardInfo():', rewardType) Nenue@40: self.itemNumber = tonumber(rewardCount or self.itemNumber) Nenue@40: self.rewardType = rewardType or REWARD_GEAR Nenue@31: self.quality = quality Nenue@29: Nenue@40: self.itemTexture = rewardIcon or self.itemTexture Nenue@40: self.itemName = rewardName or self.itemName Nenue@29: Nenue@29: -- flag unresolved info Nenue@29: if not (rewardIcon and rewardName) then Nenue@40: self.isPending = true Nenue@40: return true, nil Nenue@29: --WorldPlan:print('|cFFFFFF00'..tostring(self.title)..'|r waiting on texture info') Nenue@29: else Nenue@40: if (rewardIcon and rewardName) and self.isPending then Nenue@29: --WorldPlan:print('|cFF00FF00'..tostring(self.title)..'|r has info', rewardIcon, rewardName) Nenue@40: self.isStale = true Nenue@29: end Nenue@40: self.isPending = nil Nenue@29: end Nenue@29: Nenue@40: end Nenue@40: return self.isStale, self.isPending Nenue@29: Nenue@7: end Nenue@7: Nenue@34: -- run from OnShow if .isNew is set Nenue@40: function QuestPOI:OnNew() Nenue@34: Nenue@34: if not self.isAnimating then Nenue@35: --qprint('|cFFFFFF00'.. self.title .. ' added to quest log.') Nenue@35: self:SetAlpha(0) Nenue@40: if db.Config.FadeWhileGrouped then Nenue@35: self.FadeIn.FadeIn:SetToAlpha(0.15) Nenue@35: self.PendingFade.FadeIn:SetToAlpha(0.15) Nenue@35: self.PendingFade.FadeOut:SetFromAlpha(0.15) Nenue@35: else Nenue@35: self.FadeIn.FadeIn:SetToAlpha(1) Nenue@35: self.PendingFade.FadeIn:SetToAlpha(1) Nenue@35: self.PendingFade.FadeOut:SetFromAlpha(1) Nenue@35: end Nenue@34: self.isAnimating = true Nenue@35: self.isNew = nil Nenue@40: self.isStale = true Nenue@35: self.FadeIn:Play() Nenue@34: end Nenue@7: end Nenue@7: Nenue@40: function QuestPOI:OnShow () Nenue@27: -- pop this on principle Nenue@34: Nenue@34: if self.isNew or self.isStale then Nenue@27: self:Refresh() Nenue@27: end Nenue@27: Nenue@34: Nenue@34: -- is it a new quest? Nenue@34: if self.isNew then Nenue@36: qprint('|cFFFFFF00'..tostring(self:GetName())..':OnShow()|r update:', self.isStale, 'new:', self.isNew, 'animation:', self.isAnimating) Nenue@36: --qprint('|cFFFFFF00popping new pin handler') Nenue@34: self:OnNew() Nenue@35: elseif not self.isAnimating then Nenue@35: self:SetAlpha(1) Nenue@34: end Nenue@34: Nenue@36: self.Overlay:SetShown(true) Nenue@35: --WorldPlan:print(self:GetAlpha()) Nenue@34: Nenue@27: end Nenue@40: function QuestPOI:OnHide() Nenue@35: --qprint('|cFFFFFF00["'..tostring(self.title)..'"]|r:OnHide()') Nenue@34: if not self:IsShown() then Nenue@34: self.isAnimating = nil Nenue@35: self:SetAlpha(1) Nenue@34: end Nenue@34: Nenue@36: self.Overlay:SetShown(false) Nenue@27: end Nenue@27: Nenue@40: function QuestPOI:SetAnchor(frame, mapID, mapWidth, mapHeight) Nenue@40: qprint(' |cFF00FF00'..self:GetName()..':SetAnchor()|r', self.questID, mapID) Nenue@7: self:ClearAllPoints() Nenue@29: local dX, dY = TQ_GetQuestLocation(self.questID) Nenue@7: if not dX or dX == 0 then Nenue@7: local _, x, y = QuestPOIGetIconInfo(self.questID) Nenue@7: if x and floor(x) ~= 0 then Nenue@7: dX, dY = x, y Nenue@7: else Nenue@7: dX, dY = self.x, self.y Nenue@7: end Nenue@7: end Nenue@40: local oX, oY = self.x, self.y Nenue@7: self.x = dX Nenue@7: self.y = dY Nenue@7: Nenue@7: Nenue@7: local pX = (dX * mapWidth) Nenue@7: local pY = (-dY * mapHeight) Nenue@7: Nenue@40: if oX ~= dX then Nenue@40: wqprint(' |cFF00FF00'..self.questID..':|r', oX, dX, format("%0.2f %0.2f", pX, pY)) Nenue@40: end Nenue@40: Nenue@7: self:SetParent(WorldMapPOIFrame) Nenue@7: self:SetPoint('CENTER', frame, 'TOPLEFT', pX, pY) Nenue@7: end Nenue@7: Nenue@40: function QuestPOI:OnLoad() Nenue@40: qprint('|cFF00FF88'..self:GetName()..':OnLoad()|r',db.Config) Nenue@7: self:RegisterEvent('SUPER_TRACKED_QUEST_CHANGED') Nenue@36: Nenue@40: self.title = '|cFF0088FF' .. RETRIEVING_DATA..'|r' Nenue@40: self.isPending = true Nenue@36: self.count = self.Overlay.count Nenue@36: self.timeLabel = self.Overlay.timeLabel Nenue@40: self.updateRate = PIN_REQUEST_DELAY Nenue@40: self.itemName = '|cFF0088FF' .. RETRIEVING_DATA..'|r' Nenue@7: end Nenue@7: Nenue@40: function QuestPOI:OnEvent(event, ...) Nenue@7: if event == 'SUPER_TRACKED_QUEST_CHANGED' then Nenue@33: self.isStale = true Nenue@7: end Nenue@7: end Nenue@7: Nenue@40: function QuestPOI:OnUpdate (sinceLast) Nenue@40: -- control update check intervals Nenue@40: self.throttle = (self.throttle or self.updateRate) + sinceLast Nenue@40: if self.throttle >= self.updateRate then Nenue@40: -- factor overtime into the throttle timer Nenue@40: self.throttle = self.throttle - self.updateRate Nenue@40: else Nenue@40: return Nenue@40: end Nenue@35: if self.isNew then Nenue@35: print('|cFFFFFF00push new poi stuff') Nenue@35: self:OnNew() Nenue@40: elseif (self.isStale or (not self.title)) and not self.isAnimating then Nenue@36: wprint('|cFFFFFF00push poi update') Nenue@35: self:Refresh() Nenue@35: return Nenue@35: end Nenue@7: Nenue@7: -- query for reward data if it wasn't found in the original scan Nenue@7: local questID = self.questID Nenue@7: if self.isPending then Nenue@40: self:GetData() Nenue@7: if not (self.PendingFade:IsPlaying() or self.isAnimating) then Nenue@7: self.PendingFade:Play() Nenue@7: end Nenue@7: return Nenue@7: else Nenue@7: if self.PendingFade:IsPlaying() then Nenue@7: self.PendingFade:Stop() Nenue@7: end Nenue@7: end Nenue@7: Nenue@7: Nenue@7: -- update time elements Nenue@40: if TQ_IsActive(self.questID) then Nenue@40: Nenue@40: local tl = self.alertLevel Nenue@40: local timeLeft = TQ_GetQuestTimeLeftMinutes(questID) Nenue@40: if timeLeft > 0 then Nenue@40: Nenue@40: local text, timeState = WorldPlan:GetTimeInfo(timeLeft, self.maxAlertLevel) Nenue@40: if tl ~= timeState then Nenue@40: tl = timeState Nenue@40: self.timeLabel:SetText(text) Nenue@40: end Nenue@40: else Nenue@9: if self.worldQuestType ~= LE_QUEST_TAG_TYPE_PROFESSION then Nenue@40: self:SetShown(false) Nenue@9: end Nenue@7: end Nenue@40: self.alertLevel = tl Nenue@7: end Nenue@40: self.timeLabel:SetShown(self.worldQuest and (self.maxAlertLevel >= 1)) Nenue@8: end Nenue@8: Nenue@8: Nenue@9: Nenue@40: function QuestPOI:Refresh () Nenue@30: print('|cFF00FF88'..self:GetName()..'|r:Refresh()') Nenue@9: Nenue@40: local styleType = (self.isPending and STYLE_TYPE_PENDING) or self.rewardType Nenue@40: local style,subStyle = self:GetTypeInfo(self.rewardType) Nenue@40: if self.filtered then Nenue@40: subStyle = style.minimized Nenue@40: end Nenue@40: self.style = style Nenue@40: self.subStyle = subStyle Nenue@40: --print(style, subStyle) Nenue@40: self.currentWidth = subStyle.iconWidth Nenue@40: self.borderWidth = subStyle.borderWidth Nenue@40: self.highlightWidth = subStyle.highlightWidth Nenue@40: self.tagSize = subStyle.TagSize Nenue@40: self.maxAlertLevel = subStyle.maxAlertLevel Nenue@40: self.NoIcon = subStyle.NoIcon Nenue@9: Nenue@29: local questID = self:GetID() Nenue@36: local iconBorder = self.RewardBorder Nenue@36: local trackingBorder = self.HighlightBorder Nenue@9: local icon = self.icon Nenue@9: local count = self.count Nenue@9: --WorldPlan:print(tostring(self.title), "|T"..tostring(self.itemTexture)..":16:16|t", tostring(self.itemName)) Nenue@36: Nenue@9: if self.itemName then Nenue@33: --wqprint('filtered:', self.filtered, 'showNumber:', self.showNumber) Nenue@40: if self.itemNumber and self.itemNumber >= 1000 then Nenue@40: local numeral = floor(self.itemNumber/1000) Nenue@40: local decimal = mod(self.itemNumber, 1000) Nenue@40: local numberString = numeral Nenue@40: if decimal > 100 then Nenue@40: numberString = numberString .. '.' .. tostring(floor(decimal/100)) Nenue@40: end Nenue@40: numberString = numberString .. 'k' Nenue@40: self.count:SetText(numberString) Nenue@40: else Nenue@40: self.count:SetText(self.itemNumber) Nenue@40: end Nenue@30: Nenue@40: Nenue@36: end Nenue@40: icon:SetMask("Interface\\Minimap\\UI-Minimap-Background") Nenue@36: if self.itemTexture then Nenue@40: iconBorder:SetTexture(WORLD_QUEST_BORDER) Nenue@40: Nenue@40: if self.NoIcon then Nenue@40: icon:SetTexture(PENDING_ICON) Nenue@40: icon:SetDesaturated(true) Nenue@40: icon:SetVertexColor(style.r, style.g, style.b, style.a) Nenue@40: else Nenue@40: Nenue@40: icon:SetTexture(self.itemTexture) Nenue@40: icon:SetDesaturated(false) Nenue@40: icon:SetVertexColor(1, 1, 1) Nenue@40: end Nenue@40: else Nenue@40: iconBorder:SetTexture(PENDING_BORDER) Nenue@40: icon:SetTexture(PENDING_ICON) Nenue@40: icon:SetDesaturated(true) Nenue@40: icon:SetVertexColor(style.r, style.g, style.b, style.a) Nenue@9: end Nenue@9: Nenue@40: local borderStyle = style Nenue@40: if self.rarity and WORLD_QUEST_QUALITY_COLORS[self.rarity] then Nenue@40: borderStyle = WORLD_QUEST_QUALITY_COLORS[self.rarity] Nenue@40: end Nenue@40: Nenue@40: iconBorder:SetVertexColor(borderStyle.r, borderStyle.g, borderStyle.b, 1) Nenue@9: iconBorder:SetDesaturated(true) Nenue@40: iconBorder:SetAlpha(subStyle.alpha or 1) Nenue@9: Nenue@9: if questID == GetSuperTrackedQuestID() then Nenue@9: trackingBorder:SetVertexColor(0,0,0,1) Nenue@9: else Nenue@9: trackingBorder:SetVertexColor(0,0,0,0.5) Nenue@9: end Nenue@9: Nenue@40: self.tagIcon:SetShown(self.tagSize and true or false) Nenue@9: self.tagIcon:SetAtlas(self.tagAtlas) Nenue@40: self.tagIcon:SetAlpha(subStyle.alpha or 1) Nenue@36: self.EliteBorder:SetShown(self.isElite and not self.filtered) Nenue@36: self.Overlay:SetShown(self:IsShown()) Nenue@36: self.Overlay:SetParent(self:GetParent()) Nenue@36: self.Overlay:SetFrameLevel(self:GetFrameLevel()+200) Nenue@36: self.Overlay:SetAllPoints(self) Nenue@36: Nenue@9: Nenue@9: self:UpdateSize() Nenue@33: self.isStale = nil Nenue@9: end Nenue@9: Nenue@35: local cvar_check = { Nenue@35: [REWARD_CASH] = 'worldQuestFilterGold', Nenue@35: [REWARD_ARTIFACT_POWER] = 'worldQuestFilterArtifactPower', Nenue@35: [REWARD_CURRENCY] = 'worldQuestFilterOrderResources', Nenue@35: [REWARD_REAGENT]= 'worldQuestFilterProfessionMaterials', Nenue@35: [REWARD_GEAR] = 'worldQuestFilterEquipment', Nenue@35: } Nenue@8: Nenue@33: Nenue@40: function QuestPOI:IsFiltered () Nenue@40: for filterKey, value in pairs(db.UsedFilters) do Nenue@40: print('|cFFFF4400', filterKey, self[filterKey]) Nenue@40: if self[filterKey] ~= value then Nenue@40: return true Nenue@40: end Nenue@40: end Nenue@40: if self.rewardType and cvar_check[self.rewardType] then Nenue@40: if self.rewardType == REWARD_CASH then Nenue@40: print('##', cvar_check[self.rewardType], GetCVarBool(cvar_check[self.rewardType])) Nenue@40: end Nenue@40: if not GetCVarBool(cvar_check[self.rewardType]) then Nenue@40: return true Nenue@40: end Nenue@40: end Nenue@40: print(' '..self.questID..':|cFFFFFF00IsFiltered()|r') Nenue@40: end Nenue@40: Nenue@33: function QuestPOI:IsShowable () Nenue@36: local print = qprint Nenue@33: local qType = self.worldQuestType Nenue@33: Nenue@40: if not self.worldQuest then Nenue@40: print('ignoring showable check') Nenue@40: return self.used, self.filtered Nenue@40: end Nenue@40: self.used = TQ_IsActive(self.questID) Nenue@40: Nenue@40: if qType == LE_QUEST_TAG_TYPE_PROFESSION then Nenue@40: qprint('hide flags:', (not self.isKnownProfession), (db.Config.ShowAllProfessionQuests == false)) Nenue@40: if (not self.isKnownProfession) and (db.Config.ShowAllProfessionQuests == false) then Nenue@40: qprint(self.used) Nenue@40: self.used = nil Nenue@40: qprint(self.used) Nenue@36: end Nenue@36: end Nenue@40: print(' '..self.questID..':|cFFFFFF00IsShowable()|r ', self.used, self.title) Nenue@40: return self.used Nenue@33: end Nenue@33: Nenue@33: function QuestPOI:UpdateTimer (timeLeft, timeType) Nenue@33: print('|cFF0088FFUpdatePinTimer()|r') Nenue@33: end Nenue@33: Nenue@33: --- Fixes icons upon size update Nenue@36: function QuestPOI:UpdateSize () Nenue@33: Nenue@40: qprint('|cFF00FF88'..self:GetName()..'|r:UpdateSize()', self.style, self.subStyle) Nenue@33: Nenue@40: local style = self.style Nenue@40: local subStyle = self.subStyle Nenue@36: local icon = self.icon Nenue@36: local iconBorder = self.RewardBorder Nenue@36: local trackingBorder = self.HighlightBorder Nenue@36: local tag = self.tagIcon Nenue@33: Nenue@36: local iconWidth = subStyle.iconWidth Nenue@36: local borderWidth = iconWidth + (subStyle.borderWidth * 2) Nenue@36: local highlightWidth = borderWidth + (subStyle.highlightWidth * 2) Nenue@33: Nenue@36: local iconTexture = self.itemTexture Nenue@33: Nenue@40: self.tagIcon:SetSize(self.tagSize, self.tagSize) Nenue@36: self:SetSize(iconWidth, iconWidth) Nenue@36: icon:SetSize(iconWidth, iconWidth) Nenue@36: iconBorder:SetSize(borderWidth, borderWidth) Nenue@36: trackingBorder:SetSize(highlightWidth, highlightWidth) Nenue@33: Nenue@36: Nenue@36: iconBorder:SetPoint('CENTER', (style.x or 0), (style.y or 0)) Nenue@36: trackingBorder:SetPoint('CENTER', (style.x or 0), (style.y or 0)) Nenue@36: Nenue@36: Nenue@36: if style.hasNumeric then Nenue@36: self.count:SetTextColor(unpack(style.numberRGB)) Nenue@36: if subStyle.numberFontObject then Nenue@36: --wqprint('change font', _G[subStyle.numberFontObject]:GetName()) Nenue@36: self.count:SetFontObject(_G[subStyle.numberFontObject]) Nenue@36: end Nenue@33: end Nenue@33: Nenue@36: self.count:SetShown((subStyle.showNumber and self.itemNumber) and style.hasNumeric) Nenue@33: Nenue@36: Nenue@7: end