]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Grappling fixes (#23709)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Mon, 8 Jan 2024 01:15:46 +0000 (20:15 -0500)
committerGitHub <noreply@github.com>
Mon, 8 Jan 2024 01:15:46 +0000 (12:15 +1100)
Content.Shared/Weapons/Misc/SharedGrapplingGunSystem.cs
Content.Shared/Weapons/Ranged/Components/GrapplingGunComponent.cs
Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.BasicEntity.cs
Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml

index eb02dd06f8c8d90c7b2ad0a2297094b8ed170077..41e1895da2c963951f011f90778849b3c5f5f5ed 100644 (file)
@@ -16,7 +16,6 @@ using Robust.Shared.Physics.Dynamics.Joints;
 using Robust.Shared.Physics.Systems;
 using Robust.Shared.Serialization;
 using Robust.Shared.Timing;
-using Robust.Shared.Utility;
 
 namespace Content.Shared.Weapons.Misc;
 
@@ -27,6 +26,7 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
     [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
     [Dependency] private readonly SharedAudioSystem _audio = default!;
     [Dependency] private readonly SharedJointSystem _joints = default!;
+    [Dependency] private readonly SharedGunSystem _gun = default!;
     [Dependency] private readonly SharedPhysicsSystem _physics = default!;
 
     public const string GrapplingJoint = "grappling";
@@ -48,7 +48,8 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
 
     private void OnGrappleJointRemoved(EntityUid uid, GrapplingProjectileComponent component, JointRemovedEvent args)
     {
-        QueueDel(uid);
+        if (_netManager.IsServer)
+            QueueDel(uid);
     }
 
     private void OnGrapplingShot(EntityUid uid, GrapplingGunComponent component, ref GunShotEvent args)
@@ -58,12 +59,12 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
             if (!HasComp<GrapplingProjectileComponent>(shotUid))
                 continue;
 
+            //todo: this doesn't actually support multigrapple
             // At least show the visuals.
             component.Projectile = shotUid.Value;
             Dirty(uid, component);
             var visuals = EnsureComp<JointVisualsComponent>(shotUid.Value);
-            visuals.Sprite =
-                new SpriteSpecifier.Rsi(new ResPath("Objects/Weapons/Guns/Launchers/grappling_gun.rsi"), "rope");
+            visuals.Sprite = component.RopeSprite;
             visuals.OffsetA = new Vector2(0f, 0.5f);
             visuals.Target = uid;
             Dirty(shotUid.Value, visuals);
@@ -71,6 +72,7 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
 
         TryComp<AppearanceComponent>(uid, out var appearance);
         _appearance.SetData(uid, SharedTetherGunSystem.TetherVisualsStatus.Key, false, appearance);
+        Dirty(uid, component);
     }
 
     private void OnGrapplingDeselected(EntityUid uid, GrapplingGunComponent component, HandDeselectedEvent args)
@@ -117,23 +119,21 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
         if (!Timing.IsFirstTimePredicted || args.Handled)
             return;
 
-        _audio.PlayPredicted(component.CycleSound, uid, args.User);
+        if (Deleted(component.Projectile))
+            return;
 
-        TryComp<AppearanceComponent>(uid, out var appearance);
-        _appearance.SetData(uid, SharedTetherGunSystem.TetherVisualsStatus.Key, true, appearance);
-        SetReeling(uid, component, false, args.User);
+        _audio.PlayPredicted(component.CycleSound, uid, args.User);
+        _appearance.SetData(uid, SharedTetherGunSystem.TetherVisualsStatus.Key, true);
 
-        if (!Deleted(component.Projectile))
+        if (_netManager.IsServer)
         {
-            if (_netManager.IsServer)
-            {
-                QueueDel(component.Projectile.Value);
-            }
-
-            component.Projectile = null;
-            Dirty(uid, component);
+            QueueDel(component.Projectile.Value);
         }
 
+        component.Projectile = null;
+        SetReeling(uid, component, false, args.User);
+        _gun.ChangeBasicEntityAmmoCount(uid,  1);
+
         args.Handled = true;
     }
 
index 3ca52b28786c8364570dc49c138fb6c778e81e29..d0af3e8b36d6e084fc025f49e472c82f6bab6049 100644 (file)
@@ -1,5 +1,6 @@
 using Robust.Shared.Audio;
 using Robust.Shared.GameStates;
+using Robust.Shared.Utility;
 
 namespace Content.Shared.Weapons.Ranged.Components;
 
@@ -10,7 +11,8 @@ public sealed partial class GrapplingGunComponent : Component
     [DataField("jointId"), AutoNetworkedField]
     public string Joint = string.Empty;
 
-    [DataField("projectile")] public EntityUid? Projectile;
+    [DataField, AutoNetworkedField]
+    public EntityUid? Projectile;
 
     [ViewVariables(VVAccess.ReadWrite), DataField("reeling"), AutoNetworkedField]
     public bool Reeling;
@@ -24,5 +26,9 @@ public sealed partial class GrapplingGunComponent : Component
     [ViewVariables(VVAccess.ReadWrite), DataField("cycleSound"), AutoNetworkedField]
     public SoundSpecifier? CycleSound = new SoundPathSpecifier("/Audio/Weapons/Guns/MagIn/kinetic_reload.ogg");
 
+    [DataField, ViewVariables]
+    public SpriteSpecifier RopeSprite =
+        new SpriteSpecifier.Rsi(new ResPath("Objects/Weapons/Guns/Launchers/grappling_gun.rsi"), "rope");
+
     public EntityUid? Stream;
 }
index 731e7a526d9a2a6dbad3003ede9b246d6c3364c2..04f9b52324cd09feb76266623baead93adc37670 100644 (file)
@@ -62,19 +62,26 @@ public abstract partial class SharedGunSystem
     }
 
     #region Public API
+    public bool ChangeBasicEntityAmmoCount(EntityUid uid, int delta, BasicEntityAmmoProviderComponent? component = null)
+    {
+        if (!Resolve(uid, ref component, false) || component.Count == null)
+            return false;
+
+        return UpdateBasicEntityAmmoCount(uid, component.Count.Value + delta, component);
+    }
 
     public bool UpdateBasicEntityAmmoCount(EntityUid uid, int count, BasicEntityAmmoProviderComponent? component = null)
     {
-        if (!Resolve(uid, ref component))
+        if (!Resolve(uid, ref component, false))
             return false;
 
         if (count > component.Capacity)
             return false;
 
         component.Count = count;
-        Dirty(uid, component);
         UpdateBasicEntityAppearance(uid, component);
         UpdateAmmoCount(uid);
+        Dirty(uid, component);
 
         return true;
     }
index 74f606ddb5ba655344bb5f3f10dc214a55feb0e7..635de1c64bfcf20537767a9774208e320a6a4bad 100644 (file)
     - type: Gun
       soundGunshot: /Audio/Weapons/Guns/Gunshots/harpoon.ogg
       fireRate: 0.5
-    - type: RechargeCycleAmmo
     - type: BasicEntityAmmoProvider
       proto: GrapplingHook
       capacity: 1