From 19a06b6cc0498fa59ffe7328df0f524f753968f4 Mon Sep 17 00:00:00 2001 From: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Date: Thu, 11 Jul 2024 00:14:49 -0500 Subject: [PATCH] Fix the ability to shoot out of crates (#28961) * 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? --- .../Weapons/Ranged/Systems/GunSystem.cs | 22 ++++++++++++------- .../Systems/RequireProjectileTargetSystem.cs | 13 +++++++++-- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index 7f7c7ba855..29f9198818 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -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(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(collide.HitEntity)?.Active == true) + { + continue; + } - result = collide; - break; + result = collide; + break; + } } var hit = result.HitEntity; diff --git a/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs b/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs index 79b374a60f..12838eb04d 100644 --- a/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs +++ b/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs @@ -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(PreventCollide); @@ -23,10 +26,16 @@ public sealed class RequireProjectileTargetSystem : EntitySystem return; var other = args.OtherEntity; - if (HasComp(other) && + if (TryComp(other, out ProjectileComponent? projectile) && CompOrNull(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; } }