Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

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

Asked by 3 years ago

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

Log in to vote
3
Answered by
appxritixn 2235 Moderation Voter Community Moderator
3 years ago

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

Answer this question