CatStation/Content.Shared/Chemistry/EntitySystems/RiggableSystem.cs
Princess Cheeseballs bb98838d67
Energy Bow Nerf (#44138)
* phase 1

* delayed knockdown

* brudda

* microbalance

* enrrhguy gjkasnnboew

* does nothing

* whoop

* fix YAML linter

* some more changes

* no discounts

* I hate ContainerContainer

* gorbino's quest

* asfassaffsa

* dgdgsdgsgds

* humburber

* better description

* make it a metabolite...

* nevermind

* API text

* grok

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
2026-09-05 23:45:37 +00:00

103 lines
3.5 KiB
C#

using Content.Shared.Administration.Logs;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Database;
using Content.Shared.Explosion.EntitySystems;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Kitchen;
using Content.Shared.Rejuvenate;
namespace Content.Shared.Power.EntitySystems;
/// <summary>
/// Handles sabotaged/rigged objects
/// </summary>
public sealed partial class RiggableSystem : EntitySystem
{
[Dependency] private ISharedAdminLogManager _adminLogger = default!;
[Dependency] private SharedBatterySystem _battery = default!;
[Dependency] private SharedExplosionSystem _explosionSystem = default!;
[Dependency] private SharedSolutionContainerSystem _solution = default!;
[SubscribeLocalEvent]
private void OnRejuvenate(Entity<RiggableComponent> entity, ref RejuvenateEvent args)
{
if (!_solution.TryGetSolution(entity.Owner, entity.Comp.Solution, out var solution, true))
return;
_solution.RemoveAllSolution(solution.Value);
entity.Comp.IsRigged = false;
DirtyField(entity, entity.Comp, nameof(RiggableComponent.IsRigged));
}
[SubscribeLocalEvent]
private void OnMicrowaved(Entity<RiggableComponent> entity, ref BeingMicrowavedEvent args)
{
if (!entity.Comp.IsRigged)
return;
Explode(entity, _battery.GetCharge(entity.Owner).Charge, args.User);
args.Handled = true;
}
[SubscribeLocalEvent]
private void OnSolutionChanged(Entity<RiggableComponent> entity, ref SolutionChangedEvent args)
{
if (args.Solution.Comp.Id != entity.Comp.Solution)
return;
var wasRigged = entity.Comp.IsRigged;
var solution = args.Solution.Comp.Solution;
var quantity = solution.GetReagentQuantity(entity.Comp.Reagent.Reagent);
entity.Comp.IsRigged = quantity >= entity.Comp.Reagent.Quantity;
if (wasRigged || !entity.Comp.IsRigged)
return;
_adminLogger.Add(LogType.Explosion, LogImpact.Medium, $"{ToPrettyString(entity)} has been rigged up to explode when used.");
if (!TryComp<ItemToggleComponent>(entity, out var toggleComp) || !toggleComp.Activated)
return;
Explode(entity, _battery.GetCharge(entity.Owner).Charge);
}
[SubscribeLocalEvent]
private void OnChargeChanged(Entity<RiggableComponent> entity, ref ChargeChangedEvent args)
{
if (!entity.Comp.IsRigged)
return;
if (args.CurrentCharge == 0f)
return; // No charge to cause an explosion.
// Don't explode if we are not using any charge.
if (args.CurrentChargeRate == 0f && args.Delta == 0f)
return;
Explode(entity, args.CurrentCharge);
}
[SubscribeLocalEvent]
private void OnToggled(Entity<RiggableComponent> entity, ref ItemToggledEvent args)
{
if (!args.Activated || !entity.Comp.IsRigged)
return;
Explode(entity, _battery.GetCharge(entity.Owner).Charge, args.User);
}
public void Explode(Entity<RiggableComponent> entity, float charge, EntityUid? cause = null)
{
if (entity.Comp.Exploded || charge == 0f)
return;
var radius = MathF.Min(5, MathF.Sqrt(charge) / 9);
// Explosion system also queues entity deletion
_explosionSystem.TriggerExplosive(entity, radius: radius, user: cause);
entity.Comp.Exploded = true;
DirtyField(entity, entity.Comp, nameof(RiggableComponent.Exploded));
}
}