Advertisement
dubleeyrblxx

Keep Items after leaving -- Roblox

Jan 28th, 2023
1,140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.52 KB | None | 0 0
  1. local folders_to_save = {
  2.     ['Backpack'] = game.ReplicatedStorage.Items
  3. }
  4.  
  5. local reload_items_on_reset = true
  6.  
  7. local DataStoreService = game:GetService("DataStoreService")
  8. local ItemStore = DataStoreService:GetDataStore("ItemStore")
  9.  
  10. local PlayerData = {}
  11.  
  12. local function LoadItemsFromData(player: Player, data, onReset: boolean)
  13.     local folders = {}
  14.  
  15.     for storeFolderName, itemsFolder in pairs(folders_to_save) do
  16.         local folder = player:FindFirstChild(storeFolderName)
  17.         if not folder then
  18.             folder = Instance.new("Folder")
  19.             folder.Name = storeFolderName
  20.             folder.Parent = player
  21.         end
  22.         folders[storeFolderName] = folder
  23.     end
  24.  
  25.     local function AddItem(item: Instance, folder: Folder, index: number)
  26.  
  27.         if not data[folder.Name] then
  28.             data[folder.Name] = {}
  29.         end
  30.  
  31.         if not index then
  32.             index = #data[folder.Name] + 1
  33.             table.insert(data[folder.Name], index, item.Name)
  34.         end
  35.  
  36.  
  37.         item.AncestryChanged:Connect(function(_, newParent)
  38.             if newParent ~= folder and folder.Parent ~= nil then
  39.                 data[folder.Name][index] = nil
  40.             end
  41.         end)
  42.     end
  43.  
  44.     for storeFolderName, savedItems in pairs(data) do
  45.  
  46.         if onReset == true and storeFolderName ~= 'Backpack' then
  47.             continue
  48.         end
  49.  
  50.  
  51.         local itemsFolder: Folder = folders_to_save[storeFolderName]
  52.  
  53.         if itemsFolder then
  54.  
  55.             local folder = folders[storeFolderName]
  56.  
  57.             for index, itemName in pairs(savedItems) do
  58.                 local item = itemsFolder:FindFirstChild(itemName)
  59.                 if item then
  60.                     local playerItem = item:Clone()
  61.                     playerItem.Parent = folder
  62.  
  63.                     AddItem(playerItem, folder, index)
  64.                 else
  65.                     warn(player, 'has unknown item that is said to be in folder', storeFolderName, ":", itemName)
  66.                 end
  67.             end
  68.  
  69.         else
  70.             warn(player, 'has unknown directory saved in data:', storeFolderName)
  71.         end
  72.     end
  73.  
  74.  
  75.     for storeFolderName, folder in pairs(folders) do
  76.         folders[storeFolderName] = nil
  77.  
  78.         if onReset == true and storeFolderName ~= 'Backpack' then
  79.             continue
  80.         end
  81.  
  82.         folder.ChildAdded:Connect(function(item)
  83.             AddItem(item, folder)
  84.         end)
  85.     end
  86. end
  87.  
  88. local function Load(player: Player)
  89.  
  90.     if PlayerData[player] then
  91.         return warn(player, 'data is already loaded')
  92.     end
  93.  
  94.     local dataKey = 'key_' .. player.UserId
  95.  
  96.     local loadedData = nil
  97.     local success, result = pcall(function()
  98.         loadedData = ItemStore:GetAsync(dataKey)
  99.     end)
  100.  
  101.     if not success then
  102.         error(success)
  103.     end
  104.  
  105.     if loadedData == nil then
  106.         loadedData = {} -- we give it empty data
  107.     end
  108.  
  109.     warn(player, 'items have been loaded')
  110.  
  111.     return loadedData
  112. end
  113.  
  114. local function Save(player: Player)
  115.     local dataKey = 'key_' .. player.UserId
  116.  
  117.     local data = PlayerData[player]
  118.  
  119.     local success, result = pcall(function()
  120.         ItemStore:SetAsync(dataKey, data, {player.UserId})
  121.     end)
  122.  
  123.     if not success then
  124.         error(result)
  125.     end
  126.  
  127.     warn('Successfully saved', player, 'items to Datastore')
  128. end
  129.  
  130. game.Players.PlayerAdded:Connect(function(player: Player)
  131.     local data = Load(player)
  132.     PlayerData[player] = data
  133.  
  134.     local character = player.Character or player.CharacterAdded:Wait()
  135.     LoadItemsFromData(player, data)
  136.  
  137.     if reload_items_on_reset == true then
  138.         player.CharacterAdded:Connect(function(character: Model)
  139.             LoadItemsFromData(player, data, true)
  140.         end)    
  141.     end
  142. end)
  143.  
  144. game.Players.PlayerRemoving:Connect(function(player: Player)
  145.     Save(player)
  146.  
  147.     if PlayerData[player] then
  148.         table.clear(PlayerData[player])
  149.     end
  150.  
  151.     PlayerData[player] = nil
  152. end)
  153.  
  154. game:BindToClose(function()
  155.     for _, player in pairs(game.Players:GetPlayers()) do
  156.         Save(player)
  157.     end
  158. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement