From 80a1aadd5e3c05014fe3686441107979710681ad Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 6 Dec 2023 01:07:52 -0800 Subject: [PATCH] Disposals chute make it go splat (#20848) Co-authored-by: metalgearsloth --- .../Tube/Components/DisposalTubeComponent.cs | 2 +- .../Unit/EntitySystems/DisposableSystem.cs | 87 +++++++++++-------- Content.Shared/Throwing/ThrownItemSystem.cs | 1 + 3 files changed, 55 insertions(+), 35 deletions(-) diff --git a/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs b/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs index 0a256aff4a..c16f1fcc22 100644 --- a/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs +++ b/Content.Server/Disposal/Tube/Components/DisposalTubeComponent.cs @@ -16,7 +16,7 @@ public sealed partial class DisposalTubeComponent : Component public bool Connected; [DataField] - public SoundSpecifier ClangSound = new SoundPathSpecifier("/Audio/Effects/clang.ogg"); + public SoundSpecifier ClangSound = new SoundPathSpecifier("/Audio/Effects/clang.ogg", AudioParams.Default.WithVolume(-5f)); /// /// Container of entities that are currently inside this tube diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs index 0811be059b..59aa832f6a 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs @@ -6,38 +6,54 @@ using Content.Server.Disposal.Unit.Components; using Content.Shared.Body.Components; using Content.Shared.Damage; using Content.Shared.Item; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; +using Content.Shared.Throwing; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; +using Robust.Shared.Random; namespace Content.Server.Disposal.Unit.EntitySystems { public sealed class DisposableSystem : EntitySystem { - [Dependency] private readonly DisposalUnitSystem _disposalUnit = default!; - [Dependency] private readonly DisposalTubeSystem _disposalTube = default!; - [Dependency] private readonly AtmosphereSystem _atmosphere = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly MapSystem _map = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly DisposalUnitSystem _disposalUnitSystem = default!; + [Dependency] private readonly DisposalTubeSystem _disposalTubeSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedMapSystem _maps = default!; + [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; + [Dependency] private readonly SharedTransformSystem _xformSystem = default!; + + private EntityQuery _disposalTubeQuery; + private EntityQuery _disposalUnitQuery; + private EntityQuery _metaQuery; + private EntityQuery _physicsQuery; + private EntityQuery _xformQuery; + + private List _entList = new(); public override void Initialize() { base.Initialize(); + _disposalTubeQuery = GetEntityQuery(); + _disposalUnitQuery = GetEntityQuery(); + _metaQuery = GetEntityQuery(); + _physicsQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + SubscribeLocalEvent(OnComponentStartup); } private void OnComponentStartup(EntityUid uid, DisposalHolderComponent holder, ComponentStartup args) { - holder.Container = _container.EnsureContainer(uid, nameof(DisposalHolderComponent)); + holder.Container = _containerSystem.EnsureContainer(uid, nameof(DisposalHolderComponent)); } public bool TryInsert(EntityUid uid, EntityUid toInsert, DisposalHolderComponent? holder = null) @@ -50,8 +66,8 @@ namespace Content.Server.Disposal.Unit.EntitySystems if (!holder.Container.Insert(toInsert, EntityManager)) return false; - if (TryComp(toInsert, out var physBody)) - _physics.SetCanCollide(toInsert, false, body: physBody); + if (_physicsQuery.TryGetComponent(toInsert, out var physBody)) + _physicsSystem.SetCanCollide(toInsert, false, body: physBody); return true; } @@ -61,7 +77,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems if (!Resolve(uid, ref holder)) return false; - if (!_container.CanInsert(toInsert, holder.Container)) + if (!_containerSystem.CanInsert(toInsert, holder.Container)) { return false; } @@ -93,10 +109,9 @@ namespace Content.Server.Disposal.Unit.EntitySystems var gridUid = holderTransform.GridUid; if (TryComp(gridUid, out var grid)) { - var ducQuery = GetEntityQuery(); - foreach (var contentUid in _map.GetLocal(gridUid.Value, grid, holderTransform.Coordinates)) + foreach (var contentUid in _maps.GetLocal(gridUid.Value, grid, holderTransform.Coordinates)) { - if (ducQuery.TryGetComponent(contentUid, out duc)) + if (_disposalUnitQuery.TryGetComponent(contentUid, out duc)) { disposalId = contentUid; break; @@ -104,39 +119,43 @@ namespace Content.Server.Disposal.Unit.EntitySystems } } - var physQuery = GetEntityQuery(); - var metaQuery = GetEntityQuery(); - var transformQuery = GetEntityQuery(); - foreach (var entity in holder.Container.ContainedEntities.ToArray()) + _entList.Clear(); + _entList.AddRange(holder.Container.ContainedEntities); + + foreach (var entity in _entList) { RemComp(entity); - var meta = metaQuery.GetComponent(entity); + var meta = _metaQuery.GetComponent(entity); holder.Container.Remove(entity, EntityManager, meta: meta, reparent: false, force: true); - var xform = transformQuery.GetComponent(entity); + var xform = _xformQuery.GetComponent(entity); if (xform.ParentUid != uid) continue; if (duc != null) duc.Container.Insert(entity, EntityManager, xform, meta: meta); else - _transform.AttachToGridOrMap(entity, xform); - - if (physQuery.TryGetComponent(entity, out var physics)) { - _physics.WakeBody(entity, body: physics); + _xformSystem.AttachToGridOrMap(entity, xform); + + if (holder.PreviousDirection != Direction.Invalid && _xformQuery.TryGetComponent(xform.ParentUid, out var parentXform)) + { + var direction = holder.PreviousDirection.ToAngle(); + direction += _xformSystem.GetWorldRotation(parentXform); + _throwing.TryThrow(entity, direction.ToWorldVec() * 3f, 10f); + } } } if (disposalId != null && duc != null) { - _disposalUnit.TryEjectContents(disposalId.Value, duc); + _disposalUnitSystem.TryEjectContents(disposalId.Value, duc); } - if (_atmosphere.GetContainingMixture(uid, false, true) is { } environment) + if (_atmosphereSystem.GetContainingMixture(uid, false, true) is { } environment) { - _atmosphere.Merge(environment, holder.Air); + _atmosphereSystem.Merge(environment, holder.Air); holder.Air.Clear(); } @@ -199,7 +218,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems { _damageable.TryChangeDamage(ent, to.DamageOnTurn); } - _audio.PlayPvs(to.ClangSound, toUid, AudioParams.Default.WithVolume(-5f)); + _audio.PlayPvs(to.ClangSound, toUid); } return true; @@ -237,21 +256,21 @@ namespace Content.Server.Disposal.Unit.EntitySystems if (holder.TimeLeft > 0) { var progress = 1 - holder.TimeLeft / holder.StartingTime; - var origin = Transform(currentTube).Coordinates; + var origin = _xformQuery.GetComponent(currentTube).Coordinates; var destination = holder.CurrentDirection.ToVec(); var newPosition = destination * progress; // This is some supreme shit code. - _transform.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); + _xformSystem.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); continue; } // Past this point, we are performing inter-tube transfer! // Remove current tube content - Comp(currentTube).Contents.Remove(uid, reparent: false, force: true); + _disposalTubeQuery.GetComponent(currentTube).Contents.Remove(uid, reparent: false, force: true); // Find next tube - var nextTube = _disposalTube.NextTubeFor(currentTube, holder.CurrentDirection); + var nextTube = _disposalTubeSystem.NextTubeFor(currentTube, holder.CurrentDirection); if (!EntityManager.EntityExists(nextTube)) { ExitDisposals(uid, holder); diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index fffde8c87e..ec29bf7ee5 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -86,6 +86,7 @@ namespace Content.Shared.Throwing private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsSleepEvent @event) { + @event.Cancelled = true; StopThrow(uid, thrownItem); } -- 2.51.2