]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix the ability to shoot out of crates (#28961)
authorCojoke <83733158+Cojoke-dot@users.noreply.github.com>
Thu, 11 Jul 2024 05:14:49 +0000 (00:14 -0500)
committerGitHub <noreply@github.com>
Thu, 11 Jul 2024 05:14:49 +0000 (15:14 +1000)
* Fix the ability to shoot out of crates

* Makes it check what inventory the player is in

* use IsEntityOrParentInContainer

* Fix Issues Github had

* gaahhh... Prevents lasers from being shot out of crates

* gaahhh... Prevents lasers from being shot out of crates

* Fix laser?

* hmmm... this is better looking I think?

* Uncook indentation

* Rerun tests?

Content.Server/Weapons/Ranged/Systems/GunSystem.cs
Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs

index 7f7c7ba8557403303938dd2acd2abae36b0eb36d..29f91988182f11bd46b8d3ea978771774f467a1e 100644 (file)
@@ -24,6 +24,7 @@ using Robust.Shared.Physics;
 using Robust.Shared.Player;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Utility;
+using Robust.Shared.Containers;
 
 namespace Content.Server.Weapons.Ranged.Systems;
 
@@ -38,6 +39,7 @@ public sealed partial class GunSystem : SharedGunSystem
     [Dependency] private readonly SharedTransformSystem _transform = default!;
     [Dependency] private readonly StaminaSystem _stamina = default!;
     [Dependency] private readonly StunSystem _stun = default!;
+    [Dependency] private readonly SharedContainerSystem _container = default!;
 
     private const float DamagePitchVariation = 0.05f;
     public const float GunClumsyChance = 0.5f;
@@ -204,17 +206,21 @@ public sealed partial class GunSystem : SharedGunSystem
 
                             var result = rayCastResults[0];
 
-                            // Checks if the laser should pass over unless targeted by its user
-                            foreach (var collide in rayCastResults)
+                            // Check if laser is shot from in a container
+                            if (!_container.IsEntityOrParentInContainer(lastUser))
                             {
-                                if (collide.HitEntity != gun.Target &&
-                                    CompOrNull<RequireProjectileTargetComponent>(collide.HitEntity)?.Active == true)
+                                // Checks if the laser should pass over unless targeted by its user
+                                foreach (var collide in rayCastResults)
                                 {
-                                    continue;
+                                    if (collide.HitEntity != gun.Target &&
+                                        CompOrNull<RequireProjectileTargetComponent>(collide.HitEntity)?.Active == true)
+                                    {
+                                        continue;
+                                    }
+
+                                    result = collide;
+                                    break;
                                 }
-
-                                result = collide;
-                                break;
                             }
 
                             var hit = result.HitEntity;
index 79b374a60f35d01a2dd04900c8d248684c230079..12838eb04d9b877eb4576368bdf6e8c5a8397890 100644 (file)
@@ -2,11 +2,14 @@ using Content.Shared.Projectiles;
 using Content.Shared.Weapons.Ranged.Components;
 using Content.Shared.Standing;
 using Robust.Shared.Physics.Events;
+using Robust.Shared.Containers;
 
 namespace Content.Shared.Damage.Components;
 
 public sealed class RequireProjectileTargetSystem : EntitySystem
 {
+    [Dependency] private readonly SharedContainerSystem _container = default!;
+
     public override void Initialize()
     {
         SubscribeLocalEvent<RequireProjectileTargetComponent, PreventCollideEvent>(PreventCollide);
@@ -23,10 +26,16 @@ public sealed class RequireProjectileTargetSystem : EntitySystem
             return;
 
         var other = args.OtherEntity;
-        if (HasComp<ProjectileComponent>(other) &&
+        if (TryComp(other, out ProjectileComponent? projectile) &&
             CompOrNull<TargetedProjectileComponent>(other)?.Target != ent)
         {
-            args.Cancelled = true;
+            // Prevents shooting out of while inside of crates
+            var shooter = projectile.Shooter;
+            if (!shooter.HasValue)
+                return;
+
+            if (!_container.IsEntityOrParentInContainer(shooter.Value))
+               args.Cancelled = true;
         }
     }