using Content.Server.Atmos.EntitySystems; using Content.Shared.Atmos.Components; using Content.Shared.Buckle.Components; using Robust.Shared.Timing; namespace Content.Server.Buckle.Systems; public sealed class IgniteOnBuckleSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly FlammableSystem _flammable = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStrapped); SubscribeLocalEvent(OnUnstrapped); SubscribeLocalEvent(ActiveOnInit); } private void OnStrapped(Entity ent, ref StrappedEvent args) { // We cache the values here to the other component. // This is done so we have to do less lookups var comp = EnsureComp(args.Buckle); comp.FireStacks = ent.Comp.FireStacks; comp.MaxFireStacks = ent.Comp.MaxFireStacks; comp.IgniteTime = ent.Comp.IgniteTime; } private void ActiveOnInit(Entity ent, ref MapInitEvent args) { // Handle this via a separate MapInit so the component can be added by itself if need be. ent.Comp.NextIgniteTime = _timing.CurTime + ent.Comp.NextIgniteTime; Dirty(ent); } private void OnUnstrapped(Entity ent, ref UnstrappedEvent args) { RemCompDeferred(args.Buckle); } public override void Update(float frameTime) { base.Update(frameTime); var curTime = _timing.CurTime; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var igniteComponent, out var flammableComponent)) { if (curTime < igniteComponent.NextIgniteTime) continue; igniteComponent.NextIgniteTime += TimeSpan.FromSeconds(igniteComponent.IgniteTime); Dirty(uid, igniteComponent); if (flammableComponent.FireStacks > igniteComponent.MaxFireStacks) continue; var stacks = flammableComponent.FireStacks + igniteComponent.FireStacks; if (igniteComponent.MaxFireStacks.HasValue) stacks = Math.Min(stacks, igniteComponent.MaxFireStacks.Value); _flammable.SetFireStacks(uid, stacks, flammableComponent, true); } } }