Fix damaging thrown item phasing through walls (#18574)
This commit is contained in:
@@ -8,6 +8,7 @@ using Content.Shared.Effects;
|
|||||||
using Content.Shared.Mobs.Components;
|
using Content.Shared.Mobs.Components;
|
||||||
using Content.Shared.Throwing;
|
using Content.Shared.Throwing;
|
||||||
using Robust.Shared.Physics.Components;
|
using Robust.Shared.Physics.Components;
|
||||||
|
using Robust.Shared.Physics.Systems;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
|
|
||||||
namespace Content.Server.Damage.Systems
|
namespace Content.Server.Damage.Systems
|
||||||
@@ -19,6 +20,7 @@ namespace Content.Server.Damage.Systems
|
|||||||
[Dependency] private readonly GunSystem _guns = default!;
|
[Dependency] private readonly GunSystem _guns = default!;
|
||||||
[Dependency] private readonly SharedCameraRecoilSystem _sharedCameraRecoil = default!;
|
[Dependency] private readonly SharedCameraRecoilSystem _sharedCameraRecoil = default!;
|
||||||
[Dependency] private readonly ThrownItemSystem _thrownItem = default!;
|
[Dependency] private readonly ThrownItemSystem _thrownItem = default!;
|
||||||
|
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -41,7 +43,11 @@ namespace Content.Server.Damage.Systems
|
|||||||
_sharedCameraRecoil.KickCamera(args.Target, direction);
|
_sharedCameraRecoil.KickCamera(args.Target, direction);
|
||||||
}
|
}
|
||||||
|
|
||||||
_thrownItem.LandComponent(args.Thrown, args.Component, playSound: false);
|
if (TryComp<PhysicsComponent>(uid, out var physics))
|
||||||
|
{
|
||||||
|
_thrownItem.LandComponent(args.Thrown, args.Component, physics, false);
|
||||||
|
_physics.ResetDynamics(physics);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Shared.Administration.Logs;
|
using Content.Shared.Administration.Logs;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.Hands.Components;
|
|
||||||
using Content.Shared.Physics;
|
using Content.Shared.Physics;
|
||||||
using Content.Shared.Physics.Pull;
|
using Content.Shared.Physics.Pull;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
@@ -115,35 +114,22 @@ namespace Content.Shared.Throwing
|
|||||||
EntityManager.RemoveComponent<ThrownItemComponent>(uid);
|
EntityManager.RemoveComponent<ThrownItemComponent>(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LandComponent(EntityUid uid, ThrownItemComponent thrownItem, PhysicsComponent? physics = null, bool playSound = true)
|
public void LandComponent(EntityUid uid, ThrownItemComponent thrownItem, PhysicsComponent physics, bool playSound)
|
||||||
{
|
{
|
||||||
if (!Resolve(uid, ref physics))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_physics.SetBodyStatus(physics, BodyStatus.OnGround);
|
_physics.SetBodyStatus(physics, BodyStatus.OnGround);
|
||||||
|
|
||||||
if (thrownItem.Deleted || Deleted(uid) || _containerSystem.IsEntityInContainer(uid))
|
if (thrownItem.Deleted || Deleted(uid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var landing = uid;
|
|
||||||
|
|
||||||
// Unfortunately we can't check for hands containers as they have specific names.
|
|
||||||
if (uid.TryGetContainerMan(out var containerManager) &&
|
|
||||||
EntityManager.HasComponent<HandsComponent>(containerManager.Owner))
|
|
||||||
{
|
|
||||||
EntityManager.RemoveComponent(landing, thrownItem);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assume it's uninteresting if it has no thrower. For now anyway.
|
// Assume it's uninteresting if it has no thrower. For now anyway.
|
||||||
if (thrownItem.Thrower is not null)
|
if (thrownItem.Thrower is not null)
|
||||||
_adminLogger.Add(LogType.Landed, LogImpact.Low, $"{ToPrettyString(landing):entity} thrown by {ToPrettyString(thrownItem.Thrower.Value):thrower} landed.");
|
_adminLogger.Add(LogType.Landed, LogImpact.Low, $"{ToPrettyString(uid):entity} thrown by {ToPrettyString(thrownItem.Thrower.Value):thrower} landed.");
|
||||||
|
|
||||||
_broadphase.RegenerateContacts(uid, physics);
|
_broadphase.RegenerateContacts(uid, physics);
|
||||||
var landEvent = new LandEvent(thrownItem.Thrower, playSound);
|
var landEvent = new LandEvent(thrownItem.Thrower, playSound);
|
||||||
RaiseLocalEvent(landing, ref landEvent);
|
RaiseLocalEvent(uid, ref landEvent);
|
||||||
|
|
||||||
|
StopThrow(uid, thrownItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user