Hello, I am writing a trading system for my game, however, I have come to a problem, whenever I attempt to retrieve the Trade data from a table, it always returns nil, no matter what. I tried using dictionaries before this but that didn’t work., I would be very grateful if someone can help me with my problem.
Fires a RemoteEvent to the server to add an item:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Events = ReplicatedStorage:WaitForChild("Events")
local TradeEvent = Events:WaitForChild("TradeEvent")
local TradeId = script.Parent.Parent.Parent:WaitForChild("TradeId")
script.Parent.MouseButton1Click:Connect(function()
TradeEvent:FireServer("AddItem",game.Players.LocalPlayer,script.Parent.Name,TradeId.Value)
end)
Server Code:
local OngoingTrades = {}
--[[
Trade Template:
{
[TradeId] = 1;
[Player1] = "Player Name";
[Player2] = "Player Name";
[Player1ItemTrades] = {
{ItemName,Amount};
};
[Player2ItemTrades] = {
{ItemName,Amount};
}
]]
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Events = ReplicatedStorage:WaitForChild("Events")
local TradeEvent = Events:WaitForChild("TradeEvent")
local function GetTrade(TradeId)
for _,Trade in pairs(OngoingTrades) do
print(Trade)
if Trade[1] == TradeId then
print(Trade[1])
return Trade
end
end
end
local function AddItem(Player,AddItem,TradeId)
local Data = Player:WaitForChild("Data")
local PlayerSkins = Data:WaitForChild("PlayerSkins")
if PlayerSkins:FindFirstChild(AddItem) then
local Trade = GetTrade(TradeId)
if Trade[2] == Player then -- The problem area.
local TradeItems = Trade[4]
if #TradeItems < 5 then
local HasItem = false
local SkinCount = 0
for _,Skin in pairs(PlayerSkins) do
if Skin.Name == AddItem then
SkinCount = SkinCount+1
end
end
for I,Item in pairs(TradeItems) do
if Item[1] == AddItem.Name then
if Item[2] < SkinCount then
Item[2] = Item[2]+1
HasItem = true
Trade[4] = TradeItems
break
end
end
end
if HasItem == false then
local ItemData = {
AddItem.Name,1
}
table.insert(TradeItems,#TradeItems+1,ItemData)
Trade[4] = TradeItems
end
TradeEvent:FireClient(Player,"UpdateTrade",Trade)
TradeEvent:FireClient(Trade[3],"UpdateTrade",Trade)
end
elseif Trade[3] == Player then
local TradeItems = Trade[5]
if #TradeItems < 5 then
local HasItem = false
local SkinCount = 0
for _,Skin in pairs(PlayerSkins) do
if Skin.Name == AddItem then
SkinCount = SkinCount+1
end
end
for I,Item in pairs(TradeItems) do
if Item[1] == AddItem.Name then
if Item[2] < SkinCount then
Item[2] = Item[2]+1
HasItem = true
Trade[5] = TradeItems
break
end
end
end
if HasItem == false then
local ItemData = {
AddItem.Name,1
}
table.insert(TradeItems,#TradeItems+1,ItemData)
Trade[5] = TradeItems
end
TradeEvent:FireClient(Player,"UpdateTrade",Trade)
TradeEvent:FireClient(Trade[2],"UpdateTrade",Trade)
end
end
end
end
local function RemoveItem(Player,RemoveItem,TradeId)
print("removing")
local Trade = GetTrade(TradeId)
if Trade[2] == Player then
local Trades = Trade[4]
for Index,Item in pairs(Trades) do
if Item[1] == RemoveItem then
table.remove(Trades,Index)
end
end
end
if Trade[3] == Player then
local Trades = Trade[5]
for Index,Item in pairs(Trades) do
if Item[1] == RemoveItem then
table.remove(Trades,Index)
end
end
end
TradeEvent:FireClient(Player,"UpdateTrade",Trade)
TradeEvent:FireClient(Trade[3],"UpdateTrade",Trade)
print("removed")
end
local function CreateTrade(TradePlayer1,TradePlayer2)
local TradeData = {}
table.insert(TradeData,1,math.random(1,9999999))
table.insert(TradeData,2,TradePlayer1)
table.insert(TradeData,3,TradePlayer2)
table.insert(TradeData,4,{})
table.insert(TradeData,5,{})
table.insert(OngoingTrades,#OngoingTrades+1,TradeData)
TradeEvent:FireClient(TradePlayer1,"UpdateTrade",TradeData)
TradeEvent:FireClient(TradePlayer2,"UpdateTrade",TradeData)
end
TradeEvent.OnServerEvent:Connect(function(Player,Type,arg1,arg2,arg3)
if Type == "AddItem" then
AddItem(arg1,arg2,arg3)
end
if Type == "RemoveItem" then
RemoveItem(arg1,arg2,arg3)
end
if Type == "CreateTrade" then
CreateTrade(arg1,arg2)
end
end)
repeat wait() until game.Players:FindFirstChild("Player1")
repeat wait() until game.Players:FindFirstChild("Player2")
CreateTrade(game.Players:FindFirstChild("Player1"),game.Players:FindFirstChild("Player2"))