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.
155 lines
4.4 KiB
155 lines
4.4 KiB
|
3 years ago
|
local _, addon = ...
|
||
|
|
|
||
|
|
|
||
|
|
local UPDATE_INTERVAL_MOVING = 0.5;
|
||
|
|
local UPDATE_INTERVAL_STOPPED = 1;
|
||
|
|
|
||
|
|
local format = string.format;
|
||
|
|
local GetBestMapForUnit = C_Map.GetBestMapForUnit;
|
||
|
|
local GetMapInfo = C_Map.GetMapInfo;
|
||
|
|
local GetPlayerMapPosition = C_Map.GetPlayerMapPosition;
|
||
|
|
local GetMinimapZoneText = GetMinimapZoneText;
|
||
|
|
local IsPlayerMoving = IsPlayerMoving;
|
||
|
|
local IsInInstance = IsInInstance;
|
||
|
|
|
||
|
|
local ZONE_CHANGED_EVENTS = {
|
||
|
|
MAP_EXPLORATION_UPDATED = true,
|
||
|
|
ZONE_CHANGED_NEW_AREA = true,
|
||
|
|
ZONE_CHANGED_INDOORS = true,
|
||
|
|
ZONE_CHANGED = true,
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
NarciPlayerLocationFrameMixin = {};
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:OnLoad()
|
||
|
|
self.threshhold = UPDATE_INTERVAL_STOPPED;
|
||
|
|
self:RegisterEvent("DISPLAY_SIZE_CHANGED");
|
||
|
|
self:UpdateFontSize();
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:UpdateFontSize()
|
||
|
|
local fontName = "NarciFontNormal10Outline";
|
||
|
|
local _, screenHeight = GetPhysicalScreenSize();
|
||
|
|
local pixel = 768 / screenHeight;
|
||
|
|
local fontHeight = 18 * pixel;
|
||
|
|
if _G[fontName] then
|
||
|
|
local fontPath = _G[fontName]:GetFont();
|
||
|
|
if fontPath then
|
||
|
|
self.Location:SetFont(fontPath, fontHeight, "OUTLINE");
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:OnShow()
|
||
|
|
self:RegisterEvent("PLAYER_STARTED_MOVING");
|
||
|
|
self:RegisterEvent("PLAYER_STOPPED_MOVING");
|
||
|
|
self:RegisterEvent("MAP_EXPLORATION_UPDATED");
|
||
|
|
self:RegisterEvent("ZONE_CHANGED_NEW_AREA");
|
||
|
|
self:RegisterEvent("ZONE_CHANGED_INDOORS");
|
||
|
|
self:RegisterEvent("ZONE_CHANGED");
|
||
|
|
|
||
|
|
self:UpdateMovingStatus();
|
||
|
|
self:OnEvent("ZONE_CHANGED");
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:OnHide()
|
||
|
|
self:UnregisterEvent("PLAYER_STARTED_MOVING");
|
||
|
|
self:UnregisterEvent("PLAYER_STOPPED_MOVING");
|
||
|
|
self:UnregisterEvent("MAP_EXPLORATION_UPDATED");
|
||
|
|
self:UnregisterEvent("ZONE_CHANGED_NEW_AREA");
|
||
|
|
self:UnregisterEvent("ZONE_CHANGED_INDOORS");
|
||
|
|
self:UnregisterEvent("ZONE_CHANGED");
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:UpdateMovingStatus()
|
||
|
|
if IsPlayerMoving() then
|
||
|
|
self:OnEvent("PLAYER_STARTED_MOVING");
|
||
|
|
else
|
||
|
|
self:OnEvent("PLAYER_STOPPED_MOVING");
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local function PlayerLocationFrame_OnUpdate(self, elapsed)
|
||
|
|
self.t = self.t + elapsed;
|
||
|
|
|
||
|
|
if self.t > self.threshhold then
|
||
|
|
self.t = 0;
|
||
|
|
if self.updateZone then
|
||
|
|
self.updateZone = nil;
|
||
|
|
self:UpdateZone();
|
||
|
|
self:UpdateMovingStatus();
|
||
|
|
end
|
||
|
|
|
||
|
|
if self.inInstance then
|
||
|
|
self:SetScript("OnUpdate", nil);
|
||
|
|
else
|
||
|
|
self:UpdateCoordinates();
|
||
|
|
end
|
||
|
|
else
|
||
|
|
return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:OnEvent(event, ...)
|
||
|
|
if event == "PLAYER_STARTED_MOVING" then
|
||
|
|
self.threshhold = UPDATE_INTERVAL_MOVING;
|
||
|
|
elseif event == "PLAYER_STOPPED_MOVING" then
|
||
|
|
self.t = 2; --call update on next frame
|
||
|
|
self.threshhold = UPDATE_INTERVAL_STOPPED;
|
||
|
|
elseif event == "DISPLAY_SIZE_CHANGED" then
|
||
|
|
self:UpdateFontSize();
|
||
|
|
else
|
||
|
|
--Zone changed
|
||
|
|
self.t = 0;
|
||
|
|
self.threshhold = 0.1;
|
||
|
|
self.updateZone = true;
|
||
|
|
self:SetScript("OnUpdate", PlayerLocationFrame_OnUpdate);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:UpdateZone()
|
||
|
|
local mapName;
|
||
|
|
|
||
|
|
local mapID = GetBestMapForUnit("player");
|
||
|
|
self.mapID = mapID;
|
||
|
|
|
||
|
|
if mapID then
|
||
|
|
local mapInfo = GetMapInfo(mapID);
|
||
|
|
if mapInfo then
|
||
|
|
mapName = mapInfo.name;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local zoneName = GetMinimapZoneText();
|
||
|
|
if zoneName then
|
||
|
|
if mapName and zoneName ~= mapName then
|
||
|
|
mapName = mapName .. ": "..zoneName
|
||
|
|
else
|
||
|
|
mapName = zoneName;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
self.locationText = mapName;
|
||
|
|
|
||
|
|
if IsInInstance() then
|
||
|
|
self.inInstance = true;
|
||
|
|
self.Location:SetText(mapName);
|
||
|
|
else
|
||
|
|
self.inInstance = nil;
|
||
|
|
self:UpdateCoordinates();
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function NarciPlayerLocationFrameMixin:UpdateCoordinates()
|
||
|
|
if not (self.mapID and self.locationText) then return end;
|
||
|
|
|
||
|
|
local position = GetPlayerMapPosition(self.mapID, "player");
|
||
|
|
|
||
|
|
if not position then return end;
|
||
|
|
|
||
|
|
local x = position.x or 0;
|
||
|
|
local y = position.y or 0;
|
||
|
|
|
||
|
|
self.Location:SetText(format("%s %.1f, %.1f", self.locationText, 100*x, 100*y));
|
||
|
|
end
|