Even though I love my own way of coding and how I understand it; I really need another set of eyes on this. It is fairly slow and probably not the most efficient way of data saving for inventory so I just need as much feedback as possible to make sure the data saving is reliable and wont cause data loss
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local GunFolder = ReplicatedStorage:WaitForChild("Guns")
local playerData = DataStoreService:GetDataStore("PlayerData")
local function loadData(player, what)
local data
local item = player:WaitForChild(what)
local success, errormessage = pcall(function()
data = playerData:GetAsync(player.UserId .. "-" .. what)
end)
if success then
if data ~= nil then
item.Value = data
end
else
warn(errormessage)
end
end
function saveToString(array)
local invString = ""
for _, v in array:GetChildren() do
invString = invString .. v.Name .. "|"
end
print(invString)
return invString
end
function readData(dataToRead, player)
for _, data in string.split(dataToRead, "|") do
if data ~= "Instance" then
local gunType = nil
if GunFolder:FindFirstChild(data) then
if GunFolder:WaitForChild(data):GetAttribute("gunType") then
gunType = GunFolder:WaitForChild(data):GetAttribute("gunType")
local item = nil
item = Instance.new("StringValue")
item.Name = data
item.Value = gunType
item.Parent = player.Inventory
print(data)
end
end
end
end
end
function addGunToPlayerInventory(player, gun, gunType)
local inventory = player.Inventory
local newGun = Instance.new("StringValue")
newGun.Parent = inventory
newGun.Name = gun
newGun.Value = gunType
end
-- Player Join
Players.PlayerAdded:Connect(function(player)
player:SetAttribute("Loaded", false)
local level = Instance.new("NumberValue")
level.Name = "level"
level.Parent = player
local points = Instance.new("NumberValue")
points.Name = "points"
points.Parent = player
local tickets = Instance.new("NumberValue")
tickets.Name = "tickets"
tickets.Parent = player
local timeSurvived = Instance.new("NumberValue")
timeSurvived.Name = "timeSurvived"
timeSurvived.Parent = player
local kills = Instance.new("NumberValue")
kills.Name = "kills"
kills.Parent = player
local timePlayed = Instance.new("NumberValue")
timePlayed.Name = "time"
timePlayed.Parent = player
local timeSurvivedInGame = Instance.new("NumberValue")
timeSurvivedInGame.Name = "survivalTime"
timeSurvivedInGame.Parent = player
local roundsSurvived = Instance.new("NumberValue")
roundsSurvived.Name = "roundsSurvived"
roundsSurvived.Parent = player
local roundKills = Instance.new("NumberValue")
roundKills.Name = "roundKills"
roundKills.Parent = player
local playerGuns = Instance.new("Folder")
playerGuns.Parent = player
playerGuns.Name = "Inventory"
local equippedGun = Instance.new("StringValue")
equippedGun.Parent = player
equippedGun.Name = "currentGun"
equippedGun.Value = "Assault Rifle"
local playerSpeed = Instance.new("NumberValue")
playerSpeed.Parent = player
playerSpeed.Name = "Speed"
playerSpeed.Value = game.StarterPlayer.CharacterWalkSpeed
local equippedConsumable = Instance.new("StringValue")
equippedConsumable.Parent = player
equippedConsumable.Name = "consumable"
equippedConsumable.Value = "Nothing Soda"
local colas = Instance.new("NumberValue")
colas.Parent = player
colas.Name = "colas"
colas.Value = 0
local bandages = Instance.new("NumberValue")
bandages.Parent = player
bandages.Name = "bandages"
bandages.Value = 0
task.wait(0.5)
loadData(player, "level")
loadData(player, "points")
loadData(player, "tickets")
loadData(player, "kills")
loadData(player, "timeSurvived")
loadData(player, "time")
loadData(player, "roundsSurvived")
loadData(player, "currentGun")
loadData(player, "colas")
loadData(player, "bandages")
-- Inventory
if playerData:GetAsync(player.UserId .. "-" .. "inventory") == nil or tostring(playerData:GetAsync(player.UserId .. "-" .. "inventory")) == " Instance" then
local item = nil
item = Instance.new("StringValue", playerGuns)
item.Name = "Assault Rifle"
item.Value = "AR"
item = Instance.new("StringValue", playerGuns)
item.Name = "Sniper"
item.Value = "Sniper"
item = Instance.new("StringValue", playerGuns)
item.Name = "Sub Machine Gun"
item.Value = "SMG"
item = Instance.new("StringValue", playerGuns)
item.Name = "Shotgun"
item.Value = "Shotgun"
else
print(playerData:GetAsync(player.UserId .. "-" .. "inventory"))
readData(playerData:GetAsync(player.UserId .. "-" .. "inventory"), player)
if #player.Inventory:GetChildren() == 0 then
local item = nil
item = Instance.new("StringValue", playerGuns)
item.Name = "Assault Rifle"
item.Value = "AR"
item = Instance.new("StringValue", playerGuns)
item.Name = "Sniper"
item.Value = "Sniper"
item = Instance.new("StringValue", playerGuns)
item.Name = "Sub Machine Gun"
item.Value = "SMG"
item = Instance.new("StringValue", playerGuns)
item.Name = "Shotgun"
item.Value = "Shotgun"
end
end
if player.currentGun.Value == "nil" or player.currentGun.Value == nil then
player.currentGun.Value = "Assault Rifle"
end
if bandages == nil or colas == nil then
bandages.Value = 0
colas.Value = 0
end
end)
function saveData(player)
if player:GetAttribute("InLoaded") == false then return end
local saveFolder = Instance.new("Folder")
saveFolder.Parent = script
saveFolder.Name = player.UserId
player.Inventory.Parent = saveFolder
for i,v in player:GetChildren() do
if v:IsA("NumberValue") or v:IsA("StringValue") then
v.Parent = saveFolder
end
end
local success, errormessage = pcall(function()
playerData:SetAsync(saveFolder.Name.."-level", saveFolder.level.Value)
playerData:SetAsync(saveFolder.Name.."-points", saveFolder.points.Value)
playerData:SetAsync(saveFolder.Name.."-tickets", saveFolder.tickets.Value)
playerData:SetAsync(saveFolder.Name.."-kills", saveFolder.kills.Value)
playerData:SetAsync(saveFolder.Name.."-time", saveFolder.time.Value)
playerData:SetAsync(saveFolder.Name.."-timeSurvived", saveFolder.timeSurvived.Value)
playerData:SetAsync(saveFolder.Name.."-roundsSurvived", saveFolder.roundsSurvived.Value)
playerData:SetAsync(saveFolder.Name.."-currentGun", saveFolder.currentGun.Value)
-- Inventory
playerData:SetAsync(saveFolder.Name.."-inventory", saveToString(saveFolder.Inventory))
-- Items
playerData:SetAsync(saveFolder.Name.."-colas", saveFolder.colas.Value)
playerData:SetAsync(saveFolder.Name.."-bandages", saveFolder.bandages.Value)
end)
if success then
print("Data Saved")
else
print("Error saving player data")
warn(errormessage)
end
end
Players.PlayerRemoving:Connect(function(player)
saveData(player)
end)