using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
+using Robust.Shared.Containers;
namespace Content.Server.Weapons.Ranged.Systems;
[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;
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;
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);
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;
}
}