So, every time a round begins a course is selected and the obstacles appear. Players get to run thru the course and make their way to either a win or fail. However, when a player wins or fails the course has been already used and the following player cannot play because the obstacles don't reset. Can you make it so that every time a player goes up on stage the already selected course (set) resets so it can be reused?

function Core:LoadStage(stageNumber)

	if Core.StageLoaded then warn("There is alread a stage loaded, unload it frst"); return; end;
	Core.StageNumber = stageNumber;
	local Stage = game:GetService("ServerStorage"):FindFirstChild("Stages"):WaitForChild("Stage" .. stageNumber);
	if Stage:FindFirstChild("TimeLimit") then Core.TimeLimit = Stage:FindFirstChild("TimeLimit").Value; end;
	if not Stage:FindFirstChild("StageTP") or not Stage:FindFirstChild("FinishButton") then
		warn("Stage missing StageTP or FinishButton!");
		return;
	end;
	Core.Stage:ClearAllChildren();
	Stage = Stage:Clone();
	local randStageMap = game:GetService("ServerStorage"):FindFirstChild("Clones"):WaitForChild("Stage"..stageNumber.."C"):GetChildren()
	local actualMap = randStageMap[math.random(1,#randStageMap)]:Clone()
	actualMap.Parent = Core.Stage
	for _,obj in pairs(Stage:GetChildren()) do obj.Parent = Core.Stage; end;
	
	local deb = true;
	
	Core.FinishedButtonCon = Core.Stage:WaitForChild("FinishButton").Touched:Connect(function(hit)
		if deb then
			deb = not deb;
			if not game:GetService("Players"):GetPlayerFromCharacter(hit.Parent) then hit = hit.Parent; end;
		  local player = game:GetService("Players"):GetPlayerFromCharacter(hit.Parent);
			if player then
		  	Core.Finished[player.UserId] = 1;
				local points = player:FindFirstChild("leaderstats"):FindFirstChild("Stage " .. stageNumber);
  	  	points.Value = points.Value + 1;
			end;
			wait(2);
			deb = not deb;
		end;
	end);
	Core.WaterCon = Core.Stage:WaitForChild("Water").Touched:Connect(function(hit)
		if not game:GetService("Players"):GetPlayerFromCharacter(hit.Parent) then hit = hit.Parent; end;
	  local player = game:GetService("Players"):GetPlayerFromCharacter(hit.Parent);
		if player then
		  Core.Finished[player.UserId] = -1;
		end;
	end);
	
	Core.StageLoaded = true;
end;

function Core:UnloadStage()
	if Core.StageRunning then warn("Stage is running!"); return; end;
	Core.Stage:ClearAllChildren();
	Core.FinishedButtonCon = nil;
	Core.WaterCon = nil;
	Core.StageLoaded = false;
end;

function Core:RunStage()
	if Core.StageRunning then warn("Stage in progress!"); return; end;
	if not Core.StageLoaded then warn("No stage loaded!"); return; end;
	
	Core.StageRunning = true;
	local h = workspace:FindFirstChild("Message") or Instance.new("Hint", workspace);
	
	local Players = game:GetService("Players"):GetPlayers();
do
  for i = #Players, 2, -1 do
    local j = math.random(i)
    Players[i], Players[j] = Players[j], Players[i];
  end;
end;
local playerRunning = false;
	local pNum = 1;
	local passedLast = false;
	for _,a in pairs(Core.Finished) do
		if a == 1 then passedLast = true; end;
	end;
	if passedLast or Core.StageNumber == 1 then
	for number, Player in pairs(Players) do
		if Core.StageNumber == 1 then Core.Finished[Player.UserId] = 0; end;
		spawn(function()
			repeat wait(); until pNum == number;
			if Core.StageNumber == 1 or Core.Finished[Player.UserId] == 1 then
				Core.Finished[Player.UserId] = 0;
				h.Text = Player.Name .. " is about to run stage 1!";
				if Player.Character then
					Player.Character:WaitForChild("Humanoid").WalkSpeed = 0;
					Player.Character:SetPrimaryPartCFrame(Core.Stage:FindFirstChild("StageTP", true).CFrame);
					h.Text = "5";
					wait(1);
					h.Text = "4";
					wait(1);
					h.Text = "3";
					wait(1);
					h.Text = "2";
					wait(1);
					h.Text = "1";
					wait(1);
					h.Text = "Go!";
					if Player.Character then
						Player.Character:WaitForChild("Humanoid").WalkSpeed = 16;
					end;
					local sTick, vTick = tick(), tick();
					if Core.ThemeSongs[Player.UserId] then
						table.foreach(Core.ThemeSongs[Player.UserId], print);
						if Core.ThemeSongs[Player.UserId][Core.StageNumber] then
							Core.Sound.SoundId = "rbxassetid://" .. Core.ThemeSongs[Player.UserId][Core.StageNumber];
							Core.Sound:Play();
						end;
					end;
					repeat
						wait();
						if Player.Character then
							local head = Player.Character:FindFirstChild("Humanoid");
							if head.MoveDirection.Magnitude > 0 then
								vTick = tick();
							end;
						end;
						h.Text = string.format("%.2f left!", Core.TimeLimit - (tick() - sTick));
						print(Core.Finished[Player.UserId] == 1, Core.Finished[Player.UserId] == -1,
							math.floor(tick() - sTick) >= Core.TimeLimit,
							Player.Character == nil,
							math.floor(tick() - vTick) >= Core.AFKLimit);
					until Core.Finished[Player.UserId] == 1 or Core.Finished[Player.UserId] == -1
						or math.floor(tick() - sTick) >= Core.TimeLimit or Player.Character == nil
						or math.floor(tick() - vTick) >= Core.AFKLimit;
					Core.Sound:Stop();
					if Player.Character then
						if Core.Finished[Player.UserId] and Core.Finished[Player.UserId] == 1 then h.Text = string.format("%s finished in %.2f seconds!", Player.Name, (tick() - sTick));
						elseif Core.Finished[Player.UserId] == -1 then h.Text = string.format("%s has failed.", Player.Name);
						else
							if math.floor(tick() - vTick) >= Core.AFKLimit then
								h.Text = Player.Name .. " Has been disqualified - AFK.";
							else
								h.Text = Player.Name .. " did not finish in time!";
							end;
						end;
						Player.Character:SetPrimaryPartCFrame(workspace:FindFirstChild("Map"):FindFirstChild("LobbyTP").CFrame);
					else
						Core.Finished[Player.UserId] = -1;
						h.Text = "Disqualified";
					end;
				end;
				wait(Player.Character == nil and 1 or 9);
			end;
			playerRunning = false;
			pNum = pNum + 1;
		end);
	end;
	repeat wait(); until pNum > #Players;
	end;
	
	Core.StageRunning = false;
end;

function Core:SetLimit(seconds)
	Core.TimeLimit = tonumber(seconds);
end;

function Core:SetAFKLimit(seconds)
	Core.AFKLimit = tonumber(seconds);
end;

function Core:SetThemeSongs(player, songs)
	Core.ThemeSongs[player.UserId] = songs;
end;


return Core;