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.

855 lines
24 KiB

local _, addon = ...
local API = addon.API;
local L = addon.L;
local SecondsToClock = API.SecondsToClock;
local Round = Round;
local C_Navigation = C_Navigation;
local C_SuperTrack = C_SuperTrack;
local SetSuperTrackedUserWaypoint = C_SuperTrack.SetSuperTrackedUserWaypoint;
local SetUserWaypoint = C_Map.SetUserWaypoint;
local GetCursorPosition = GetCursorPosition;
local ClampedPercentageBetween = ClampedPercentageBetween;
local FrameDeltaLerp = FrameDeltaLerp;
local DeltaLerp = DeltaLerp;
local CreateVector2D = CreateVector2D;
local Vector2D_Normalize = Vector2D_Normalize;
local Vector2D_CalculateAngleBetween = Vector2D_CalculateAngleBetween;
local UIParent = UIParent;
local WorldFrame = WorldFrame;
local AbbreviateNumbers = AbbreviateNumbers;
local C_QuestLog = C_QuestLog;
local GetMouseFocus = GetMouseFocus;
local InCombatLockdown = InCombatLockdown;
local floor = math.floor;
local deg = math.deg;
local PI2 = 2*math.pi;
local sqrt = math.sqrt;
local FORMAT_RANGE = IN_GAME_NAVIGATION_RANGE;
local ALPHA_CLAMPED_TIMER = 0.6;
local CLICK_THRESHOLD = 0.2; --Right Mouse Button Down/Up within this time window is considered a Right Click
local LOCK_TO_USER_WAYPOINT = true; --Game will try to track auto-accepted World Quest when passing through, we need to re-set it to our waypoint
local MainFrame;
local UpdateFrame = CreateFrame("Frame");
local function GetSuperTrackFrame()
if not MainFrame then
MainFrame = CreateFrame("Frame", nil, UIParent, "PlumberSuperTrackingTemplate");
end
return MainFrame
end
addon.GetSuperTrackFrame = GetSuperTrackFrame;
local function InterpolateDimension(lastValue, targetValue, amount, elapsed)
return lastValue and amount and DeltaLerp(lastValue, targetValue, amount, elapsed) or targetValue;
end
PlumberSuperTrackingMixin = {};
function PlumberSuperTrackingMixin:SetArrowAngle(radian)
if radian < 0 then
radian = -radian;
else
radian = PI2 - radian;
end
local n = floor(( deg(radian) + 2.5) * 0.2 ) + 1; -- /5
if n > 72 then
n = 1;
end
local row = floor(n / 8);
local col = floor(n % 8);
if col == 0 then
col = 8;
row = row - 1;
end
col = col - 1;
self.Arrow:SetTexCoord(0.125*col, 0.125*col + 0.125, 0.0625*row, 0.0625*row + 0.0625);
end
function PlumberSuperTrackingMixin:OnLoad()
MainFrame = self;
self.useTitle = true;
self.t = 0;
self.mouseToNavVec = CreateVector2D(0, 0);
self.indicatorVec = CreateVector2D(0, 0);
self.circularVec = CreateVector2D(0, 0);
UpdateFrame:SetParent(self);
self.Arrow:SetTexture("Interface/AddOns/Plumber/Art/SuperTracking/DirectionArrow_Angle.png", nil, nil, "LINEAR");
self:SetArrowAngle(0);
end
function PlumberSuperTrackingMixin:EnableSuperTracking(state)
local f = SuperTrackedFrame;
if (not state) and self.enabled then
self.enabled = false;
self:UnregisterEvent("NAVIGATION_FRAME_CREATED");
self:UnregisterEvent("NAVIGATION_FRAME_DESTROYED");
self:UnregisterEvent("SUPER_TRACKING_CHANGED");
self:UnregisterEvent("QUEST_ACCEPTED");
self:MonitorClicks(false);
self:Hide();
f:RegisterEvent("NAVIGATION_FRAME_CREATED");
f:RegisterEvent("NAVIGATION_FRAME_DESTROYED");
f:RegisterEvent("SUPER_TRACKING_CHANGED");
C_Map.ClearUserWaypoint();
f:InitializeNavigationFrame();
f:Show();
elseif state and not self.enabled then
self.enabled = true;
self:RegisterEvent("NAVIGATION_FRAME_CREATED");
self:RegisterEvent("NAVIGATION_FRAME_DESTROYED");
self:RegisterEvent("SUPER_TRACKING_CHANGED");
self:RegisterEvent("QUEST_ACCEPTED");
self:MonitorClicks(true);
self:Show();
f:UnregisterEvent("NAVIGATION_FRAME_CREATED");
f:UnregisterEvent("NAVIGATION_FRAME_DESTROYED");
f:UnregisterEvent("SUPER_TRACKING_CHANGED");
f:ShutdownNavigationFrame();
f:Hide();
end
end
function PlumberSuperTrackingMixin:TryEnableByModule()
if PlumberDB.Navigator_MasterSwitch then
self:EnableSuperTracking(true);
end
end
function PlumberSuperTrackingMixin:OnEvent(event, ...)
if event == "NAVIGATION_FRAME_CREATED" then
self:InitializeNavigationFrame();
elseif event == "NAVIGATION_FRAME_DESTROYED" then
self:ShutdownNavigationFrame();
elseif event == "SUPER_TRACKING_CHANGED" then
self:OnSuperTrackingChanged();
--print(event, ...)
elseif event == "QUEST_ACCEPTED" then
self:OnQuestAccepted(...);
elseif event == "GLOBAL_MOUSE_DOWN" then
local button = ...
if button == "RightButton" then
self:OnMouseStateChanged(true);
end
elseif event == "GLOBAL_MOUSE_UP" then
self:OnMouseStateChanged(false);
end
end
function PlumberSuperTrackingMixin:OnMouseStateChanged(rightButtonDown)
if rightButtonDown then
self.rightButtonDownTime = 0;
else
if self.rightButtonDownTime and self.rightButtonDownTime < CLICK_THRESHOLD then
if self.Icon:IsMouseOver(-6, 6, 6, -6) and GetMouseFocus() == WorldFrame then
--Shrink from 32 to 20
if self.isClamped or (self.distance and self.distance > 15) then --Hack to avoid conflict with interacting with NPC, objects...
if not InCombatLockdown() or (self.Icon:IsMouseOver(-8, 8, 8, -8)) then --Sticker rules to trigger right-click during combat
self:ToggleMenu();
end
end
end
end
self.rightButtonDownTime = nil;
end
end
function PlumberSuperTrackingMixin:OnUpdate(elapsed)
self:CheckInitializeNavigationFrame();
if self.navFrame then
self.t = self.t + elapsed;
if self.t > 1 then
self.t = 0;
self.requestUpdate = true;
self:UpdateTimer();
end
if self.rightButtonDownTime then
self.rightButtonDownTime = self.rightButtonDownTime + elapsed;
if self.rightButtonDownTime > 0.5 then
self.rightButtonDownTime = nil;
end
end
self:UpdateClampedState();
self:UpdatePosition();
self:UpdateInterpolation(elapsed);
self:UpdateArrow();
self:UpdateDistance();
self:UpdateAlpha();
self.requestUpdate = false;
end
self.setByPlumber = false;
end
function PlumberSuperTrackingMixin:UpdateClampedState()
local clamped = C_Navigation.WasClampedToScreen();
self.clampedChanged = clamped ~= self.isClamped;
self.isClamped = clamped;
if self.clampedChanged then
self:OnClampedChanged();
end
end
function PlumberSuperTrackingMixin:OnClampedChanged()
if self.isClamped then
if self.keepTitle then
self.Title:SetAlpha(ALPHA_CLAMPED_TIMER);
end
self:TransitToTimer(false);
self:ShowTimer();
else
if self.hasTimer and self.waypointName then
self.Title:SetText(self.waypointName);
self:TransitToTimer(true);
end
end
self:UpdateTitleVisibility();
end
do
local navStateToTargetAlpha =
{
[Enum.NavigationState.Invalid] = 0.5, --0 --state change to 0 within 70 yds
[Enum.NavigationState.Occluded] = 0.6, --1
[Enum.NavigationState.InRange] = 1.0, --2
[Enum.NavigationState.Disabled] = 0.0, --3
};
function PlumberSuperTrackingMixin:GetTargetAlphaBaseValue()
local state = C_Navigation.GetTargetState();
if self.distance then
if self.distance < 8 then
state = 3;
elseif self.distance < 40 then
state = 0;
elseif self.distance < 80 then
if state == 0 then
state = 2;
end
end
end
local alpha = navStateToTargetAlpha[state];
if alpha and alpha > 0 then
if self.isClamped then
return 1; -- Just to make the indicator easier to see
end
end
return alpha;
end
function PlumberSuperTrackingMixin:GetTargetAlpha()
if not C_Navigation.HasValidScreenPosition() then
return 0;
end
local additionalFade = 1.0;
if self:IsMouseOver() then
local mouseX, mouseY = GetCursorPosition();
local scale = UIParent:GetEffectiveScale();
mouseX = mouseX / scale
mouseY = mouseY / scale;
local centerX, centerY = self:GetCenter();
self.mouseToNavVec:SetXY(mouseX - centerX, mouseY - centerY);
local mouseToNavDistanceSq = self.mouseToNavVec:GetLengthSquared();
additionalFade = ClampedPercentageBetween(mouseToNavDistanceSq, 0, self.navFrameRadiusSq * 2);
if additionalFade < 0.2 then
additionalFade = 0.2;
end
end
return FrameDeltaLerp(self:GetAlpha(), self:GetTargetAlphaBaseValue() * additionalFade, 0.1);
end
function PlumberSuperTrackingMixin:SetTargetAlphaForState(state, alpha)
navStateToTargetAlpha[state] = alpha;
end
function PlumberSuperTrackingMixin:UpdateAlpha()
self:SetAlpha(self:GetTargetAlpha());
end
end
do --Menu
local ContextMenu;
local function ChangePriority_NewSeeds()
API.DreamseedUtil:SetNavigatorPrioritizingReward(false);
LOCK_TO_USER_WAYPOINT = true;
MainFrame:SetManualMode(false);
return true --Auto-close
end
local function ChangePriority_CollecRewards()
API.DreamseedUtil:SetNavigatorPrioritizingReward(true);
LOCK_TO_USER_WAYPOINT = true;
MainFrame:SetManualMode(false);
return true
end
local function TrackingSeedSwitch_OnClick()
LOCK_TO_USER_WAYPOINT = false;
MainFrame:SetManualMode(true);
return true
end
local function StopTracking_OnClick()
MainFrame:EnableSuperTracking(false);
PlumberDB.Navigator_MasterSwitch = false;
return true
end
local warningColor = { API.GetColorByName("WarningRed") };
local ContextMenuData = {
{text = L["Priority"], type = "title"},
{text = L["Priority New Seeds"], level = 1, type = "radio", onClickFunc = ChangePriority_NewSeeds,},
{text = L["Priority Rewards"], level = 1, type = "radio", onClickFunc = ChangePriority_CollecRewards},
{text = L["Priority Default"], level = 1, type = "radio", onClickFunc = TrackingSeedSwitch_OnClick, tooltip = L["Priority Default Tooltip"]},
{type = "divider"},
{text = L["Stop Tracking"], color = warningColor, onClickFunc = StopTracking_OnClick, tooltip = L["Stop Tracking Dreamseed Tooltip"]},
};
function PlumberSuperTrackingMixin:ToggleMenu()
if not ContextMenu then
ContextMenu = addon.GetSharedContextMenu();
end
local menu = ContextMenu;
if menu:IsShown() then
menu:CloseMenu();
return
end
local rewardFirst = API.DreamseedUtil:IsNavigatorPrioritizingReward();
local questFirst = not LOCK_TO_USER_WAYPOINT or (self:IsManualMode());
local selectedButtonIndex;
if questFirst then
selectedButtonIndex = 3;
elseif rewardFirst then
selectedButtonIndex = 2;
else
selectedButtonIndex = 1;
end
selectedButtonIndex = selectedButtonIndex + 1;
for i = 2, 4 do
ContextMenuData[i].selected = i == selectedButtonIndex;
end
local cursorX, cursorY = API.GetScaledCursorPosition();
menu:SetOwner(self.Icon);
menu:ClearAllPoints();
menu:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", cursorX + 8, cursorY);
local forceUpdate = true;
menu:SetContent(ContextMenuData, forceUpdate);
menu:Show();
end
end
do
local UP_VECTOR = CreateVector2D(0, 1);
local RIGHT_VECTOR = CreateVector2D(1, 0);
local function GetCenterScreenPoint()
local centerX, centerY = WorldFrame:GetCenter();
local scale = UIParent:GetEffectiveScale() or 1;
return centerX / scale, centerY / scale;
end
function PlumberSuperTrackingMixin:UpdateArrow()
if self.isClamped then
local centerScreenX, centerScreenY = GetCenterScreenPoint();
local indicatorX, indicatorY = self:GetCenter();
local indicatorVec = self.indicatorVec;
indicatorVec:SetXY(indicatorX - centerScreenX, indicatorY - centerScreenY);
local angle = Vector2D_CalculateAngleBetween(indicatorVec.x, indicatorVec.y, UP_VECTOR.x, UP_VECTOR.y);
--self.Arrow:SetRotation(-angle);
local toArrowX, toArrowY = Vector2D_Normalize(indicatorVec.x, indicatorVec.y);
self.Arrow:SetPoint("CENTER", self, "CENTER", toArrowX * self.navFrameRadius, toArrowY * self.navFrameRadius);
self:SetArrowAngle(angle);
end
self.Arrow:SetShown(self.isClamped);
end
function PlumberSuperTrackingMixin:ClampCircular()
local centerX, centerY = GetCenterScreenPoint();
local navX, navY = self.navFrame:GetCenter();
local v = self.circularVec;
v:SetXY(navX - centerX, navY - centerY);
v:Normalize();
v:ScaleBy(self.clampRadius);
self:SetPoint("CENTER", WorldFrame, "CENTER", v.x, v.y);
end
function PlumberSuperTrackingMixin:ClampElliptical()
local centerX, centerY = GetCenterScreenPoint();
local navX, navY = self.navFrame:GetCenter();
-- This is the point we want to find the intersection, translated to origin
local pX = navX - centerX;
local pY = navY - centerY;
local denominator = sqrt(self.majorAxisSquared * pY * pY + self.minorAxisSquared * pX * pX);
if denominator ~= 0 then
local ratio = self.axesMultiplied / denominator;
local intersectionX = pX * ratio;
local intersectionY = pY * ratio;
self:SetPoint("CENTER", WorldFrame, "CENTER", intersectionX, intersectionY);
end
end
function PlumberSuperTrackingMixin:UpdatePosition()
if self.isClamped or self.clampedChanged then
self:ClearAllPoints();
if self.isClamped then
if self.clampMode == 0 then
self:ClampCircular();
else
self:ClampElliptical();
end
self.useInterpolation = false;
else
--self:SetPoint("CENTER", self.navFrame, "CENTER");
if self.clampedChanged then
self.interpolatedTargetX, self.interpolatedTargetY = self:GetCenter();
self.useInterpolation = true;
self.targetInterpolationAmount = 0.05;
else
self.useInterpolation = false;
end
end
end
end
function PlumberSuperTrackingMixin:UpdateInterpolation(elapsed)
if self.useInterpolation then
local targetX, targetY = self.navFrame:GetCenter();
self.targetInterpolationAmount = self.targetInterpolationAmount + 0.65*elapsed;
if self.targetInterpolationAmount >= 1 then
self.targetInterpolationAmount = 1;
self.useInterpolation = false;
end
self.interpolatedTargetX = InterpolateDimension(self.interpolatedTargetX, targetX, self.targetInterpolationAmount, elapsed); --targetInterpolationAmount: 0.15
self.interpolatedTargetY = InterpolateDimension(self.interpolatedTargetY, targetY, self.targetInterpolationAmount, elapsed);
self:SetPoint("CENTER", UIParent, "BOTTOMLEFT", self.interpolatedTargetX, self.interpolatedTargetY);
if self.useInterpolation then
local diffX = targetX - self.interpolatedTargetX;
local diffY = targetY - self.interpolatedTargetY;
local diff = diffX*diffX + diffY*diffY;
if diff <= 0.5 then
self.useInterpolation = false;
end
end
else
if not self.isClamped then
if self.clampedChanged then
self:ClearAllPoints();
end
self:SetPoint("CENTER", self.navFrame, "CENTER");
end
end
end
end
local function GetDistanceString(distance)
if distance < 9000 then --1000
return tostring(distance);
else
return AbbreviateNumbers(distance);
end
end
function PlumberSuperTrackingMixin:UpdateDistance()
if not self.isClamped then
local distance = Round(C_Navigation.GetDistance());
if self.distance ~= distance then
self.DistanceText:SetText(FORMAT_RANGE:format(GetDistanceString(distance)));
self.distance = distance;
end
if self.requestUpdate then
if self.lastDistance and distance then
local distanceDiff = self.lastDistance - distance;
if distanceDiff > 100 then --after chaning waypoint
distanceDiff = 0;
end
self.speed = distanceDiff; --distanceDiff/1
else
self.speed = 0;
end
self.lastDistance = distance;
if self.speed and self.speed > 0 and distance > 40 then
local seconds = distance / self.speed;
if seconds < 300 then
local eta = SecondsToClock(seconds);
self.ETAText:SetText(eta);
else
self.ETAText:SetText(nil);
end
else
self.ETAText:SetText(nil);
end
end
end
self.DistanceText:SetShown(not self.isClamped);
self.ETAText:SetShown(not self.isClamped);
end
function PlumberSuperTrackingMixin:UpdateIconSize()
self.navFrameRadius = 32; --math.max(self.Icon:GetSize())
self.navFrameRadiusSq = self.navFrameRadius * self.navFrameRadius;
end
function PlumberSuperTrackingMixin:UpdateTimer()
--called every second
if self.hasTimer and self.remainingSeconds and self.remainingSeconds >= 1 then
self.keepTitle = true;
self.remainingSeconds = self.remainingSeconds - 1;
local clock = SecondsToClock(self.remainingSeconds);
if self.pauseTimer then
return
end
self.Title:SetText(clock);
else
self.keepTitle = false;
end
end
local ICON_NAME_LOOKUP = {
[0] = "Quest", --Quest Navigation-Tracked-Icon
[1] = "Waypoint", --Content Waypoint-MapPin-Tracked
--UserWaypoint
[2] = "Corpse", --Corpse Navigation-Tombstone-Icon
[3] = "Waypoint", --Scenario
[4] = "Waypoint", --Content Waypoint-MapPin-Tracked
};
function PlumberSuperTrackingMixin:SetIconTexture(iconName)
if iconName then
self.Icon:SetTexture("Interface/AddOns/Plumber/Art/SuperTracking/"..iconName..".png");
else
self.Icon:SetAtlas("Navigation-Tracked-Icon", true);
end
end
function PlumberSuperTrackingMixin:UpdateIcon(setByPlumber)
--local superTrackingType = C_SuperTrack.GetHighestPrioritySuperTrackingType() or Enum.SuperTrackingType.Quest;
--local atlas = iconLookup[superTrackingType] or "Navigation-Tracked-Icon";
--self.Icon:SetAtlas(atlas, true);
--print("superTrackingType", self.superTrackingType)
if self.superTrackingType and (not setByPlumber) and ICON_NAME_LOOKUP[self.superTrackingType] then
self:SetIconTexture(ICON_NAME_LOOKUP[self.superTrackingType]);
end
self:UpdateIconSize();
end
function PlumberSuperTrackingMixin:InitializeNavigationFrame()
self.navFrame = C_Navigation.GetFrame();
self:SetShown(self.navFrame ~= nil);
if self.navFrame then
self:SetPoint("CENTER", self.navFrame);
self:UpdateIcon();
--0:Circular 1: Elliptical
self.clampMode = 1;
-- Circular
self.clampRadius = 350;
-- Elliptical
self:SetEllipticalRadii(320, 180); --500, 200
end
end
function PlumberSuperTrackingMixin:SetEllipticalRadii(major, minor)
self.majorAxis = major;
self.minorAxis = minor;
self.majorAxisSquared = self.majorAxis * self.majorAxis;
self.minorAxisSquared = self.minorAxis * self.minorAxis;
self.axesMultiplied = self.majorAxis * self.minorAxis;
end
function PlumberSuperTrackingMixin:CheckInitializeNavigationFrame()
if not self.navFrame then
self:InitializeNavigationFrame();
self.frameReady = true;
end
end
function PlumberSuperTrackingMixin:ShutdownNavigationFrame()
self:ClearAllPoints();
self.navFrame = nil;
self:MonitorClicks(false);
end
local function UpdateFrame_OnUpdate_FadeIn(self, elapsed)
self.alpha = self.alpha + 4*elapsed;
if self.alpha >= 1 then
self.alpha = 1;
self:SetScript("OnUpdate", nil);
if self.callback then
self.callback(self);
end
end
self.object:SetAlpha(self.alpha);
end
local function UpdateFrame_OnUpdate_FadeOut(self, elapsed)
self.alpha = self.alpha - 4*elapsed;
local alpha = self.alpha;
if alpha > 1 then
alpha = 1;
end
if alpha <= 0 then
self.alpha = 0;
alpha = 0;
self:SetScript("OnUpdate", nil);
if self.callback then
self.callback(self);
end
end
self.object:SetAlpha(alpha);
end
local function ResumeTimer()
MainFrame.pauseTimer = false;
end
function PlumberSuperTrackingMixin:ShowTimer()
if MainFrame.hasTimer and MainFrame.remainingSeconds and MainFrame.remainingSeconds >= 1 then
local clock = SecondsToClock(MainFrame.remainingSeconds);
MainFrame.Title:SetText(clock);
end
end
local function TitleTimer_FadeOut_Callback()
MainFrame:ShowTimer();
MainFrame.Title:SetAlpha(0);
UpdateFrame.object = MainFrame.Title;
UpdateFrame.alpha = 0;
UpdateFrame.callback = ResumeTimer;
UpdateFrame:SetScript("OnUpdate", UpdateFrame_OnUpdate_FadeIn);
end
function PlumberSuperTrackingMixin:TransitToTimer(state)
if state then
self.pauseTimer = true;
UpdateFrame.object = self.Title;
UpdateFrame.alpha = self.Title:GetAlpha() + 4; --Keep name for 1 second
UpdateFrame.callback = TitleTimer_FadeOut_Callback;
UpdateFrame:SetScript("OnUpdate", UpdateFrame_OnUpdate_FadeOut);
else
self.pauseTimer = false;
UpdateFrame:SetScript("OnUpdate", nil);
end
end
function PlumberSuperTrackingMixin:UpdateTitleVisibility()
if self.useTitle then
if self.isClamped then
if self.keepTitle then
self.Title:Show();
else
self.Title:Hide();
end
else
self.Title:Show();
end
else
self.Title:Hide();
end
end
local PreviousPoint;
function PlumberSuperTrackingMixin:SetTarget(name, uiMapID, x, y, iconName)
if not (self.enabled and self.frameReady) then return end;
local point = {
uiMapID = uiMapID,
position = CreateVector2D(x, y);
};
self.setByPlumber = true
--[[
if PreviousPoint then
if PreviousPoint.position:IsEqualTo(point.position) then
self.setByPlumber = true;
end
end
--]]
SetUserWaypoint(point);
SetSuperTrackedUserWaypoint(true);
if name ~= self.waypointName then
self.waypointName = name;
self.Title:SetText(name);
UpdateFrame:SetScript("OnUpdate", nil);
if self.hasTimer and not self.isClamped then
self:TransitToTimer(true);
end
end
self:SetIconTexture(iconName);
self.hasTimer = false;
self.remainingSeconds = nil;
end
function PlumberSuperTrackingMixin:SetTimerTarget(name, uiMapID, x, y, iconName, hasTimer, remainingSeconds)
--Show Name on the Title first, then replace it with a timer
self:SetTarget(name, uiMapID, x, y, iconName);
self.hasTimer = hasTimer;
self.remainingSeconds = remainingSeconds;
if not hasTimer then
self:TransitToTimer(false);
self.pauseTimer = false;
self.keepTitle = false;
self.Title:SetAlpha(1);
end
if (not self.isClamped) or self.keepTitle then
if self.keepTitle and self.isClamped then
self.Title:SetAlpha(ALPHA_CLAMPED_TIMER);
end
end
self:UpdateTitleVisibility();
end
function PlumberSuperTrackingMixin:OnQuestAccepted(questID)
self.setByPlumber = false;
if LOCK_TO_USER_WAYPOINT or (questID and C_QuestLog.IsWorldQuest(questID)) then
SetSuperTrackedUserWaypoint(true);
end
end
function PlumberSuperTrackingMixin:SetUseTitle(useTitle)
if useTitle ~= self.useTitle then
self.useTitle = useTitle;
self.DistanceText:ClearAllPoints();
if useTitle then
self.DistanceText:SetPoint("TOP", self.Title, "BOTTOM", 0, -2);
else
self.keepTitle = false;
self.hasTimer = false;
self.DistanceText:SetPoint("TOP", self.Icon, "BOTTOM", 0, 0);
self:TransitToTimer(false);
end
self:UpdateTitleVisibility();
end
end
function PlumberSuperTrackingMixin:SetManualMode(isUserInput)
--SuperTrack changed by player manually
self.isUserInput = isUserInput;
if isUserInput then
self:SetUseTitle(false);
self.Title:SetText(nil);
self.waypointName = nil;
SetSuperTrackedUserWaypoint(false);
PreviousPoint = nil;
else
self:SetUseTitle(true);
end
end
function PlumberSuperTrackingMixin:IsManualMode()
return self.isUserInput or false
end
function PlumberSuperTrackingMixin:CanReceiveDataFromNavigator()
return self.enabled and not self:IsManualMode()
end
function PlumberSuperTrackingMixin:MonitorClicks(state)
if state then
self:RegisterEvent("GLOBAL_MOUSE_DOWN");
self:RegisterEvent("GLOBAL_MOUSE_UP");
else
self:UnregisterEvent("GLOBAL_MOUSE_DOWN");
self:UnregisterEvent("GLOBAL_MOUSE_UP");
end
end
function PlumberSuperTrackingMixin:OnSuperTrackingChanged()
local superTrackingType = C_SuperTrack.GetHighestPrioritySuperTrackingType();
self.superTrackingType = superTrackingType;
local isSetByPlumber = self.setByPlumber;
self.setByPlumber = false;
if isSetByPlumber then
self:SetManualMode(false);
--print("Changed by Plumber", superTrackingType);
else
self:SetManualMode(true);
--print("Not by", superTrackingType);
end
if C_SuperTrack.IsSuperTrackingAnything() then
self:MonitorClicks(true);
else
self:SetManualMode(false);
self:MonitorClicks(false);
end
self:UpdateIcon(isSetByPlumber);
end