With the data store script i currently have if a player has 2 bronze swords and 3 silver swords and leaves and rejoins the game they will have 2 bronze and 3 silver swords in their inventory when they rejoin. My goal would be to make so when they leave and rejoin they would they would only have one bronze sword and one silver sword when they rejoin. a solution that i have come up with is to put if player.Backpack:FindFirstChild("Bronzesword") then my bronze sword giver script does not give the player the tool thus solving the duplicate problem. The problem with that is i didn't think of this solution until the game got a a lot of visits and a lot of players have multiples of the same tool.
i need to figure out a way to make it so the datastore doesn't save multiple of the same tool or maybe have a script that as soon as a player joins the game it scans through their inventory and checks if they have duplicates.
local rs = game:GetService("ReplicatedStorage") local ds = game:GetService("DataStoreService") local store = ds:GetDataStore("saveStore") local library = rs:WaitForChild("Library") local dir = {} local function edit(player, list) dir[player.Name] = list end local function setup(player, list) for i = 1, #list do local tool = library:FindFirstChild(list[i]) if tool then local clone = tool:Clone() clone.Parent = player.Backpack else print(list[i] .. " not found") end end end --< player events game.Players.PlayerAdded:connect(function(player) local ready = false player.CharacterAdded:connect(function(char) local bp = player.Backpack local data = nil if ready == false then ready = true data = store:GetAsync(player.UserId) if data then setup(player, data) edit(player, data) end end char.Humanoid.Died:connect(function() char.Humanoid:UnequipTools() local old = player.StarterGear:GetChildren() for i = 1, #old do old[i]:Destroy() end local new = player.Backpack:GetChildren() for i = 1, #new do new[i].Parent = player.StarterGear end end) --< adjuster local count = 0 local function adjust() if char.Humanoid.Health > 0 then local list = {} local equipped = char:FindFirstChildOfClass("Tool") if equipped then table.insert(list, equipped.Name) end local tools = bp:GetChildren() for i = 1, #tools do table.insert(list, tools[i].Name) end if count ~= #list then edit(player, list) count = #list end end end bp.ChildAdded:connect(adjust) bp.ChildRemoved:connect(adjust) char.ChildAdded:connect(function(child) if child.ClassName == "Tool" then adjust() end end) char.ChildRemoved:connect(function(child) if child.ClassName == "Tool" then adjust() end end) end) end) game.Players.PlayerRemoving:connect(function(player) store:SetAsync(player.UserId, dir[player.Name]) dir[player.Name] = nil end) game:BindToClose(function() wait(5) end)
To remove duplicates within a table, you can use a function like this:
function RemoveTableDupes(tbl) local temp = {} for _,v in ipairs(tbl) do if not table.find(temp,v) then table.insert(temp,v) end end return temp end
In your script, it could look something like this:
game.Players.PlayerRemoving:connect(function(player) dir[player.Name] = RemoveTableDupes(dir[player.Name]) store:SetAsync(player.UserId, dir[player.Name]) dir[player.Name] = nil end)