My script is supposed to detect If the player is touching a part, then give them a win and some points. If the player jumps on the win button, however, they can get up to 5 wins. Is there a way to fix this?
Script:
local Players = game:GetService("Players") local ServerStorage = game:GetService("ServerStorage") local checkpoint = script.Parent function onTouched(hit) if hit and hit.Parent and hit.Parent:FindFirstChildOfClass("Humanoid") then local player = Players:GetPlayerFromCharacter(hit.Parent) player:LoadCharacter() player:WaitForChild("leaderstats").Wins.Value = player:WaitForChild("leaderstats").Wins.Value + 1 player:WaitForChild("leaderstats").Points.Value = player:WaitForChild("leaderstats").Points.Value + math.random(20,30) local checkpointData = ServerStorage:FindFirstChild("CheckpointData") if not checkpointData then checkpointData = Instance.new("Folder") checkpointData.Name = "CheckpointData" checkpointData.Parent = ServerStorage end local userIdString = tostring(player.UserId) local checkpointValue = checkpointData:FindFirstChild(userIdString) if not checkpointValue then checkpointValue = Instance.new("ObjectValue") checkpointValue.Name = userIdString checkpointValue.Parent = checkpointData player.CharacterAdded:connect(function(character) wait() local storedCheckpoint = ServerStorage.CheckpointData[userIdString].Value character:MoveTo(storedCheckpoint.Position + Vector3.new(math.random(-4, 4), 4, math.random(-4, 4))) end) end checkpointValue.Value = workspace.Start.SpawnLocation end wait(1) end checkpoint.Touched:Connect(onTouched)
This answer's to be used as a reference, and assumes you have prior knowledge with Touched
The solution to your problem's to use a debounce
. A debounce, to put simply, is a bool that tells the function whether to execute the code or not for a specific amount of time.
Let's take a common example: the Touched
-- Assuming `Part` was already declared. Part.Touched:Connect(function(Hit) print(Hit.Name, 'stepped on me!'); end)
When you step on the part, you'll notice it prints a lot. Maybe 8-10 times. Pretty annoying, right? But, like a said before, there's a solution: a debounce. With the code from before, lets implement the debounce into it.
local Debounce = true; Part.Touched:Connect(function(Hit) if Debounce then Debounce = false; print(Hit.Name, 'stepped on me!'); wait(1); Debounce = true; end end)
You'll notice that when you step on it, it only prints once after every 1 second. Pretty neat, right? The reason this occurs is because...
The conditional statement (if
) is checking if Debounce
is truthy (or true). If it is, it's going to execute the following.
Set the Debounce variable to false, so that on the next check it doesn't fire.
It'll print Hit_Name stepped on me!
Waits 1 second
Sets Debounce
back to true after the 1 second.
Not sure if there's any other explanation needed lol.
If you have any questions, please don't hesitate to ask me. :) I hope this helped! :D