Suit sensors, but in space? Perish the thought. (#6054)
This commit is contained in:
parent
d7543bd24a
commit
6cdeb3d9cf
|
|
@ -1,13 +1,16 @@
|
|||
<controls:FancyWindow xmlns="https://spacestation14.io"
|
||||
xmlns:ui="clr-namespace:Content.Client.Medical.CrewMonitoring"
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
||||
xmlns:crewMonitoring="clr-namespace:Content.Client._DV.CrewMonitoring"
|
||||
Title="{Loc crew-monitoring-ui-title}"
|
||||
Resizable="False"
|
||||
SetSize="1210 700"
|
||||
MinSize="1210 700">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True" HorizontalExpand="True">
|
||||
<ui:CrewMonitoringNavMapControl Name="NavMap" HorizontalExpand="True" VerticalExpand="True" Margin="5 20"/>
|
||||
<ui:CrewMonitoringNavMapControl Name="NavMap" HorizontalExpand="True" VerticalExpand="True" Margin="5 20" Visible="False" />
|
||||
<crewMonitoring:CrewMonitoringShuttleControl Name="ShuttleMap" HorizontalExpand="True" VerticalExpand="True" Margin="5 20" Visible="False" />
|
||||
|
||||
<BoxContainer Orientation="Vertical" Margin="0 0 10 0">
|
||||
<controls:StripeBack>
|
||||
<PanelContainer>
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ using Content.Client.Pinpointer.UI;
|
|||
using Content.Client.Stylesheets;
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared.Medical.SuitSensor;
|
||||
using Content.Shared.Station; // DeltaV - crew monitoring radar
|
||||
using Content.Shared.StatusIcon;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.GameObjects;
|
||||
|
|
@ -27,6 +28,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
|
|||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
private readonly SharedTransformSystem _transformSystem;
|
||||
private readonly SpriteSystem _spriteSystem;
|
||||
private readonly SharedStationSystem _station; // DeltaV - crew monitoring radar
|
||||
|
||||
private NetEntity? _trackedEntity;
|
||||
private bool _tryToScrollToListFocus;
|
||||
|
|
@ -39,8 +41,10 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
|
|||
|
||||
_transformSystem = _entManager.System<SharedTransformSystem>();
|
||||
_spriteSystem = _entManager.System<SpriteSystem>();
|
||||
_station = _entManager.System<SharedStationSystem>(); // DeltaV - crew monitoring radar
|
||||
|
||||
NavMap.TrackedEntitySelectedAction += SetTrackedEntityFromNavMap;
|
||||
ShuttleMap.NavMap = NavMap; // DeltaV - crew monitoring radar
|
||||
}
|
||||
|
||||
public void Set(string stationName, EntityUid? mapUid)
|
||||
|
|
@ -50,8 +54,10 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
|
|||
if (_entManager.TryGetComponent<TransformComponent>(mapUid, out var xform))
|
||||
NavMap.MapUid = xform.GridUid;
|
||||
|
||||
else
|
||||
NavMap.Visible = false;
|
||||
// Begin DeltaV - handle navmap visibility based on current position
|
||||
// else
|
||||
// NavMap.Visible = false;
|
||||
// End DeltaV - handle navmap visibility based on current position
|
||||
|
||||
StationName.AddStyleClass("LabelBig");
|
||||
StationName.Text = stationName;
|
||||
|
|
@ -62,6 +68,19 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
|
|||
{
|
||||
base.FrameUpdate(args);
|
||||
|
||||
// Begin DeltaV - handle navmap visibility based on current position
|
||||
if (_station.GetOwningStation(ShuttleMap.Owner) is not null)
|
||||
{
|
||||
NavMap.Visible = true;
|
||||
ShuttleMap.Visible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
NavMap.Visible = false;
|
||||
ShuttleMap.Visible = true;
|
||||
}
|
||||
// End DeltaV - handle navmap visibility based on current position
|
||||
|
||||
if (_tryToScrollToListFocus)
|
||||
TryToScrollToFocus();
|
||||
}
|
||||
|
|
@ -69,6 +88,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
|
|||
public void ShowSensors(List<SuitSensorStatus> sensors, EntityUid monitor, EntityCoordinates? monitorCoords)
|
||||
{
|
||||
ClearOutDatedData();
|
||||
ShuttleMap.Owner = monitor; // DeltaV - crew monitoring radar
|
||||
|
||||
// No server label
|
||||
if (sensors.Count == 0)
|
||||
|
|
@ -304,7 +324,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
|
|||
jobContainer.AddChild(jobLabel);
|
||||
|
||||
// Add user coordinates to the navmap
|
||||
if (coordinates != null && NavMap.Visible && _blipTexture != null)
|
||||
if (coordinates != null && _blipTexture != null) // DeltaV - don't filter the navmap visibility
|
||||
{
|
||||
NavMap.TrackedEntities.TryAdd(sensor.SuitSensorUid,
|
||||
new NavMapBlip
|
||||
|
|
|
|||
|
|
@ -56,8 +56,8 @@ public partial class NavMapControl : MapGridControl
|
|||
|
||||
// Constants
|
||||
protected float UpdateTime = 1.0f;
|
||||
protected float MaxSelectableDistance = 10f;
|
||||
protected float MinDragDistance = 5f;
|
||||
public float MaxSelectableDistance = 10f; // DeltaV - accessible to CrewMonitoringShuttleControl
|
||||
public float MinDragDistance = 5f; // DeltaV - accessible to CrewMonitoringShuttleControl
|
||||
protected static float MinDisplayedRange = 8f;
|
||||
protected static float MaxDisplayedRange = 128f;
|
||||
protected static float DefaultDisplayedRange = 48f;
|
||||
|
|
@ -193,6 +193,13 @@ public partial class NavMapControl : MapGridControl
|
|||
_recenter.Disabled = false;
|
||||
}
|
||||
|
||||
// Begin DeltaV - we need access to that from outside
|
||||
public void TrackEntity(NetEntity? entity)
|
||||
{
|
||||
TrackedEntitySelectedAction?.Invoke(entity);
|
||||
}
|
||||
// End DeltaV - we need access to that from outside
|
||||
|
||||
protected override void KeyBindUp(GUIBoundKeyEventArgs args)
|
||||
{
|
||||
base.KeyBindUp(args);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,180 @@
|
|||
using System.Numerics;
|
||||
using Content.Client.Pinpointer.UI;
|
||||
using Content.Client.Shuttles.UI;
|
||||
using Content.Shared.Shuttles.Components;
|
||||
using Content.Shared.Shuttles.Systems;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Input;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Physics.Components;
|
||||
|
||||
namespace Content.Client._DV.CrewMonitoring;
|
||||
|
||||
public sealed class CrewMonitoringShuttleControl : BaseShuttleControl
|
||||
{
|
||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||
private readonly SharedShuttleSystem _shuttles;
|
||||
private readonly SharedTransformSystem _transform;
|
||||
|
||||
public EntityUid? Owner;
|
||||
public NavMapControl? NavMap;
|
||||
|
||||
private List<Entity<MapGridComponent>> _grids = new();
|
||||
|
||||
public CrewMonitoringShuttleControl() : base(64f, 256f, 256f)
|
||||
{
|
||||
_shuttles = EntManager.System<SharedShuttleSystem>();
|
||||
_transform = EntManager.System<SharedTransformSystem>();
|
||||
}
|
||||
|
||||
protected override void Draw(DrawingHandleScreen handle)
|
||||
{
|
||||
base.Draw(handle);
|
||||
|
||||
DrawBacking(handle);
|
||||
DrawCircles(handle);
|
||||
|
||||
if (Owner is not { } owner || NavMap is not { } navMap)
|
||||
return;
|
||||
|
||||
var xformQuery = EntManager.GetEntityQuery<TransformComponent>();
|
||||
var fixturesQuery = EntManager.GetEntityQuery<FixturesComponent>();
|
||||
var bodyQuery = EntManager.GetEntityQuery<PhysicsComponent>();
|
||||
var iffQuery = EntManager.GetEntityQuery<IFFComponent>();
|
||||
|
||||
if (!xformQuery.TryGetComponent(owner, out var xform)
|
||||
|| xform.MapID == MapId.Nullspace)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var coordinates = new EntityCoordinates(owner, Vector2.Zero);
|
||||
|
||||
var mapPos = _transform.ToMapCoordinates(coordinates);
|
||||
var ourEntRot = Angle.Zero;
|
||||
var ourEntMatrix = Matrix3Helpers.CreateTransform(_transform.GetWorldPosition(xform), ourEntRot);
|
||||
Matrix3x2.Invert(ourEntMatrix, out var worldToShuttle);
|
||||
var shuttleToView = Matrix3x2.CreateScale(new Vector2(MinimapScale, -MinimapScale)) * Matrix3x2.CreateTranslation(MidPointVector);
|
||||
var worldToView = worldToShuttle * shuttleToView;
|
||||
|
||||
var viewBounds = new Box2Rotated(new Box2(-WorldRange, -WorldRange, WorldRange, WorldRange).Translated(mapPos.Position), ourEntRot, mapPos.Position);
|
||||
var viewAABB = viewBounds.CalcBoundingBox();
|
||||
|
||||
_grids.Clear();
|
||||
_mapManager.FindGridsIntersecting(xform.MapID, new Box2(mapPos.Position - MaxRadarRangeVector, mapPos.Position + MaxRadarRangeVector), ref _grids, approx: true, includeMap: false);
|
||||
|
||||
foreach (var grid in _grids)
|
||||
{
|
||||
if (!fixturesQuery.HasComponent(grid))
|
||||
continue;
|
||||
|
||||
var body = bodyQuery.GetComponent(grid);
|
||||
iffQuery.TryComp(grid, out var iff);
|
||||
|
||||
if (!_shuttles.CanDraw(grid, body, iff))
|
||||
continue;
|
||||
|
||||
var curGridToWorld = _transform.GetWorldMatrix(grid);
|
||||
var curGridToView = curGridToWorld * worldToShuttle * shuttleToView;
|
||||
|
||||
var gridAABB = curGridToWorld.TransformBox(grid.Comp.LocalAABB);
|
||||
if (!gridAABB.Intersects(viewAABB))
|
||||
continue;
|
||||
|
||||
var labelColor = _shuttles.GetIFFColor(grid, self: false, iff);
|
||||
DrawGrid(handle, curGridToView, grid, labelColor);
|
||||
}
|
||||
|
||||
var curTime = Timing.RealTime;
|
||||
var blinkFrequency = 1f / 1f;
|
||||
var lit = curTime.TotalSeconds % blinkFrequency > blinkFrequency / 2f;
|
||||
var box = SizeBox;
|
||||
|
||||
foreach (var (coord, value) in navMap.TrackedCoordinates)
|
||||
{
|
||||
if (!lit || !value.Visible)
|
||||
continue;
|
||||
|
||||
var blipPos = _transform.ToMapCoordinates(coord);
|
||||
|
||||
if (mapPos.MapId == MapId.Nullspace)
|
||||
continue;
|
||||
|
||||
handle.DrawCircle(Vector2.Clamp(Vector2.Transform(blipPos.Position, worldToView), box.TopLeft, box.BottomRight), float.Sqrt(MinimapScale) * 2f, value.Color);
|
||||
}
|
||||
|
||||
foreach (var blip in navMap.TrackedEntities.Values)
|
||||
{
|
||||
if (blip.Blinks && !lit)
|
||||
continue;
|
||||
|
||||
var blipPos = _transform.ToMapCoordinates(blip.Coordinates);
|
||||
|
||||
if (mapPos.MapId == MapId.Nullspace)
|
||||
continue;
|
||||
|
||||
handle.DrawCircle(Vector2.Clamp(Vector2.Transform(blipPos.Position, worldToView), box.TopLeft, box.BottomRight), float.Sqrt(MinimapScale) * 2f, blip.Color);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void KeyBindUp(GUIBoundKeyEventArgs args)
|
||||
{
|
||||
base.KeyBindUp(args);
|
||||
|
||||
if (Owner is not { } owner || NavMap is null)
|
||||
return;
|
||||
|
||||
if (!EntManager.TryGetComponent<TransformComponent>(owner, out var xform) || xform.MapID == MapId.Nullspace)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var ourEntRot = Angle.Zero;
|
||||
var ourEntMatrix = Matrix3Helpers.CreateTransform(_transform.GetWorldPosition(xform), ourEntRot);
|
||||
Matrix3x2.Invert(ourEntMatrix, out var worldToShuttle);
|
||||
var shuttleToView = Matrix3x2.CreateScale(new Vector2(MinimapScale, -MinimapScale)) * Matrix3x2.CreateTranslation(MidPointVector);
|
||||
var worldToView = worldToShuttle * shuttleToView;
|
||||
Matrix3x2.Invert(worldToView, out var viewToWorld);
|
||||
|
||||
if (args.Function == EngineKeyFunctions.UIClick)
|
||||
{
|
||||
if (NavMap.TrackedEntities.Count == 0)
|
||||
return;
|
||||
|
||||
if ((StartDragPosition - args.PointerLocation.Position).Length() > NavMap.MinDragDistance)
|
||||
return;
|
||||
|
||||
var localPosition = args.PointerLocation.Position - GlobalPixelPosition;
|
||||
var worldPosition = Vector2.Transform(localPosition, viewToWorld);
|
||||
|
||||
var closestEntity = NetEntity.Invalid;
|
||||
var closestDistance = float.PositiveInfinity;
|
||||
|
||||
foreach (var (currentEntity, blip) in NavMap.TrackedEntities)
|
||||
{
|
||||
if (!blip.Selectable)
|
||||
continue;
|
||||
|
||||
var currentDistance = (_transform.ToMapCoordinates(blip.Coordinates).Position - worldPosition).Length();
|
||||
|
||||
if (closestDistance < currentDistance || currentDistance * MinimapScale > NavMap.MaxSelectableDistance)
|
||||
continue;
|
||||
|
||||
closestEntity = currentEntity;
|
||||
closestDistance = currentDistance;
|
||||
}
|
||||
|
||||
if (closestDistance > NavMap.MaxSelectableDistance || !closestEntity.IsValid())
|
||||
return;
|
||||
|
||||
NavMap.TrackEntity(closestEntity);
|
||||
}
|
||||
else if (args.Function == EngineKeyFunctions.UIRightClick)
|
||||
{
|
||||
NavMap.TrackEntity(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -68,6 +68,11 @@ public abstract class SharedSuitSensorSystem : EntitySystem
|
|||
/// <returns>True if the sensor is assigned to a station or assigning it was successful. False otherwise.</returns>
|
||||
public bool CheckSensorAssignedStation(Entity<SuitSensorComponent> sensor)
|
||||
{
|
||||
// Begin DeltaV - fallback
|
||||
if (sensor.Comp.StationId.HasValue && _stationSystem.GetOwningStation(sensor.Owner) is null)
|
||||
return true;
|
||||
// End DeltaV - fallback
|
||||
|
||||
if (!sensor.Comp.StationId.HasValue && Transform(sensor.Owner).GridUid == null)
|
||||
return false;
|
||||
|
||||
|
|
@ -348,7 +353,7 @@ public abstract class SharedSuitSensorSystem : EntitySystem
|
|||
var transform = ent.Comp2;
|
||||
|
||||
// check if sensor is enabled and worn by user
|
||||
if (sensor.Mode == SuitSensorMode.SensorOff || sensor.User == null || !HasComp<MobStateComponent>(sensor.User) || transform.GridUid == null)
|
||||
if (sensor.Mode == SuitSensorMode.SensorOff || sensor.User == null || !HasComp<MobStateComponent>(sensor.User)) // DeltaV - don't block on grids here
|
||||
return null;
|
||||
|
||||
// try to get mobs id from ID slot
|
||||
|
|
|
|||
|
|
@ -58,8 +58,8 @@
|
|||
transmitFrequencyId: SuitSensor
|
||||
savableAddress: false
|
||||
- type: WirelessNetworkConnection
|
||||
range: 1200
|
||||
- type: StationLimitedNetwork
|
||||
range: 3600 # DeltaV - was 1200
|
||||
# - type: StationLimitedNetwork # DeltaV - this stinks and we don't want it to be limited
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
receiveFrequencyId: NTNet # DeltaV - NTNet
|
||||
- type: WirelessNetworkConnection
|
||||
range: 500
|
||||
- type: StationLimitedNetwork
|
||||
# - type: StationLimitedNetwork # DeltaV - don't restrict this unnecessarily
|
||||
- type: ReverseEngineering # Nyano
|
||||
difficulty: 2
|
||||
recipes:
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
autoConnect: false
|
||||
- type: WirelessNetworkConnection
|
||||
range: 10000 # Delta-V Maximises the range for the Crew Monitor Server to make it work for Listening Post
|
||||
- type: StationLimitedNetwork
|
||||
# - type: StationLimitedNetwork # DeltaV - make this work for salvies
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 200
|
||||
- type: ExtensionCableReceiver
|
||||
|
|
|
|||
|
|
@ -61,5 +61,3 @@
|
|||
- id: ShelterCapsuleBar
|
||||
cost: 10000
|
||||
# TODO: mining drone stuff
|
||||
- id: MedicalTrackingImplanter
|
||||
cost: 10000
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@
|
|||
content:
|
||||
- ClothingBeltSalvageWebbing
|
||||
- ShelterCapsule
|
||||
- MedicalTrackingImplanter
|
||||
- NFWeaponHoloflareGun
|
||||
|
||||
# TODO: mining drone
|
||||
|
|
|
|||
|
|
@ -22,14 +22,6 @@
|
|||
- type: Implanter
|
||||
implant: WatchdogImplant
|
||||
|
||||
- type: entity
|
||||
parent: BaseImplantOnlyImplanter
|
||||
id: MedicalTrackingImplanter
|
||||
name: medical tracking implanter
|
||||
components:
|
||||
- type: Implanter
|
||||
implant: MedicalTrackingImplant
|
||||
|
||||
- type: entity
|
||||
parent: BaseImplantOnlyImplanterCentcomm
|
||||
id: CentCommImplanter
|
||||
|
|
|
|||
|
|
@ -41,21 +41,6 @@
|
|||
targetUser: true
|
||||
radioChannel: Security
|
||||
|
||||
- type: entity
|
||||
parent: BaseSubdermalImplant
|
||||
id: MedicalTrackingImplant
|
||||
categories: [ HideSpawnMenu ]
|
||||
name: medical tracking implant
|
||||
description: This implants transmits a message on the medical channel in case the user goes into critical state or dies.
|
||||
components:
|
||||
- type: TriggerOnMobstateChange
|
||||
mobState:
|
||||
- Critical
|
||||
- Dead
|
||||
- type: RattleOnTrigger
|
||||
targetUser: true
|
||||
radioChannel: Medical
|
||||
|
||||
- type: entity
|
||||
parent: BaseSubdermalImplant
|
||||
id: CentCommImplant
|
||||
|
|
|
|||
Loading…
Reference in New Issue