You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.3 KiB
122 lines
3.3 KiB
|
3 years ago
|
-- Externals
|
||
|
|
local L = LibStub("AceLocale-3.0"):GetLocale("Rarity")
|
||
|
|
|
||
|
|
-- WOW API
|
||
|
|
local GetBestMapForUnit = C_Map.GetBestMapForUnit
|
||
|
|
|
||
|
|
-- Rarity API
|
||
|
|
local Colorize = Rarity.Utils.String.Colorize
|
||
|
|
local Count = Rarity.Utils.Table.Count
|
||
|
|
local GetMapNameByID = Rarity.MapInfo.GetMapNameByID
|
||
|
|
|
||
|
|
local format = format
|
||
|
|
local type = type
|
||
|
|
local pairs = pairs
|
||
|
|
|
||
|
|
-- Constants
|
||
|
|
local green = Rarity.Enum.Colors.Green
|
||
|
|
local gray = Rarity.Enum.Colors.Gray
|
||
|
|
|
||
|
|
local Waypoints = {}
|
||
|
|
|
||
|
|
function Waypoints:GetZoneInfoForItem(item)
|
||
|
|
local zoneInfo = {
|
||
|
|
zoneText = self:GetZoneTextForItem(item),
|
||
|
|
inMyZone = self:IsItemInCurrentZone(item),
|
||
|
|
zoneColor = (self:IsItemInCurrentZone(item) and green) or gray,
|
||
|
|
numZones = self:GetNumZonesForItem(item),
|
||
|
|
}
|
||
|
|
return zoneInfo
|
||
|
|
end
|
||
|
|
|
||
|
|
function Waypoints:GetZoneTextForItem(item)
|
||
|
|
if not self:HasItemWaypoints(item) then
|
||
|
|
return ""
|
||
|
|
end
|
||
|
|
|
||
|
|
if item.coords.zoneOverride ~= nil then
|
||
|
|
return item.coords.zoneOverride
|
||
|
|
end
|
||
|
|
|
||
|
|
local numZones = self:GetNumZonesForItem(item)
|
||
|
|
if numZones == 1 then
|
||
|
|
-- Convoluted much? Oh well, simplify later I guess (separate issue)
|
||
|
|
local mapID = self:GetFirstMapForItem(item)
|
||
|
|
return GetMapNameByID(mapID)
|
||
|
|
end
|
||
|
|
|
||
|
|
if not self:IsItemInCurrentZone(item) then
|
||
|
|
return format(L["%d |4zone:zones;"], numZones)
|
||
|
|
end
|
||
|
|
|
||
|
|
local currentZone = GetBestMapForUnit("player")
|
||
|
|
-- TBD: Why use gray if it'll be overridden with green due to being in the current zone?
|
||
|
|
return GetMapNameByID(currentZone) .. " " .. Colorize(format("+%d", numZones - 1), gray)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Waypoints:IsItemInCurrentZone(item)
|
||
|
|
if not self:HasItemWaypoints(item) then
|
||
|
|
return false
|
||
|
|
end -- We don't know for sure, but the effect is the same
|
||
|
|
|
||
|
|
local mapIDs = self:GetMapsForItem(item) or {}
|
||
|
|
-- DevTools_Dump(mapIDs)
|
||
|
|
local currentZone = GetBestMapForUnit("player")
|
||
|
|
return mapIDs[currentZone]
|
||
|
|
end
|
||
|
|
|
||
|
|
function Waypoints:GetNumZonesForItem(item)
|
||
|
|
local mapIDs = self:GetMapsForItem(item) or {}
|
||
|
|
return Count(mapIDs)
|
||
|
|
end
|
||
|
|
|
||
|
|
function Waypoints:HasItemWaypoints(item)
|
||
|
|
-- Is valid waypoint entry
|
||
|
|
-- TBD: Use DB schema validation logic for this? No need to reinvent the wheel
|
||
|
|
local hasWaypointsEntry = (item.coords ~= nil and type(item.coords) == "table")
|
||
|
|
if not hasWaypointsEntry then
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Has at least one assigned map ID (TBD: is this actually an optional field?)
|
||
|
|
local hasWaypointMapID = false -- At least one (slightly awkward, should streamline this later?)
|
||
|
|
for waypointID, waypointData in pairs(item.coords) do
|
||
|
|
if type(waypointData) == "table" and waypointData.m ~= nil then
|
||
|
|
hasWaypointMapID = true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return hasWaypointMapID
|
||
|
|
end
|
||
|
|
|
||
|
|
function Waypoints:GetFirstMapForItem(item)
|
||
|
|
if not self:HasItemWaypoints(item) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
for waypointID, waypointData in pairs(item.coords) do
|
||
|
|
local mapID = waypointData.m
|
||
|
|
if mapID then -- Skip those that don't have a mapID (not sure if that actually exists?)
|
||
|
|
return mapID
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function Waypoints:GetMapsForItem(item)
|
||
|
|
if not self:HasItemWaypoints(item) then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local waypointMapIDs = {}
|
||
|
|
for waypointID, waypointData in pairs(item.coords) do
|
||
|
|
local mapID = waypointData.m
|
||
|
|
if mapID then
|
||
|
|
waypointMapIDs[mapID] = true
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return waypointMapIDs
|
||
|
|
end
|
||
|
|
|
||
|
|
Rarity.Waypoints = Waypoints
|