Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why doesn't my DataStore/Leaderboard script work?

Asked by 9 years ago

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!

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) YasuYoshida 171 — 9y
0
Lol thanks. Any help would be appreciated! Antharaziia 75 — 8y

1 answer

Log in to vote
-2
Answered by 9 years ago

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)

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????? Antharaziia 75 — 8y
Ad

Answer this question