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)
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)
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.
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.
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