Issue with respawning & stage transfers

Posted about this game before, it’s just a difficulty chart. we made all the parts slippery to be unique but other than that it is pretty normal.

We created a very complicated stage transfer system that is over 3000 lines of code, lol. However, if you die while on a different stage, it teleports you to your highest stage.

We tried adding another value for the artificial stage, but that just made the game really slow and didn’t even work. the value stayed at 0 no matter what we tried.

Any ideas on how to fix this?

code:


local checkpoints = workspace:WaitForChild("Checkpoints")

local coinremote = game.ReplicatedStorage:WaitForChild("CoinGet")

local ms = game:GetService("MarketplaceService")

local vip = 25751808
local mvp = 25751816
local dc = 25751830

game.Players.PlayerAdded:Connect(function(player)
	
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local stage = Instance.new("IntValue")
	stage.Name = "Stage"
	stage.Value = "0"
	stage.Parent = leaderstats
	
	local coins = Instance.new("IntValue")
	coins.Name = "Coins"
	coins.Value = "0"
	coins.Parent = leaderstats

	player.CharacterAdded:Connect(function(char)
		local hum = char:WaitForChild("Humanoid")
		wait()
		char:MoveTo(checkpoints[stage.Value].Position)

		hum.Touched:Connect(function(hit)
			if hit.Parent == checkpoints then
				if tonumber(hit.Name) == stage.Value + 1 then
					stage.Value = stage.Value + 1
					if not ms:UserOwnsGamePassAsync(player.UserId,vip) and not ms:UserOwnsGamePassAsync(player.UserId,mvp) and not ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 5 -- none
					elseif ms:UserOwnsGamePassAsync(player.UserId,vip) and not ms:UserOwnsGamePassAsync(player.UserId,mvp) and not ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 6 -- vip
					elseif not ms:UserOwnsGamePassAsync(player.UserId,vip) and not ms:UserOwnsGamePassAsync(player.UserId,mvp) and ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 10 -- dc
					elseif not ms:UserOwnsGamePassAsync(player.UserId,vip) and ms:UserOwnsGamePassAsync(player.UserId,mvp) and not ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 7 -- mvp
					elseif ms:UserOwnsGamePassAsync(player.UserId,vip) and ms:UserOwnsGamePassAsync(player.UserId,mvp) and not ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 7 -- vip,mvp
					elseif ms:UserOwnsGamePassAsync(player.UserId,vip) and ms:UserOwnsGamePassAsync(player.UserId,mvp) and ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 10 -- vip,mvp,dc
					elseif not ms:UserOwnsGamePassAsync(player.UserId,vip) and ms:UserOwnsGamePassAsync(player.UserId,mvp) and ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 10 -- mvp,dc
					elseif ms:UserOwnsGamePassAsync(player.UserId,vip) and not ms:UserOwnsGamePassAsync(player.UserId,mvp) and ms:UserOwnsGamePassAsync(player.UserId,dc) then
						coins.Value = coins.Value + 10 -- vip,dc
					end
						
					coinremote:FireAllClients()
				end
			end
		end)
	end)
	
	
end)

Update: tried changing this

char:MoveTo(checkpoints[stage.Value].Position)

to the stage transfers text

didnt work