]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Remove Contact Slowdown when Weightless or in the Air (#33299)
authorVictor Shen <71985089+Vexerot@users.noreply.github.com>
Tue, 29 Apr 2025 00:24:12 +0000 (17:24 -0700)
committerGitHub <noreply@github.com>
Tue, 29 Apr 2025 00:24:12 +0000 (20:24 -0400)
* removed contact slowdowns from entities that are weightless or in the air

* fixed kudzu not applying contact slowdown to airbone entities

* revert kudzu fix

* reimplemented kudzu fix with bool datafield

* update variable serialization format

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
* empty commit

* cleaned up and added documentation

* cached airborne check

* rerun tests

* minor review

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Milon <milonpl.git@proton.me>
Content.Shared/Movement/Components/SpeedModifierContactsComponent.cs
Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs
Resources/Prototypes/Entities/Objects/Misc/kudzu.yml

index 73bb0690fdc1a201d2b1103af163b875c4a57b22..f288363a2db955b0112fee48e720cab426332536 100644 (file)
@@ -4,19 +4,33 @@ using Robust.Shared.GameStates;
 
 namespace Content.Shared.Movement.Components;
 
-[NetworkedComponent, RegisterComponent]
-[AutoGenerateComponentState]
-[Access(typeof(SpeedModifierContactsSystem))]
+/// <summary>
+/// Component that modifies the movement speed of other entities that come into contact with the entity this component is added to.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SpeedModifierContactsSystem))]
 public sealed partial class SpeedModifierContactsComponent : Component
 {
-    [DataField("walkSpeedModifier"), ViewVariables(VVAccess.ReadWrite)]
-    [AutoNetworkedField]
+    /// <summary>
+    /// The modifier applied to the walk speed of entities that come into contact with the entity this component is added to.
+    /// </summary>
+    [DataField, AutoNetworkedField]
     public float WalkSpeedModifier = 1.0f;
 
-    [AutoNetworkedField]
-    [DataField("sprintSpeedModifier"), ViewVariables(VVAccess.ReadWrite)]
+    /// <summary>
+    /// The modifier applied to the sprint speed of entities that come into contact with the entity this component is added to.
+    /// </summary>
+    [DataField, AutoNetworkedField]
     public float SprintSpeedModifier = 1.0f;
 
-    [DataField("ignoreWhitelist")]
+    /// <summary>
+    /// Indicates whether this component affects the movement speed of airborne entities that come into contact with the entity this component is added to.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public bool AffectAirborne;
+
+    /// <summary>
+    /// A whitelist of entities that should be ignored by this component's speed modifiers.
+    /// </summary>
+    [DataField]
     public EntityWhitelist? IgnoreWhitelist;
 }
index 089fbbf924579c9916cbfc30b05ebb8533695891..e53a4351d195732f9a69c88045cea1761efedf9a 100644 (file)
@@ -1,6 +1,7 @@
 using Content.Shared.Inventory;
 using Content.Shared.Movement.Components;
 using Content.Shared.Movement.Events;
+using Content.Shared.Gravity;
 using Content.Shared.Slippery;
 using Content.Shared.Whitelist;
 using Robust.Shared.Physics.Components;
@@ -12,6 +13,7 @@ namespace Content.Shared.Movement.Systems;
 public sealed class SpeedModifierContactsSystem : EntitySystem
 {
     [Dependency] private readonly SharedPhysicsSystem _physics = default!;
+    [Dependency] private readonly SharedGravitySystem _gravity = default!;
     [Dependency] private readonly MovementSpeedModifierSystem _speedModifierSystem = default!;
     [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
 
@@ -84,6 +86,9 @@ public sealed class SpeedModifierContactsSystem : EntitySystem
         var walkSpeed = 0.0f;
         var sprintSpeed = 0.0f;
 
+        // Cache the result of the airborne check, as it's expensive and independent of contacting entities, hence need only be done once.
+        var isAirborne = physicsComponent.BodyStatus == BodyStatus.InAir || _gravity.IsWeightless(uid, physicsComponent);
+
         bool remove = true;
         var entries = 0;
         foreach (var ent in _physics.GetContactingEntities(uid, physicsComponent))
@@ -95,6 +100,10 @@ public sealed class SpeedModifierContactsSystem : EntitySystem
                 if (_whitelistSystem.IsWhitelistPass(slowContactsComponent.IgnoreWhitelist, uid))
                     continue;
 
+                // Entities that are airborne should not be affected by contact slowdowns that are specified to not affect airborne entities.
+                if (isAirborne && !slowContactsComponent.AffectAirborne)
+                    continue;
+
                 walkSpeed += slowContactsComponent.WalkSpeedModifier;
                 sprintSpeed += slowContactsComponent.SprintSpeedModifier;
                 speedModified = true;
index c688c7cadc1bd63570fddf44af3c535e35f23471..e35e915b092556f7442dce48550447269af25acf 100644 (file)
@@ -15,6 +15,8 @@
     - type: ActiveEdgeSpreader
     - type: EdgeSpreader
       id: Kudzu
+    - type: SpeedModifierContacts
+      affectAirborne: true
 
 - type: entity
   id: Kudzu