| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- using Content.Server.Administration.Logs;
- using Content.Shared.Damage;
- using Content.Shared.Database;
- using Content.Shared.Interaction;
- using Content.Shared.Popups;
- using Content.Shared.Repairable;
- using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem;
- namespace Content.Server.Repairable
- {
- public sealed class RepairableSystem : SharedRepairableSystem
- {
- [Dependency] private readonly SharedToolSystem _toolSystem = default!;
- [Dependency] private readonly DamageableSystem _damageableSystem = default!;
- [Dependency] private readonly SharedPopupSystem _popup = default!;
- [Dependency] private readonly IAdminLogManager _adminLogger= default!;
- public override void Initialize()
- {
- SubscribeLocalEvent<RepairableComponent, InteractUsingEvent>(Repair);
- SubscribeLocalEvent<RepairableComponent, RepairFinishedEvent>(OnRepairFinished);
- }
- private void OnRepairFinished(EntityUid uid, RepairableComponent component, RepairFinishedEvent args)
- {
- if (args.Cancelled)
- return;
- if (!EntityManager.TryGetComponent(uid, out DamageableComponent? damageable) || damageable.TotalDamage == 0)
- return;
- if (component.Damage != null)
- {
- var damageChanged = _damageableSystem.TryChangeDamage(uid, component.Damage, true, false, origin: args.User);
- _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} by {damageChanged?.GetTotal()}");
- }
- else
- {
- // Repair all damage
- _damageableSystem.SetAllDamage(uid, damageable, 0);
- _adminLogger.Add(LogType.Healed, $"{ToPrettyString(args.User):user} repaired {ToPrettyString(uid):target} back to full health");
- }
- var str = Loc.GetString("comp-repairable-repair",
- ("target", uid),
- ("tool", args.Used!));
- _popup.PopupEntity(str, uid, args.User);
- var ev = new RepairedEvent((uid, component), args.User);
- RaiseLocalEvent(uid, ref ev);
- }
- public async void Repair(EntityUid uid, RepairableComponent component, InteractUsingEvent args)
- {
- if (args.Handled)
- return;
- // Only try repair the target if it is damaged
- if (!TryComp<DamageableComponent>(uid, out var damageable) || damageable.TotalDamage == 0)
- return;
- float delay = component.DoAfterDelay;
- // Add a penalty to how long it takes if the user is repairing itself
- if (args.User == args.Target)
- {
- if (!component.AllowSelfRepair)
- return;
- delay *= component.SelfRepairPenalty;
- }
- // Run the repairing doafter
- args.Handled = _toolSystem.UseTool(args.Used, args.User, uid, delay, component.QualityNeeded, new RepairFinishedEvent(), component.FuelCost);
- }
- }
- /// <summary>
- /// Event raised on an entity when its successfully repaired.
- /// </summary>
- /// <param name="Ent"></param>
- /// <param name="User"></param>
- [ByRefEvent]
- public readonly record struct RepairedEvent(Entity<RepairableComponent> Ent, EntityUid User);
- }
|