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

How to add "while true do" function among the KO WO point leaderboard?

I want to add a script where every 3 seconds, a point is added. The script works in build mode but not in the play mode when it's saved. Or even in some cases, the points work but the KO and WO doesn't work.

Is there a way to have the KO, WO and points script (that changes every 3 seconds) work at the same time?

Below is the script:

function onHumanoidDied(humanoid, player)
	local stats = player:findFirstChild("leaderstats")
	if stats ~= nil then
		local deaths = stats:findFirstChild("Deaths")
		deaths.Value = deaths.Value + 1
		local spend = stats:findFirstChild("Points")
		spend.Value = spend.Value - 5
	-- do short dance to try and find the killer
		local killer = getKillerOfHumanoidIfStillInGame(humanoid)
		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")
			local earn = stats:findFirstChild("Points")
			if killer ~= player then
				kills.Value = kills.Value + 1
				earn.Value = earn.Value + 100		
			else
				kills.Value = kills.Value - 1
				earn.Value = earn.Value - 1
				
			end
		end
	end
end


-----------------------------------------------


function Entered(player)
      if player:findFirstChild("leaderstats") ~= nil then
			player.leaderstats:remove()
      end

      stats = Instance.new("IntValue")
      stats.Parent = player
      stats.Name = "leaderstats"

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

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

		kills.Parent = stats
		deaths.Parent = stats

      money = Instance.new("IntValue")
      money.Parent = stats
      money.Name = "Points"
      money.Value = 0 --How much you start out with change it to how much you want

		-- VERY UGLY HACK
		-- Will this leak threads?
		-- Is the problem even what I think it is (player arrived before character)?
		while true do
			if player.Character ~= nil then break end
			wait(5)
		end

		local humanoid = player.Character.Humanoid

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

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


		stats.Parent = player

end


game.Players.PlayerAdded:connect(Entered)

c = game.Players:GetChildren()
for i=1, #c do
        Entered(c[i])
end


while true do
	wait(3)
	money.Value = money.Value + 1
	end

Thank you!

2 comments

0

Can you edit your code block.

0

Sorry!! Hope its better for reading now.

1 answer

✓ Accepted answer

The issue is that your money variable gets updated every time a player joins the game since it's not a local variable. When the first player joins, money is equal to that player's money stat, and it'll get updated in the loop. When a second player joins the game, money is now set to the second player's money stat, and your script no longer has any reference to the first player's money stat. To fix this, replace your loop with this:

while true do
    wait(3)
    for i,player in pairs(game.Players:GetPlayers()) do
        player.leaderstats.Points.Value = player.leaderstats.Points.Value + 1
    end
end

In this new loop we loop through all of the players and update their individual money stats. Make sure to change "Points" in this loop if you rename your money stat to "Money" instead of "Points". Another change I'd recommend is making the money variable on line 82 and the stats variable on line 67 local. You will never need to access those outside of the PlayerAdded event, so making them local will remind you to use player.leaderstats instead to avoid the issue you're having now.

1 comment

0

Thank you so much for your help! I've learnt something today :D

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