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