My code will not work and I have no idea why!

I am making a piggy inspired game from scratch will the help of my friend, and he is the builder. I am the programmer of the game, and I am having some difficulties in my system that detects if the game is over or not. If the timer runs out it is over. If everyone dies or leaves the game, the round is over. If the slayer dies or leaves the game, the round is over. The timer part works completely fine, but the other 2 options work and don’t work. They work very well if you are doing 1 player, but not that good when multiple players get selected. I have gone over my code a bunch of times, and I even tried making it double-check, and still nothing. Voting works fine, but this glitch only happens when a player is selected and not a bot. Here is my round system code:

while true do
	for i, v in pairs(game.Players:GetChildren()) do
		v.Character.Humanoid.Health = v.Character.Humanoid.MaxHealth -- Makes sure the player's health is full
	end
	for i = 45, 0, -1 do
		game.ReplicatedStorage.Status.Value = "<ContainerHorizontalAlignment=Center><AnimateStepFrequency=0>Intermission: <AnimateStyle=Fade><AnimateStyleTime=0.25><Color=Green>" .. i  -- I used rich text module made by defaultio
		wait(1)
	end
	local slayer
	local gameOver = false
	local slayerLeft = false
	local players = game.Players:GetChildren() -- a table listing all of the players that we will put into the round
	local chosenMode = "Player"
	local numPlayers = #game.Players:GetChildren() -- the number of players
	for i, v in pairs(players) do -- Doesn't add the player to the round if they are still loading
		if not v.Character then
			numPlayers = numPlayers - 1
			table.remove(players, i)
		end
	end
	if numPlayers == 1 or #players == 1 then -- Automatically chooses bot if only 1 player in the server
		chosenMode = "Bot"
	else
		if #game.ReplicatedStorage.BotVote:GetChildren() > #game.ReplicatedStorage.PlayerVote:GetChildren() then
			chosenMode = "Bot"
		else
			chosenMode = "Player"
			numPlayers = numPlayers - 1
		end
	end
	if chosenMode == "Player" then
		slayer = game.Players:GetChildren()[math.random(1, #game.Players:GetChildren())] -- Choosing slayer is not the problem btw
	else
		slayer = game.ServerStorage.Bots.Bot:Clone()
	end
	for i, v in pairs(players) do
		if v.Name == slayer.Name then -- Removes the slayer from the player table
			table.remove(players, i)
		end
		v.Character.Humanoid.WalkSpeed = 16 + v.ExtraSpeed.Value -- Faster speed gamepass thing
		v.Character.Humanoid.Died:Connect(function() -- if player died, it will remove them from the players table
			table.remove(players, i)
			numPlayers = numPlayers - 1
			print(v, "Died!")
			if v.Character:FindFirstChildOfClass("Tool") then -- puts the tools back where they found it.
				game.ServerStorage.Tools:FindFirstChild(v.Character:FindFirstChildOfClass("Tool").Name).Parent = game.Workspace.CurrentMap.Keys
				v.Character:FindFirstChildOfClass("Tool"):Destroy()
			end
			if v.Backpack:FindFirstChildOfClass("Tool") then
				game.ServerStorage.Tools:FindFirstChild(v.Backpack:FindFirstChildOfClass("Tool").Name).Parent = game.Workspace.CurrentMap.Keys
				v.Backpack:FindFirstChildOfClass("Tool"):Destroy()
			end
		end)
	end
	game.ReplicatedStorage.Escape.OnServerEvent:Connect(function(player) -- if player escapes, they will be removed from the players table
		print(player, "Escaped")
		numPlayers = numPlayers - 1
		game.BadgeService:AwardBadge(player.UserId, 2124534311)
		player.Points.Value = player.Points.Value + (35 * player.Multiplier.Value)
		for i, v in pairs(players) do
			if v == player then
				table.remove(players, i)
			end
		end
	end)
	game.Players.PlayerRemoving:Connect(function(player)
		if player == slayer then -- resets game if slayer left
			players = {}
			gameOver = true
			slayerLeft = true
		else
			for i, v in pairs(players) do
				if v == player then
					table.remove(players, i)
				end
			end
		end
	end)
	if chosenMode == "Player" then -- resets the game if the slayer died
		slayer.Character.Humanoid.Died:Connect(function()
			gameOver = true
			slayerLeft = true
		end)
	end
	game.ReplicatedStorage.Status.Value = "<ContainerHorizontalAlignment=Center><AnimateStepFrequency=0.05><AnimateStyle=Fade><AnimateStyleTime=0.25><Color=Red>" .. slayer.Name .. "<Color=/> has been selected as<Color=Red> Slayer!<Color=/>" -- some more rich text
	wait(5)
	local map = game.ServerStorage.Maps.House:Clone()
	map.Parent = game.Workspace
	map.Name = "CurrentMap"
	game.ReplicatedStorage.Status.Value = "<ContainerHorizontalAlignment=Center><AnimateStepFrequency=0.05><AnimateStyle=Fade><AnimateStyleTime=0.25>Loading Map..."
	wait(5)
	game.ReplicatedStorage.Fade:FireAllClients(true)
	wait(2)
	game.ReplicatedStorage.Fade:FireAllClients(false)
	game.ReplicatedStorage.HideShop:FireAllClients(false)
	wait(0.1)
	if chosenMode == "Player" then
		game.ReplicatedStorage.Backpack:FireClient(slayer, false) -- hides the slayer's backpack
	end
	for i, v in pairs(players) do
		game.ReplicatedStorage.Intro:FireClient(v)
	end
	game.ReplicatedStorage.Intro:FireClient(slayer)
	for i, v in pairs(players) do -- for the intro
		if v.Character then
			pcall(function()
				v.Character:SetPrimaryPartCFrame(CFrame.new(266.253, -29.26, -93.261) * CFrame.Angles(0, math.rad(90), 0))
			end)
		end
	end
	wait(30)
	game.Workspace.GameTimeMusic:Play()
	if chosenMode == "Player" then -- changes player to the slayer skin
		skin = game.ServerStorage.Skins:FindFirstChild(slayer.Equip.Value):Clone()
		skin.Name = slayer.Name
		slayer.Character = skin
		skin.Parent = game.Workspace
		slayer.Character:SetPrimaryPartCFrame(CFrame.new(339.263, 4, 205.29))
		skin.Humanoid.WalkSpeed = 16 + slayer.ExtraSpeed.Value
	end
	for i, v in pairs(players) do
		if v.Name ~= slayer.Name then
			pcall(function()
				v.Character:SetPrimaryPartCFrame(map.Spawn.CFrame)
			end)
		end
	end
	game.ReplicatedStorage.CurrentSlayer.Value = slayer.Name
	for i = 480, 0, -1 do -- timer system
		local timer = math.floor(i / 60) .. ":" .. i % 60
		if i % 60 < 10 then
			timer = math.floor(i / 60) .. ":0" .. i % 60
		end
		if i == 450 then
			if chosenMode == "Player" then
				slayer.Character:SetPrimaryPartCFrame(map.Spawn.CFrame)
			else
				slayer.Parent = game.Workspace
				slayer:SetPrimaryPartCFrame(map.Spawn.CFrame)
			end
		end
		game.ReplicatedStorage.Status.Value = "<ContainerHorizontalAlignment=Center><AnimateStepFrequency=0>Game Time: <AnimateStyle=Fade><AnimateStyleTime=0.25><Color=Green>" .. timer
		wait(1)
		if #players == 0 then
			gameOver = true
		end
		if numPlayers == 0 then
			gameOver = true
		end
		if gameOver then -- resets game if gameOver is set to true
			break
		end
	end
	game.Workspace.GameTimeMusic:Stop()
	game.ReplicatedStorage.Status.Value = "<ContainerHorizontalAlignment=Center><AnimateStepFrequency=0.05><AnimateStyle=Fade><AnimateStyleTime=0.25>Game Over!"
	wait(3)
	game.ReplicatedStorage.Backpack:FireAllClients(true)
	game.Workspace.TrapsPlacement:ClearAllChildren()
	map:Destroy()
	if not slayerLeft then
		if chosenMode == "Player" then -- turns player back to normal if slayer
			slayer:LoadCharacter()
			skin:Destroy()
		else
			slayer:Destroy()
		end
	end
	game.ReplicatedStorage.CurrentSlayer.Value = ""
	game.ReplicatedStorage.HideShop:FireAllClients(true)
	for i, v in pairs(players) do -- teleports players back to the lobby
		if v then
			v.Character:MoveTo(game.Workspace:FindFirstChild("SpawnLocation" .. math.random(1, 3)).Position)
		end
	end
	game.ReplicatedStorage.BotVote:ClearAllChildren()
	game.ReplicatedStorage.PlayerVote:ClearAllChildren()
	game.ServerStorage.Tools:ClearAllChildren()
end

I just cannot figure out why it doesn’t work. I sometimes found that if a player dies it sometimes doesn’t do anything. Is the script not efficient or is it an error? I can’t seem to know!

Check the output window. And send screenshots if there are any errors. It really helps us in pointing out the error.

1 Like

the problem is that it doesn’t show errors! When i debugged, it would show that it sees that the player has died but then it doesn’t remove them from the table or anything!

i literally just said there are no errors

Concerns Some may be related to the issue, some may not.

  • First of all, how is anything in ReplicatedStorage handled beforehand? You are getting the children of it and counting the children, but please don’t say that’s handled on the Client because nothing on the Client in ReplicatedStorage will replicate to the Server, it’s only the other way around. (??? not sure if this causes anything ???)
  • You don’t know if a player’s character even exists when you run the first bit of code (health setting).
  • Wrap that for i=45 part in a spawn() or coroutine(), otherwise the code will wait for each wait(1) to run before doing anything else.
  • Shouldn’t you remove the slayer from the table before running the for i,v in pairs(players)?
  • Why are you checking if slayerLeft just as the game should start?
  • Stop calling game.Workspace, it’s slower than just calling workspace.
  • Don’t keep indexing game.ReplicatedStorage in future, assign it to a variable and call it from the variable.
  • Wrap timer based stuff in spawn() or coroutine().
  • Simply relying on an event fired by the client to handle escapes means your game will be super vulnerable to exploits.
  • Perhaps you may want to wrap the entire thing in a pcall() and do the following:
local succ,err = pcall(function()
   -- code
end)
warn(err)

I know a lot of it is just nitpicking, but I think it’s still something worth caring about. I apologise if none of it actually helps you with your issue, but I couldn’t help but point them out.