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!
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)