Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

How to make tool datastore script that doesn't save multiple of the same tool.?

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)


1 answer

✓ Accepted answer

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)

This discussion is preserved as it was. New answers, comments, and votes are closed.