v9.7.2: Ebonhold Database integration and core logic refinements
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
---@class QuestieCoords
|
||||
local QuestieCoords = QuestieLoader:CreateModule("QuestieCoords");
|
||||
|
||||
---@type l10n
|
||||
local l10n = QuestieLoader:ImportModule("l10n")
|
||||
|
||||
--- COMPATIBILITY ---
|
||||
local C_Timer = QuestieCompat.C_Timer
|
||||
local C_Map = QuestieCompat.C_Map
|
||||
local WorldMapFrame = QuestieCompat.WorldMapFrame
|
||||
|
||||
local posX = 0;
|
||||
local posY = 0;
|
||||
|
||||
QuestieCoords.updateInterval = QuestieCompat.Is335 and 0.1 or 0.5;
|
||||
-- Placing the functions locally to save time when spamming the updateInterval
|
||||
local GetBestMapForUnit = C_Map.GetBestMapForUnit;
|
||||
local GetPlayerMapPosition = C_Map.GetPlayerMapPosition;
|
||||
local GetCursorPosition = GetCursorPosition;
|
||||
|
||||
local GetMinimapZoneText = GetMinimapZoneText;
|
||||
local IsInInstance = IsInInstance;
|
||||
local format = format;
|
||||
|
||||
|
||||
local function GetMapTitleText()
|
||||
if QuestieCompat.Is335 then return WorldMapFrameTitle end
|
||||
local regions = {WorldMapFrame.BorderFrame:GetRegions()}
|
||||
for i = 1, #regions do
|
||||
if (regions[i].SetText) then
|
||||
return regions[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function GetMiniWorldMapTitleText()
|
||||
if QuestieCompat.Is335 then return end
|
||||
local regions = {WorldMapFrame.MiniBorderFrame:GetRegions()}
|
||||
for i = 1, #regions do
|
||||
if regions[i].SetText then
|
||||
return regions[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function QuestieCoords:WriteCoords()
|
||||
if not ((Questie.db.profile.mapCoordinatesEnabled and WorldMapFrame:IsVisible()) or (Questie.db.profile.minimapCoordinatesEnabled and Minimap:IsVisible())) then
|
||||
return -- no need to write coords
|
||||
end
|
||||
local isInInstance, instanceType = IsInInstance()
|
||||
|
||||
if isInInstance and "pvp" ~= instanceType then
|
||||
return -- dont write coords in raids
|
||||
end
|
||||
|
||||
local position = QuestieCoords.GetPlayerMapPosition()
|
||||
if (not position) then
|
||||
return
|
||||
end
|
||||
|
||||
if position.x ~= 0 and position.y ~= 0 and (position.x ~= QuestieCoords._lastX or position.y ~= QuestieCoords._lastY) then
|
||||
QuestieCoords._lastX = position.x
|
||||
QuestieCoords._lastY = position.y
|
||||
|
||||
posX = position.x * 100;
|
||||
posY = position.y * 100;
|
||||
|
||||
-- if minimap
|
||||
if Questie.db.profile.minimapCoordinatesEnabled and Minimap:IsVisible() then
|
||||
MinimapZoneText:SetText(format("(%d, %d) ", posX, posY) .. GetMinimapZoneText());
|
||||
end
|
||||
end
|
||||
-- if main map
|
||||
local mapTitleText = GetMapTitleText()
|
||||
if Questie.db.profile.mapCoordinatesEnabled and WorldMapFrame:IsVisible() and mapTitleText then
|
||||
-- get cursor position
|
||||
local curX, curY = GetCursorPosition();
|
||||
|
||||
local canvas = WorldMapFrame:GetCanvas()
|
||||
|
||||
local scale = canvas:GetEffectiveScale();
|
||||
curX = curX / scale;
|
||||
curY = curY / scale;
|
||||
|
||||
local width = canvas:GetWidth();
|
||||
local height = canvas:GetHeight();
|
||||
local left = canvas:GetLeft();
|
||||
local top = canvas:GetTop();
|
||||
|
||||
curX = (curX - left) / width * 100;
|
||||
curY = (top - curY) / height * 100;
|
||||
local precision = "%.".. Questie.db.profile.mapCoordinatePrecision .."f";
|
||||
|
||||
if QuestieCompat.Is335 and (not canvas:IsMouseOver()) or (position.uiMapID == 946)then
|
||||
curX, curY = 0, 0
|
||||
end
|
||||
|
||||
local worldmapCoordsText = "Cursor: "..format(precision.. " X, ".. precision .." Y ", curX, curY);
|
||||
|
||||
worldmapCoordsText = worldmapCoordsText.."| Player: "..format(precision.. " X , ".. precision .." Y", posX, posY);
|
||||
-- Add text to world map
|
||||
mapTitleText:SetText(worldmapCoordsText)
|
||||
|
||||
-- Adding text to mini world map
|
||||
local miniWorldMapTitleText = GetMiniWorldMapTitleText()
|
||||
if miniWorldMapTitleText then
|
||||
miniWorldMapTitleText:SetText(worldmapCoordsText)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
---@return table<{x: number, y: number}>, number | nil
|
||||
function QuestieCoords.GetPlayerMapPosition()
|
||||
local mapID = GetBestMapForUnit("player")
|
||||
if (not mapID) then
|
||||
return nil, nil
|
||||
end
|
||||
|
||||
return GetPlayerMapPosition(mapID, "player"), mapID
|
||||
end
|
||||
|
||||
function QuestieCoords:Initialize()
|
||||
|
||||
-- Do not fight with Coordinates addon
|
||||
if IsAddOnLoaded("Coordinates") and ((Questie.db.profile.minimapCoordinatesEnabled) or (Questie.db.profile.mapCoordinatesEnabled)) then
|
||||
Questie:Print("|cFFFF0000", l10n("WARNING!"), "|r", l10n("Coordinates addon is enabled and will cause buggy behavior. Disabling global map and mini map coordinates. These can be re-enabled in settings"))
|
||||
Questie.db.profile.minimapCoordinatesEnabled = false
|
||||
Questie.db.profile.mapCoordinatesEnabled = false
|
||||
end
|
||||
|
||||
C_Timer.NewTicker(QuestieCoords.updateInterval, QuestieCoords.Update)
|
||||
end
|
||||
|
||||
function QuestieCoords:Update()
|
||||
if (Questie.db.profile.minimapCoordinatesEnabled) or (Questie.db.profile.mapCoordinatesEnabled) then
|
||||
QuestieCoords.WriteCoords();
|
||||
end
|
||||
end
|
||||
|
||||
function QuestieCoords:ResetMinimapText()
|
||||
MinimapZoneText:SetText(GetMinimapZoneText());
|
||||
end
|
||||
|
||||
function QuestieCoords:ResetMapText()
|
||||
GetMapTitleText():SetText(WORLD_MAP);
|
||||
end
|
||||
|
||||
function QuestieCoords:ResetMiniWorldMapText()
|
||||
local currentMapId = WorldMapFrame:GetMapID();
|
||||
if currentMapId then
|
||||
local info = C_Map.GetMapInfo(currentMapId);
|
||||
if info then
|
||||
GetMiniWorldMapTitleText():SetText(info.name);
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user