Inventory Server
Inventory Server
-- Modules
local Signal = require(RS.Modules.Signal)
local Janitor = require(RS.Modules.Janitor)
local NotificationsModule = require(RS.ClientModules.NotificationModule)
-- DataStore
local InventoryDataStore = DataStoreService:GetDataStore("InventoryDataStore2")
-- Module
local InventoryServer = {}
InventoryServer.AllInventories = {}
InventoryServer.MaxStacks = 50
InventoryServer.MaxStackData = {
Weapon = 1,
Armor = 1,
Consumable = 8,
Resource = 16
}
-- Dropping Item
function InventoryServer.DropItem(player, stackId)
local stackData = InventoryServer.FindStackDataFromId(player, stackId)
if not stackData then return end
local dropDistance = 5
local dropPosition = root.CFrame.Position + root.CFrame.LookVector *
dropDistance
handle.CFrame = CFrame.new(dropPosition)
end
-- Equip Item
function InventoryServer.EquipItem(player, slotNum)
local inv = InventoryServer.AllInventories[player]
local stackData = nil
for slotKey, stackId in pairs(inv.Hotbar) do
if slotKey == "Slot" .. slotNum then
stackData = InventoryServer.FindStackDataFromId(player, stackId)
break
end
end
InventoryServer.UnequipItems(player)
if stackData then
local tool = stackData.Items[1]
if not player.Character then return end
tool.Parent = player.Character
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
end
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
InventoryServer.UnequipFromHotbar(player, stackId)
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
if found then
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
end
-- Adding Items
function InventoryServer.RegisterItem(player, tool)
if tool.ClassName ~= "Tool" then return end
for slotNum = 1, 9 do
if inv.Hotbar["Slot" .. slotNum] == nil then
InventoryServer.EquipToHotbar(player, slotNum,
stack.StackId)
break
end
end
else
error("The user has more than the max stacks of 50!")
end
end
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
if #stackData.Items == 0 then
table.remove(inv.Inventory, table.find(inv.Inventory,
stackData))
InventoryServer.UnequipFromHotbar(player,
stackData.StackId)
end
end
end
Signal.FireClient(player, "Inventory:ItemsUpdated",
InventoryServer.GetInventoryJSON(player))
end
function InventoryServer.StartAutoSave()
while true do
-- Save inventory data for each player
for _, player in pairs(game.Players:GetPlayers()) do
InventoryServer.SaveInventoryData(player)
print("Auto Save: Saved inventory data for player " ..
player.Name)
end
-- Delay for 1 to 3 minutes (60 to 180 seconds)
local saveInterval = math.random(60, 180)
task.wait(saveInterval)
end
end
InventoryServer.AllInventories[player] = inventoryData
end
-- Player Added
function InventoryServer.PlayerAdded(player)
InventoryServer.LoadInventoryData(player)
player.Backpack.ChildAdded:Connect(function(child)
InventoryServer.RegisterItem(player, child)
end)
player.Backpack.ChildRemoved:Connect(function(child)
InventoryServer.UnRegisterItem(player, child)
end)
function InventoryServer.CharacterToolRemoved()
local enabled = false
for _, tool in pairs(player.Character:GetChildren()) do
if tool:IsA("Tool") and enabled == true then
tool:GetPropertyChangedSignal("Parent"):Connect(function()
if tool.Parent ~= player.Character or player.Backpack
then
InventoryServer.UnRegisterItem(player, tool)
end
end)
end
end
end
player.Backpack.ChildAdded:Connect(function(child)
InventoryServer.RegisterItem(player, child)
end)
player.Backpack.ChildRemoved:Connect(function(child)
InventoryServer.UnRegisterItem(player, child)
end)
char.ChildAdded:Connect(function(child)
InventoryServer.RegisterItem(player, child)
end)
char.ChildRemoved:Connect(function(child)
InventoryServer.UnRegisterItem(player, child)
end)
end
if player.Character then
task.spawn(charAdded, player.Character)
end
player.CharacterAdded:Connect(charAdded)
end
-- Player Removing
function InventoryServer.PlayerRemoving(player)
InventoryServer.SaveInventoryData(player)
InventoryServer.AllInventories[player] = nil
end
local adjustedInv = {
Inventory = {},
Hotbar = inv.Hotbar,
Armor = inv.Armor,
LastStackId = inv.LastStackId
}
for i, stackData in pairs(inv.Inventory) do
table.insert(adjustedInv.Inventory, {
Name = stackData.Name,
Description = stackData.Description,
Image = stackData.Image,
ItemType = stackData.ItemType,
ArmorType = stackData.ArmorType,
ItemTypeDescription = stackData.ItemTypeDescription,
Rarity = stackData.Rarity,
IsDroppable = stackData.IsDroppable,
Items = stackData.Items,
Count = #stackData.Items,
StackId = stackData.StackId
})
end
return adjustedInv
end
-- Initializing
function InventoryServer.Start()
for i, player in pairs(Players:GetPlayers()) do
task.spawn(InventoryServer.PlayerAdded, player)
end
Players.PlayerAdded:Connect(InventoryServer.PlayerAdded)
Players.PlayerRemoving:Connect(InventoryServer.PlayerRemoving)
task.spawn(InventoryServer.StartAutoSave)
Signal.ListenRemote("Inventory:GetInventoryJSON",
InventoryServer.GetInventoryJSON)
Signal.ListenRemote("Inventory:DropItem", InventoryServer.DropItem)
Signal.ListenRemote("InventoryEquipToHotbar", InventoryServer.EquipToHotbar)
Signal.ListenRemote("InventoryUnequipFromHotbar",
InventoryServer.UnequipFromHotbar)
Signal.ListenRemote("Inventory:EquipItem", InventoryServer.EquipItem)
Signal.ListenRemote("Inventory:UnequipItems", InventoryServer.UnequipItems)
Signal.ListenRemote("Inventory:UnequipAllItems",
InventoryServer.UnequipAllItems)
end
return InventoryServer