1
0

RepairableSystem.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using Content.Server.Administration.Logs;
  2. using Content.Shared.Damage;
  3. using Content.Shared.Database;
  4. using Content.Shared.Interaction;
  5. using Content.Shared.Popups;
  6. using Content.Shared.Repairable;
  7. using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem;
  8. namespace Content.Server.Repairable
  9. {
  10. public sealed class RepairableSystem : SharedRepairableSystem
  11. {
  12. [Dependency] private readonly SharedToolSystem _toolSystem = default!;
  13. [Dependency] private readonly DamageableSystem _damageableSystem = default!;
  14. [Dependency] private readonly SharedPopupSystem _popup = default!;
  15. [Dependency] private readonly IAdminLogManager _adminLogger= default!;
  16. public override void Initialize()
  17. {
  18. SubscribeLocalEvent<RepairableComponent, InteractUsingEvent>(Repair);
  19. SubscribeLocalEvent<RepairableComponent, RepairFinishedEvent>(OnRepairFinished);
  20. }
  21. private void OnRepairFinished(EntityUid uid, RepairableComponent component, RepairFinishedEvent args)
  22. {
  23. if (args.Cancelled)
  24. return;
  25. if (!EntityManager.TryGetComponent(uid, out DamageableComponent? damageable) || damageable.TotalDamage == 0)
  26. return;
  27. if (component.Damage != null)
  28. {
  29. var damageChanged = _damageableSystem.TryChangeDamage(uid, component.Damage, true, false, origin: args.User);
  30. _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} by {damageChanged?.GetTotal()}");
  31. }
  32. else
  33. {
  34. // Repair all damage
  35. _damageableSystem.SetAllDamage(uid, damageable, 0);
  36. _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} back to full health");
  37. }
  38. var str = Loc.GetString("comp-repairable-repair",
  39. ("target", uid),
  40. ("tool", args.Used!));
  41. _popup.PopupEntity(str, uid, args.User);
  42. var ev = new RepairedEvent((uid, component), args.User);
  43. RaiseLocalEvent(uid, ref ev);
  44. }
  45. public async void Repair(EntityUid uid, RepairableComponent component, InteractUsingEvent args)
  46. {
  47. if (args.Handled)
  48. return;
  49. // Only try repair the target if it is damaged
  50. if (!TryComp<DamageableComponent>(uid, out var damageable) || damageable.TotalDamage == 0)
  51. return;
  52. float delay = component.DoAfterDelay;
  53. // Add a penalty to how long it takes if the user is repairing itself
  54. if (args.User == args.Target)
  55. {
  56. if (!component.AllowSelfRepair)
  57. return;
  58. delay *= component.SelfRepairPenalty;
  59. }
  60. // Run the repairing doafter
  61. args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, delay, component.QualityNeeded, new RepairFinishedEvent(), component.FuelCost);
  62. }
  63. }
  64. /// <summary>
  65. /// Event raised on an entity when its successfully repaired.
  66. /// </summary>
  67. /// <param name="Ent"></param>
  68. /// <param name="User"></param>
  69. [ByRefEvent]
  70. public readonly record struct RepairedEvent(Entity<RepairableComponent> Ent, EntityUid User);
  71. }