Script doesn't work

  1. What do you want to achieve? Keep it simple and clear!

To make DataStore working

  1. What is the issue? Include screenshots / videos if possible!

I made DataStore, but weapon value and buttonValues doesn’t save

  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?

I’ve tried many solutions, none of them worked

After that, you should include more details if you have any. Try to make your topic as descriptive as possible, so that it’s easier for people to help you!

local dataStoreService = game:GetService("DataStoreService")
local getDataStore = dataStoreService:GetDataStore("data")
local serverStorage = game:GetService("ServerStorage")

local weaponsFolder = serverStorage:WaitForChild("Weapons")

local rankSpawners = workspace.RankSpawners

game.Players.PlayerAdded:Connect(function(player)
	local userId = player.UserId
	
	repeat task.wait(1) until player.PlayerGui.Display
	
	local folder = Instance.new("Folder",player)
	folder.Name = "leaderstats"
	local cash = Instance.new("NumberValue",folder)
	cash.Name = "Cash"
	local rank = Instance.new("NumberValue",folder)
	rank.Name = "Rank"
	local weapon = Instance.new("NumberValue",folder)
	weapon.Name = "Weapon"
	
	local data
	
	local success,fail = pcall(function()
		data = getDataStore:GetAsync(userId)
	end)
	
	if data then
		for key,value in pairs(data) do
			print(key)
			print(value)
			cash.Value = data["Cash"] or 0
			rank.Value = data["Rank"] or 1
			weapon.Value = data["Weapon"] or 1

			player.PlayerGui.Display.RankUpButton.RequiredCash.Value = data["RankUp_RequiredCash"] or 500
			player.PlayerGui.Display.RankUpButton.RequiredRank.Value = data["RankUp_RequiredRank"] or 1

			player.PlayerGui.Display.NextWeaponButton.RequiredCash.Value = data["NextWeapon_RequiredCash"] or 150
			player.PlayerGui.Display.NextWeaponButton.RequiredRank.Value = data["NextWeapon_RequiredRank"] or 1

		end
	else
		cash.Value = 0
		rank.Value = 1
		weapon.Value = 1

		player.PlayerGui.Display.RankUpButton.RequiredCash.Value = 500
		player.PlayerGui.Display.RankUpButton.RequiredRank.Value = 1

		player.PlayerGui.Display.NextWeaponButton.RequiredCash.Value = 150
		player.PlayerGui.Display.NextWeaponButton.RequiredRank.Value = 1
	end
	
	task.wait(0.25)
	
	player:LoadCharacter()
	
	task.wait(0.25)
	
	player.CharacterAppearanceLoaded:Connect(function(character)
		character:MoveTo(rankSpawners["R"..rank.Value].Position)
		
		task.wait(0.25)
		for _,checkWeapon in pairs(weaponsFolder:GetChildren()) do
			if checkWeapon:IsA("Tool") then
				for _,findWeapon in pairs(checkWeapon.Config:GetChildren()) do
					if findWeapon:IsA("NumberValue") and findWeapon.Name == "Weapon" and findWeapon.Value == weapon.Value then
						local clone = checkWeapon:Clone()
						clone.Parent = player.Backpack
					end
				end
			end
		end
		
		local rankUpButton = player.PlayerGui.Display.RankUpButton
		local nextWeaponButton = player.PlayerGui.Display.NextWeaponButton
		
	end)
	
	local rankUpButton = player.PlayerGui.Display.RankUpButton
	local nextWeaponButton = player.PlayerGui.Display.NextWeaponButton
	
	rankUpButton.Activated:Connect(function()
		if rank.Value == rankUpButton.RequiredRank.Value and cash.Value == rankUpButton.RequiredCash.Value then
			rank.Value += 1
			rankUpButton.RequiredRank.Value += 1
			rankUpButton.RequiredCash.Value += 500
		end
	end)
	
	nextWeaponButton.Activated:Connect(function()
		if rank.Value == nextWeaponButton.RequiredRank.Value and cash.Value == nextWeaponButton.RequiredCash.Value then
			weapon.Value += 1
			rankUpButton.RequiredRank.Value += 1
			rankUpButton.RequiredCash.Value += 150
		end
	end)
	
	
end)

game.Players.PlayerRemoving:Connect(function(player)
	local userId = player.UserId
	
	local data = {
		["Cash"] = player.leaderstats.Cash.Value,
		["Rank"] = player.leaderstats.Rank.Value,
		["Weapon"] = player.leaderstats.Weapon.Value,
		["RankUp_RequiredCash"] = player.PlayerGui.Display.RankUpButton.RequiredCash.Value,
		["RankUp_RequiredRank"] = player.PlayerGui.Display.RankUpButton.RequiredRank.Value,
		["NextWeapon_RequiredCash"] = player.PlayerGui.Display.NextWeaponButton.RequiredCash.Value,
		["NextWeapon_RequiredRank"] = player.PlayerGui.Display.NextWeaponButton.RequiredRank.Value,
	}
	local success,fail = pcall(function()
		getDataStore:SetAsync(userId,data)
	end)	
end)
1 Like

You can’t save tables in datastores, instead you can use JSONEncode and JSONDecode from HttpService

A JSON is basically like a table but it’s like a string and you can convert it to table or vice versa

It still saves the data, but It’s not saving weapon value and buttons value.

can i help you @Jacoberz4

Description The Problem,The Issues, The Motivation

I’m not sure where you’ve heard that, but it’s 100% possible to store tables in datastores.

1 Like

You didn’t check for errors when saving, so we don’t really know what’s up. Here’s a modified version of your PlayerRemoving event to do that, plus support for BindToClose:

local function Save(player)
	local userId = player.UserId

	local data = {
		["Cash"] = player.leaderstats.Cash.Value,
		["Rank"] = player.leaderstats.Rank.Value,
		["Weapon"] = player.leaderstats.Weapon.Value,
		["RankUp_RequiredCash"] = player.PlayerGui.Display.RankUpButton.RequiredCash.Value,
		["RankUp_RequiredRank"] = player.PlayerGui.Display.RankUpButton.RequiredRank.Value,
		["NextWeapon_RequiredCash"] = player.PlayerGui.Display.NextWeaponButton.RequiredCash.Value,
		["NextWeapon_RequiredRank"] = player.PlayerGui.Display.NextWeaponButton.RequiredRank.Value,
	}
	local success, err = pcall(function()
		getDataStore:SetAsync(userId,data)
	end)	

	if not success then
		warn(err)
	end
end

game.Players.PlayerRemoving:Connect(Save)
game:BindToClose(function()
	for _, player in game.Players:GetPlayers() do
		Save(player)
	end
end)

Try it on studio to observe any errors as you leave. Then once that’s fixed, play your game through the Roblox app to see if all the data saves.