I’m not sure why you’re using coroutines for the wave system, that will make every wave play at once. I would also recommend using task.spawn. It’s more lightweight and better fits your purposes. You should also be setting .Parent last for these reasons.
Spawn code:
function Spawn_Sequence(wave)
for i, sequence in pairs(wave) do
task.wait(sequence.SpawnDelay)
for x=1, sequence.EnemyCount do
task.spawn(addToDatabase, sequence.Enemy)
local EnemyID = #Database
local randomOffset = Random.new():NextNumber(-1, 1)
local model = EnemyModels[sequence.Enemy.Name]:Clone()
model.Name = tostring(EnemyID)
model:SetAttribute("EnemyName", sequence.Enemy.Name)
model:SetAttribute("PathOffset", randomOffset)
model:PivotTo(workspace.Path.StartNode.CFrame * CFrame.new(randomOffset, sequence.Enemy.HipHeight, 0))
model.Parent = workspace.Enemies
task.spawn(Move_Enemy, sequence.Enemy, EnemyID)
task.spawn(SetupEnemy, sequence.Enemy, EnemyID)
task.wait(sequence.SpawnRate)
end
end
end
Loop code:
local function Wave_System()
for count, wave in pairs(Waves.Casual) do
Spawn_Sequence(wave.Enemies)
end
end