My xp system shows up in the leaderstats but when I change the xp for me to level up nothing happens.
My code is as follows:
My xp system shows up in the leaderstats but when I change the xp for me to level up nothing happens.
My code is as follows:
Unsure if itāll apply to you but I recommend making it Case-Sensitive.
When grabbing the data from Line 16, Line 20 and Line 24, I see that you put, āuserIdā
Maybe try changing it to āUserIdā since thatās the Case-Sensitive version in the Player Properties?
Edit: Keep in mind, there are other lines where the same may apply such as at the bottom of the script.
If you ever need to find out why a certain piece of code is not running and console is silent, then either step through the code using debugging tools or (if youāre lazy like me) just shove print statements into your code and look at where they stop showing up.
To clarify, Roblox used to use ācamelCaseā for method property names, but it now uses āPascalCaseā. camelCase names are simply for legacy support and Iām pretty sure they just redirect to the PascalCase version ā that being said, you should always be using PascalCase now.
By looking at your code, does the XP value even change on the server? Be aware that, due to FE, any changes made from a client will not be replicated to the server aside from a few exceptions.
I recommend you use the printing debugging technique and just print everything ā make sure the Changed event is firing, check what the conditions are, etc.
Also, in your if statement, you arenāt using the variables for the xp objects, which is generally considered inefficient and bad practice. You donāt need to wait for the xp objects again ā you already have them saved to variables.
Roblox still uses camelCase in properties of game.Players.LocalPlayer apparently. Maybe they use camelCase in some areas and PascalCase in others?
Are you trying to change the colour level inside of studio test? If so, studio closes before SetAsync can fire meaning that your data wont save unless you have a BindToClose in your game script.
However, separate issue BindToClose freezes studio currently and Iām not sure whether it saves or not.
This means that you are going to either have to go into a game and use the devconsole to increase your XP or have a button to press to save your data before you press stop testing.
If I were you, Iād have a table for all of your data and make the key the UserId. What youāre doing is going to take up a lot of DataStore requests in an actual server with a decent amount of players. Also I recommend wrapping your save and load functions into a pcall loop incase it fails.
Here is how I create a data template
function DataTemplate()
local temp = {
Coins = 0,
EquipGun = "Default",
EquipKnife = "Default",
OwnsPremium = false,
OwnsRadio = false,
Level = 1,
XP = 0,
NeedXP = 100,
Wins = 0,
Kills = 0,
Skins = {
}
}
return temp
end
Now I recommend a pcall loop to make sure it gets saved/loaded.
Here is some code taken directly from an old game of mine. Not the prettiest code, but it gets the job done.
function SaveData(Plr)
if not DataIsLoaded[Plr.Name] then
warn(Plr.Name .. " | Data was not saved as it was not loaded")
return
end
local tempD = DataTemplate()
local data = GetData(Plr.Name)
if data then
tempD["Coins"] = data.Currencies.Coins.Value
tempD["EquipGun"] = data.Equips.Gun.Value
tempD["EquipKnife"] = data.Equips.Knife.Value
tempD["Level"] = data.LevelData.Level.Value
tempD["XP"] = data.LevelData.CurrentXP.Value
tempD["NeedXP"] = data.LevelData.NeededXP.Value
tempD["OwnsPremium"] = data.Gamepasses.Premium.Value
tempD["OwnsRadio"] = data.Gamepasses.Radio.Value
tempD["Wins"] = data.Totals.Wins.Value
tempD["Kills"] = data.Totals.Kills.Value
for i,v in pairs(data.Skins:GetChildren()) do
local skint = SkinTempl()
skint["Skin"] = v.Skin.Value
skint["Wep"] = v.Wep.Value
skint["Copies"] = v.Copies.Value
table.insert(tempD["Skins"],#tempD["Skins"]+1,skint)
end
local Pcalled = false
repeat
Pcalled = pcall(function()
PlayerDS:SetAsync(Plr.UserId .. "_data2",tempD)
end)
if not Pcalled then
warn(Plr.Name .. " | Data failed to save, retrying")
end
wait(1)
until Pcalled
warn(Plr.Name .. " | Data successfully saved")
end
end
I personally recomend you redo your method of saving and getting data. You arenāt going to get far with it.
Iām not one for trying to lay it on thick when it comes to replying to issues, but this isā¦ quite the mess. Three data stores for three separate stats? Thatās a yikes from me.
It looks like your save system in general needs to be completely redone, sorry to spill the beans. Thereās a couple of inherent issues with your current script:
game:GetService("DataStoreService")
.Using this script wonāt get you places. Itād be hurtful to retain this knowledge as you gradually improve your area of scripting and it wouldnāt do your player base any good. If you need support on making a new data store script, thereās the developer hub, tutorials and support categories available for your usage - people would be happy to point you in the right direction.
Thanks for all your help! I ended up rewriting the entire system and it is working now.
Itās definitely not the standard. I know of no Player properties that are exclusively camelCase. It would be incredibly stupid of the Roblox engineers to use an inconsistent naming format ā like I said, camelCase is for legacy support only now.