Saving Players Body Colours

Hello,
I am making a script that data saves a players body colour, but I am unsure how to actually save and load the colour. I have this data store with everything made, but unsure how to save/load the body colours. I have a custom startercharacter and I would like to use this to save the colours for it, like a shirt that utilizes body colours. Any help would be appreciated, couldn’t find anything to help.

Script:

local DSS = game:GetService("DataStoreService")
local ColourStore = DSS:GetDataStore("DataColors")
local DefaultColour = nil
game.Players.PlayerAdded:Connect(function(Player)
	local data
	local success, result = pcall(function()

		data = ColourStore:GetAsync(Player.UserId)
		
	end)
	if success then
		if data then
			
		end
	end
end)
game.Players.PlayerRemoving:Connect(function(player)	
	local success, result = pcall(function()
		ColourStore:SetAsync("Player_"..player.UserId)
	end)

	if success then
		print(result)
	else
		warn(result)
	end
end)

game:BindToClose(function()
	for _, player in ipairs(game.Players:GetPlayers()) do
		local success, result = pcall(function()
		   ColourStore:SetAsync("Player_"..player.UserId, player.Quest.Value)
		end)

		if success then
			print(result)
		else
			warn(result)
		end
	end
end)
1 Like
local datastores = game:GetService("DataStoreService")
local datastore = datastores:GetDataStore("DataStore")
local players = game:GetService("Players")

local properties = {"HeadColor", "LeftArmColor", "LeftLegColor", "RightArmColor", "RightLegColor", "TorsoColor"}
local playersData = {}

local function serializeData(character)
	local data = {}
	local bodyColors = character["Body Colors"]
	for _, property in ipairs(properties) do
		data[property] = bodyColors[property].Name
	end
	return data
end

local function deserializeData(character, data)
	local bodyColors = character["Body Colors"]
	for propertyName, propertyValue in pairs(data) do
		bodyColors[propertyName] = BrickColor.new(propertyValue)
	end
end

local function onPlayerAdded(player)
	local function onCharacterRemoving(character)
		local function onPlayerRemoving(plr)
			if player == plr then
				local data = serializeData(character)
				local success, result = pcall(function()
					return datastore:SetAsync("BodyColors_"..player.UserId, data)
				end)
				
				if success then
					if result then
						print(result)
					end
				else
					warn(result)
				end
			end
		end
		
		players.PlayerRemoving:Connect(onPlayerRemoving)
	end
	
	local function onCharacterLoaded(character)
		local data = playersData[player]
		if data then
			deserializeData(character, data)
		end
	end
	
	player.CharacterRemoving:Connect(onCharacterRemoving)
	player.CharacterAppearanceLoaded:Connect(onCharacterLoaded)
	
	local success, result = pcall(function()
		return datastore:GetAsync("BodyColors_"..player.UserId)
	end)
	
	if success then
		if result then
			playersData[player] = result
		end
	else
		warn(result)
	end
end

players.PlayerAdded:Connect(onPlayerAdded)

I did test this & it works.

1 Like

Ah, thanks, is there also a way to do this with the players shirt?

local datastores = game:GetService("DataStoreService")
local datastore = datastores:GetDataStore("DataStore")
local players = game:GetService("Players")

local properties = {"HeadColor", "LeftArmColor", "LeftLegColor", "RightArmColor", "RightLegColor", "TorsoColor"}
local playersData = {}

local function serializeData(character)
	local data = {}
	local bodyColors = character["Body Colors"]
	for _, property in ipairs(properties) do
		data[property] = bodyColors[property].Name
	end
	
	local shirt = character:FindFirstChild("Shirt")
	if shirt then
		data["Shirt"] = shirt.ShirtTemplate
	end
	
	local pants = character:FindFirstChild("Pants")
	if pants then
		data["Pants"] = pants.PantsTemplate
	end
	
	local shirtGraphic = character:FindFirstChild("ShirtGraphic")
	if shirtGraphic then
		data["ShirtGraphic"] = shirtGraphic.Graphic
	end
	
	return data
end

local function deserializeData(character, data)
	local bodyColors = character["Body Colors"]
	for _, property in ipairs(properties) do
		bodyColors[property] = BrickColor.new(data[property])
	end
	
	if data["Shirt"] then
		local shirt = character:FindFirstChild("Shirt")
		if shirt then
			shirt.ShirtTemplate = data["Shirt"]
		else
			shirt = Instance.new("Shirt")
			shirt.Parent = character
			shirt.ShirtTemplate = data["Shirt"]
		end
	end
	
	if data["Pants"] then
		local pants = character:FindFirstChild("Pants")
		if pants then
			pants.PantsTemplate = data["Pants"]
		else
			pants = Instance.new("Pants")
			pants.Parent = character
			pants.PantsTemplate = data["Pants"]
		end
	end
	
	if data["ShirtGraphic"] then
		local shirtGraphic = character:FindFirstChild("ShirtGraphic")
		if shirtGraphic then
			shirtGraphic.Graphic = data["ShirtGraphic"]
		else
			shirtGraphic = Instance.new("ShirtGraphic")
			shirtGraphic.Parent = character
			shirtGraphic.Graphic = data["ShirtGraphic"]
		end
	end
end

local function onPlayerAdded(player)
	local function onCharacterRemoving(character)
		local function onPlayerRemoving(plr)
			if player == plr then
				local data = serializeData(character)
				local success, result = pcall(function()
					return datastore:SetAsync("BodyColors_"..player.UserId, data)
				end)

				if success then
					if result then
						print(result)
					end
				else
					warn(result)
				end
			end
			
			playersData[plr] = nil
		end

		players.PlayerRemoving:Connect(onPlayerRemoving)
	end

	local function onCharacterLoaded(character)
		local data = playersData[player]
		if data then
			deserializeData(character, data)
		end
	end

	player.CharacterRemoving:Connect(onCharacterRemoving)
	player.CharacterAppearanceLoaded:Connect(onCharacterLoaded)

	local success, result = pcall(function()
		return datastore:GetAsync("BodyColors_"..player.UserId)
	end)

	if success then
		if result then
			playersData[player] = result
		end
	else
		warn(result)
	end
end

players.PlayerAdded:Connect(onPlayerAdded)

Yes, I’ve covered all bases and added support for pants/tshirt too.

3 Likes

Alright, I’ll test it tomorrow and see if it works!

I think it’s possible to save Color3 and BrickColor values (You can create them as instances), if you can’t with DataStore, then save 3 Values for R,G,B to the player’s name.

Thanks a lot man, it works great! I will be able to do a lot now.

Also one more quick question, on the line where it says

else 
shirt = instance.new("Shirt")
shirt.Parent = character
shirt.ShirtTemplate = data["Shirt"]

Am I able to switch this out with a line that gives them a shirt if they don’t have any data?

if data["Shirt"] then
	local shirt = character:FindFirstChild("Shirt")
	if shirt then
		shirt.ShirtTemplate = data["Shirt"]
	else
		shirt = Instance.new("Shirt")
		shirt.Parent = character
		shirt.ShirtTemplate = data["Shirt"]
	end
else
	local shirt = character:FindFirstChild("Shirt")
	if shirt then
		shirt.ShirtTemplate = "rbxassetid://" --change this
	else
		shirt = Instance.new("Shirt")
		shirt.Parent = character
		shirt.ShirtTemplate = "rbxassetid://" --change this
	end
end

if data["Pants"] then
	local pants = character:FindFirstChild("Pants")
	if pants then
		pants.PantsTemplate = data["Pants"]
	else
		pants = Instance.new("Pants")
		pants.Parent = character
		pants.PantsTemplate = data["Pants"]
	end
else
	local pants = character:FindFirstChild("Pants")
	if pants then
		pants.PantsTemplate = "rbxassetid://" --change this
	else
		pants = Instance.new("Pants")
		pants.Parent = character
		pants.PantsTemplate = "rbxassetid://" --change this
	end
end

if data["ShirtGraphic"] then
	local shirtGraphic = character:FindFirstChild("ShirtGraphic")
	if shirtGraphic then
		shirtGraphic.Graphic = data["ShirtGraphic"]
	else
		shirtGraphic = Instance.new("ShirtGraphic")
		shirtGraphic.Parent = character
		shirtGraphic.Graphic = data["ShirtGraphic"]
	end
else
	local shirtGraphic = character:FindFirstChild("ShirtGraphic")
	if shirtGraphic then
		shirtGraphic.Graphic = "rbxassetid://" --change this
	else
		shirtGraphic = Instance.new("ShirtGraphic")
		shirtGraphic.Parent = character
		shirtGraphic.Graphic = "rbxassetid://" --change this
	end
end

Alright thanks! I appreciate you always being there answering my questions lol

Hi!! I’ve tried this exact solution on my own game, and it only works under very specific circumstances. After changing the color, I have to respawn my character, leave the game, and then rejoin for the skin color value to be saved. If I only respawn or only leave, nothing happens. I know this is an old post, but I was wondering if there’s anything that could be causing that? Or if there’s something I’m doing wrong right now