Why would this datastore not work?

I am trying to save the kills/KOs a player has when they leave the game.

Leaderboard Script

function onPlayerEntered(newPlayer)
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
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 )
newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end )
stats.Parent = newPlayer
end
function Send_DB_Event_Died(victim, killer)
local killername = "no one"
if killer ~= nil then killername = killer.Name end
if shared["deaths"] ~= nil then 
shared["deaths"](victim, killer)
end
end
function Send_DB_Event_Kill(killer, victim)
if shared["kills"] ~= nil then 
shared["kills"](killer, victim)
end
end
function onHumanoidDied(humanoid, player)
local stats = player:findFirstChild("leaderstats")
if stats ~= nil then
local deaths = stats:findFirstChild("Wipeouts")
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("KOs")
if killer ~= player then
kills.Value = kills.Value + 1
else
kills.Value = kills.Value - 1
end
Send_DB_Event_Kill(killer, player)
end
end
end
game.Players.ChildAdded:connect(onPlayerEntered)

Data Store script:


local killsDataStore = game:GetService("DataStoreService"):GetDataStore("KOs")
local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(plr)
	local playerKey = "Player_"..plr.UserId
	local data
	local success, errormessage = pcall(function()
		data = killsDataStore:GetAsync(playerKey)
		if data then
			plr.leaderstats.KOs.Value = data
		else
			plr.leaderstats.KOs.Value = 0
		end
	end)
end)

Players.PlayerRemoving:Connect(function(plr)
	local playerKey = "Player_"..plr.UserId
	local success, errormessage = pcall(function()
		killsDataStore:SetAsync(playerKey, plr.leaderstats.KOs.Value)
	end)
end)

My guess, is you need to add a PlayerAdded event, make a folder named “leaderstats” so you can hold multiple IntValues inside it. Then parent them inside the player (variable you gave like plr when you add it between the () in the PlayerAdded event.

Big reminder: Make sure to capitalize “Connect” when connecting to events (error at the end of the script.)

Why would it make a difference if leaderstats was a folder or an int value? Shouldn’t the referencing of the KOs int value be the same?

To me, I find it more easier for me to understand, since its more organized. Not sure since I haven’t really used a IntValue as a replacement for a folder.

I agree with you, but I didn’t make this leaderboard. I just made the datastore. I am trying to find out why the datastore isn’t working with minimal rewriting of the script. The game has hundreds of scripts so if I change how the leaderstats is stored it could mean I would have to start hunting down random scripts to see if it is referenced.

Looking at the start of your datastore, your getting the service, can getting the datastore named “K0s”. Try switching that with the variable “killsDataStore” aka the same variable your using to call it for a later time.

I gave that a shot and it still didn’t work.

A few things I would say:
Why are you using pcall if your not using it? And there is a possibility your script is not connected to the leaderstats. My suggestion is adding the script making the leaderstats, and datastore into one whole script.

I’ve actually used this data store script for another data store and it worked. So I don’t think that’s the issue ( I used the same methodology)

Try turning on API, some of the most basic mistakes many make. Thats all I can really say at the moment.

1 Like

I actually did forget to turn on the API (whoops), but it still doesn’t work.

Try this:

local killsDataStore = game:GetService("DataStoreService"):GetDataStore("KOs")
local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(plr)
	local playerKey = "Player_"..plr.UserId
	local data
	local success, errormessage = pcall(function()
		data = killsDataStore:GetAsync(playerKey)
	end)
	if success then
		if data then
			plr:WaitForChild("leaderstats").KOs.Value = data
		else
			plr:WaitForChild("leaderstats").KOs.Value = 0
		end
	else
		print(errormessage)
	end
end)

Players.PlayerRemoving:Connect(function(plr)
	local playerKey = "Player_"..plr.UserId
	local success, errormessage = pcall(function()
		killsDataStore:SetAsync(playerKey, plr.leaderstats.KOs.Value)
	end)
	if not success then
		print(errormessage)
	end
end)
1 Like