Hair Color not loading correctly in DataStore

Why isn’t my Hair Color not being loaded correctly?

I use identical logic to save the Skin Color and that works fine, but when I save Hair Color, it gives me the proper value to save, but it loads as the default.

Does anyone know how to solve this?


local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local playerDataStore = DataStoreService:GetDataStore("PlayerDataStore")
local defaultIsFemale = false
local defaultSkinColor = Color3.fromRGB(255, 212, 177)
local defaultHairNumber = 1
local defaultHairColor = Color3.fromRGB(255, 255, 255)
local defaultBodySize = 1

local function color3ToTable(color)
	return {color.R, color.G, color.B}
end

local function tableToColor3(tbl)
	return Color3.new(tbl[1], tbl[2], tbl[3])
end

local function savePlayerData(player)
	local character = player.Character

	if character then
		local data = {
			IsFemale = character.Customization.IsFemale.Value or defaultIsFemale,
			SkinColor = color3ToTable(character.Customization.SkinColor.Value or defaultSkinColor),
			HairNumber = character.Customization.HairNumber.Value or defaultHairNumber,
			HairColor = color3ToTable(character.Customization.HairColor.Value or defaultHairColor),
			BodySize = character.Customization.BodySize.Value or defaultBodySize
		}

		local success, err = pcall(function()
			print("Saved IsFemale as: " .. tostring(data.IsFemale))
			print("Saved SkinColor as: " .. table.concat(data.SkinColor, ", "))
			print("Saved HairNumber as: " .. tostring(data.HairNumber))
			print("Saved HairColor as: " .. table.concat(data.HairColor, ", "))
			print("Saved BodySize as: " .. tostring(data.BodySize))

			playerDataStore:SetAsync(player.UserId, data)
		end)

		if not success then
			warn("Failed to save data for player", player.Name, ":", err)
		end
	end
end

local function loadPlayerData(player)
	local success, data = pcall(function()
		return playerDataStore:GetAsync(player.UserId)
	end)

	if success and data then
		local isFemale = data.IsFemale or defaultIsFemale
		local skinColor = data.SkinColor and tableToColor3(data.SkinColor) or defaultSkinColor
		local hairNumber = data.HairNumber or defaultHairNumber
		local hairColor = data.HairColor and tableToColor3(data.HairColor) or defaultHairColor
		local bodySize = data.BodySize or defaultBodySize

		print("Found and loaded data for Player: " .. player.Name)
		return isFemale, skinColor, hairNumber, hairColor, bodySize
	else
		print("Using Defaults for Player:", player.Name)
		return defaultIsFemale, defaultSkinColor, defaultHairNumber, defaultHairColor, defaultBodySize
	end
end

local function changePlayerAppearance(character, isFemale, skinColor, hairNumber, hairColor, bodySize)
	local player = Players:GetPlayerFromCharacter(character)

	character.Customization.IsFemale.Value = isFemale
	character.Customization.SkinColor.Value = skinColor
	character.Customization.HairNumber.Value = hairNumber
	character.Customization.HairColor.Value = hairColor
	character.Customization.BodySize.Value = bodySize
end

local function onPlayerAdded(player)
	local function onCharacterAdded(character)
		character:WaitForChild("Humanoid")

		local isFemale, skinColor, hairNumber, hairColor, bodySize = loadPlayerData(player)
		changePlayerAppearance(character, isFemale, skinColor, hairNumber, hairColor, bodySize)
	end

	player.CharacterAppearanceLoaded:Connect(onCharacterAdded)
	player.CharacterAdded:Connect(onCharacterAdded)

	spawn(function()
		while player.Parent do
			wait(1)
			savePlayerData(player)
		end
	end)
end

local function onPlayerRemoving(player)
	savePlayerData(player)
end

Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)

for _, player in ipairs(Players:GetPlayers()) do
	onPlayerAdded(player)
end

1 Like

Bumping this because it’s literally gotten no activity

Hello, I am not sure that you have to wait for success and data in the loading aspect of things. Not sure if that would change anything though.

Also, do you know if your load script is receiving the correct number from the datastore? Or is it getting nothing and defaulting?

Figured out the problem after spending 20 minutes going back and forth adding debug prints as well as changing my datastore logic, then I realized that it had nothing to do with my DataStore, and it was because I had a while true loop setting the color to white in my hair color logic.

My god, I am stupid. Thanks for the help anyways.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.