1
0

DamageOtherOnHitSystem.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Content.Server.Administration.Logs;
  2. using Content.Server.Damage.Components;
  3. using Content.Server.Weapons.Ranged.Systems;
  4. using Content.Shared.CombatMode.Pacification;
  5. using Content.Shared.Camera;
  6. using Content.Shared.Damage;
  7. using Content.Shared.Damage.Events;
  8. using Content.Shared.Damage.Systems;
  9. using Content.Shared.Database;
  10. using Content.Shared.Effects;
  11. using Content.Shared.Mobs.Components;
  12. using Content.Shared.Throwing;
  13. using Content.Shared.Wires;
  14. using Robust.Shared.Physics.Components;
  15. using Robust.Shared.Player;
  16. namespace Content.Server.Damage.Systems
  17. {
  18. public sealed class DamageOtherOnHitSystem : EntitySystem
  19. {
  20. [Dependency] private readonly IAdminLogManager _adminLogger = default!;
  21. [Dependency] private readonly GunSystem _guns = default!;
  22. [Dependency] private readonly DamageableSystem _damageable = default!;
  23. [Dependency] private readonly DamageExamineSystem _damageExamine = default!;
  24. [Dependency] private readonly SharedCameraRecoilSystem _sharedCameraRecoil = default!;
  25. [Dependency] private readonly SharedColorFlashEffectSystem _color = default!;
  26. public override void Initialize()
  27. {
  28. SubscribeLocalEvent<DamageOtherOnHitComponent, ThrowDoHitEvent>(OnDoHit);
  29. SubscribeLocalEvent<DamageOtherOnHitComponent, DamageExamineEvent>(OnDamageExamine);
  30. SubscribeLocalEvent<DamageOtherOnHitComponent, AttemptPacifiedThrowEvent>(OnAttemptPacifiedThrow);
  31. }
  32. private void OnDoHit(EntityUid uid, DamageOtherOnHitComponent component, ThrowDoHitEvent args)
  33. {
  34. if (TerminatingOrDeleted(args.Target))
  35. return;
  36. var dmg = _damageable.TryChangeDamage(args.Target, component.Damage * _damageable.UniversalThrownDamageModifier, component.IgnoreResistances, origin: args.Component.Thrower);
  37. // Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying.
  38. if (dmg != null && HasComp<MobStateComponent>(args.Target))
  39. _adminLogger.Add(LogType.ThrowHit, $"{ToPrettyString(args.Target):target} received {dmg.GetTotal():damage} damage from collision");
  40. if (dmg is { Empty: false })
  41. {
  42. _color.RaiseEffect(Color.Red, new List<EntityUid>() { args.Target }, Filter.Pvs(args.Target, entityManager: EntityManager));
  43. }
  44. _guns.PlayImpactSound(args.Target, dmg, null, false);
  45. if (TryComp<PhysicsComponent>(uid, out var body) && body.LinearVelocity.LengthSquared() > 0f)
  46. {
  47. var direction = body.LinearVelocity.Normalized();
  48. _sharedCameraRecoil.KickCamera(args.Target, direction);
  49. }
  50. }
  51. private void OnDamageExamine(EntityUid uid, DamageOtherOnHitComponent component, ref DamageExamineEvent args)
  52. {
  53. _damageExamine.AddDamageExamine(args.Message, _damageable.ApplyUniversalAllModifiers(component.Damage * _damageable.UniversalThrownDamageModifier), Loc.GetString("damage-throw"));
  54. }
  55. /// <summary>
  56. /// Prevent players with the Pacified status effect from throwing things that deal damage.
  57. /// </summary>
  58. private void OnAttemptPacifiedThrow(Entity<DamageOtherOnHitComponent> ent, ref AttemptPacifiedThrowEvent args)
  59. {
  60. args.Cancel("pacified-cannot-throw");
  61. }
  62. }
  63. }