-- Basic Inventory and Trading System
-- Services
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Remote Events
local InventoryEvent = Instance.new("RemoteEvent")
InventoryEvent.Name = "InventoryEvent"
InventoryEvent.Parent = ReplicatedStorage
local TradeEvent = Instance.new("RemoteEvent")
TradeEvent.Name = "TradeEvent"
TradeEvent.Parent = ReplicatedStorage
-- Inventory Class
local Inventory = {}
Inventory.__index = Inventory
function Inventory.new()
local self = setmetatable({}, Inventory)
self.Items = {}
return self
end
function Inventory:AddItem(item)
table.insert(self.Items, item)
end
function Inventory:RemoveItem(itemName)
for i, item in ipairs(self.Items) do
if item.Name == itemName then
table.remove(self.Items, i)
break
end
end
end
function Inventory:GetItems()
return self.Items
end
-- Trade System
local TradeSystem = {}
TradeSystem.__index = TradeSystem
function TradeSystem.new()
local self = setmetatable({}, TradeSystem)
self.Trades = {}
return self
end
function TradeSystem:CreateTrade(player1, player2, items1, items2)
local tradeId = tostring(math.random(1000, 9999))
local trade = {
Id = tradeId,
Player1 = player1,
Player2 = player2,
Items1 = items1,
Items2 = items2,
Status = "Pending"
}
table.insert(self.Trades, trade)
return tradeId
end
function TradeSystem:GetTrade(tradeId)
for _, trade in ipairs(self.Trades) do
if trade.Id == tradeId then
return trade
end
end
return nil
end
-- Player Inventory and Trade Management
local playerInventories = {}
local tradeSystem = TradeSystem.new()
local function GetPlayerInventory(player)
if not playerInventories[player.UserId] then
local inventory = Inventory.new()
playerInventories[player.UserId] = inventory
end
return playerInventories[player.UserId]
end
local function OnInventoryRequest(player)
local inventory = GetPlayerInventory(player)
InventoryEvent:FireClient(player, "UpdateInventory", inventory:GetItems())
end
local function OnItemAddRequest(player, item)
local inventory = GetPlayerInventory(player)
inventory:AddItem(item)
InventoryEvent:FireClient(player, "UpdateInventory", inventory:GetItems())
end
local function OnItemRemoveRequest(player, itemName)
local inventory = GetPlayerInventory(player)
inventory:RemoveItem(itemName)
InventoryEvent:FireClient(player, "UpdateInventory", inventory:GetItems())
end
local function OnTradeCreateRequest(player1, player2, items1, items2)
local tradeId = tradeSystem:CreateTrade(player1.UserId, player2.UserId, items1,
items2)
TradeEvent:FireClient(player1, "TradeCreated", tradeId)
TradeEvent:FireClient(player2, "TradeCreated", tradeId)
end
local function OnTradeAcceptRequest(player, tradeId)
local trade = tradeSystem:GetTrade(tradeId)
if trade and trade.Status == "Pending" then
trade.Status = "Accepted"
TradeEvent:FireClient(player, "TradeAccepted", tradeId)
local otherPlayer = Players:GetPlayerByUserId(trade.Player1 ==
player.UserId and trade.Player2 or trade.Player1)
if otherPlayer then
TradeEvent:FireClient(otherPlayer, "TradeAccepted", tradeId)
end
else
TradeEvent:FireClient(player, "TradeAcceptFailed", tradeId)
end
end
local function OnTradeRejectRequest(player, tradeId)
local trade = tradeSystem:GetTrade(tradeId)
if trade and trade.Status == "Pending" then
trade.Status = "Rejected"
TradeEvent:FireClient(player, "TradeRejected", tradeId)
local otherPlayer = Players:GetPlayerByUserId(trade.Player1 ==
player.UserId and trade.Player2 or trade.Player1)
if otherPlayer then
TradeEvent:FireClient(otherPlayer, "TradeRejected", tradeId)
end
else
TradeEvent:FireClient(player, "TradeRejectFailed", tradeId)
end
end
-- Player Added Event
Players.PlayerAdded:Connect(function(player)
-- Initialize player inventory
GetPlayerInventory(player)
-- Listen to RemoteEvents from client
InventoryEvent.OnServerEvent:Connect(function(player, action, data)
if action == "RequestInventory" then
OnInventoryRequest(player)
elseif action == "AddItem" then
OnItemAddRequest(player, data)
elseif action == "RemoveItem" then
OnItemRemoveRequest(player, data)
end
end)
TradeEvent.OnServerEvent:Connect(function(player, action, data)
if action == "CreateTrade" then
local player2 = Players:GetPlayerByUserId(data.Player2Id)
if player2 then
OnTradeCreateRequest(player, player2, data.Items1, data.Items2)
end
elseif action == "AcceptTrade" then
OnTradeAcceptRequest(player, data.TradeId)
elseif action == "RejectTrade" then
OnTradeRejectRequest(player, data.TradeId)
end
end)
end)
-- Player Removing Event
Players.PlayerRemoving:Connect(function(player)
playerInventories[player.UserId] = nil
end)