Hi everyone!
So I was implementing data store into my game to save the number of survivals and coins a player has after they exit (I'm new to data store). I used a couple examples I found to make a data store like this and I made a module script any script can access. So I use the module script in 2 other scripts: 1 in the server script service, which sets up the leader board and the data store, and another script which changes the number of coins and survivals (both on the leaderboard and the data store) when its parent (a part) is touched by a player. Here are the scripts:
ModuleScript named "Datastore"
local DataStoreModule = {}
local DataStore = game:GetService("DataStoreService")
local playerdata = DataStore:GetDataStore("playerdata")
function DataStoreModule.onPlayerJoin(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local Survivals = Instance.new("IntValue")
Survivals.Name = "Survivals"
Survivals.Parent = leaderstats
local Coins = Instance.new("IntValue")
Coins.Name = "Coins"
Coins.Parent = leaderstats
local data
local data2
local success, errormessage = pcall(function()
data = playerdata:GetAsync(player.UserId .. "-Survivals")
data2 = playerdata:GetAsync(player.UserId .. "-Coins")
end)
if success then
Survivals.Value = data
Coins.Value = data2
print("Player ID " .. player.UserId ..": Data fully created!")
else
warn("Player ID " .. player.UserId .. ": There was an error while making data (" .. errormessage .. ")")
end
end
function DataStoreModule.SaveData(player)
local success, errormessage = pcall(function()
playerdata:SetAsync(player.UserId .. "-Survivals", player.leaderstats.Survivals.Value)
playerdata:SetAsync(player.UserId .. "-Coins", player.leaderstats.Coins.Value)
end)
if success then
print("Player ID " .. player.UserId .. ": Data fully saved!")
else
warn("Player ID " .. player.UserId .. ": There was an error while saving data (" .. errormessage .. ")")
end
end
return DataStoreModule
Leaderboard script
DataStore = require(game.Workspace.Datastore)
game.Players.PlayerAdded:Connect(DataStore.onPlayerJoin)
game.Players.PlayerRemoving:Connect(DataStore.SaveData)
Script for when the part is hit by the player ("HitScript")
local Players = game:GetService("Players")
local DataStore = require(game.Workspace.Datastore)
Main = require(game.Workspace.Main)
Survivors = Main.Survivors
InList = false
script.Parent.Touched:Connect(function(h)
if h.Parent:FindFirstChild("Humanoid") then
h.Parent.HumanoidRootPart.CFrame = game.Workspace.Lobby.SpawnLocation.CFrame + Vector3.new(0,7,0)
for i = 1, #Survivors do
local Survivor = Survivors[i]
if Survivor == h.Parent.Name then
InList = true
break
end
end
if InList == false then
table.insert(Survivors, #Survivors + 1, h.Parent.Name)
local player = Players:GetPlayerFromCharacter(h.Parent)
if not player then return end
game.ReplicatedStorage.WinPadHit:FireClient(player)
DataStore.SaveData(player)
end
end
end)
For some reason, the data isnt saved when the hit script runs (I touch the part), but when I mannually change the survivals and coins values using the dev console, data store works fine. The prints also work when the hit script runs, but no change happens.
Any help is appreciated!
