i'm trying to learn about data store and have copied this script exactly the way it is from the youtube video I'm watching. enable studio access to api servers is on. after I change the value of Cash when I'm testing in the server nothing happens. no errors either
local DataStoreService = game:GetService("DataStoreService") local myDataStore = DataStoreService:GetDataStore("myDataStore") --Player Joins game.Players.PlayerAdded:Connect(function(player) --Gives Player Stats local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" leaderstats.Parent = player local Cash = Instance.new("IntValue") Cash.Name = "Cash" Cash.Parent = leaderstats local playerUserId = "Player_"..player.UserId --Load Data local data local success, errormessage = pcall(function() data = myDataStore:GetAsync(playerUserId) end) if success then Cash.Value = data end end) -- Save Data game.Players.PlayerRemoving:Connect(function(player) local playerUserId = "Player_"..player.UserId local data = player.leaderstats.Cash.Value local success, errormessage = pcall(function() myDataStore:SetAsync(playerUserId, data) end) if success then print("Data Saved") else print("error") warn(errormessage) end end)
Hello, i'm gonna try to help you but first save your actual script because i will make you modify it a lot but i'm pretty sure it will work!
Make a line ontop for your script like this: local cash = game:GetService("DataStoreService"):GetDataStore("CASH")
And then after that line do: function savedata(dataname, playerid, value)
game:GetService("DataStoreService"):GetDataStore(dataname):SetAsync(playerid, value)
end
game.Players.PlayerAdded:Connect(function(player)
So now make a function to detect when the cash value changes, it would be something like this: Cash.Changed:Connect(function() And why do you want to detect when the cash changes? to save data every time the cash value changes. How you do that? Simple, do this:
savedata("CASH",player.userId,Cash.Value) Do that right after the changed function. So now you will save data when the player leaves too just to be sure it's gonna save data 100%. Do this after PlayerRemoving:
savedata("CASH",player.userId,player.leaderstats.Cash.Value) And done, your money will be saved every time you get cash and leave the game! Also you need to replace
local DataStoreService = game:GetService("DataStoreService")
local myDataStore = DataStoreService:GetDataStore("myDataStore") and
local playerUserId = "Player_"..player.UserId
--Load Data local data local success, errormessage = pcall(function() data = myDataStore:GetAsync(playerUserId) end) if success then Cash.Value = data
end end) Because you don't need them. IMPORTANT: GIVE THE CASH A VALUE LIKE 0 OR IT WONT WORK! And delete everything after PlayerRemoving too and replace it with what i said.
Try using :BindToClose
. If you're the only one in the server and you leave, the server may shut down first and not allow all your functions to finish running. The server can also shut down unexpectedly even if there is more than 1 player. :BindToClose
will allow bound functions to run 30 seconds before the server shuts down. You can just add this at the end of your script.
game:BindToClose(function() for i, player in pairs(game.Players:GetPlayers()) do -- looping through the players will allow this function to run for every player in the server local playerUserId = "Player_"..player.UserId local data = player.leaderstats.Cash.Value local success, errormessage = pcall(function() myDataStore:SetAsync(playerUserId, data) end) if success then print("Data Saved") else print("error") warn(errormessage) end end end)