221 lines
9.4 KiB
C#
221 lines
9.4 KiB
C#
// New Frontiers - This file is licensed under AGPLv3
|
|
// Copyright (c) 2024 New Frontiers Contributors
|
|
// See AGPLv3.txt for details.
|
|
|
|
using System.Numerics;
|
|
using Content.Shared._NF.Shuttles.Events;
|
|
using Content.Shared.Shuttles.BUIStates;
|
|
using Content.Shared.Shuttles.Components;
|
|
using Robust.Client.UserInterface.Controls;
|
|
|
|
namespace Content.Client.Shuttles.UI
|
|
{
|
|
public sealed partial class NavScreen
|
|
{
|
|
private readonly ButtonGroup _buttonGroup = new();
|
|
public event Action<NetEntity?, InertiaDampeningMode>? OnInertiaDampeningModeChanged;
|
|
public event Action<NetEntity?, ServiceFlags>? OnServiceFlagsChanged;
|
|
public event Action<NetEntity?, Vector2>? OnSetTargetCoordinates;
|
|
public event Action<NetEntity?, bool>? OnSetHideTarget;
|
|
private bool _targetCoordsModified = false;
|
|
public event Action<NetEntity?, float>? OnMaxShuttleSpeedChanged;
|
|
public event Action<string, string>? OnNetworkPortButtonPressed;
|
|
|
|
private void NfInitialize()
|
|
{
|
|
// Frontier - IFF search
|
|
IffSearchCriteria.OnTextChanged += args => OnIffSearchChanged(args.Text);
|
|
|
|
// Frontier - Maximum IFF Distance
|
|
MaximumIFFDistanceValue.GetChild(0).GetChild(1).Margin = new Thickness(8, 0, 0, 0);
|
|
MaximumIFFDistanceValue.OnValueChanged += args => OnRangeFilterChanged(args);
|
|
|
|
// Frontier - Maximum Shuttle Speed
|
|
MaximumShuttleSpeedValue.GetChild(0).GetChild(1).Margin = new Thickness(8, 0, 0, 0);
|
|
MaximumShuttleSpeedValue.OnValueChanged += args => OnMaxSpeedChanged(args);
|
|
|
|
DampenerOff.OnPressed += _ => SetDampenerMode(InertiaDampeningMode.Off);
|
|
DampenerOn.OnPressed += _ => SetDampenerMode(InertiaDampeningMode.Dampen);
|
|
AnchorOn.OnPressed += _ => SetDampenerMode(InertiaDampeningMode.Anchor);
|
|
|
|
DampenerOff.Group = _buttonGroup;
|
|
DampenerOn.Group = _buttonGroup;
|
|
AnchorOn.Group = _buttonGroup;
|
|
|
|
// Network Port Buttons
|
|
DeviceButton1.OnPressed += _ => OnPortButtonPressed("device-button-1", "button-1");
|
|
DeviceButton2.OnPressed += _ => OnPortButtonPressed("device-button-2", "button-2");
|
|
DeviceButton3.OnPressed += _ => OnPortButtonPressed("device-button-3", "button-3");
|
|
DeviceButton4.OnPressed += _ => OnPortButtonPressed("device-button-4", "button-4");
|
|
DeviceButton5.OnPressed += _ => OnPortButtonPressed("device-button-5", "button-5");
|
|
DeviceButton6.OnPressed += _ => OnPortButtonPressed("device-button-6", "button-6");
|
|
DeviceButton7.OnPressed += _ => OnPortButtonPressed("device-button-7", "button-7");
|
|
DeviceButton8.OnPressed += _ => OnPortButtonPressed("device-button-8", "button-8");
|
|
|
|
// Send off a request to get the current dampening mode.
|
|
_entManager.TryGetNetEntity(_shuttleEntity, out var shuttle);
|
|
OnInertiaDampeningModeChanged?.Invoke(shuttle, InertiaDampeningMode.Query);
|
|
|
|
ServiceFlagServices.OnPressed += _ => ToggleServiceFlags(ServiceFlags.Services);
|
|
ServiceFlagTrade.OnPressed += _ => ToggleServiceFlags(ServiceFlags.Trade);
|
|
ServiceFlagSocial.OnPressed += _ => ToggleServiceFlags(ServiceFlags.Social);
|
|
|
|
TargetX.OnTextChanged += _ => _targetCoordsModified = true;
|
|
TargetY.OnTextChanged += _ => _targetCoordsModified = true;
|
|
TargetSet.OnPressed += _ => SetTargetCoords();
|
|
TargetShow.OnPressed += _ => SetHideTarget(!TargetShow.Pressed);
|
|
}
|
|
|
|
private void OnPortButtonPressed(string sourcePort, string targetPort)
|
|
{
|
|
OnNetworkPortButtonPressed?.Invoke(sourcePort, targetPort);
|
|
}
|
|
|
|
private void SetDampenerMode(InertiaDampeningMode mode)
|
|
{
|
|
NavRadar.DampeningMode = mode;
|
|
_entManager.TryGetNetEntity(_shuttleEntity, out var shuttle);
|
|
OnInertiaDampeningModeChanged?.Invoke(shuttle, mode);
|
|
}
|
|
|
|
private void NfUpdateState(NavInterfaceState state)
|
|
{
|
|
if (NavRadar.DampeningMode == InertiaDampeningMode.Station)
|
|
{
|
|
DampenerModeButtons.Visible = false;
|
|
ServiceFlagsBox.Visible = false;
|
|
}
|
|
else
|
|
{
|
|
DampenerModeButtons.Visible = true;
|
|
ServiceFlagsBox.Visible = true;
|
|
DampenerOff.Pressed = NavRadar.DampeningMode == InertiaDampeningMode.Off;
|
|
DampenerOn.Pressed = NavRadar.DampeningMode == InertiaDampeningMode.Dampen;
|
|
AnchorOn.Pressed = NavRadar.DampeningMode == InertiaDampeningMode.Anchor;
|
|
ToggleServiceFlags(NavRadar.ServiceFlags, updateButtonsOnly: true);
|
|
|
|
// Disable the Park button (AnchorOn) while in FTL, but keep other dampener buttons enabled
|
|
if (NavRadar.InFtl)
|
|
{
|
|
AnchorOn.Disabled = true;
|
|
// If the AnchorOn button is pressed while it gets disabled, we need to switch to another mode
|
|
if (AnchorOn.Pressed)
|
|
{
|
|
DampenerOn.Pressed = true;
|
|
SetDampenerMode(InertiaDampeningMode.Dampen);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
AnchorOn.Disabled = false;
|
|
}
|
|
}
|
|
|
|
TargetShow.Pressed = !state.HideTarget;
|
|
if (!_targetCoordsModified)
|
|
{
|
|
if (state.Target != null)
|
|
{
|
|
var target = state.Target.Value;
|
|
TargetX.Text = target.X.ToString("F1");
|
|
TargetY.Text = target.Y.ToString("F1");
|
|
}
|
|
else
|
|
{
|
|
TargetX.Text = 0.0f.ToString("F1");
|
|
TargetY.Text = 0.0f.ToString("F1");
|
|
}
|
|
}
|
|
}
|
|
|
|
// Frontier - Maximum IFF Distance
|
|
private void OnRangeFilterChanged(int value)
|
|
{
|
|
NavRadar.MaximumIFFDistance = (float)value;
|
|
}
|
|
|
|
// Frontier - Maximum Shuttle Speed
|
|
private void OnMaxSpeedChanged(int value)
|
|
{
|
|
_entManager.TryGetNetEntity(_shuttleEntity, out var shuttle);
|
|
OnMaxShuttleSpeedChanged?.Invoke(shuttle, value);
|
|
}
|
|
|
|
private void ToggleServiceFlags(ServiceFlags flags, bool updateButtonsOnly = false)
|
|
{
|
|
if (!updateButtonsOnly)
|
|
{
|
|
// Special handling for ServiceFlags.None
|
|
if (flags == ServiceFlags.None)
|
|
{
|
|
// If None is being toggled, set it to None (clear all other flags)
|
|
// No need to check if None is already set since that check will always be false
|
|
NavRadar.ServiceFlags = ServiceFlags.None;
|
|
}
|
|
else
|
|
{
|
|
// Toggle the requested flag
|
|
NavRadar.ServiceFlags ^= flags;
|
|
|
|
// If any flag other than None is set, make sure None is unset
|
|
if (NavRadar.ServiceFlags != 0)
|
|
{
|
|
NavRadar.ServiceFlags &= ~ServiceFlags.None; // This is redundant since None is 0
|
|
}
|
|
// If toggling resulted in no flags, set None
|
|
else
|
|
{
|
|
NavRadar.ServiceFlags = ServiceFlags.None;
|
|
}
|
|
}
|
|
_entManager.TryGetNetEntity(_shuttleEntity, out var shuttle);
|
|
OnServiceFlagsChanged?.Invoke(shuttle, NavRadar.ServiceFlags);
|
|
}
|
|
|
|
ServiceFlagServices.Pressed = NavRadar.ServiceFlags.HasFlag(ServiceFlags.Services);
|
|
ServiceFlagTrade.Pressed = NavRadar.ServiceFlags.HasFlag(ServiceFlags.Trade);
|
|
ServiceFlagSocial.Pressed = NavRadar.ServiceFlags.HasFlag(ServiceFlags.Social);
|
|
}
|
|
|
|
private void NfAddShuttleDesignation(EntityUid? shuttle)
|
|
{
|
|
// Frontier - PR #1284 Add Shuttle Designation
|
|
if (_entManager.TryGetComponent<MetaDataComponent>(shuttle, out var metadata))
|
|
{
|
|
var shipNameParts = metadata.EntityName.Split(' ');
|
|
var designation = shipNameParts[^1];
|
|
if (designation.Length > 2 && designation[2] == '-')
|
|
{
|
|
NavDisplayLabel.Text = string.Join(' ', shipNameParts[..^1]);
|
|
ShuttleDesignation.Text = designation;
|
|
}
|
|
else
|
|
NavDisplayLabel.Text = metadata.EntityName;
|
|
}
|
|
// End Frontier - PR #1284
|
|
}
|
|
|
|
private void SetTargetCoords()
|
|
{
|
|
Vector2 outputVector;
|
|
if (!float.TryParse(TargetX.Text, out outputVector.X))
|
|
outputVector.X = 0.0f;
|
|
|
|
if (!float.TryParse(TargetY.Text, out outputVector.Y))
|
|
outputVector.Y = 0.0f;
|
|
|
|
NavRadar.Target = outputVector;
|
|
NavRadar.TargetEntity = NetEntity.Invalid;
|
|
_entManager.TryGetNetEntity(_shuttleEntity, out var shuttle);
|
|
OnSetTargetCoordinates?.Invoke(shuttle, outputVector);
|
|
_targetCoordsModified = false;
|
|
}
|
|
|
|
private void SetHideTarget(bool hide)
|
|
{
|
|
_entManager.TryGetNetEntity(_shuttleEntity, out var shuttle);
|
|
OnSetHideTarget?.Invoke(shuttle, hide);
|
|
}
|
|
}
|
|
}
|