diff --git a/Content.Server/Stack/StackSystem.cs b/Content.Server/Stack/StackSystem.cs index bac789716c..b9553a6b84 100644 --- a/Content.Server/Stack/StackSystem.cs +++ b/Content.Server/Stack/StackSystem.cs @@ -100,19 +100,55 @@ namespace Content.Server.Stack /// public List SpawnMultiple(string entityPrototype, int amount, EntityCoordinates spawnPosition) { - var proto = _prototypeManager.Index(entityPrototype); - proto.TryGetComponent(out var stack); - var maxCountPerStack = GetMaxCount(stack); + var spawns = CalculateSpawns(entityPrototype, amount); + var spawnedEnts = new List(); + foreach (var count in spawns) + { + var entity = SpawnAtPosition(entityPrototype, spawnPosition); + spawnedEnts.Add(entity); + SetCount(entity, count); + } + + return spawnedEnts; + } + + /// + public List SpawnMultiple(string entityPrototype, int amount, EntityUid target) + { + var spawns = CalculateSpawns(entityPrototype, amount); + + var spawnedEnts = new List(); + foreach (var count in spawns) + { + var entity = SpawnNextToOrDrop(entityPrototype, target); + spawnedEnts.Add(entity); + SetCount(entity, count); + } + + return spawnedEnts; + } + + /// + /// Calculates how many stacks to spawn that total up to . + /// + /// The stack to spawn. + /// The amount of pieces across all stacks. + /// The list of stack counts per entity. + private List CalculateSpawns(string entityPrototype, int amount) + { + var proto = _prototypeManager.Index(entityPrototype); + proto.TryGetComponent(out var stack, EntityManager.ComponentFactory); + var maxCountPerStack = GetMaxCount(stack); + var amounts = new List(); while (amount > 0) { - var entity = Spawn(entityPrototype, spawnPosition); - spawnedEnts.Add(entity); var countAmount = Math.Min(maxCountPerStack, amount); - SetCount(entity, countAmount); amount -= countAmount; + amounts.Add(countAmount); } - return spawnedEnts; + + return amounts; } private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent args)