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

Why doesn't my DataStore/Leaderboard script work?

So, this script needs to do 3 things...

  1. Set up the player's leaderboard.
  2. Set the stats on the leaderboard to whatever the player has saved.
  3. Save the player's stats when they leave.

It doesn't even get to setting up the leaderboard.

Here's my script...

local myData = game:GetService("DataStoreService"):GetDataStore("GameStats")
local vals = {
{"Wins",0,"IntValue"},
{"BlitzCreditz" ,0,"IntValue"},
}





game.Players.PlayerAdded:connect(function(player)
	
    
	
    local tab = myData:GetAsync(player.userId)

    if not tab then -- new player set up table
        tab = {}
        local num = 0
        for i = 1,#vals do
        table.insert(tab,{vals[i][1],vals[i],2})
       

        if num % 10 == 0 then -- reduces lag
            wait()
        end 
    end
end
    myData:SetAsync(player.userId,tab)

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

    local num = 0
    for i = 1,#vals do
        local val = Instance.new(vals[i][3],stats)
        val.Name = vals[i][1]
        val.Value = vals[i][2]
		val.Parent = stats
        if num % 10 == 0 then -- lag reducer if you have  a lot of vals
            wait()
        end
    end

game.Players.PlayerRemoving:connect(function(player)
    local newTab = {}
    local tab = myData:GetAsync(player.userId)

    local num = 0
    for i = 1,#tab do
        num = num + 1       
        for a,b in pairs(player.leaderstats:GetChildren()) do
            if b.Name == tab[i][1] then
                table.insert(newTab,{tab[i][1],tab[i][2],tab[i][3]})
            end
        end
        if num % 10 == 0 then
            wait()
        end
    end
    myData:SetAsync(player.userId,newTab)
end)

All help would be appreciated!

2 comments

0

I'm currently looking at your script, and you're making it more difficult then it needs to be. (Thought I should let you know)

0

Lol thanks. Any help would be appreciated!

1 answer

The script is supposed to be

stands = {} CTF_mode = false

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)

	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
	end
end

end


function findAllFlagStands(root) local c = root:children() for i=1,#c do if (c[i].className == "Model" or c[i].className == "Part") then findAllFlagStands(c[i]) end if (c[i].className == "FlagStand") then table.insert(stands, c[i]) end end end

function hookUpListeners() for i=1,#stands do stands[i].FlagCaptured:connect(onCaptureScored) end end

function onPlayerEntered(newPlayer)

if CTF_mode == true then

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

	local captures = Instance.new("IntValue")
	captures.Name = "Captures"
	captures.Value = 0


	captures.Parent = stats

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

	stats.Parent = newPlayer

else

	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

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

end

function onCaptureScored(player)

	local ls = player:findFirstChild("leaderstats")
	if ls == nil then return end
	local caps = ls:findFirstChild("Captures")
	if caps == nil then return end
	caps.Value = caps.Value + 1

end

findAllFlagStands(game.Workspace) hookUpListeners() if (#stands > 0) then CTF_mode = true end game.Players.ChildAdded:connect(onPlayerEntered)

1 comment

0

No offense... but WTF is up with all this kill stuff? And a flag stand? Maybe I should've made it more clear, BlitzCredits is a currency, and wins is pretty obvious... Why do I need all this stuff about finding the killer?????

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