When the player touches the ball, it creates Number Value. What I want it to do is when the player touches ball, the number value will keep on growing to a bigger number. I also what it to stop in 2 ways. 1 if it reaches to 200, it stops counting. 2 when somebody else touches the ball, it stops counting the person number who previously touched it. I try to do the number the loop but I did not under stand what i did.
local BallTarget = game.Workspace.BallTarget local PlayersName = game.Workspace.BallTarget.BillboardGui.PlayersName BallTarget.Touched:connect(function(hit) if hit.Parent:FindFirstChild("Humanoid") and game.Players:GetPlayerFromCharacter(hit.Parent) then PlayersName.Text = hit.Parent.Name BallTarget.Material = ("Neon") BallTarget.BrickColor = hit.Parent:FindFirstChild("Torso").BrickColor numvalue.Value = 0 while true do number = numvalue.Value + 1 print(number) wait(1) end end end) function BallTargethit(otherPart) if otherPart ~= nil and otherPart.Parent ~= nil and otherPart.Parent:FindFirstChild("Humanoid") then print("A player hit me!") if not BallTarget:FindFirstChild(otherPart.Parent.Name) then local playerTag = Instance.new("NumberValue") playerTag.Parent = BallTarget playerTag.Name = otherPart.Parent.Name end end end numvalue.Value = 0 while true do number = numvalue.Value + 1 Value = (number) wait(1) end BallTarget.Touched:connect(BallTargethit)
The easiest way to accomplish what you want isn't by using NumberValues, but rather by using a table (or more specifically a dictionary). This way you can assign a Key to the table for each player who touches the ball that holds a value equal to the number of seconds they have been touching it. All we need to do is check if the player's points have been set yet, and initialize them to zero if not:
local points = {} Ball.Touched:connect(function(hit) local player = game.Players:GetPlayerFromCharacter(hit.Parent) if player and not points[player] then points[player] = 0 end end)
Now we'll need a loop to add points to the last person who touched the ball's score. We'll create a new variable called LastPlayerTouched that we will have update each time a new player touches the ball. Then we'll call a new function called AddPoints that takes one argument, the player. This function creates a while loop that will run until LastPlayerTouched is no longer equal to the argument player (i.e. when another player touches the ball):
local LastPlayerTouched = nil local function AddPoints(player) while LastPlayerTouched == player do points[player] = points[player] + 1 wait(1) end end
Now all we need to is write a function that changes the Ball and BillboardGui to reflect the player who is currently earning points:
local PlayersName = game.Workspace.BallTarget.BillboardGui.PlayersName local function UpdateBall(player) PlayersName.Text = player.Name BallTarget.Material = ("Neon") BallTarget.BrickColor = hit.Parent:FindFirstChild("Torso").BrickColor end
local PlayersName = game.Workspace.BallTarget.BillboardGui.PlayersName local LastPlayerTouched = nil local score = {} local function AddPoints(player) while LastPlayerTouched == player do points[player] = points[player] + 1 wait(1) end end local function UpdateBall(player) PlayersName.Text = player.Name BallTarget.Material = ("Neon") BallTarget.BrickColor = hit.Parent:FindFirstChild("Torso").BrickColor end Ball.Touched:connect(function(hit) local player = game.Players:GetPlayerFromCharacter(hit.Parent) if player and not points[player] then points[player] = 0 end if player and LastPlayerTouched ~= player then LastPlayerTouched == player AddPoints(player) UpdateBall(player) end end)