Hello! I am currently making a Character Creation System with HumanoidDescription. The problem is that when I change an id, let’s say the HairAccessory, and keep the FaceAccessory at the default value then load the game again, it doesn’t keep the default FaceAccessory yet it deletes the previous one, like its supposed to do. The fact is that it works if I change both HairAccessory and FaceAccessory at the same time, it keeps the new IDs and accessories and removes the previous ones. I even tried making a constant default table for the default IDs. Also one thing to note is that the default IDs are also in the default HumanoidDescription. Underneath is the code for my DataStore which I use for both data values and character data.
local dataStoreService = game:GetService("DataStoreService")
local dataStore = dataStoreService:GetDataStore("UltimateLevelingData")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local HttpService = game:GetService("HttpService")
if RunService:IsStudio() then
dataStore = dataStoreService:GetDataStore("TestData145")
print("Loaded Test Database")
else
print("Loaded Production Database")
end
local PlayerCache = game.ReplicatedStorage:WaitForChild("PlayerCache")
local DEFAULT_ACCESSORIES = {
hair = "122928544683214",
face = "108408358816244"
}
local function charLoad()
for _, plr in ipairs(Players:GetPlayers()) do
local char = plr.Character or plr.CharacterAdded:Wait()
local hum = char:WaitForChild("Humanoid")
local desc = hum:GetAppliedDescription(hum)
local key = plr.UserId .. "_charData"
local success, err
local getData = dataStore:GetAsync(key)
if getData then
local decodedData = HttpService:JSONDecode(getData)
if decodedData then
for i, hairInChar in pairs(char:GetChildren()) do
if hairInChar:IsA("Accessory") then
if hairInChar.AccessoryType == Enum.AccessoryType.Hair then
hairInChar:Destroy()
end
end
end
for i, faceInChar in pairs(char:GetChildren()) do
if faceInChar:IsA("Accessory") then
if faceInChar.AccessoryType == Enum.AccessoryType.Face then
faceInChar:Destroy()
end
end
end
task.wait(0.1)
desc.HairAccessory = decodedData[1][1]
desc.FaceAccessory = decodedData[1][2]
desc.Shirt = decodedData[1][3]
desc.Pants = decodedData[1][4]
desc.HeadColor = Color3.fromRGB(255, 204, 153)
desc.TorsoColor = Color3.fromRGB(255, 204, 153)
desc.RightArmColor = Color3.fromRGB(255, 204, 153)
desc.LeftArmColor = Color3.fromRGB(255, 204, 153)
desc.RightArmColor = Color3.fromRGB(255, 204, 153)
desc.RightLegColor = Color3.fromRGB(255, 204, 153)
desc.LeftLegColor = Color3.fromRGB(255, 204, 153)
task.wait(0.5)
hum:ApplyDescription(desc)
for i, hair in pairs(char:GetChildren()) do
if hair:IsA("Accessory") then
if hair.AccessoryType == Enum.AccessoryType.Hair then
hair.Name = "Hair"
hair.AccessoryType = Enum.AccessoryType.Hair
end
end
end
for i, face in pairs(char:GetChildren()) do
if face:IsA("Accessory") then
if face.AccessoryType == Enum.AccessoryType.Face then
face.Name = "Face"
face.AccessoryType = Enum.AccessoryType.Face
end
end
end
end
end
end
end
local function charSave()
for _, plr in ipairs(Players:GetPlayers()) do
local char = plr.Character or plr.CharacterRemoving:Wait()
local hum = char:WaitForChild("Humanoid")
local desc = hum:WaitForChild("HumanoidDescription")
local key = plr.UserId .. "_charData"
local data = {}
local success, err
table.insert(data, {
desc.HairAccessory or DEFAULT_ACCESSORIES.hair,
desc.FaceAccessory or DEFAULT_ACCESSORIES.face,
desc.Shirt,
desc.Pants
})
local Encoded = HttpService:JSONEncode(data)
repeat
success, err = pcall(function()
return data
end)
until success
if success then
dataStore:SetAsync(key, Encoded)
task.wait(0.1)
else
warn("Failed to save data: " .. tostring(err))
end
end
task.wait()
end
game.Players.PlayerAdded:Connect(function(plr)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = plr
local rank = Instance.new("StringValue")
rank.Name = "Rank"
rank.Value = "E"
rank.Parent = leaderstats
local level = Instance.new("IntValue")
level.Name = "Level"
level.Value = 1
level.Parent = leaderstats
local statistics = Instance.new("Folder")
statistics.Name = "Stats"
statistics.Parent = plr
local strenght = Instance.new("IntValue")
strenght.Name = "Strenght"
strenght.Value = 1
strenght.Parent = statistics
local agility = Instance.new("IntValue")
agility.Name = "Agility"
agility.Value = 1
agility.Parent = statistics
local vitality = Instance.new("IntValue")
vitality.Name = "Vitality"
vitality.Value = 1
vitality.Parent = statistics
local perception = Instance.new("IntValue")
perception.Name = "Perception"
perception.Value = 1
perception.Parent = statistics
local intelligence = Instance.new("IntValue")
intelligence.Name = "Intelligence"
intelligence.Value = 1
intelligence.Parent = statistics
local plrStatsData = Instance.new("Folder")
plrStatsData.Name = "Data"
plrStatsData.Parent = plr
local hp = Instance.new("IntValue")
hp.Name = "HP"
hp.Value = 100
hp.Parent = plrStatsData
local maxHP = Instance.new("IntValue")
maxHP.Name = "MaxHP"
maxHP.Value = 100
maxHP.Parent = plrStatsData
local mp = Instance.new("IntValue")
mp.Name = "MP"
mp.Value = 100
mp.Parent = plrStatsData
local maxMP = Instance.new("IntValue")
maxMP.Name = "MaxMP"
maxMP.Value = 100
maxMP.Parent = plrStatsData
local characterCreated = Instance.new("BoolValue")
characterCreated.Name = "CharacterCreated"
characterCreated.Value = false
characterCreated.Parent = plrStatsData
local joinedFirstTime = Instance.new("BoolValue")
joinedFirstTime.Name = "JoinedFirstTime"
joinedFirstTime.Value = false
joinedFirstTime.Parent = plrStatsData
local hairName = Instance.new("StringValue")
hairName.Name = "HairName"
hairName.Value = ""
hairName.Parent = plrStatsData
local faceName = Instance.new("StringValue")
faceName.Name = "FaceName"
faceName.Value = ""
faceName.Parent = plrStatsData
charLoad()
task.wait(0.1)
local success, errorMessage = pcall(function()
local savedData = dataStore:GetAsync(plr.UserId .. "_data")
if savedData then
print(`Successfully loaded data for {plr.Name}({plr.UserId})`)
rank.Value = savedData.rank
level.Value = savedData.level
strenght.Value = savedData.strenght
agility.Value = savedData.agility
vitality.Value = savedData.vitality
perception.Value = savedData.perception
intelligence.Value = savedData.intelligence
hp.Value = savedData.hp
maxHP.Value = savedData.maxhp
mp.Value = savedData.mp
maxMP.Value = savedData.maxmp
characterCreated.Value = savedData.charactercreated
joinedFirstTime.Value = savedData.joinedfirsttime
hairName.Value = savedData.hairname
faceName.Value = savedData.facename
end
end)
if not success then
print(`Error when loading data for {plr.Name}({plr.UserId})`)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
charSave()
local dataToSave = {
rank = plr.leaderstats.Rank.Value,
level = plr.leaderstats.Level.Value,
strenght = plr.Stats.Strenght.Value,
agility = plr.Stats.Agility.Value,
vitality = plr.Stats.Vitality.Value,
perception = plr.Stats.Perception.Value,
intelligence = plr.Stats.Intelligence.Value,
hp = plr.Data.HP.Value,
maxhp = plr.Data.MaxHP.Value,
mp = plr.Data.MP.Value,
maxmp = plr.Data.MaxMP.Value,
charactercreated = plr.Data.CharacterCreated.Value,
joinedfirsttime = plr.Data.JoinedFirstTime.Value,
hairname = plr.Data.HairName.Value,
facename = plr.Data.FaceName.Value
}
local tries = 3
while tries > 0 do
local success, errorMessage = pcall(function()
dataStore:SetAsync(plr.UserId .. "_data", dataToSave)
end)
if success then
print(`Successfully saved data for {plr.Name}({plr.UserId})`)
break
else
tries -= 1
print(`Error when saving data for {plr.Name}({plr.UserId})`)
task.wait(1)
end
end
end)
game:BindToClose(function()
charSave()
for _, player in ipairs(Players:GetPlayers()) do
if player.leaderstats then
local dataToSave = {
rank = player.leaderstats.Rank.Value,
level = player.leaderstats.Level.Value,
strenght = player.Stats.Strenght.Value,
agility = player.Stats.Agility.Value,
vitality = player.Stats.Vitality.Value,
perception = player.Stats.Perception.Value,
intelligence = player.Stats.Intelligence.Value,
hp = player.Data.HP.Value,
maxhp = player.Data.MaxHP.Value,
mp = player.Data.MP.Value,
maxmp = player.Data.MaxMP.Value,
charactercreated = player.Data.CharacterCreated.Value,
joinedfirsttime = player.Data.JoinedFirstTime.Value,
hairname = player.Data.HairName.Value,
facename = player.Data.FaceName.Value
}
dataStore:SetAsync(player.UserId .. "_data", dataToSave)
end
end
end)
while true do
task.wait(0.1)
charSave()
for _, player in ipairs(Players:GetPlayers()) do
if player.leaderstats then
local dataToSave = {
rank = player.leaderstats.Rank.Value,
level = player.leaderstats.Level.Value,
strenght = player.Stats.Strenght.Value,
agility = player.Stats.Agility.Value,
vitality = player.Stats.Vitality.Value,
perception = player.Stats.Perception.Value,
intelligence = player.Stats.Intelligence.Value,
hp = player.Data.HP.Value,
maxhp = player.Data.MaxHP.Value,
mp = player.Data.MP.Value,
maxmp = player.Data.MaxMP.Value,
charactercreated = player.Data.CharacterCreated.Value,
joinedfirsttime = player.Data.JoinedFirstTime.Value,
hairname = player.Data.HairName.Value,
facename = player.Data.FaceName.Value
}
dataStore:SetAsync(player.UserId .. "_data", dataToSave)
end
end
end