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

Savable leaderboard won't save? Please Help

I was trying to make this leaderboard savable. Player suppose to see their score even after they quit but for some reason, it won't work.

I wrote the script which is why obviously I am asking for help because its not working. So stop saying I didn't wrote the script. Yes, I used free models to base my script but that doesn't mean I didn't wrote it. Yes I was talking to you @eLunate If you can't help please let others help me instead.

Note: I noted in here where there might be a problem. I just can't figure which one.

function onXPChanged(player, XP, level)
	if XP.Value>=level.Value * 10 then
		XP.Value = 0
		level.Value = level.Value + 1 
	end
end

function onLevelUp(player, XP, level)
	local m = Instance.new("Hint")
	m.Parent = game.Workspace
	m.Text = player.Name .. " has leveled up!"
	wait(3)
	m.Parent = nil
   player.Humanoid.Health = 0
end


function onPlayerRespawned(player)
	wait(5)

	player.Character.Humanoid.Health = player.Character.Humanoid.Health + player.leaderstats.Level * 10

	player.Character.Humanoid.MaxHealth = player.Character.Humanoid.MaxHealth + player.leaderstats.Level * 10

end

local datastore = game:GetService("DataStoreService")
local ds1 = datastore:GetDataStore("KillsSaveSystem")
local ds2 = datastore:GetDataStore("CashSaveSystem")
local ds3 = datastore:GetDataStore("DeathSaveSystem")
local ds4 = datastore:GetDataStore("LevelSaveSystem")
local ds5 = datastore:GetDataStore("XPSaveSystem")

function onPlayerEntered(newPlayer)

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

local cash = Instance.new("IntValue",stats)
	cash.Name = "Cash" 	
	
local kills = Instance.new("IntValue",stats)
	kills.Name = "Kills"
	
local deaths = Instance.new("IntValue",stats)
	deaths.Name = "Deaths"

local level = Instance.new("IntValue",stats)
   level.Name = "Level"

local xp = Instance.new("IntValue",stats)
   xp.Name = "XP"

 kills.Value = ds1:GetAsync(newPlayer.UserId) or 0
 ds1:SetAsync(newPlayer.UserId, kills.Value)
 
 cash.Value = ds2:GetAsync(newPlayer.UserId) or 0
 ds2:SetAsync(newPlayer.UserId, cash.Value)

deaths.Value = ds3:GetAsync(newPlayer.UserId) or 0
 ds3:SetAsync(newPlayer.UserId, deaths.Value)

level.Value = ds4:GetAsync(newPlayer.UserId) or 0
 ds4:SetAsync(newPlayer.UserId, level.Value)

xp.Value = ds5:GetAsync(newPlayer.UserId) or 0
 ds5:SetAsync(newPlayer.UserId, xp.Value)
   
   cash.Parent = stats
	stats.Parent = newPlayer
	kills.Parent = stats
	deaths.Parent = stats
   level.Parent = stats
   xp.Parent = stats
---updater: This area might be broken, I don't know whats wrong.
	xp.Changed:connect(function() onXPChanged(newPlayer, xp, level) end)
	level.Changed:connect(function() onLevelUp(newPlayer, xp, level) end)
	
 		kills.Changed:connect(function()
  	 ds1:SetAsync(newPlayer.UserId, kills.Value)
 	 end)
 
 	  	cash.Changed:connect(function()
  	 ds2:SetAsync(newPlayer.UserId, cash.Value)
 	 end)

 	 	deaths.Changed:connect(function()
     ds3:SetAsync(newPlayer.UserId, deaths.Value)
	 end)
		
 		level.Changed:connect(function()
  	ds4:SetAsync(newPlayer.UserId, level.Value)
 	end)
 		xp.Changed:connect(function()
  	ds5:SetAsync(newPlayer.UserId, xp.Value)
	end)
	
	end
-------
	local humanoid = newPlayer.Character.Humanoid

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

	newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end )


	stats.Parent = newPlayer

end

function Send_DB_Event_Died(victim, killer)
	local killername = "unknown"
	if killer ~= nil then killername = killer.Name end
	print(victim.Name, " was killed by ", killername)

	if shared["deaths"] ~= nil then 
		shared["deaths"](victim, killer)
		print("Death event sent.")
	end
end

function Send_DB_Event_Kill(killer, victim)
	print(killer.Name, " killed ", victim.Name)
	if shared["kills"] ~= nil then 
		shared["kills"](killer, victim)
		print("Kill event sent.")
	end
end



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

		local killer = getKillerOfHumanoidIfStillInGame(humanoid)


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

function onPlayerRespawn(property, player)
	
	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)

	local tag = humanoid:findFirstChild("creator")

	if tag ~= nil then
		
		local killer = tag.Value
		if killer.Parent ~= nil then
			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("Kills")
		   local cash = stats:findFirstChild("Cash")
         local xp = stats:findFirstChild("XP")
			if killer ~= player then
				kills.Value = kills.Value + 1
            cash.Value = cash.Value + 50
            xp.Value = xp.Value + 3
				
			else
				kills.Value = kills.Value - 0
				
			end
			Send_DB_Event_Kill(killer, player)
		end
	end
end

game.Players.ChildAdded:connect(onPlayerEntered)

1 comment

0

I forgot that stats are suppose to be int. not named.

1 answer

Got it fixed. Thanks for the wonderful and very helpful help! :)

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