From 5b55b9ce3bafba2095acbbbae096af8546fda59e Mon Sep 17 00:00:00 2001 From: Vyacheslav Kovalevsky <40753025+Slava0135@users.noreply.github.com> Date: Mon, 4 Dec 2023 09:32:17 +0300 Subject: [PATCH] Add gas tanks throw damage (#20035) Co-authored-by: metalgearsloth --- .../Atmos/EntitySystems/GasTankSystem.cs | 9 ++++--- .../Interaction/SharedInteractionSystem.cs | 19 ------------- Content.Shared/Sound/SharedEmitSoundSystem.cs | 2 +- Content.Shared/Throwing/IThrown.cs | 27 ------------------- Content.Shared/Throwing/ThrowingSystem.cs | 8 ++++-- Content.Shared/Throwing/ThrownEvent.cs | 10 +++++++ Content.Shared/Throwing/ThrownItemSystem.cs | 2 +- .../Entities/Objects/Tools/gas_tanks.yml | 12 +++++++++ 8 files changed, 36 insertions(+), 53 deletions(-) delete mode 100644 Content.Shared/Throwing/IThrown.cs create mode 100644 Content.Shared/Throwing/ThrownEvent.cs diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index 881d27c585..b476b906a9 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -1,3 +1,4 @@ +using System.Numerics; using Content.Server.Atmos.Components; using Content.Server.Body.Components; using Content.Server.Body.Systems; @@ -8,6 +9,7 @@ using Content.Shared.Actions; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Examine; +using Content.Shared.Throwing; using Content.Shared.Toggleable; using Content.Shared.Verbs; using JetBrains.Annotations; @@ -33,6 +35,7 @@ namespace Content.Server.Atmos.EntitySystems [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; private const float TimerDelay = 0.5f; private float _timer = 0f; @@ -172,9 +175,9 @@ namespace Content.Server.Atmos.EntitySystems { _atmosphereSystem.Merge(environment, removed); } - var impulse = removed.TotalMoles * removed.Temperature; - _physics.ApplyLinearImpulse(gasTank, _random.NextAngle().ToWorldVec() * impulse); - _physics.ApplyAngularImpulse(gasTank, _random.NextFloat(-3f, 3f)); + var strength = removed.TotalMoles * MathF.Sqrt(removed.Temperature); + var dir = _random.NextAngle().ToWorldVec(); + _throwing.TryThrow(gasTank, dir * strength, strength); _audioSys.PlayPvs(gasTank.Comp.RuptureSound, gasTank); } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 7981deaee6..44cf325567 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -1044,25 +1044,6 @@ namespace Content.Shared.Interaction } #endregion - #region Throw - /// - /// Calls Thrown on all components that implement the IThrown interface - /// on an entity that has been thrown. - /// - public void ThrownInteraction(EntityUid user, EntityUid thrown) - { - var throwMsg = new ThrownEvent(user, thrown); - RaiseLocalEvent(thrown, throwMsg, true); - if (throwMsg.Handled) - { - _adminLogger.Add(LogType.Throw, LogImpact.Low,$"{ToPrettyString(user):user} threw {ToPrettyString(thrown):entity}"); - return; - } - - _adminLogger.Add(LogType.Throw, LogImpact.Low,$"{ToPrettyString(user):user} threw {ToPrettyString(thrown):entity}"); - } - #endregion - public void DroppedInteraction(EntityUid user, EntityUid item) { var dropMsg = new DroppedEvent(user); diff --git a/Content.Shared/Sound/SharedEmitSoundSystem.cs b/Content.Shared/Sound/SharedEmitSoundSystem.cs index c7fcfc6469..5e131a1355 100644 --- a/Content.Shared/Sound/SharedEmitSoundSystem.cs +++ b/Content.Shared/Sound/SharedEmitSoundSystem.cs @@ -79,7 +79,7 @@ public abstract class SharedEmitSoundSystem : EntitySystem args.Handled = true; } - private void OnEmitSoundOnThrown(EntityUid uid, BaseEmitSoundComponent component, ThrownEvent args) + private void OnEmitSoundOnThrown(EntityUid uid, BaseEmitSoundComponent component, ref ThrownEvent args) { TryEmitSound(uid, component, args.User, false); } diff --git a/Content.Shared/Throwing/IThrown.cs b/Content.Shared/Throwing/IThrown.cs deleted file mode 100644 index 7946ac1903..0000000000 --- a/Content.Shared/Throwing/IThrown.cs +++ /dev/null @@ -1,27 +0,0 @@ -using JetBrains.Annotations; - -namespace Content.Shared.Throwing -{ - /// - /// Raised when throwing the entity in your hands. - /// - [PublicAPI] - public sealed class ThrownEvent : HandledEntityEventArgs - { - /// - /// Entity that threw the item. - /// - public EntityUid User { get; } - - /// - /// Item that was thrown. - /// - public EntityUid Thrown { get; } - - public ThrownEvent(EntityUid user, EntityUid thrown) - { - User = user; - Thrown = thrown; - } - } -} diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index e47cdd5acc..229d8a72b2 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -1,4 +1,6 @@ using System.Numerics; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Interaction; using Content.Shared.Projectiles; @@ -25,10 +27,10 @@ public sealed class ThrowingSystem : EntitySystem [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ThrownItemSystem _thrownSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; public void TryThrow( EntityUid uid, @@ -135,8 +137,10 @@ public sealed class ThrowingSystem : EntitySystem _transform.SetLocalRotation(uid, angle + offset); } + var throwEvent = new ThrownEvent(user, uid); + RaiseLocalEvent(uid, ref throwEvent, true); if (user != null) - _interactionSystem.ThrownInteraction(user.Value, uid); + _adminLogger.Add(LogType.Throw, LogImpact.Low, $"{ToPrettyString(user.Value):user} threw {ToPrettyString(uid):entity}"); var impulseVector = direction.Normalized() * strength * physics.Mass; _physics.ApplyLinearImpulse(uid, impulseVector, body: physics); diff --git a/Content.Shared/Throwing/ThrownEvent.cs b/Content.Shared/Throwing/ThrownEvent.cs new file mode 100644 index 0000000000..70cb6ee43d --- /dev/null +++ b/Content.Shared/Throwing/ThrownEvent.cs @@ -0,0 +1,10 @@ +using JetBrains.Annotations; + +namespace Content.Shared.Throwing; + +/// +/// Raised on thrown entity. +/// +[PublicAPI] +[ByRefEvent] +public readonly record struct ThrownEvent(EntityUid? User, EntityUid Thrown); diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index deda47bae6..fffde8c87e 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -43,7 +43,7 @@ namespace Content.Shared.Throwing component.ThrownTime ??= _gameTiming.CurTime; } - private void ThrowItem(EntityUid uid, ThrownItemComponent component, ThrownEvent args) + private void ThrowItem(EntityUid uid, ThrownItemComponent component, ref ThrownEvent @event) { if (!EntityManager.TryGetComponent(uid, out FixturesComponent? fixturesComponent) || fixturesComponent.Fixtures.Count != 1 || diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 9887d8cdc0..624c99e64c 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -36,6 +36,10 @@ damage: types: Blunt: 10 + - type: DamageOtherOnHit + damage: + types: + Blunt: 10 - type: PhysicalComposition materialComposition: Steel: 400 @@ -117,6 +121,10 @@ damage: types: Blunt: 5 + - type: DamageOtherOnHit + damage: + types: + Blunt: 5 - type: PhysicalComposition materialComposition: Steel: 100 @@ -161,6 +169,10 @@ damage: types: Blunt: 7.5 + - type: DamageOtherOnHit + damage: + types: + Blunt: 7.5 - type: entity parent: GasTankRoundBase