diff --git a/Content.Shared/Climbing/SharedClimbingComponent.cs b/Content.Shared/Climbing/SharedClimbingComponent.cs index 07eb2d6f3a..d3eafb3919 100644 --- a/Content.Shared/Climbing/SharedClimbingComponent.cs +++ b/Content.Shared/Climbing/SharedClimbingComponent.cs @@ -12,6 +12,13 @@ namespace Content.Shared.Climbing [Dependency] private readonly IEntityManager _entMan = default!; [Dependency] private readonly IEntitySystemManager _sysMan = default!; + /// + /// List of fixtures that had vault-impassable prior to an entity being downed. Required when re-adding the + /// collision mask. + /// + [DataField("vaultImpassableFixtures")] + public List VaultImpassableFixtures = new(); + protected bool IsOnClimbableThisFrame { get @@ -78,17 +85,25 @@ namespace Content.Shared.Climbing // Hope the mob has one fixture if (!_entMan.TryGetComponent(Owner, out var fixturesComponent) || fixturesComponent.Deleted) return; - foreach (var fixture in fixturesComponent.Fixtures.Values) + if (value) { - if (value) + foreach (var (key, fixture) in fixturesComponent.Fixtures) { + if ((fixture.CollisionMask & (int) CollisionGroup.VaultImpassable) == 0) + continue; + + VaultImpassableFixtures.Add(key); fixture.CollisionMask &= ~(int) CollisionGroup.VaultImpassable; } - else - { - fixture.CollisionMask |= (int) CollisionGroup.VaultImpassable; - } + return; } + + foreach (var key in VaultImpassableFixtures) + { + if (fixturesComponent.Fixtures.TryGetValue(key, out var fixture)) + fixture.CollisionMask |= (int) CollisionGroup.VaultImpassable; + } + VaultImpassableFixtures.Clear(); } [Serializable, NetSerializable] diff --git a/Content.Shared/Standing/StandingStateComponent.cs b/Content.Shared/Standing/StandingStateComponent.cs index 94740a59c7..dee8db31da 100644 --- a/Content.Shared/Standing/StandingStateComponent.cs +++ b/Content.Shared/Standing/StandingStateComponent.cs @@ -1,12 +1,7 @@ using System; using Content.Shared.Sound; -using Robust.Shared.Analyzers; -using Robust.Shared.GameObjects; using Robust.Shared.GameStates; -using Robust.Shared.Players; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager.Attributes; -using Robust.Shared.ViewVariables; namespace Content.Shared.Standing { @@ -18,10 +13,16 @@ namespace Content.Shared.Standing [DataField("downSoundCollection")] public SoundSpecifier DownSoundCollection { get; } = new SoundCollectionSpecifier("BodyFall"); - [ViewVariables] [DataField("standing")] public bool Standing { get; set; } = true; + /// + /// List of fixtures that had vault-impassable prior to an entity being downed. Required when re-adding the + /// collision mask. + /// + [DataField("vaultImpassableFixtures")] + public List VaultImpassableFixtures = new(); + public override ComponentState GetComponentState() { return new StandingComponentState(Standing); diff --git a/Content.Shared/Standing/StandingStateSystem.cs b/Content.Shared/Standing/StandingStateSystem.cs index b77c1ed736..b1a58b44ec 100644 --- a/Content.Shared/Standing/StandingStateSystem.cs +++ b/Content.Shared/Standing/StandingStateSystem.cs @@ -1,10 +1,7 @@ -using System; using Content.Shared.Audio; using Content.Shared.Hands.Components; using Content.Shared.Rotation; using Robust.Shared.Audio; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Player; using Robust.Shared.Timing; using Robust.Shared.Physics; @@ -55,7 +52,7 @@ namespace Content.Shared.Standing return false; standingState.Standing = false; - standingState.Dirty(); + Dirty(standingState); RaiseLocalEvent(uid, new DownedEvent(), false); if (!_gameTiming.IsFirstTimePredicted) @@ -66,8 +63,12 @@ namespace Content.Shared.Standing if (TryComp(uid, out FixturesComponent? fixtureComponent)) { - foreach (var fixture in fixtureComponent.Fixtures.Values) + foreach (var (key, fixture) in fixtureComponent.Fixtures) { + if ((fixture.CollisionMask & (int) CollisionGroup.VaultImpassable) == 0) + continue; + + standingState.VaultImpassableFixtures.Add(key); fixture.CollisionMask &= ~(int) CollisionGroup.VaultImpassable; } } @@ -110,11 +111,13 @@ namespace Content.Shared.Standing if (TryComp(uid, out FixturesComponent? fixtureComponent)) { - foreach (var fixture in fixtureComponent.Fixtures.Values) + foreach (var key in standingState.VaultImpassableFixtures) { - fixture.CollisionMask |= (int) CollisionGroup.VaultImpassable; + if (fixtureComponent.Fixtures.TryGetValue(key, out var fixture)) + fixture.CollisionMask |= (int) CollisionGroup.VaultImpassable; } } + standingState.VaultImpassableFixtures.Clear(); return true; }