diff --git a/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.Debug.cs b/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.Debug.cs new file mode 100644 index 00000000000..44b1c31715c --- /dev/null +++ b/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.Debug.cs @@ -0,0 +1,78 @@ +using Content.Server.Administration.Managers; +using Content.Shared._Scp.ComplexElevator; +using Content.Shared.Database; +using Content.Shared.Verbs; +using Robust.Server.GameObjects; +using Robust.Shared.Player; + +namespace Content.Server._Scp.ComplexElevator; + +public sealed partial class ComplexElevatorSystem +{ + [Dependency] private readonly IAdminManager _adminManager = default!; + + private void InitializeDebug() + { + SubscribeLocalEvent>(AddAdminElevatorVerbs); + SubscribeLocalEvent>(AddAdminPointVerbs); + } + + private void AddAdminElevatorVerbs(EntityUid uid, ComplexElevatorComponent comp, GetVerbsEvent args) + { + if (!TryComp(args.User, out ActorComponent? actor) || !_adminManager.IsAdmin(actor.PlayerSession)) + return; + + foreach (var floor in comp.Floors) + { + var targetFloor = floor; + args.Verbs.Add(new Verb + { + Text = $"Send to: {targetFloor}", + Category = VerbCategory.Debug, + Act = () => MoveToFloor((uid, comp), targetFloor), + Impact = LogImpact.Medium + }); + } + } + + private void AddAdminPointVerbs(EntityUid uid, ElevatorPointComponent comp, GetVerbsEvent args) + { + if (!TryComp(args.User, out ActorComponent? actor) || !_adminManager.IsAdmin(actor.PlayerSession)) + return; + + foreach (var (elevatorUid, elevatorComp) in _elevatorIndex) + { + if (!TryComp(elevatorComp, out var elevator)) + continue; + + if (!elevator.Floors.Contains(comp.FloorId)) + continue; + + var elUid = elevatorComp; + var floorId = comp.FloorId; + + args.Verbs.Add(new Verb + { + Text = $"[Elevator: {elevator.ElevatorId}] Send here", + Category = VerbCategory.Debug, + Act = () => MoveToFloor((elUid, elevator), floorId), + Impact = LogImpact.Medium + }); + + args.Verbs.Add(new Verb + { + Text = $"[Elevator: {elevator.ElevatorId}] Teleport here instantly", + Category = VerbCategory.Debug, + Act = () => + { + ClearGasInTargetArea(elUid, floorId); + KillEntitiesInTargetArea((elUid, elevator), floorId); + elevator.CurrentFloor = floorId; + Dirty(elUid, elevator); + TeleportToFloor(elUid, floorId, elevator); + }, + Impact = LogImpact.High + }); + } + } +} diff --git a/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs b/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs index 5d42b2e7f4c..a2512a30dfa 100644 --- a/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs +++ b/Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs @@ -1,146 +1,324 @@ using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Numerics; -using Content.Shared.Timing; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Doors.Systems; +using Content.Shared._Scp.ComplexElevator; +using Robust.Shared.GameObjects; +using ElevatorButtonComponent = Content.Shared._Scp.ComplexElevator.ElevatorButtonComponent; +using ElevatorPointComponent = Content.Shared._Scp.ComplexElevator.ElevatorPointComponent; +using ElevatorDoorComponent = Content.Shared._Scp.ComplexElevator.ElevatorDoorComponent; +using Content.Shared.Buckle.Components; using Content.Shared.Damage; using Content.Shared.Damage.Systems; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; -using Robust.Shared.Physics.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Timing; using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Map; -using Robust.Shared.Maths; +using Robust.Shared.Map.Components; +using Robust.Shared.Physics.Components; using Robust.Shared.Timing; -using Content.Server.Doors.Systems; namespace Content.Server._Scp.ComplexElevator; -public sealed class ComplexElevatorSystem : EntitySystem +public sealed partial class ComplexElevatorSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly DoorSystem _doorSystem = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly PointLightSystem _pointLight = default!; - + [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly AtmosphereSystem _atmos = default!; + [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly IComponentFactory _componentFactory = default!; private static readonly Color ElevatorButtonGreen = Color.FromHex("#00FF00"); private static readonly Color ElevatorButtonYellow = Color.FromHex("#FFFF00"); private static readonly Color ElevatorButtonRed = Color.FromHex("#FF0000"); + private readonly Dictionary _elevatorIndex = new(); + private readonly Dictionary _pointIndex = new(); + public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnElevatorStartup); + SubscribeLocalEvent(OnElevatorShutdown); + SubscribeLocalEvent(OnPointStartup); + SubscribeLocalEvent(OnPointShutdown); + SubscribeLocalEvent(OnButtonInteract); SubscribeLocalEvent(OnButtonActivate); + + InitializeDebug(); } - private TimeSpan GetButtonUseDelay(Entity elevator, ElevatorButtonComponent button) + private void OnElevatorStartup(EntityUid uid, ComplexElevatorComponent comp, ComponentStartup args) { - return elevator.Comp.SendDelay + elevator.Comp.IntermediateDelay + TimeSpan.FromSeconds(1); + if (!string.IsNullOrEmpty(comp.ElevatorId)) + _elevatorIndex[comp.ElevatorId] = uid; } - private void SetButtonDelay(EntityUid button, Entity elevator) + private void OnElevatorShutdown(EntityUid uid, ComplexElevatorComponent comp, ComponentShutdown args) { - if (TryComp(button, out var useDelay)) - { - _useDelay.SetLength((button, useDelay), GetButtonUseDelay(elevator, Comp(button))); - } + if (!string.IsNullOrEmpty(comp.ElevatorId) && _elevatorIndex.TryGetValue(comp.ElevatorId, out var existing) && existing == uid) + _elevatorIndex.Remove(comp.ElevatorId); } - private void StartMovement(Entity ent, string targetFloor) + private void OnPointStartup(EntityUid uid, ElevatorPointComponent comp, ComponentStartup args) { - KillEntitiesInTargetArea(ent, ent.Comp.IntermediateFloorId); - ent.Comp.CurrentFloor = ent.Comp.IntermediateFloorId; - TeleportToFloor(ent, ent.Comp.IntermediateFloorId); + if (!string.IsNullOrEmpty(comp.FloorId)) + _pointIndex[comp.FloorId] = uid; + } - _audio.PlayPvs(ent.Comp.TravelSound, ent); - Timer.Spawn(ent.Comp.IntermediateDelay, () => + private void OnPointShutdown(EntityUid uid, ElevatorPointComponent comp, ComponentShutdown args) + { + if (!string.IsNullOrEmpty(comp.FloorId) && _pointIndex.TryGetValue(comp.FloorId, out var existing) && existing == uid) + _pointIndex.Remove(comp.FloorId); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + var toRemove = new List(); + + while (query.MoveNext(out var uid, out var moving, out var elevator)) { - if (!Exists(ent)) - return; + if (moving.MovementStartTime == null) + { + moving.MovementStartTime = _timing.CurTime; + continue; + } - KillEntitiesInTargetArea(ent, targetFloor); - ent.Comp.CurrentFloor = targetFloor; - TeleportToFloor(ent, targetFloor); - OpenDoorsForFloor(ent.Comp.ElevatorId, targetFloor); + var elapsed = _timing.CurTime - moving.MovementStartTime.Value; - _audio.PlayPvs(ent.Comp.ArrivalSound, ent); + if (moving.Phase == ElevatorMovementPhase.DoorClosing) + { + if (elapsed >= elevator.DoorCloseDelay) + { + if (!CanCloseDoorsForFloor(elevator.ElevatorId, elevator.CurrentFloor)) + { + toRemove.Add(uid); + continue; + } + + TryCloseDoorsForFloor(elevator.ElevatorId, elevator.CurrentFloor); + + moving.Phase = ElevatorMovementPhase.WaitingForSend; + moving.MovementStartTime = _timing.CurTime; + } + } + else if (moving.Phase == ElevatorMovementPhase.WaitingForSend) + { + if (elapsed >= elevator.SendDelay) + { + if (elevator.UseIntermediateFloor) + { + var toTeleport = CollectEntitiesOnElevator(uid); + var exempt = new HashSet(toTeleport.Select(t => t.Item1)); + + ClearGasInTargetArea(uid, elevator.IntermediateFloorId); + KillEntitiesInTargetArea((uid, elevator), elevator.IntermediateFloorId, exempt); + + if (TeleportToFloor(uid, elevator.IntermediateFloorId, elevator, toTeleport)) + { + elevator.CurrentFloor = elevator.IntermediateFloorId; + Dirty(uid, elevator); + + _audio.PlayPvs(elevator.TravelSound, uid); + + moving.Phase = ElevatorMovementPhase.Travelling; + moving.MovementStartTime = _timing.CurTime; + } + } + else + { + var toTeleport = CollectEntitiesOnElevator(uid); + var exempt = new HashSet(toTeleport.Select(t => t.Item1)); + + ClearGasInTargetArea(uid, moving.TargetFloor); + KillEntitiesInTargetArea((uid, elevator), moving.TargetFloor, exempt); + + if (TeleportToFloor(uid, moving.TargetFloor, elevator, toTeleport)) + { + elevator.CurrentFloor = moving.TargetFloor; + Dirty(uid, elevator); + + OpenDoorsForFloor(elevator.ElevatorId, moving.TargetFloor); + _audio.PlayPvs(elevator.ArrivalSound, uid); + + toRemove.Add(uid); + } + } + } + } + else if (moving.Phase == ElevatorMovementPhase.Travelling) + { + if (elapsed >= elevator.IntermediateDelay) + { + var toTeleport = CollectEntitiesOnElevator(uid); + var exempt = new HashSet(toTeleport.Select(t => t.Item1)); - ent.Comp.IsMoving = false; - UpdateButtonLights(ent); - }); + ClearGasInTargetArea(uid, moving.TargetFloor); + KillEntitiesInTargetArea((uid, elevator), moving.TargetFloor, exempt); + + if (TeleportToFloor(uid, moving.TargetFloor, elevator, toTeleport)) + { + elevator.CurrentFloor = moving.TargetFloor; + Dirty(uid, elevator); + + OpenDoorsForFloor(elevator.ElevatorId, moving.TargetFloor); + _audio.PlayPvs(elevator.ArrivalSound, uid); + + toRemove.Add(uid); + } + } + } + + foreach (var movingUid in toRemove) + { + RemComp(movingUid); + if (TryComp(movingUid, out var movingElevator)) + { + UpdateButtonLights((movingUid, movingElevator)); + } + } + } } - private void TeleportToFloor(EntityUid uid, string floorId) + private TimeSpan GetButtonUseDelay(Entity elevator, ElevatorButtonComponent button) + { + return elevator.Comp.DoorCloseDelay + elevator.Comp.SendDelay + elevator.Comp.IntermediateDelay + TimeSpan.FromSeconds(1); + } + + private void SetButtonDelay(EntityUid button, Entity elevator) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var pointUid, out var pointComp)) + if (TryComp(button, out var useDelay)) { - if (pointComp.FloorId != floorId) - continue; + _useDelay.SetLength((button, useDelay), GetButtonUseDelay(elevator, Comp(button))); + } + } + + private bool TeleportToFloor(EntityUid uid, string floorId, ComplexElevatorComponent elevatorComp, List<(EntityUid, Vector2)>? precomputed = null) + { + if (!TryFindPoint(floorId, out var point)) + { + Log.Warning($"Could not find ElevatorPoint for floor {floorId} for elevator {elevatorComp.ElevatorId}"); + return false; + } + + var pointTransform = Transform(point.Value.Owner); + var elevatorTransform = Transform(uid); - var pointTransform = Transform(pointUid); - var elevatorTransform = Transform(uid); + var entitiesToTeleport = precomputed ?? new List<(EntityUid, Vector2)>(); + if (precomputed == null) + { var aabb = _lookup.GetWorldAABB(uid, elevatorTransform); - var intersectingEntities = _lookup.GetEntitiesIntersecting(elevatorTransform.MapID, aabb, LookupFlags.Dynamic | LookupFlags.Sensors); + var intersectingEntities = _lookup.GetEntitiesIntersecting(elevatorTransform.MapID, aabb, LookupFlags.Static | LookupFlags.Dynamic | LookupFlags.Sundries); - var entitiesToTeleport = new List<(EntityUid, Vector2)>(); foreach (var entUid in intersectingEntities) { - if (entUid == uid || HasComp(entUid)) + if (entUid == uid || IsBlacklisted(entUid)) + continue; + + if (TryComp(entUid, out var buckle) && buckle.Buckled) continue; var entTransform = Transform(entUid); - var relativePos = entTransform.LocalPosition - elevatorTransform.LocalPosition; + var relativePos = _transform.GetWorldPosition(entTransform) - _transform.GetWorldPosition(elevatorTransform); entitiesToTeleport.Add((entUid, relativePos)); + + if (TryComp(entUid, out var pullable) && pullable.BeingPulled) + { + _pulling.TryStopPull(entUid, pullable); + } + if (TryComp(entUid, out var puller) && puller.Pulling != null) + { + if (TryComp(puller.Pulling.Value, out var subjectPulling)) + { + _pulling.TryStopPull(puller.Pulling.Value, subjectPulling); + } + } } + } - _transform.SetCoordinates(uid, pointTransform.Coordinates); + var targetWorldPos = _transform.GetWorldPosition(pointTransform); + var destParent = pointTransform.GridUid ?? pointTransform.MapUid; - var newElevatorTransform = Transform(uid); + if (destParent == null) + return false; - foreach (var (entUid, relativePos) in entitiesToTeleport) - { - var newCoordinates = new EntityCoordinates(newElevatorTransform.ParentUid, newElevatorTransform.LocalPosition + relativePos); - _transform.SetCoordinates(entUid, newCoordinates); - } + foreach (var (entUid, relativePos) in entitiesToTeleport) + { + var entWorldPos = targetWorldPos + relativePos; + var destCoords = new EntityCoordinates(destParent.Value, entWorldPos - _transform.GetWorldPosition(destParent.Value)); + _transform.SetCoordinates(entUid, destCoords); + } + + _transform.SetCoordinates(uid, pointTransform.Coordinates); + return true; + } + + private List<(EntityUid, Vector2)> CollectEntitiesOnElevator(EntityUid uid) + { + var elevatorTransform = Transform(uid); + var aabb = _lookup.GetWorldAABB(uid, elevatorTransform); + var intersecting = _lookup.GetEntitiesIntersecting(elevatorTransform.MapID, aabb, LookupFlags.Static | LookupFlags.Dynamic | LookupFlags.Sundries); - break; + var entities = new List<(EntityUid, Vector2)>(); + foreach (var entUid in intersecting) + { + if (entUid == uid || IsBlacklisted(entUid)) + continue; + + if (TryComp(entUid, out var buckle) && buckle.Buckled) + continue; + + var entTransform = Transform(entUid); + var relativePos = _transform.GetWorldPosition(entTransform) - _transform.GetWorldPosition(elevatorTransform); + entities.Add((entUid, relativePos)); } + + return entities; } private void HandleButtonPress(Entity button, Entity elevator) { - if (elevator.Comp.IsMoving) + if (HasComp(elevator)) return; + + switch (button.Comp.ButtonType) { - switch (button.Comp.ButtonType) - { - case ElevatorButtonType.CallButton: - MoveToFloor(elevator, button.Comp.Floor); - break; - case ElevatorButtonType.SendElevatorUp: - MoveUp(elevator); - break; - case ElevatorButtonType.SendElevatorDown: - MoveDown(elevator); - break; - } - SetButtonDelay(button, elevator); + case ElevatorButtonType.CallButton: + MoveToFloor(elevator, button.Comp.Floor); + break; + case ElevatorButtonType.SendElevatorUp: + MoveUp(elevator); + break; + case ElevatorButtonType.SendElevatorDown: + MoveDown(elevator); + break; } + SetButtonDelay(button, elevator); } private void OnButtonInteract(Entity ent, ref InteractHandEvent args) { if (!TryFindElevator(ent.Comp.ElevatorId, out var elevator)) return; - + HandleButtonPress(ent, elevator.Value); args.Handled = true; } @@ -156,53 +334,42 @@ private void OnButtonActivate(Entity ent, ref ActivateI private bool TryFindElevator(string elevatorId, [NotNullWhen(true)] out Entity? ent) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp)) + if (_elevatorIndex.TryGetValue(elevatorId, out var uid) && TryComp(uid, out var comp)) { - if (comp.ElevatorId == elevatorId) - { - ent = (uid, comp); - return true; - } + ent = (uid, comp); + return true; } + + ent = null; + return false; + } + + private bool TryFindPoint(string floorId, [NotNullWhen(true)] out Entity? ent) + { + if (_pointIndex.TryGetValue(floorId, out var uid) && TryComp(uid, out var comp)) + { + ent = (uid, comp); + return true; + } + ent = null; return false; } public void MoveToFloor(Entity ent, string targetFloor) { - if (ent.Comp.IsMoving || !ent.Comp.Floors.Contains(targetFloor) || ent.Comp.CurrentFloor == targetFloor) + if (HasComp(ent) || !ent.Comp.Floors.Contains(targetFloor) || ent.Comp.CurrentFloor == targetFloor) return; if (!CanCloseDoorsForFloor(ent.Comp.ElevatorId, ent.Comp.CurrentFloor)) return; - ent.Comp.IsMoving = true; - UpdateButtonLights(ent); + var moving = EnsureComp(ent); + moving.TargetFloor = targetFloor; + moving.MovementStartTime = _timing.CurTime; + moving.Phase = ElevatorMovementPhase.DoorClosing; - Timer.Spawn(ent.Comp.SendDelay, () => - { - if (!Exists(ent) || !ent.Comp.IsMoving) - return; - - StartMovement(ent, targetFloor); - }); - - Timer.Spawn(ent.Comp.DoorCloseDelay, () => - { - if (!Exists(ent) || !ent.Comp.IsMoving) - return; - - if (!CanCloseDoorsForFloor(ent.Comp.ElevatorId, ent.Comp.CurrentFloor)) - { - ent.Comp.IsMoving = false; - UpdateButtonLights(ent); - } - else - { - TryCloseDoorsForFloor(ent.Comp.ElevatorId, ent.Comp.CurrentFloor); - } - }); + UpdateButtonLights(ent); } public void MoveUp(Entity ent) @@ -221,7 +388,7 @@ public void MoveDown(Entity ent) private string? GetNextFloor(Entity ent, bool up) { - if (ent.Comp.IsMoving || ent.Comp.Floors.Count == 0) + if (HasComp(ent) || ent.Comp.Floors.Count == 0) return null; var currentIndex = ent.Comp.Floors.IndexOf(ent.Comp.CurrentFloor); @@ -317,34 +484,80 @@ private bool IsDoorBlocked(EntityUid doorUid, float range) return false; } - private void KillEntitiesInTargetArea(Entity elevator, string floorId) + private void ClearGasInTargetArea(EntityUid elevator, string floorId) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var pointUid, out var pointComp)) - { - if (pointComp.FloorId != floorId) - continue; + if (!TryFindPoint(floorId, out var point)) + return; - var pointTransform = Transform(pointUid); + var pointTransform = Transform(point.Value.Owner); + if (pointTransform.GridUid == null) + return; - var aabb = _lookup.GetWorldAABB(elevator.Owner, pointTransform); - var intersectingEntities = _lookup.GetEntitiesIntersecting(pointTransform.MapID, aabb, LookupFlags.Dynamic | LookupFlags.Sensors); + if (!TryComp(pointTransform.GridUid, out var grid)) + return; - foreach (var entUid in intersectingEntities) + var aabb = _lookup.GetWorldAABB(elevator, pointTransform); + var invMatrix = _transform.GetInvWorldMatrix(pointTransform.GridUid.Value); + var localAabb = invMatrix.TransformBox(aabb); + + var tileEnumerator = _mapSystem.GetLocalTilesEnumerator(pointTransform.GridUid.Value, grid, localAabb); + while (tileEnumerator.MoveNext(out var tileRef)) + { + var gas = _atmos.GetTileMixture(pointTransform.GridUid, null, tileRef.GridIndices, excite: true); + if (gas != null) { - if (entUid == elevator.Owner) - continue; + gas.Clear(); + } + } + } + + private void KillEntitiesInTargetArea(Entity elevator, string floorId, HashSet? exempt = null) + { + if (!elevator.Comp.CrushEntitiesOnArrival) + return; + + if (!TryFindPoint(floorId, out var point)) + return; + + var pointTransform = Transform(point.Value.Owner); + var aabb = _lookup.GetWorldAABB(elevator.Owner, pointTransform); + + var intersectingEntities = _lookup.GetEntitiesIntersecting(pointTransform.MapID, aabb, LookupFlags.Static | LookupFlags.Dynamic | LookupFlags.Sundries); + + foreach (var entUid in intersectingEntities) + { + if (entUid == elevator.Owner || IsBlacklisted(entUid) || (exempt != null && exempt.Contains(entUid))) + continue; + + var damage = new DamageSpecifier(); + damage.DamageDict["Blunt"] = elevator.Comp.CrushDamage; + _damageable.TryChangeDamage(entUid, damage, true); + } + } - var damage = new DamageSpecifier(); - damage.DamageDict["Blunt"] = 2000; - _damageable.TryChangeDamage(entUid, damage, true); + private bool IsBlacklisted(EntityUid entity) + { + foreach (var comp in EntityManager.GetComponents(entity)) + { + var compName = _componentFactory.GetRegistration(comp).Name; + + if (compName == "ElevatorPoint" || + compName == "ElevatorButton" || + compName == "ElevatorDoor" || + compName == "Marker" || + compName.EndsWith("Spawner") || + compName.Contains("SpawnPoint")) + { + return true; } - break; } + + return false; } private void UpdateButtonLights(Entity elevator) { + var isMoving = HasComp(elevator); var query = EntityQueryEnumerator(); while (query.MoveNext(out var buttonUid, out var buttonComp, out var light)) { @@ -354,7 +567,7 @@ private void UpdateButtonLights(Entity elevator) Color color = ElevatorButtonRed; if (buttonComp.ButtonType == ElevatorButtonType.CallButton) { - if (elevator.Comp.IsMoving) + if (isMoving) color = ElevatorButtonYellow; else if (buttonComp.Floor == elevator.Comp.CurrentFloor) color = ElevatorButtonGreen; @@ -366,5 +579,3 @@ private void UpdateButtonLights(Entity elevator) } } } - - diff --git a/Content.Server/_Scp/ComplexElevator/ElevatorButtonComponent.cs b/Content.Server/_Scp/ComplexElevator/ElevatorButtonComponent.cs deleted file mode 100644 index 1d0a178f644..00000000000 --- a/Content.Server/_Scp/ComplexElevator/ElevatorButtonComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace Content.Server._Scp.ComplexElevator; - -[RegisterComponent] -public sealed partial class ElevatorButtonComponent : Component -{ - [DataField] - public string ElevatorId = string.Empty; - - [DataField] - public ElevatorButtonType ButtonType = ElevatorButtonType.CallButton; - - [DataField] - public string Floor = string.Empty; - -} - -public enum ElevatorButtonType -{ - CallButton, - SendElevatorDown, - SendElevatorUp, -} diff --git a/Content.Server/_Scp/ComplexElevator/ElevatorCommands.cs b/Content.Server/_Scp/ComplexElevator/ElevatorCommands.cs index 62e5f66d5ae..7abb81493c2 100644 --- a/Content.Server/_Scp/ComplexElevator/ElevatorCommands.cs +++ b/Content.Server/_Scp/ComplexElevator/ElevatorCommands.cs @@ -1,5 +1,4 @@ -using System.Linq; -using Content.Server._Scp.ComplexElevator; +using Content.Shared._Scp.ComplexElevator; using Content.Shared.Administration; using Robust.Shared.Console; using Robust.Shared.GameObjects; @@ -82,6 +81,7 @@ private void HandleAdd(IConsoleShell shell, string[] args, Entity Floors = new(); [DataField] public string IntermediateFloorId = "IntermediateFloor"; + [DataField] + public bool UseIntermediateFloor = true; + [DataField] public TimeSpan SendDelay = TimeSpan.FromSeconds(1); @@ -41,5 +46,15 @@ public sealed partial class ComplexElevatorComponent : Component [DataField] public float DoorBlockCheckRange = 0.6f; - public bool IsMoving = false; -} \ No newline at end of file + [DataField] + public bool TeleportBuckled = true; + + [DataField] + public bool TeleportPulled = true; + + [DataField] + public bool CrushEntitiesOnArrival = true; + + [DataField] + public float CrushDamage = 2000f; +} diff --git a/Content.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.cs b/Content.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.cs new file mode 100644 index 00000000000..ff60df111d5 --- /dev/null +++ b/Content.Shared/_Scp/ComplexElevator/ElevatorButtonComponent.cs @@ -0,0 +1,26 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._Scp.ComplexElevator; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ElevatorButtonComponent : Component +{ + [DataField, AutoNetworkedField] + public string ElevatorId = string.Empty; + + [DataField, AutoNetworkedField] + public ElevatorButtonType ButtonType = ElevatorButtonType.CallButton; + + [DataField, AutoNetworkedField] + public string Floor = string.Empty; +} + +[Serializable, NetSerializable] +public enum ElevatorButtonType +{ + CallButton, + SendElevatorDown, + SendElevatorUp, +} diff --git a/Content.Shared/_Scp/ComplexElevator/ElevatorDoorComponent.cs b/Content.Shared/_Scp/ComplexElevator/ElevatorDoorComponent.cs new file mode 100644 index 00000000000..19889e411ee --- /dev/null +++ b/Content.Shared/_Scp/ComplexElevator/ElevatorDoorComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._Scp.ComplexElevator; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ElevatorDoorComponent : Component +{ + [DataField, AutoNetworkedField] + public string ElevatorId = string.Empty; + + [DataField, AutoNetworkedField] + public string Floor = string.Empty; +} diff --git a/Content.Shared/_Scp/ComplexElevator/ElevatorPointComponent.cs b/Content.Shared/_Scp/ComplexElevator/ElevatorPointComponent.cs new file mode 100644 index 00000000000..ce28183a598 --- /dev/null +++ b/Content.Shared/_Scp/ComplexElevator/ElevatorPointComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._Scp.ComplexElevator; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ElevatorPointComponent : Component +{ + [DataField, AutoNetworkedField] + public string FloorId = string.Empty; +}