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;
