Hello!
So I have a script that takes care of my game’s leaderstats, saving data, and loading data. It works fine most of the time, except for some occasions (examples listed bellow). I would only like to know how I can improve and optimize my code so I can improve as a developer. ![]()
Examples of some limitations/errors:
- When I shut down servers, the player’s data does not save.
- Sometimes I receive the “Too Many DataStore Requests” warning.
- The code is overall messy and hard to read.
My script, located in ServerScriptService:
local DataStoreService = game:GetService("DataStoreService")
local CornerData = DataStoreService:GetDataStore("CornerData")
game.Players.PlayerAdded:Connect(function(player)
-- leaderstats
local leaderstats = Instance.new("Folder", player)
leaderstats.Name = "leaderstats"
local Wins = Instance.new("IntValue", leaderstats)
Wins.Name = "Wins"
Wins.Value = 0
Wins.Parent = leaderstats
-- InfoFolder
local InfoFolder = Instance.new("Folder", player)
InfoFolder.Name = "InfoFolder"
local Coins = Instance.new("IntValue", InfoFolder)
Coins.Name = "Coins"
Coins.Value = 0
local LavaDebounce = Instance.new("BoolValue", InfoFolder)
LavaDebounce.Name = "LavaDebounce"
LavaDebounce.Value = false
local EquipedTitle = Instance.new("StringValue", InfoFolder)
EquipedTitle.Name = "EquipedTitle"
EquipedTitle.Value = "Newbie"
local EquipedTrail = Instance.new("StringValue", InfoFolder)
EquipedTrail.Name = "EquipedTrail"
EquipedTrail.Value = "None"
local SpeedLevel = Instance.new("IntValue", InfoFolder)
SpeedLevel.Name = "SpeedLevel"
SpeedLevel.Value = 0
local JumpLevel = Instance.new("IntValue", InfoFolder)
JumpLevel.Name = "JumpLevel"
JumpLevel.Value = 0
local CoinMultiplier = Instance.new("IntValue", InfoFolder)
CoinMultiplier.Name = "CoinMultiplier"
CoinMultiplier.Value = 1
--Get Wins
local data
local success, errormessage = pcall(function()
CornerData:GetAsync(player.UserId.."-Wins")
end)
if success then
if CornerData:GetAsync(player.UserId.."-Wins") == nil then
Wins.Value = 0
elseif CornerData:GetAsync(player.UserId.."-Wins") ~= nil then
Wins.Value = CornerData:GetAsync(player.UserId.."-Wins")
end
end
--Get Coins
local data2
local success2, errormessage2 = pcall(function()
CornerData:GetAsync(player.UserId.."-Coins")
end)
if success2 then
if CornerData:GetAsync(player.UserId.."-Coins") == nil then
Coins.Value = 0
elseif CornerData:GetAsync(player.UserId.."-Coins") ~= nil then
Coins.Value = CornerData:GetAsync(player.UserId.."-Coins")
end
end
--Get EquipedTitle
local data3
local success3, errormessage3 = pcall(function()
CornerData:GetAsync(player.UserId.."-EquipedTitle")
end)
if success3 then
if CornerData:GetAsync(player.UserId.."-EquipedTitle") == nil then
EquipedTitle.Value = "Newbie"
elseif CornerData:GetAsync(player.UserId.."-EquipedTitle") ~= nil then
EquipedTitle.Value = CornerData:GetAsync(player.UserId.."-EquipedTitle")
end
end
local TitleGuiClone = game.ServerStorage.Titles.TitleGui:Clone()
local EquipedTitle = player.InfoFolder.EquipedTitle
TitleGuiClone.Parent = game.Workspace:WaitForChild(player.Name):WaitForChild("Head")
for Number, Title in ipairs(game.ServerStorage.Titles:GetChildren()) do
if Title.Name == EquipedTitle.Value then
local ClonedTitle = Title:Clone()
ClonedTitle.Parent = TitleGuiClone
end
end
--Get SpeedLevel
local data4
local success4, errormessage4 = pcall(function()
CornerData:GetAsync(player.UserId.."-SpeedLevel")
end)
if success4 then
if CornerData:GetAsync(player.UserId.."-SpeedLevel") == nil then
SpeedLevel.Value = 0
elseif CornerData:GetAsync(player.UserId.."-SpeedLevel") ~= nil then
SpeedLevel.Value = CornerData:GetAsync(player.UserId.."-SpeedLevel")
local Character = game.Workspace:WaitForChild(player.Name)
local Humanoid = Character:WaitForChild("Humanoid")
Humanoid.WalkSpeed = 16 + (SpeedLevel.Value*3)
end
end
--Get JumpLevel
local data5
local success5, errormessage5 = pcall(function()
CornerData:GetAsync(player.UserId.."-JumpLevel")
end)
if success5 then
if CornerData:GetAsync(player.UserId.."-JumpLevel") == nil then
JumpLevel.Value = 0
elseif CornerData:GetAsync(player.UserId.."-JumpLevel") ~= nil then
JumpLevel.Value = CornerData:GetAsync(player.UserId.."-JumpLevel")
local Character = game.Workspace:WaitForChild(player.Name)
local Humanoid = Character:WaitForChild("Humanoid")
Humanoid.JumpPower = 50 + (JumpLevel.Value*3)
end
end
--Get EquipedTrail
local data6
local success6, errormessage6 = pcall(function()
CornerData:GetAsync(player.UserId.."-EquipedTrail")
end)
if success6 then
if CornerData:GetAsync(player.UserId.."-EquipedTrail") == nil then
EquipedTrail.Value = "None"
elseif CornerData:GetAsync(player.UserId.."-EquipedTrail") ~= nil then
EquipedTrail.Value = CornerData:GetAsync(player.UserId.."-EquipedTrail")
end
end
for Number, Trail in ipairs(game.ServerStorage.Trails:GetChildren()) do
if Trail.Name == EquipedTrail.Value then
local ClonedTrail = Trail:Clone()
local Character = game.Workspace:WaitForChild(player.Name)
ClonedTrail.Parent = Character.Head
local attachment0 = Instance.new("Attachment", Character.Head)
attachment0.Name = "TrailAttachment0"
local attachment1 = Instance.new("Attachment", Character.HumanoidRootPart)
attachment1.Name = "TrailAttachment1"
ClonedTrail.Attachment0 = attachment0
ClonedTrail.Attachment1 = attachment1
end
end
end)
game.Players.PlayerRemoving:Connect(function(player)
--Save Wins
local success, errormessage = pcall(function()
CornerData:SetAsync(player.UserId.."-Wins",player.leaderstats.Wins.Value)
end)
--Save Coins
local success2, errormessage2 = pcall(function()
CornerData:SetAsync(player.UserId.."-Coins",player.InfoFolder.Coins.Value)
end)
--Save EquipedTitle
local success3, errormessage3 = pcall(function()
CornerData:SetAsync(player.UserId.."-EquipedTitle",player.InfoFolder.EquipedTitle.Value)
end)
--Save SpeedLevel
local success4, errormessage4 = pcall(function()
CornerData:SetAsync(player.UserId.."-SpeedLevel",player.InfoFolder.SpeedLevel.Value)
end)
--Save JumpLevel
local success5, errormessage5 = pcall(function()
CornerData:SetAsync(player.UserId.."-JumpLevel",player.InfoFolder.JumpLevel.Value)
end)
--Save EquipedTrail
local success6, errormessage6 = pcall(function()
CornerData:SetAsync(player.UserId.."-EquipedTrail",player.InfoFolder.EquipedTrail.Value)
end)
end)
As you can see, the code is very repetetive…
Any feedback is appreciated!
Thank you! ![]()
