Files
tbd-station-14/Content.Shared/Damage/Systems/RequireProjectileTargetSystem.cs
Plykiya a4d6f09a4f Cluster grenade refactor and contra markings (#31108)
* Cluster grenade refactor

* oopsies on the name

* Solve client-side errors

* reviews addressed

* filling scattering grenades is now predicted

* reviews addressed
2024-12-16 13:08:07 +01:00

66 lines
2.1 KiB
C#

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);
SubscribeLocalEvent<RequireProjectileTargetComponent, StoodEvent>(StandingBulletHit);
SubscribeLocalEvent<RequireProjectileTargetComponent, DownedEvent>(LayingBulletPass);
}
private void PreventCollide(Entity<RequireProjectileTargetComponent> ent, ref PreventCollideEvent args)
{
if (args.Cancelled)
return;
if (!ent.Comp.Active)
return;
var other = args.OtherEntity;
if (TryComp(other, out ProjectileComponent? projectile) &&
CompOrNull<TargetedProjectileComponent>(other)?.Target != ent)
{
// Prevents shooting out of while inside of crates
var shooter = projectile.Shooter;
if (!shooter.HasValue)
return;
// ProjectileGrenades delete the entity that's shooting the projectile,
// so it's impossible to check if the entity is in a container
if (TerminatingOrDeleted(shooter.Value))
return;
if (!_container.IsEntityOrParentInContainer(shooter.Value))
args.Cancelled = true;
}
}
private void SetActive(Entity<RequireProjectileTargetComponent> ent, bool value)
{
if (ent.Comp.Active == value)
return;
ent.Comp.Active = value;
Dirty(ent);
}
private void StandingBulletHit(Entity<RequireProjectileTargetComponent> ent, ref StoodEvent args)
{
SetActive(ent, false);
}
private void LayingBulletPass(Entity<RequireProjectileTargetComponent> ent, ref DownedEvent args)
{
SetActive(ent, true);
}
}