I made an adaptation on the script written originally by Shiro75, so that it would work with DataStore2 for saving tools data. When i add or remove tools on the player´s backpack, the data is saved. However, the last tool present at the player´s backpack is never removed. How can i solve this issue? Here is the code:
local library = game:GetService("ServerStorage").toolFolder
local DataStore2 = require(game:GetService("ServerScriptService").MainModule)
--< directory functions
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 toolsDataStore = DataStore2("Tools_", player)
local bp = player.Backpack
local data = nil
if ready == false then
ready = true
data = toolsDataStore:Get(nil)
if data then
setup(player, data)
edit(player, data)
end
end
--< adjuster
local count = 0
local function adjust()
local list = {}
local toolsDataStore = DataStore2("Tools_", player)
local equipped = char:FindFirstChildOfClass("Tool")
if equipped then
table.insert(list, equipped.Name)
toolsDataStore:Set(list)
end
local tools = bp:GetChildren()
for i = 1, #tools do
table.insert(list, tools[i].Name)
toolsDataStore:Set(list)
end
if count ~= #list then
edit(player, list)
count = #list
end
end
--< child events
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)
I’m not sure if DS2 can save models/tools. What I do is have it save an inventory which has the name and other data saved as objects and when the player wants to equip it it gets the tool from serverstorage and has them equip it.
The data that represents the tool is sucessfully saved and loaded with the script that i have presented using DS2. The only problem is that the last tool always remains and i can´t figure out how to get rid of it.
1- It doesn´t really matter the name. Suppose i have Tool1 and Tool2. If i delete Tool2, the Tool1 will remain, and vice-versa.
2- Its not disappearing from the datastore. If i leave the game and come back again, 1 tool will always remain. If i add more tools, leave and come back again, the number of tools will be correct, the problem only happends when removing the tools until the last one.
When the player joins, can you unpack the value from the datastore and print it? Also when setting the datastore can you unpack that too and print it?
if you don’t know what unpacking is, here’s an example
print(unpack(workspace:GetChildren()))
The above should print all of the children in the workspace.
Hi there, could you properly format your code to use a codeblock so we can read it better (more formatting details here)? If you want to remove the tool and save it when the player leaves, you should be using the PlayerRemoving event. Could you better explain what you want to happen and what really happens?
Hi Qxest, i have edited the code and included the codelock as requested, thanks for the orientation! I believe may not be using the PlayerRemoving event because of how the DataStore2 module works. What i want to happend is that when a tool is removed, it will not remain in the player´s backpack when i leave and rejoin the game. For example: If i have 3 tools on the players backpack: Tool1, Tool2 and Tool3. If i remove Tool3, leave and rejoin the game, Tool1 and Tool2 will be in the game. That is the expected behaviour. However, if i keep removing until the last one, the very last tool will always remain when i rejoin the game. In summary, i can´t get rid of the last tool.
What do you mean by this exactly? How are you removing the last tool? You do know if a tool is equipped it’s not in Backpack but in the player’s character in Workspace.
I mean completely removing from the players backpack, and also not present in the character as an equipped tool. As if the tool is on the player backpack and then i use Destroy() or ClearAllChildren() on the backpack.
Sorry, I may be a bit slow here to understand. Just so I can see what’s going on, can you confirm that the adjust function is being called by sticking a print statement right above it. If it is being printed as you remove the 3rd tool, there is a problem with how you’re saving your tools (your code is unnecessarily complex btw). You keep saying you’re removing the last tool but I don’t see where in your code you’re doing that. All I see is that you’re saving it every time you call adjust and use the same datastore over and over. You probably don’t even need to do this, just update the datastore when the player leaves rather than every time his or her tools update.
I am removing by other means, that are not on this code (i mean by another script). But i made a print() on the adjust function as you suggested. I can get the print at everytime i add or remove a tool, except when it´s the last tool…
Regarding the fact that the script do not save only when the player leaves, is an attempt to prevent data loss, as explained here How to use DataStore2 - Data Store caching and data loss prevention
I understand that this may be a controversial method, but i have decided to give it a try.