using Content.Server.Body.Components; using Content.Server.Body.Systems; using Content.Shared.Chemistry.Components; using Content.Shared.Devour; using Content.Shared.Devour.Components; using Content.Shared.Humanoid; namespace Content.Server.Devour; public sealed class DevourSystem : SharedDevourSystem { [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent(OnGibContents); } private void OnDoAfter(EntityUid uid, DevourerComponent component, DevourDoAfterEvent args) { if (args.Handled || args.Cancelled) return; var ichorInjection = new Solution(component.Chemical, component.HealRate); if (component.FoodPreference == FoodPreference.All || (component.FoodPreference == FoodPreference.Humanoid && HasComp(args.Args.Target))) { ichorInjection.ScaleSolution(0.5f); if (component.ShouldStoreDevoured && args.Args.Target is not null) { ContainerSystem.Insert(args.Args.Target.Value, component.Stomach); } _bloodstreamSystem.TryAddToChemicals(uid, ichorInjection); } //TODO: Figure out a better way of removing structures via devour that still entails standing still and waiting for a DoAfter. Somehow. //If it's not human, it must be a structure else if (args.Args.Target != null) { QueueDel(args.Args.Target.Value); } _audioSystem.PlayPvs(component.SoundDevour, uid); } private void OnGibContents(EntityUid uid, DevourerComponent component, ref BeingGibbedEvent args) { if (!component.ShouldStoreDevoured) return; // For some reason we have two different systems that should handle gibbing, // and for some another reason GibbingSystem, which should empty all containers, doesn't get involved in this process ContainerSystem.EmptyContainer(component.Stomach); } }