Fix BodySystem and Gibbing (#20460)
* Fix gibbing & body system Makes it so that bodies no longer have two sets of torso organs and that gibbed bodies get spread around on the floor again. * Actually fix the double torso problem * rootSlot in cameFrom * Remove SetCoordinates inside GibBody() * Don't use entity.RandomOffset() in GibBody() * Gibbing now uses _random.NextVector2()
This commit is contained in:
@@ -1,12 +1,8 @@
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using System.Linq;
|
|
||||||
using Content.Server.Body.Components;
|
using Content.Server.Body.Components;
|
||||||
using Content.Server.GameTicking;
|
using Content.Server.GameTicking;
|
||||||
using Content.Server.Humanoid;
|
using Content.Server.Humanoid;
|
||||||
using Content.Server.Kitchen.Components;
|
using Content.Server.Kitchen.Components;
|
||||||
using Content.Server.Mind;
|
|
||||||
using Content.Shared.Body.Components;
|
using Content.Shared.Body.Components;
|
||||||
using Content.Shared.Body.Organ;
|
|
||||||
using Content.Shared.Body.Part;
|
using Content.Shared.Body.Part;
|
||||||
using Content.Shared.Body.Systems;
|
using Content.Shared.Body.Systems;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
@@ -14,13 +10,11 @@ using Content.Shared.Kitchen.Components;
|
|||||||
using Content.Shared.Mind;
|
using Content.Shared.Mind;
|
||||||
using Content.Shared.Mobs.Systems;
|
using Content.Shared.Mobs.Systems;
|
||||||
using Content.Shared.Movement.Events;
|
using Content.Shared.Movement.Events;
|
||||||
using Content.Shared.Random.Helpers;
|
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.Containers;
|
|
||||||
using Robust.Shared.Map;
|
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
|
using Robust.Shared.Random;
|
||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
using Robust.Shared.Utility;
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Content.Server.Body.Systems;
|
namespace Content.Server.Body.Systems;
|
||||||
|
|
||||||
@@ -33,6 +27,7 @@ public sealed class BodySystem : SharedBodySystem
|
|||||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||||
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
|
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
|
||||||
|
[Dependency] private readonly IRobustRandom _random = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -136,11 +131,7 @@ public sealed class BodySystem : SharedBodySystem
|
|||||||
|
|
||||||
_audio.Play(body.GibSound, filter, coordinates, true, audio);
|
_audio.Play(body.GibSound, filter, coordinates, true, audio);
|
||||||
|
|
||||||
var containers = GetBodyContainers(bodyId, body: body).ToList();
|
foreach (var entity in gibs)
|
||||||
|
|
||||||
foreach (var container in containers)
|
|
||||||
{
|
|
||||||
foreach (var entity in container.ContainedEntities)
|
|
||||||
{
|
{
|
||||||
if (deleteItems)
|
if (deleteItems)
|
||||||
{
|
{
|
||||||
@@ -148,10 +139,7 @@ public sealed class BodySystem : SharedBodySystem
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
container.Remove(entity, EntityManager, force: true);
|
SharedTransform.SetCoordinates(entity, coordinates.Offset(_random.NextVector2(.3f)));
|
||||||
SharedTransform.SetCoordinates(entity,coordinates);
|
|
||||||
entity.RandomOffset(0.25f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RaiseLocalEvent(bodyId, new BeingGibbedEvent(gibs));
|
RaiseLocalEvent(bodyId, new BeingGibbedEvent(gibs));
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
|
||||||
|
|
||||||
namespace Content.Shared.Body.Prototypes;
|
namespace Content.Shared.Body.Prototypes;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Content.Shared.Body.Components;
|
using Content.Shared.Body.Components;
|
||||||
using Content.Shared.Body.Organ;
|
using Content.Shared.Body.Organ;
|
||||||
@@ -156,6 +156,7 @@ public partial class SharedBodySystem
|
|||||||
|
|
||||||
// Child -> Parent connection.
|
// Child -> Parent connection.
|
||||||
var cameFrom = new Dictionary<string, string>();
|
var cameFrom = new Dictionary<string, string>();
|
||||||
|
cameFrom[rootSlot] = rootSlot;
|
||||||
// Maps slot to its relevant entity.
|
// Maps slot to its relevant entity.
|
||||||
var cameFromEntities = new Dictionary<string, EntityUid>();
|
var cameFromEntities = new Dictionary<string, EntityUid>();
|
||||||
cameFromEntities[rootSlot] = rootPartId;
|
cameFromEntities[rootSlot] = rootPartId;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Content.Shared.Damage;
|
using Content.Shared.Damage;
|
||||||
using Content.Shared.Movement.Systems;
|
using Content.Shared.Movement.Systems;
|
||||||
using Content.Shared.Standing;
|
using Content.Shared.Standing;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
@@ -50,7 +50,7 @@ public abstract partial class SharedBodySystem : EntitySystem
|
|||||||
// This is blursed
|
// This is blursed
|
||||||
var slotIndex = containerSlotId.IndexOf(PartSlotContainerIdPrefix, StringComparison.Ordinal);
|
var slotIndex = containerSlotId.IndexOf(PartSlotContainerIdPrefix, StringComparison.Ordinal);
|
||||||
|
|
||||||
if (slotIndex < -1)
|
if (slotIndex < 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var slotId = containerSlotId.Remove(slotIndex, PartSlotContainerIdPrefix.Length);
|
var slotId = containerSlotId.Remove(slotIndex, PartSlotContainerIdPrefix.Length);
|
||||||
|
|||||||
Reference in New Issue
Block a user