using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Database; using Content.Shared.Fluids.Components; using Content.Shared.Spillable; using Content.Shared.Throwing; namespace Content.Server.Fluids.EntitySystems; public sealed partial class PuddleSystem { protected override void InitializeSpillable() { base.InitializeSpillable(); SubscribeLocalEvent(SpillOnLand); // Openable handles the event if it's closed SubscribeLocalEvent(OnOverflow); SubscribeLocalEvent(OnDoAfter); } private void OnOverflow(Entity entity, ref SolutionContainerOverflowEvent args) { if (args.Handled) return; TrySpillAt(Transform(entity).Coordinates, args.Overflow, out _); args.Handled = true; } private void SpillOnLand(Entity entity, ref LandEvent args) { if (!_solutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.SolutionName, out var soln, out var solution)) return; if (Openable.IsClosed(entity.Owner)) return; if (!entity.Comp.SpillWhenThrown) return; if (args.User != null) { AdminLogger.Add(LogType.Landed, $"{ToPrettyString(entity.Owner):entity} spilled a solution {SharedSolutionContainerSystem.ToPrettyString(solution):solution} on landing"); } var drainedSolution = _solutionContainerSystem.Drain(entity.Owner, soln.Value, solution.Volume); TrySplashSpillAt(entity.Owner, Transform(entity).Coordinates, drainedSolution, out _); } private void OnDoAfter(Entity entity, ref SpillDoAfterEvent args) { if (args.Handled || args.Cancelled || args.Args.Target == null) return; //solution gone by other means before doafter completes if (!_solutionContainerSystem.TryGetDrainableSolution(entity.Owner, out var soln, out var solution) || solution.Volume == 0) return; var puddleSolution = _solutionContainerSystem.SplitSolution(soln.Value, solution.Volume); TrySpillAt(Transform(entity).Coordinates, puddleSolution, out _); args.Handled = true; } }