# HG changeset patch
# User Nenue
# Date 1477590656 14400
# Node ID c1612c2c1840aa5a27a57d34cec3df11daf9f09f
# Parent 3f4368c4a49bb3ae1ef9f91c8811028df09a7be8
WorldPlan:
- Optimizations to in a lot of areas that should lead to better load-times and snappier world map.
* Responding to quest log and map events by setting flags instead of tailing into the complete works.
* Using a generic getter function for resolving pin visual attributes. and making use of blizzard constants for sanity's sake.
diff -r 3f4368c4a49b -r c1612c2c1840 QuestPOI.lua
--- a/QuestPOI.lua Thu Oct 27 06:19:05 2016 -0400
+++ b/QuestPOI.lua Thu Oct 27 13:50:56 2016 -0400
@@ -3,13 +3,17 @@
-- Created: 10/1/2016 7:21 PM
-- %file-revision%
--
+
+local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID
local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation
local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes
local TQ_IsActive = C_TaskQuest.IsActive
+local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData
local QuestPOIGetIconInfo, WorldMapPOIFrame = QuestPOIGetIconInfo, WorldMapPOIFrame
local print = DEVIAN_WORKSPACE and function(...) _G.print('WP', ...) end or function() end
local qprint = DEVIAN_WORKSPACE and function(...) _G.print('POI', ...) end or function() end
+local wqprint = DEVIAN_WORKSPACE and function(...) _G.print('WorldQuest', ...) end or function() end
local iprint = DEVIAN_WORKSPACE and function(...) _G.print('ItemScan', ...) end or function() end
local QuestPOI = WorldPlanPOIMixin
@@ -23,6 +27,27 @@
local POI_BORDER_YELLOW = "Interface\\BUTTONS\\YELLOWORANGE64"
local POI_BORDER_GREEN = "Interface\\BUTTONS\\GREENGRAD64"
+local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD
+local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER
+local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT
+local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES
+local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS
+
+
+local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
+local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
+local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
+local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
+local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
+
+local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
+local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
+local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
+local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
+local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
+
+-- Pin color/display variables
+
local familiars = {
[42159] = {npc = 106552, name = 'Nightwatcher Merayl'},
[40277] = {npc = 97804, name = 'Tiffany Nelson'},
@@ -43,25 +68,6 @@
local familiars_id = 9696
-local PIN_TIME_CONTEXT = {
- {max = 60,
- r=1, g=0.25, b =0, format = function (minutes) return '|cFFFF4400'.. minutes .. 'm' end,
- continentAlpha = 1, swipeTime = 1440,
- },
- {max = 240,
- r=1, g=.5, b=0, format = function(minutes) return '|cFFFF4400'.. floor(minutes/60) .. 'h' end,
- continentAlpha = 1, swipeTime = 1440,
- },
- {max = 1440,
- r=1, g=1, b=0, format = function(minutes) return '|cFFFFFF00'.. floor(minutes/60) .. 'h' end,
- continentAlpha = .55, swipeTime = 1440
- },
- {max = 10081,
- r=0, g=1, b=0,
- continentAlpha = .3,
- }, -- 7 days + 1 minute
-}
-
-- update a masked texture without messing up its blending mask
local SetMaskedTexture = function(region, file, mask)
mask = mask or POI_BORDER_MASK
@@ -70,6 +76,59 @@
region:SetMask(mask)
end
+
+-- use tooltip object to extract item details
+local ParseItemReward = function(questID)
+ local name, icon, quantity, quality, _, itemID = GetQuestLogRewardInfo(1, questID)
+ local scanner = _G.WorldPlanTooltip
+ if not itemID then
+ return
+ end
+
+ scanner:SetOwner(WorldPlan, "ANCHOR_NONE")
+ scanner:SetItemByID(itemID)
+ scanner:Show()
+ local ttl1 = _G['WorldPlanTooltipTextLeft1']
+ local ttl2 = _G['WorldPlanTooltipTextLeft2']
+ local ttl3 = _G['WorldPlanTooltipTextLeft3']
+ local ttl4 = _G['WorldPlanTooltipTextLeft4']
+ if ttl2 then
+ local text = ttl2:GetText()
+ -- Artifact Power
+ if text then
+ if text:match("|cFFE6CC80") then
+ --print('AP token!', text)
+ local power
+ if ttl4 then
+ local text = ttl4:GetText()
+ --print('tip line 4', text)
+ if text then
+ power = text:gsub("%p", ""):match("%d+")
+ power = tonumber(power)
+ end
+
+ end
+ return REWARD_ARTIFACT_POWER, "Interface\\ICONS\\inv_7xp_inscription_talenttome01", power, name, itemID
+ elseif text:match("Item Level") then
+ --print('equipment!', text)
+ quantity = text:match("Item Level ([%d\+]+)")
+ return REWARD_GEAR, icon, quantity, name, itemID
+ elseif text:match("Crafting Reagent") then
+ --print('|cFFFF4400it is a reagent', text)
+ return REWARD_REAGENT, icon, quantity, name, itemID
+ end
+ end
+
+ elseif ttl3 then
+ local text = ttl3:GetText()
+ if text:match("Crafting Reagent") then
+ --print('|cFFFF4400it is a reagent', text)
+ return REWARD_REAGENT, icon, quantity, name, itemID
+ end
+ end
+ return 128, icon, quantity, name, itemID
+end
+
function WorldPlanPOIMixin:OnEnter()
local completed = select(4,GetAchievementInfo(familiars_id))
if not completed then
@@ -106,10 +165,113 @@
end
+
+-- create or update the pin using the given questID and C_TaskQuest results
+function WorldPlanPOIMixin:RefreshData (info)
+
+ qprint('|cFF00FF88'..self:GetName()..':RefreshData()|r')
+
+ if info then
+
+ self.x = info.x or self.x
+ self.y = info.y or self.y
+ self.inProgress = info.inProgress
+ self.floor = info.floor
+ self.numObjectives = info.numObjectives or 0
+ print('|cFFFF4400subbing in new info', info.x, info.y, self.x, self.y)
+ end
+
+
+ local questID = self:GetID()
+ local questTitle, rewardIcon, rewardName, rewardCount, rewardStyle, rewardType, itemID, quantity, quality, _
+ local hasUpdate, isPending = self.isNew, false
+
+
+ if not HaveQuestData(questID) then
+ TQ_RequestPreloadRewardData(questID)
+ isPending = true
+ qprint('because not have data')
+ else
+
+ -- set reward category
+ local numRewards = GetNumQuestLogRewards(questID)
+ local numCurrency = GetNumQuestLogRewardCurrencies(questID)
+ local money = GetQuestLogRewardMoney(questID)
+ if numRewards >= 1 then
+ rewardType, rewardIcon, rewardCount, rewardName, itemID = ParseItemReward(questID)
+ elseif numCurrency >= 1 then
+ rewardName, rewardIcon, rewardCount = GetQuestLogRewardCurrencyInfo(1, questID)
+ rewardType = REWARD_CURRENCY
+ elseif money >= 1 then
+ rewardIcon = ICON_MONEY
+ rewardName = GetMoneyString(money)
+ rewardType = REWARD_CASH
+ end
+ rewardStyle = WorldPlan:GetTypeInfo(rewardType)
+
+ self.itemNumber = rewardCount or self.itemNumber
+ self.rewardType = rewardType or REWARD_ITEM
+ self.style = rewardStyle
+
+ -- title, faction, capped state
+ local questTitle, factionID, capped = TQ_GetQuestInfoByQuestID(questID)
+ self.factionID = factionID
+ self.capped = capped
+
+ -- set tag details
+ local tagID, tagName, worldQuestType, rarity, isElite, tradeskillLineIndex = GetQuestTagInfo(questID);
+ local tagAtlas
+ if worldQuestType == LE_QUEST_TAG_TYPE_PET_BATTLE then
+ tagAtlas = "worldquest-icon-petbattle"
+ elseif worldQuestType == LE_QUEST_TAG_TYPE_PVP then
+ tagAtlas = "worldquest-icon-pvp-ffa"
+ elseif worldQuestType == LE_QUEST_TAG_TYPE_PROFESSION then
+ local id = tradeskillLineIndex and select(7, GetProfessionInfo(tradeskillLineIndex))
+ if id then
+ tagAtlas = WORLD_QUEST_ICONS_BY_PROFESSION[id]
+ end
+ elseif worldQuestType == LE_QUEST_TAG_TYPE_DUNGEON then
+ tagAtlas = "worldquest-icon-dungeon"
+ end
+
+ self.tagID = tagID
+ self.tagName = tagName
+ self.worldQuestType = worldQuestType
+ self.isElite = isElite
+ self.tradeskillLineIndex = tradeskillLineIndex
+ self.rarity = rarity
+ self.tagAtlas = tagAtlas
+
+ -- flag unresolved info
+ if not (rewardIcon and rewardName) then
+ isPending = true
+ qprint('because not have icon')
+ TQ_RequestPreloadRewardData (questID)
+ --WorldPlan:print('|cFFFFFF00'..tostring(self.title)..'|r waiting on texture info')
+ else
+ if (rewardIcon and rewardName) and isPending then
+ --WorldPlan:print('|cFF00FF00'..tostring(self.title)..'|r has info', rewardIcon, rewardName)
+ hasUpdate = true
+ end
+ isPending = false
+ end
+
+ self.title = questTitle or "|cFFFF0000Retrieving..."
+ self.itemTexture = rewardIcon or self.itemTexture
+ self.itemName = rewardName or self.itemName
+ self.hasUpdate = hasUpdate
+ self.isPending = isPending
+
+
+ qprint(' |cFF00FFFF'..questID..'|r hasUpdate:', hasUpdate, 'isPending:', isPending)
+ qprint(' ', self.title, self.itemTexture, 'rewardType:', self.rewardType, 'tag:', self.tagID, 'style', self.style )
+ end
+ return hasUpdate, isPending
+end
+
+
function WorldPlanPOIMixin:SetAchievementProgressTooltip()
print('cheevos')
-
-
end
function WorldPlanPOIMixin:ShowNew()
@@ -133,8 +295,9 @@
end
function WorldPlanPOIMixin:SetAnchor(frame, mapID, mapWidth, mapHeight)
+ qprint(' |cFF00FF00'..self:GetName()..':SetAnchor()|r', self.questID, mapID, mapWidth)
self:ClearAllPoints()
- local dX, dY = TQ_GetQuestLocation(self.questID, mapID)
+ local dX, dY = TQ_GetQuestLocation(self.questID)
if not dX or dX == 0 then
local _, x, y = QuestPOIGetIconInfo(self.questID)
if x and floor(x) ~= 0 then
@@ -146,7 +309,7 @@
self.x = dX
self.y = dY
- qprint(' |cFF00FF00'..self.questID..':|r', format("%0.2f %0.2f", dX, dY))
+ --qprint(' |cFF00FF00'..self.questID..':|r', format("%0.2f %0.2f", dX, dY))
local pX = (dX * mapWidth)
local pY = (-dY * mapHeight)
@@ -187,7 +350,7 @@
-- query for reward data if it wasn't found in the original scan
local questID = self.questID
if self.isPending then
- self:Reset()
+ self:RefreshData()
if not (self.PendingFade:IsPlaying() or self.isAnimating) then
self.PendingFade:Play()
end
@@ -207,25 +370,10 @@
local tl = self.timeThreschold
local timeLeft = TQ_GetQuestTimeLeftMinutes(questID)
if timeLeft > 0 then
- for i, context in ipairs(PIN_TIME_CONTEXT) do
- if i > self.TimeleftStage then
- self.timeLabel:SetText(nil)
- break
- end
-
-
- if timeLeft <= context.max then
- if tl ~= i then
- tl = i
- end
-
- if context.format then
- self.timeLabel:SetText(context.format(timeLeft))
- else
- self.timeLabel:SetText(nil)
- end
- break
- end
+ local text, timeState = WorldPlan:GetTimeInfo(timeLeft, self.TimeleftStage)
+ if tl ~= timeState then
+ tl = timeState
+ self.timeLabel:SetText(text)
end
else
-- remove self in a timely manner
@@ -255,9 +403,12 @@
- local questID = self.questId
- local style = self.style
- local subStyle = style[(self.filtered and 'minimized' or 'continent')]
+ local questID = self:GetID()
+ local style,subStyle = WorldPlan:GetTypeInfo(self.rewardType or ((self.quality or 0) + 127))
+ if self.filtered then
+ subStyle = style.minimized
+ end
+
local borderMask = style.mask
local borderFill = style.texture
local iconBorder = self.iconBorder
@@ -280,18 +431,21 @@
local color = self.rewardColor or COMMON_COLOR
- self.label:SetShown( self.showNumber)
+
if self.hasNumeric then
- self.label:SetText(self.itemNumber)
- self.label:SetTextColor(unpack(self.numberRGB))
+ self.count:SetShown(true)
+ self.count:SetText(self.itemNumber)
+ self.count:SetTextColor(unpack(self.numberRGB))
else
- self.label:SetText(nil)
+ self.count:SetShown(false)
+ self.count:SetText(nil)
end
end
SetMaskedTexture(iconBorder, borderFill, borderMask)
- local border = (self.rewardType and db.rewardStyle[self.rewardType]) or (WORLD_QUEST_QUALITY_COLORS[self.rarity] or db.defaultStyle)
+ local border = WorldPlan:GetTypeInfo(self.rewardType)
+ print(self.rewardType, print)
iconBorder:SetVertexColor(border.r, border.g, border.b, border.a)
iconBorder:SetDesaturated(true)
@@ -314,9 +468,9 @@
if self.isElite then
- self.EliteDecal:Show()
+ self.EliteBorder:Show()
else
- self.EliteDecal:Hide()
+ self.EliteBorder:Hide()
end
qprint('|cFF88FF00updated', questID, self.title, self.rewardType, (style.showNumber and self.itemNumber) or '')
diff -r 3f4368c4a49b -r c1612c2c1840 WorldPlan.lua
--- a/WorldPlan.lua Thu Oct 27 06:19:05 2016 -0400
+++ b/WorldPlan.lua Thu Oct 27 13:50:56 2016 -0400
@@ -10,7 +10,20 @@
Dalaran quests aren't visible until that map has been specifically viewed by the player.
--]]
-WorldPlanCore = {}
+local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark"
+local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up"
+
+local POI_BORDER_MASK = "Interface\\Minimap\\UI-Minimap-Background"
+local POI_BORDER_FILL = "Interface\\BUTTONS\\YELLOWORANGE64"
+local POI_BORDER_BLUE = "Interface\\BUTTONS\\GRADBLUE"
+local POI_BORDER_RED = "Interface\\BUTTONS\\RedGrad64"
+local POI_BORDER_YELLOW = "Interface\\BUTTONS\\YELLOWORANGE64"
+local POI_BORDER_GREEN = "Interface\\BUTTONS\\GREENGRAD64"
+
+WorldPlanCore = {
+ defaults = {},
+
+}
WorldPlanPOIMixin = {}
WorldPlanFilterPinMixin = {}
local WorldPlanFlightMapMixin = setmetatable({}, {__tostring = function() return 'FlightMapHandler' end})
@@ -30,11 +43,8 @@
local fbprint = DEVIAN_WORKSPACE and function(...) _G.print('FilterBar', ...) end or function() end
local wipe, tremove, tinsert, pairs, floor, tContains = table.wipe, table.remove, table.insert, pairs, floor, tContains
-local TQ_GetQuestInfoByQuestID = C_TaskQuest.GetQuestInfoByQuestID -- Return the name of a quest with a given ID
local TQ_GetQuestsForPlayerByMapID = C_TaskQuest.GetQuestsForPlayerByMapID -- This function is not yet documented
-local TQ_GetQuestTimeLeftMinutes = C_TaskQuest.GetQuestTimeLeftMinutes
-local TQ_RequestPreloadRewardData = C_TaskQuest.RequestPreloadRewardData
-local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation
+local TQ_GetQuestZoneID = C_TaskQuest.GetQuestZoneID
local TQ_IsActive = C_TaskQuest.IsActive
local ITEM_QUALITY_COLORS = ITEM_QUALITY_COLORS
local WorldMap_DoesWorldQuestInfoPassFilters = WorldMap_DoesWorldQuestInfoPassFilters
@@ -63,25 +73,7 @@
local ARTIFACT_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_ARTIFACT]
local MONEY_COLOR = {hex ='|cFFFFFF00', r=1, g=1, b=0}
local COMMON_COLOR = ITEM_QUALITY_COLORS[LE_ITEM_QUALITY_COMMON]
-
-local ICON_UNKNOWN = "Interface\\ICONS\\inv_misc_questionmark"
-local ICON_MONEY = "Interface\\Buttons\\UI-GroupLoot-Coin-Up"
-
-local POI_BORDER_MASK = "Interface\\Minimap\\UI-Minimap-Background"
-local POI_BORDER_FILL = "Interface\\BUTTONS\\YELLOWORANGE64"
-local POI_BORDER_BLUE = "Interface\\BUTTONS\\GRADBLUE"
-local POI_BORDER_RED = "Interface\\BUTTONS\\RedGrad64"
-local POI_BORDER_YELLOW = "Interface\\BUTTONS\\YELLOWORANGE64"
-local POI_BORDER_GREEN = "Interface\\BUTTONS\\GREENGRAD64"
-
-local REWARD_CASH = 1001
-local REWARD_ARTIFACT_POWER = 1002
-local REWARD_GEAR = 1003
-local REWARD_CURRENCY = 1004
-local REWARD_ITEM = 1005
-local REWARD_REAGENT = 1006
-
-local POI_DEFAULT_TYPE = {
+local DEFAULT_TYPE = {
a = 1,
r = 1, g = 1, b = 1,
x = 0, y = 0,
@@ -114,53 +106,12 @@
showNumber = false,
}
}
-local POI_REWARD_TYPE = setmetatable({}, {
- __newindex = function(t, k, v)
- if type(v) == 'table' then
- setmetatable(v, {__index = POI_DEFAULT_TYPE})
- end
- rawset(t,k,v)
- end
-})
+
+
local POI_FILTER_STYLE = setmetatable({
continentBorder = 2,
zoneBorder = 2,
-}, {__index = POI_DEFAULT_TYPE})
-
-local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
-local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
-local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
-local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
-local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
-
--- Pin color/display variables
-POI_REWARD_TYPE[REWARD_ITEM] = {
- r = 1, g = 1, b = 1,
-}
-POI_REWARD_TYPE[REWARD_REAGENT] = {
- r = 0, g = 1, b = 1,
-}
-POI_REWARD_TYPE[REWARD_ARTIFACT_POWER] = {
- r = 1, g = .25, b = .5,
- hasNumeric = true,
- numberRGB = {1, 1, 1},
-}
-POI_REWARD_TYPE[REWARD_GEAR] = {
- r = .1, g = .2, b = 1,
-}
-POI_REWARD_TYPE[REWARD_CURRENCY] = {
- r = 1, g = 1, b = 0,
- hasNumeric = true,
- numberRGB = {1, 1, 1},
-}
-POI_REWARD_TYPE[REWARD_CASH] = {
- r = 0, g = 0, b = 0,
- --x = 0, y = -1,
- --mask = ICON_MONEY,
- --continentBorder = 1,
- --zoneBorder = 1,
-}
-
+}, {__index = DEFAULT_TYPE})
local defaults = {
@@ -176,14 +127,26 @@
}
-- Summary header structure
+
+local REWARD_CASH = WORLD_QUEST_REWARD_TYPE_FLAG_GOLD
+local REWARD_ARTIFACT_POWER = WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER
+local REWARD_GEAR = WORLD_QUEST_REWARD_TYPE_FLAG_EQUIPMENT
+local REWARD_CURRENCY = WORLD_QUEST_REWARD_TYPE_FLAG_ORDER_RESOURCES
+local REWARD_REAGENT = WORLD_QUEST_REWARD_TYPE_FLAG_MATERIALS
+
+
+local LE_QUEST_TAG_TYPE_PVP = LE_QUEST_TAG_TYPE_PVP
+local LE_QUEST_TAG_TYPE_PET_BATTLE = LE_QUEST_TAG_TYPE_PET_BATTLE
+local LE_QUEST_TAG_TYPE_DUNGEON = LE_QUEST_TAG_TYPE_DUNGEON
+local LE_QUEST_TAG_TYPE_PROFESSION = LE_QUEST_TAG_TYPE_PROFESSION
+local LE_QUEST_TAG_TYPE_NORMAL = LE_QUEST_TAG_TYPE_NORMAL
local POI_FILTER_OPTIONS = {
{ label = 'Filters', texture = "Interface\\WorldMap\\WorldMap-Icon" },
{ filterKey= 'rewardType', filterValue = REWARD_ARTIFACT_POWER, label = 'Artifact Power', texture = "Interface\\ICONS\\inv_7xp_inscription_talenttome01" },
- { filterKey= 'rewardType', filterValue = REWARD_CURRENCY,label = 'Currency', texture = "Interface\\ICONS\\inv_misc_elvencoins" },
- { filterKey= 'rewardType', filterValue = REWARD_ITEM, label = 'Item', texture = "Interface\\ICONS\\inv_crate_01" },
+ { filterKey= 'rewardType', filterValue = REWARD_CURRENCY,label = 'Order Resources', texture = "Interface\\ICONS\\inv_misc_elvencoins" },
{ filterKey= 'rewardType', filterValue = REWARD_GEAR, label = 'Equipment', texture = "Interface\\ICONS\\garrison_bluearmorupgrade" },
- { filterKey= 'rewardType', filterValue = REWARD_REAGENT, label = 'Reagents', texture = 1417744 },
- { filterKey= 'rewardType', filterValue = REWARD_CASH, label = 'Reagents', texture = ICON_MONEY },
+ { filterKey= 'rewardType', filterValue = REWARD_REAGENT, label = 'Materials', texture = 1417744 },
+ { filterKey= 'rewardType', filterValue = REWARD_CASH, label = 'Gold', texture = ICON_MONEY },
{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PVP, label = 'PvP', texture = "Interface\\Icons\\Ability_PVP_GladiatorMedallion", spacing = 10 },
{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_PET_BATTLE, label = 'Pet Battle', texture = "Interface\\Icons\\PetJournalPortrait", },
{ filterKey= 'worldQuestType', filterValue = LE_QUEST_TAG_TYPE_DUNGEON, label = 'Dungeon', texture = "Interface\\LFGFRAME\\UI-LFR-PORTRAIT", },
@@ -250,55 +213,6 @@
return frame
end
--- use tooltip object to extract item details
-local ParseItemReward = function(questID)
- local rewardType = REWARD_ITEM
- local name, icon, quantity, quality, _, itemID = GetQuestLogRewardInfo(1, questID)
- if not itemID then
- return REWARD_ITEM
- end
-
- scanner:SetOwner(WorldPlan, "ANCHOR_NONE")
- scanner:SetItemByID(itemID)
- local ttl1 = _G['WorldPlanTooltipTextLeft1']
- local ttl2 = _G['WorldPlanTooltipTextLeft2']
- local ttl3 = _G['WorldPlanTooltipTextLeft3']
- local ttl4 = _G['WorldPlanTooltipTextLeft4']
- if ttl2 then
- local text = ttl2:GetText()
- -- Artifact Power
- if text and text:match("|cFFE6CC80") then
- --print('AP token!', text)
- local power
- if ttl4 then
- local text = ttl4:GetText()
- --print('tip line 4', text)
- if text then
- power = text:gsub("%p", ""):match("%d+")
- power = tonumber(power)
- end
-
- end
- rewardType = REWARD_ARTIFACT_POWER
- icon = "Interface\\ICONS\\inv_7xp_inscription_talenttome01"
- quantity = power
- elseif text and text:match("Item Level") then
- --print('equipment!', text)
- rewardType = REWARD_GEAR
- quantity = text:match("Item Level ([%d\+]+)")
- end
- end
- if ttl3 then
- local text = ttl3:GetText()
- -- Crafting Reagent
- if text and text:match("Crafting Reagent") then
- --print('reagent', text)
- rewardType = REWARD_REAGENT
- end
- end
- iprint(' item:', name, rewardType, icon, quantity)
- return rewardType, icon, quantity, name, itemID
-end
-- update a masked texture without messing up its blending mask
local SetMaskedTexture = function(region, file, mask)
@@ -330,6 +244,31 @@
end
function WorldPlan:OnLoad ()
+
+ self.Types = setmetatable({}, {
+ __newindex = function(t, k, v)
+ print('adding type', k)
+ if type(v) == 'table' then
+ v = setmetatable(v, {__index = function(t,k)
+ print('##deferring to default key', k)
+ return DEFAULT_TYPE[k]
+ end})
+ end
+ rawset(t,k,v)
+ end
+ })
+
+ local rgbWhite = {1, 1, 1}
+ self.Types[REWARD_REAGENT] = { r = 0, g = 1, b = 1 }
+ self.Types[REWARD_ARTIFACT_POWER] = { r = 1, g = .25, b = .5, hasNumeric = true, numberRGB = rgbWhite }
+ self.Types[REWARD_GEAR] = { r = .1, g = .2, b = 1 }
+ self.Types[REWARD_CURRENCY] = { r = 1, g = 1, b = 0, hasNumeric = true, numberRGB = rgbWhite, }
+ self.Types[REWARD_CASH] = { r = 0, g = 0, b = 0, }
+
+ for index, color in pairs(ITEM_QUALITY_COLORS) do
+ self.Types[(index+127)] = { r = color.r, g = color.g, b = color.b, hex = color.hex, }
+ end
+
WorldPlan = self
scanner = _G.WorldPlanTooltip
wmtt = _G.WorldMapTooltip
@@ -421,6 +360,59 @@
hooksecurefunc("UIDropDownMenu_Initialize", self.OnDropDownInitialize)
end
+function WorldPlan:GetTypeInfo(typeID)
+ local info, extraInfo
+ if (not typeID) or (not self.Types[typeID]) then
+ qprint('## sent default type')
+ info = DEFAULT_TYPE
+ else
+ qprint('## sent defined type', typeID)
+ info = self.Types[typeID]
+ end
+
+ if isContinentMap then
+ extraInfo = info.continent
+ qprint('### continent subtype', extraInfo)
+ else
+ extraInfo = info.zone
+
+ qprint('### zone subtype', extraInfo)
+ end
+ return info, extraInfo
+end
+
+do
+ local timeStates = {
+ {maxSeconds = 60,
+ r=1, g=0.25, b =0, format = function (minutes) return '|cFFFF4400'.. minutes .. 'm' end,
+ },
+ {maxSeconds = 240,
+ r=1, g=.5, b=0, format = function(minutes) return '|cFFFF4400'.. floor(minutes/60) .. 'h' end,
+ },
+ {maxSeconds = 1440,
+ r=1, g=1, b=0, format = function(minutes) return '|cFFFFFF00'.. floor(minutes/60) .. 'h' end,
+ },
+ {maxSeconds = 10081,
+ r=0, g=1, b=0,
+ }, -- 7 days + 1 minute
+ }
+ -- Generates a timeleft string
+ function WorldPlan:GetTimeInfo(timeLeft, limit)
+ limit = limit or #timeStates
+ for index = 1, limit do
+ local state = timeStates[index]
+ if timeLeft <= state.maxSeconds then
+ local text
+ if state.format then
+ text = state.format(timeLeft)
+ end
+ return text, index
+ end
+ end
+ return nil, nil
+ end
+end
+
function WorldPlan:RefreshAll (forced)
if not self.initialized then
return
@@ -526,6 +518,13 @@
end
function WorldQuests:Setup()
+
+
+ for mapID, mapName in pairs(WORLD_QUEST_MAPS) do
+ QuestsByZone[mapID] = {}
+ end
+
+
-- refresh positions any time blizzard does so (i.e. mousewheel zoom)
hooksecurefunc("WorldMapScrollFrame_ReanchorQuestPOIs", function()
self:Refresh(true)
@@ -548,9 +547,10 @@
if event == 'QUEST_LOG_UPDATE' then
local questID, added = ...
if questID and added then
- self:GetPinByQuestID(questID)
+ local questPOI = self:AcquirePin(questID)
+ self.hasUpdate, self.isPending = questPOI:RefreshData()
else
- self:GetPinsForMap()
+ self:RefreshData()
end
print('WorldMapFrame', WorldMapFrame:IsVisible(), 'doRefresh:', hasNewQuestPins)
if WorldMapFrame:IsVisible() and hasNewQuestPins then
@@ -566,8 +566,8 @@
self:Refresh(true)
end
end
-
-function WorldQuests:AcquirePin (questID, pinTable)
+local TQ_GetQuestLocation = C_TaskQuest.GetQuestLocation
+function WorldQuests:AcquirePin (questID, mapID)
local pin = QuestsByID[questID]
local isNew = false
if not pin then
@@ -580,14 +580,12 @@
local name = 'WorldPlanQuestMarker' .. NumPinFrames
--print('|cFF00FF00Creating', name)
pin = CreateFrame('Frame', name, WorldMapPOIFrame, 'WorldPlanQuestPin')
+
pin:SetFrameStrata('HIGH')
-
NumPinFrames = NumPinFrames + 1
-
--pin.iconBorder:SetVertexColor(0,0,0,1)
-
end
- QuestsByID[questID] = pin
+ pin:SetID(questID)
pin.isNew = true
pin.currentWidth = nil
@@ -595,21 +593,13 @@
pin.questID = questID
pin.worldQuest = true
- pin.Reset = function(self)
- WorldQuests:GetPinByQuestID(questID)
- end
+ QuestsByID[questID] = pin
else
--print('|cFF00FF00Using', pin:GetName())
end
+ mapID = mapID or TQ_GetQuestZoneID(questID)
+ QuestsByZone[mapID][questID] = pin
- -- set display flags accordingly
- if pinTable then
- for k,v in pairs(pinTable) do
- pin[k] = v
- end
- end
- pin.throttle = nil
- pin.timeThreschold = nil
return pin, isNew
end
@@ -634,7 +624,7 @@
end
-- create of update quest pins for a map and its underlying zones
-function WorldQuests:GetPinsForMap (mapID)
+function WorldQuests:RefreshData (mapID)
local print = wqprint
mapID = mapID or GetCurrentMapAreaID()
superTrackedID = GetSuperTrackedQuestID()
@@ -643,12 +633,12 @@
return
end
if mapID == BROKEN_ISLES_ID then
- hasPendingQuestData = nil
+ self.hasUpdate = false
print('|cFF00FFFFRefreshQuestsForMap|r', mapID, GetMapNameByID(mapID), superTrackedID)
self.fullSearch = true
for i = 1, MC_GetNumZones(mapID) do
local submapID, name, depth = MC_GetZoneInfo(mapID, i)
- self:GetPinsForMap(submapID)
+ self:RefreshData(submapID)
end
self.fullSearch = nil
elseif QuestsByZone[mapID] then
@@ -660,122 +650,25 @@
wipe(QuestsByZone[mapID])
ZoneInfo[mapID] = taskInfo
for taskID, info in pairs(taskInfo) do
+ print('-', taskID)
local questID = info.questId
-
info.mapID = mapID
- QuestsByZone[mapID][questID] = self:GetPinByQuestID(questID, info)
+ local questPOI = self:AcquirePin(questID, mapID)
+ local hasUpdate, isPending = questPOI:RefreshData(taskInfo)
+ self.hasUpdate = (self.hasUpdate or hasUpdate)
+ self.isPending = (self.isPending or isPending)
numQuests = numQuests + 1
end
end
end
-end
--- create or update the pin using the given questID and C_TaskQuest results
-function WorldQuests:GetPinByQuestID (questID, taskInfo)
-
- local questTitle, rewardIcon, rewardName, rewardCount, rewardStyle, rewardType, itemID, quantity, quality, _
- local pin = self:AcquirePin(questID, taskInfo)
-
- if pin.isNew then
- if not hasNewQuestPins then
- print('triggering new quest pins event')
- end
-
- hasNewQuestPins = true
- end
-
- if not HaveQuestData(questID) then
- print('|cFFFF4400Retrieval failed.')
- TQ_RequestPreloadRewardData(questID)
- hasPendingQuestData = true
- else
- wqprint('|cFF00FF88Quest Data Received|r')
- pin.mapID = pin.mapID or C_TaskQuest.GetQuestZoneID(questID)
-
- -- set reward category
- local numRewards = GetNumQuestLogRewards(questID)
- local numCurrency = GetNumQuestLogRewardCurrencies(questID)
- local money = GetQuestLogRewardMoney(questID)
- if numRewards >= 1 then
- rewardType, rewardIcon, rewardCount, rewardName, itemID = ParseItemReward(questID)
- elseif numCurrency >= 1 then
- rewardName, rewardIcon, rewardCount = GetQuestLogRewardCurrencyInfo(1, questID)
- rewardType = REWARD_CURRENCY
- elseif money >= 1 then
- rewardIcon = ICON_MONEY
- rewardName = GetMoneyString(money)
- rewardType = REWARD_CASH
- end
- rewardStyle = POI_REWARD_TYPE[rewardType] or POI_DEFAULT_TYPE
-
- pin.itemNumber = rewardCount or pin.itemNumber
- pin.rewardType = rewardType or REWARD_ITEM
- pin.style = rewardStyle
- QuestsByID[questID] = pin
-
- -- title, faction, capped state
- local questTitle, factionID, capped = TQ_GetQuestInfoByQuestID(questID)
- if factionID then
- QuestsByFaction[factionID] = QuestsByFaction[factionID] or {}
- QuestsByFaction[factionID][questID] = pin
- end
- pin.factionID = factionID
- pin.capped = capped
-
- -- set tag details
- local tagID, tagName, worldQuestType, rarity, isElite, tradeskillLineIndex = GetQuestTagInfo(questID);
- local tagAtlas
- if worldQuestType == LE_QUEST_TAG_TYPE_PET_BATTLE then
- tagAtlas = "worldquest-icon-petbattle"
- elseif worldQuestType == LE_QUEST_TAG_TYPE_PVP then
- tagAtlas = "worldquest-icon-pvp-ffa"
- elseif worldQuestType == LE_QUEST_TAG_TYPE_PROFESSION then
- local id = tradeskillLineIndex and select(7, GetProfessionInfo(tradeskillLineIndex))
- if id then
- tagAtlas = WORLD_QUEST_ICONS_BY_PROFESSION[id]
- end
- elseif worldQuestType == LE_QUEST_TAG_TYPE_DUNGEON then
- tagAtlas = "worldquest-icon-dungeon"
- end
-
- pin.tagID = tagID
- pin.tagName = tagName
- pin.worldQuestType = worldQuestType
- pin.isElite = isElite
- pin.tradeskillLineIndex = tradeskillLineIndex
- pin.rarity = rarity
- pin.tagAtlas = tagAtlas
-
- -- flag unresolved info
- if not (rewardIcon and rewardName) then
- if not pin.isPending then
- pin.isPending = true
- TQ_RequestPreloadRewardData (questID)
- pin.rewardType = pin.rewardType or REWARD_ITEM
- pin.style = pin.style or POI_REWARD_TYPE[REWARD_ITEM]
-
- if not hasPendingQuestData then
- hasPendingQuestData = true
- PlaySoundKitID(229)
- end
- --WorldPlan:print('|cFFFFFF00'..tostring(pin.title)..'|r waiting on texture info')
- end
- else
- if (rewardIcon and rewardName) then
- --WorldPlan:print('|cFF00FF00'..tostring(pin.title)..'|r has info', rewardIcon, rewardName)
- pin.hasUpdate = true
- end
- pin.isPending = nil
- end
-
- pin.title = questTitle or "|cFFFF0000Retrieving..."
- pin.itemTexture = rewardIcon or pin.itemTexture
- pin.itemName = rewardName or pin.itemName
-
- qprint(' |cFF00FFFF'..questID..'|r:->', (HaveQuestData(questID) and "|cFF00FF00HaveQuestData" or "-"), (C_TaskQuest.IsActive(questID) and "|cFF88FF00IsActive|r" or ""))
- qprint(' ', pin.title, pin.itemTexture, 'rewardType:', pin.rewardType, 'tag:', pin.tagID, 'style', pin.style )
+ print(' hasUpdate:', self.hasUpdate, 'isPending:', self.isPending, 'timer:', self.OnNext)
+ if self.hasUpdate then
+ self.OnNext = self.OnNext or C_Timer.NewTimer(0.25, function()
+ self:Refresh(true)
+ self.OnNext = nil
+ end)
end
- return QuestsByID[questID]
end
function WorldQuests:Refresh(forced)
@@ -1171,6 +1064,7 @@
local button = blocks[numHeaders]
if not blocks[numHeaders] then
button = CreateFrame('Button', 'WorldPlanFilterButton'..numHeaders, WorldMapScrollFrame, 'WorldPlanFilterPin')
+ for k,v in pairs(info)do print(k,v) end
button.iconBorder:SetTexture(info.fill or POI_BORDER_FILL)
button.iconBorder:SetMask(info.mask or POI_BORDER_MASK)
button.iconBorder:SetDesaturated(info.desaturated)
@@ -1220,7 +1114,7 @@
self.icon:SetTexture(info.texture)
self.icon:SetAllPoints(self)
self.supertrackBorder:Hide()
- self.label:SetText(numQuests)
+ self.count:SetText(numQuests)
self:Show()
end
@@ -1325,13 +1219,3 @@
SetTimedCallbackForAllPins(8, function(self) self.PendingFade:Stop() end)
end
--%end-debug%
-
-for mapID, mapName in pairs(WORLD_QUEST_MAPS) do
- QuestsByZone[mapID] = {}
-end
-for index, color in pairs(ITEM_QUALITY_COLORS) do
- POI_REWARD_TYPE[index] = {
- r = color.r, g = color.g, b = color.b,
- hex = color.hex,
- }
-end
diff -r 3f4368c4a49b -r c1612c2c1840 WorldPlan.xml
--- a/WorldPlan.xml Thu Oct 27 06:19:05 2016 -0400
+++ b/WorldPlan.xml Thu Oct 27 13:50:56 2016 -0400
@@ -6,6 +6,7 @@
+
@@ -77,8 +78,8 @@
-
-
+
+
@@ -86,14 +87,9 @@
-
+
-
-
-
-
-
-
+
@@ -116,23 +112,12 @@
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-