I want to make a platform that adds 1 coin every second in the Coins leaderstat. I want to make this work when they are standing on it and make it work even when they are standing still. I don’t really know how to go about this and if you have any ideas on how to do this, reply to this topic.
Have you tried triggers? Basically it’s an invisible block and when collided with it it triggers an event like gives coins or triggers cut scenes. This technique is used with the game ‘piggy’.
I don’t want it to be a one time function. I want it to give the player a coin every second when they are standing on the part. Do you know how to code it by chance?
Using loops you can add a +1 value into the leaderstat
Let me know if you need an example!
How would I activate it and still tell if the player is still standing on the part?
And yes I need an example.
something along the lines of this, but setting it to your leaderstat clearly lol
local part = script.Parent
local function onPartTouched(otherPart)
local partParent = otherPart.Parent
local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
if humanoid then
leaderstat +1 -- clearly not leaderstat, but referencing to your leaderstat you want to add to
end
end
part.Touched:Connect(onPartTouched)
i basically took this right out of the dev forum
https://developer.roblox.com/en-us/articles/detecting-collisions
Do I just put this script under the part that they are going to be touching.
And how will I find the player to give the leaderstats to? Because I can’t edit leaderstats with the humanoid.
- Put a script under the part.
- Put this inside the script:
local part = script.Parent
local getparts = part:GetTouchingParts()
for i, v in pairs(getparts) do
if v:IsA("BasePart") then
if v.Parent:FindFirstChildOfClass("Humanoid") then
local plr = game.Players:GetPlayerFromCharacter(v.Parent)
if plr ~= nil then
while wait() do
plr.leaderstats.Coins.Value += 1
end
end
end
end
end
try it out
This script is not working and I put print functions to see if it runs but it does not.
local part = script.Parent
local getparts = part:GetTouchingParts()
for i, v in pairs(getparts) do
print("Hello")
if v:IsA("BasePart") then
if v.Parent:FindFirstChildOfClass("Humanoid") then
local plr = game.Players:GetPlayerFromCharacter(v.Parent)
if plr ~= nil then
while wait(1) do
print("Yes")
plr.leaderstats.Current.Value += 1
end
end
end
end
end
u have to change the “plr.leaderstats.Coins.Value” to the path of ur stat
This doesn’t work because it only checks the touching parts immediately after the game runs. Try this instead:
local part = script.Parent
local touching = false
part.Touched:Connect(function(touchedPart)
if touchedPart:IsA("BasePart") then
if touchedPart.Parent:FindFirstChildOfClass("Humanoid") then
local plr = game.Players:GetPlayerFromCharacter(touchedPart.Parent)
if plr then touching = true
repeat task.wait(1)
plr.leaderstats.Current.Value += 1
until not touching
end
end
end
end)
part.TouchEnded:Connect(function(touchedPart)
counting = false
end)
local part = script.Parent
local players = game:GetService("Players")
local debounce = false
part.Touched:Connect(function(hit)
if hit.Parent:FindFirstChild("Humanoid") then
debounce = true
local character = hit.Parent
local player = players:GetPlayerFromCharacter(hit.Parent)
if player then
local leaderstats = player:FindFirstChild("leaderstats")
if leaderstats then
local current = leaderstats:FindFirstChild("leaderstats")
if current then
current.Value += 1
end
end
end
task.wait(2) --2 second cooldown between touches
debounce = false
end
end)
local part = script.Parent
local players = game:GetService("Players")
local debounces = {}
part.Touched:Connect(function(hit)
if hit.Parent:FindFirstChild("Humanoid") then
local character = hit.Parent
local player = players:GetPlayerFromCharacter(hit.Parent)
if player then
if table.find(debounces, player) then
return
end
table.insert(debounces, player)
local leaderstats = player:FindFirstChild("leaderstats")
if leaderstats then
local current = leaderstats:FindFirstChild("leaderstats")
if current then
current.Value += 1
end
end
task.wait(2)
if table.find(debounces, player) then
table.remove(debounces, table.find(debounces, player))
end
end
end
end)
This script does work but only if I am running on the part. When I stand still it does nothing. Can you maybe make it work so that when you are standing on it, it will still work?
Raycast down every second and if it hits the block you want it to hit then add a point, or you can raycast at a faster rate but with a 1 second debounce