Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Help, how to make leaderboard script reset scores every 180 seconds?

i have been trying to make this work, i have used for i =, and i think it doesn't work. how should i do it?



function onPlayerEntered(newPlayer)


	local stats = Instance.new("IntValue")
	stats.Name = "leaderstats"

	local kills = Instance.new("IntValue")
	kills.Name = "KOs"
	kills.Value = 0

	local deaths = Instance.new("IntValue")
	deaths.Name = "Wipeouts"
	deaths.Value = 0

	kills.Parent = stats
	deaths.Parent = stats

	
	while true do
		if newPlayer.Character ~= nil then break end
		wait(1)
	end

	local humanoid = newPlayer.Character.Humanoid

	humanoid.Died:connect(function() onHumanoidDied(humanoid, newPlayer) end )

	-- start to listen for new humanoid
	newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end )


	stats.Parent = newPlayer

end

function Send_DB_Event_Died(victim, killer)
	-- killer may be nil
	local killername = "no one"
	if killer ~= nil then killername = killer.Name end
	print("DIED EVENT: ", victim.Name, " KILLED by ", killername)

	if shared["deaths"] ~= nil then 
		shared["deaths"](victim, killer)
		print("SENT DB DEATH EVENT")
	end
end

function Send_DB_Event_Kill(killer, victim)
	print("KILL EVENT. ", killer.Name, " BLOXXED ", victim.Name)
	if shared["kills"] ~= nil then 
		shared["kills"](killer, victim)
		print("SENT DB KILL EVENT")
	end
end



function onHumanoidDied(humanoid, player)
	local stats = player:findFirstChild("leaderstats")
	if stats ~= nil then
		local deaths = stats:findFirstChild("Wipeouts")
		deaths.Value = deaths.Value + 1

		-- do short dance to try and find the killer

		local killer = getKillerOfHumanoidIfStillInGame(humanoid)


		Send_DB_Event_Died(player, killer)
		handleKillCount(humanoid, player)
	end
end

function onPlayerRespawn(property, player)
	-- need to connect to new humanoid
	
	if property == "Character" and player.Character ~= nil then
		local humanoid = player.Character.Humanoid
			local p = player
			local h = humanoid
			humanoid.Died:connect(function() onHumanoidDied(h, p) end )
	end
end

function getKillerOfHumanoidIfStillInGame(humanoid)
	-- returns the player object that killed this humanoid
	-- returns nil if the killer is no longer in the game

	-- check for kill tag on humanoid - may be more than one - todo: deal with this
	local tag = humanoid:findFirstChild("creator")

	-- find player with name on tag
	if tag ~= nil then
		
		local killer = tag.Value
		if killer.Parent ~= nil then -- killer still in game
			return killer
		end
	end

	return nil
end

function handleKillCount(humanoid, player)
	local killer = getKillerOfHumanoidIfStillInGame(humanoid)
	if killer ~= nil then
		local stats = killer:findFirstChild("leaderstats")
		if stats ~= nil then
			local kills = stats:findFirstChild("KOs")
			if killer ~= player then
				kills.Value = kills.Value + 1
				
			else
				kills.Value = kills.Value - 1
				
			end
			Send_DB_Event_Kill(killer, player)
		end
	end
end

game.Players.ChildAdded:connect(onPlayerEntered)
for i = 180,0,-1 do 
local kills = Instance.new("IntValue")
	kills.Name = "KOs"
	kills.Value = 0

	local deaths = Instance.new("IntValue")
	deaths.Name = "Wipeouts"
	deaths.Value = 0
end

and if what i did doesnt, work, please try and rewrite it with a different method or tell me another method for making this work, thanks.

1 comment

0

delay()

1 answer

✓ Accepted answer

There are 2 solutions:

  1. Have a loop that goes over each player and resets their kills/deaths every 180 seconds. This is ideal if you want everyone's stats reset at the same time.
  2. Have a loop that resets the player-who-just-entered-the-game every 180 seconds. This is what you want to do if you want a player's stats to be reset every 3 minutes since they entered the game (which means that if two people don't enter in at the same time, they'll probably have their stats reset at different times).

I'll assume you want #1. This at the bottom of your leaderboard script:

while true do -- keep going while the server is running
	wait(180)
	local players = game.Players:GetPlayers() -- get all the players
	for i = 1, #players do -- you could also do "for _, player in ipairs(players) do"
		local player = players[i] -- if you did the "for _, player in ipairs(players) do", you wouldn't need this line
		--Attempt to get the leaderstats. If successful, reset them.
		local leaderstats = player:FindFirstChild("leaderstats")
		if leaderstats then -- I will assume that if there are leaderstats, there are always KOs and WOs
			leaderstats.KOs.Value = 0
			leaderstats.WOs.Value = 0
		end
	end
end

It's important to understand why what you tried didn't work:

for i = 180,0,-1 do -- This is the beginnings of a count down loop. If you wanted to update a status, this would be good. It might look something like this:

while true do -- Note that you need an outer loop, or else your script will only count down once.
	for i = 180, 1, -1 do
		print(i, "seconds left!")
		wait(1)
	end
	--do whatever you want after the 180 seconds
end

--Your attempt  continues:

    local kills = Instance.new("IntValue") -- With this you create a new IntValue. But you don't want to create a *new* one, you just want to modify the one that already exists.
    kills.Name = "KOs" -- This names it to "KOs", but it's already named that
    kills.Value = 0 -- This resets the value, which *is* what you want. It doesn't work in this case because "kills" refers to a new IntValue, rather than the one in the player's leaderstats.
 
--Your script then repeats that for WOs.

This discussion is preserved as it was. New answers, comments, and votes are closed.