using Content.Server.Administration.Logs; using Content.Server.Explosion.EntitySystems; using Content.Server.Kitchen.Components; using Content.Server.Power.Components; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Database; using Content.Shared.Power.Components; using Content.Shared.Rejuvenate; namespace Content.Server.Power.EntitySystems; /// /// Handles sabotaged/rigged objects /// public sealed class RiggableSystem : EntitySystem { [Dependency] private readonly ExplosionSystem _explosionSystem = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnMicrowaved); SubscribeLocalEvent(OnSolutionChanged); } private void OnRejuvenate(Entity entity, ref RejuvenateEvent args) { entity.Comp.IsRigged = false; } private void OnMicrowaved(Entity entity, ref BeingMicrowavedEvent args) { if (TryComp(entity, out var batteryComponent)) { if (batteryComponent.CurrentCharge == 0) return; } args.Handled = true; // What the fuck are you doing??? Explode(entity.Owner, batteryComponent, args.User); } private void OnSolutionChanged(Entity entity, ref SolutionContainerChangedEvent args) { if (args.SolutionId != entity.Comp.Solution) return; var wasRigged = entity.Comp.IsRigged; var quantity = args.Solution.GetReagentQuantity(entity.Comp.RequiredQuantity.Reagent); entity.Comp.IsRigged = quantity >= entity.Comp.RequiredQuantity.Quantity; if (entity.Comp.IsRigged && !wasRigged) { _adminLogger.Add(LogType.Explosion, LogImpact.Medium, $"{ToPrettyString(entity.Owner)} has been rigged up to explode when used."); } } public void Explode(EntityUid uid, BatteryComponent? battery = null, EntityUid? cause = null) { if (!Resolve(uid, ref battery)) return; var radius = MathF.Min(5, MathF.Sqrt(battery.CurrentCharge) / 9); _explosionSystem.TriggerExplosive(uid, radius: radius, user:cause); QueueDel(uid); } }