1
0

RequireProjectileTargetSystem.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using Content.Shared.Projectiles;
  2. using Content.Shared.Weapons.Ranged.Components;
  3. using Content.Shared.Standing;
  4. using Robust.Shared.Physics.Events;
  5. using Robust.Shared.Containers;
  6. using Robust.Shared.Random;
  7. using Content.Shared.Mobs.Systems;
  8. namespace Content.Shared.Damage.Components;
  9. public sealed class RequireProjectileTargetSystem : EntitySystem
  10. {
  11. [Dependency] private readonly SharedContainerSystem _container = default!;
  12. [Dependency] private readonly IRobustRandom _random = default!;
  13. [Dependency] private readonly ILogManager _logManager = default!;
  14. [Dependency] private readonly MobStateSystem _mobState = default!;
  15. private ISawmill _sawmill = default!;
  16. public override void Initialize()
  17. {
  18. SubscribeLocalEvent<RequireProjectileTargetComponent, PreventCollideEvent>(PreventCollide);
  19. SubscribeLocalEvent<RequireProjectileTargetComponent, StoodEvent>(StandingBulletHit);
  20. SubscribeLocalEvent<RequireProjectileTargetComponent, DownedEvent>(LayingBulletPass);
  21. _sawmill = _logManager.GetSawmill("targeting");
  22. }
  23. private void PreventCollide(Entity<RequireProjectileTargetComponent> ent, ref PreventCollideEvent args)
  24. {
  25. if (args.Cancelled)
  26. return;
  27. if (!ent.Comp.Active)
  28. {
  29. return;
  30. }
  31. else
  32. {
  33. if (_mobState.IsDead(args.OtherEntity))
  34. { args.Cancelled = true; }
  35. //_sawmill.Info("checking");
  36. var rando = _random.NextFloat(0.0f, 100.0f);
  37. // 20% chance get hit
  38. if (rando >= 80.0f)
  39. {
  40. //_sawmill.Info("20%");
  41. return;
  42. }
  43. }
  44. var other = args.OtherEntity;
  45. if (TryComp(other, out ProjectileComponent? projectile) &&
  46. CompOrNull<TargetedProjectileComponent>(other)?.Target != ent)
  47. {
  48. // Prevents shooting out of while inside of crates
  49. var shooter = projectile.Shooter;
  50. if (!shooter.HasValue)
  51. return;
  52. // ProjectileGrenades delete the entity that's shooting the projectile,
  53. // so it's impossible to check if the entity is in a container
  54. if (TerminatingOrDeleted(shooter.Value))
  55. return;
  56. if (!_container.IsEntityOrParentInContainer(shooter.Value))
  57. args.Cancelled = true;
  58. }
  59. }
  60. private void SetActive(Entity<RequireProjectileTargetComponent> ent, bool value)
  61. {
  62. if (ent.Comp.Active == value)
  63. return;
  64. ent.Comp.Active = value;
  65. Dirty(ent);
  66. }
  67. private void StandingBulletHit(Entity<RequireProjectileTargetComponent> ent, ref StoodEvent args)
  68. {
  69. SetActive(ent, false);
  70. }
  71. private void LayingBulletPass(Entity<RequireProjectileTargetComponent> ent, ref DownedEvent args)
  72. {
  73. SetActive(ent, true); // stalker-changes
  74. }
  75. }