6
2025-08-05 10:00:54 +03:00

198 lines
7.9 KiB
C#

// New Frontiers - This file is licensed under AGPLv3
// Copyright (c) 2024 New Frontiers Contributors
// See AGPLv3.txt for details.
using Content.Server._NF.Station.Components;
using Content.Server.Shuttles.Components;
using Content.Shared._NF.Shuttles.Events;
using Content.Shared._NF.Shipyard.Components;
using Content.Shared.Shuttles.Components;
using Robust.Shared.Physics.Components;
namespace Content.Server.Shuttles.Systems;
public sealed partial class ShuttleSystem
{
[Dependency] private readonly RadarConsoleSystem _radarConsole = default!;
private const float SpaceFrictionStrength = 0.0075f;
private const float DampenDampingStrength = 0.25f;
private const float AnchorDampingStrength = 2.5f;
private void NfInitialize()
{
SubscribeLocalEvent<ShuttleConsoleComponent, SetInertiaDampeningRequest>(OnSetInertiaDampening);
SubscribeLocalEvent<ShuttleConsoleComponent, SetServiceFlagsRequest>(NfSetServiceFlags);
SubscribeLocalEvent<ShuttleConsoleComponent, SetTargetCoordinatesRequest>(NfSetTargetCoordinates);
SubscribeLocalEvent<ShuttleConsoleComponent, SetHideTargetRequest>(NfSetHideTarget);
}
private bool SetInertiaDampening(EntityUid uid, PhysicsComponent physicsComponent, ShuttleComponent shuttleComponent, TransformComponent transform, InertiaDampeningMode mode)
{
if (!transform.GridUid.HasValue)
{
return false;
}
if (mode == InertiaDampeningMode.Query)
{
_console.RefreshShuttleConsoles(transform.GridUid.Value);
return false;
}
if (!EntityManager.HasComponent<ShuttleDeedComponent>(transform.GridUid) ||
EntityManager.HasComponent<StationDampeningComponent>(_station.GetOwningStation(transform.GridUid)))
{
return false;
}
shuttleComponent.BodyModifier = mode switch
{
InertiaDampeningMode.Off => SpaceFrictionStrength,
InertiaDampeningMode.Dampen => DampenDampingStrength,
InertiaDampeningMode.Anchor => AnchorDampingStrength,
_ => DampenDampingStrength, // other values: default to some sane behaviour (assume normal dampening)
};
if (shuttleComponent.DampingModifier != 0)
shuttleComponent.DampingModifier = shuttleComponent.BodyModifier;
_console.RefreshShuttleConsoles(transform.GridUid.Value);
return true;
}
private void OnSetInertiaDampening(EntityUid uid, ShuttleConsoleComponent component, SetInertiaDampeningRequest args)
{
// Ensure that the entity requested is a valid shuttle (stations should not be togglable)
if (!EntityManager.TryGetComponent(uid, out TransformComponent? transform) ||
!transform.GridUid.HasValue ||
!EntityManager.TryGetComponent(transform.GridUid, out PhysicsComponent? physicsComponent) ||
!EntityManager.TryGetComponent(transform.GridUid, out ShuttleComponent? shuttleComponent))
{
return;
}
if (SetInertiaDampening(uid, physicsComponent, shuttleComponent, transform, args.Mode) && args.Mode != InertiaDampeningMode.Query)
component.DampeningMode = args.Mode;
}
public InertiaDampeningMode NfGetInertiaDampeningMode(EntityUid entity)
{
if (!EntityManager.TryGetComponent<TransformComponent>(entity, out var xform))
return InertiaDampeningMode.Dampen;
// Not a shuttle, shouldn't be togglable
if (!EntityManager.HasComponent<ShuttleDeedComponent>(xform.GridUid) ||
EntityManager.HasComponent<StationDampeningComponent>(_station.GetOwningStation(xform.GridUid)))
return InertiaDampeningMode.Station;
if (!EntityManager.TryGetComponent(xform.GridUid, out ShuttleComponent? shuttle))
return InertiaDampeningMode.Dampen;
if (shuttle.BodyModifier >= AnchorDampingStrength)
return InertiaDampeningMode.Anchor;
else if (shuttle.BodyModifier <= SpaceFrictionStrength)
return InertiaDampeningMode.Off;
else
return InertiaDampeningMode.Dampen;
}
public void NfSetPowered(EntityUid uid, ShuttleConsoleComponent component, bool powered)
{
// Ensure that the entity requested is a valid shuttle (stations should not be togglable)
if (!EntityManager.TryGetComponent(uid, out TransformComponent? transform) ||
!transform.GridUid.HasValue ||
!EntityManager.TryGetComponent(transform.GridUid, out PhysicsComponent? physicsComponent) ||
!EntityManager.TryGetComponent(transform.GridUid, out ShuttleComponent? shuttleComponent))
{
return;
}
// Update dampening physics without adjusting requested mode.
if (!powered)
{
SetInertiaDampening(uid, physicsComponent, shuttleComponent, transform, InertiaDampeningMode.Anchor);
}
else
{
// Update our dampening mode if we need to, and if we aren't a station.
var currentDampening = NfGetInertiaDampeningMode(uid);
if (currentDampening != component.DampeningMode &&
currentDampening != InertiaDampeningMode.Station &&
component.DampeningMode != InertiaDampeningMode.Station)
{
SetInertiaDampening(uid, physicsComponent, shuttleComponent, transform, component.DampeningMode);
}
}
}
/// <summary>
/// Get the current service flags for this grid.
/// </summary>
public ServiceFlags NfGetServiceFlags(EntityUid uid)
{
var transform = Transform(uid);
// Get the grid entity from the console transform
if (!transform.GridUid.HasValue)
return ServiceFlags.None;
var gridUid = transform.GridUid.Value;
// Set the service flags on the IFFComponent.
if (!EntityManager.TryGetComponent<IFFComponent>(gridUid, out var iffComponent))
return ServiceFlags.None;
return iffComponent.ServiceFlags;
}
/// <summary>
/// Set the service flags for this grid.
/// </summary>
public void NfSetServiceFlags(EntityUid uid, ShuttleConsoleComponent component, SetServiceFlagsRequest args)
{
var transform = Transform(uid);
// Get the grid entity from the console transform
if (!transform.GridUid.HasValue)
return;
var gridUid = transform.GridUid.Value;
// Set the service flags on the IFFComponent.
if (!EntityManager.TryGetComponent<IFFComponent>(gridUid, out var iffComponent))
return;
iffComponent.ServiceFlags = args.ServiceFlags;
_console.RefreshShuttleConsoles(gridUid);
Dirty(gridUid, iffComponent);
}
public void NfSetTargetCoordinates(EntityUid uid, ShuttleConsoleComponent component, SetTargetCoordinatesRequest args)
{
if (!TryComp<RadarConsoleComponent>(uid, out var radarConsole))
return;
var transform = Transform(uid);
// Get the grid entity from the console transform
if (!transform.GridUid.HasValue)
return;
var gridUid = transform.GridUid.Value;
_radarConsole.SetTarget((uid, radarConsole), args.TrackedEntity, args.TrackedPosition);
_radarConsole.SetHideTarget((uid, radarConsole), false); // Force target visibility
_console.RefreshShuttleConsoles(gridUid);
}
public void NfSetHideTarget(EntityUid uid, ShuttleConsoleComponent component, SetHideTargetRequest args)
{
if (!TryComp<RadarConsoleComponent>(uid, out var radarConsole))
return;
var transform = Transform(uid);
// Get the grid entity from the console transform
if (!transform.GridUid.HasValue)
return;
var gridUid = transform.GridUid.Value;
_radarConsole.SetHideTarget((uid, radarConsole), args.Hidden);
_console.RefreshShuttleConsoles(gridUid);
}
}