I am currentely working on a table-based trading system, but I’m running into a huge issue.
The first trade between two players works fine, but it’s like the trade stays even though I KNOW it is removed. Why is this?
Am I using table.clone() wrong?
Here’s the code;
local RequestedTrades = {}
local Trades = {}
local tradeFolder = game.ReplicatedStorage:WaitForChild("TradeRems")
-- Request Handling
local sendRem = tradeFolder:WaitForChild("SendRequest")
local acceptRem = tradeFolder:WaitForChild("AcceptRequest")
local declineRem = tradeFolder:WaitForChild("DeclineRequest")
local beginRem = tradeFolder:WaitForChild("BeginTrade")
-- Trade Handling
local completeRem = tradeFolder:WaitForChild("CompleteTrade")
local updateRem = tradeFolder:WaitForChild("UpdateContents")
local cancelRem = tradeFolder:WaitForChild("CancelTrade")
local acceptTradeRem = tradeFolder:WaitForChild("AcceptTrade")
local manager = require(game.ServerScriptService:WaitForChild("Modules"):WaitForChild("Manager"))
local players = game.Players
local tradeTemp = {
Sender = nil,
Reciever = nil,
Data = {
Sender = {
Contents = {},
Accepted = false
},
Reciever = {
Contents = {},
Accepted = false
}
}
}
--[[
Main Trading Functions
(!) This isn't in a module because that would require me to use OOP and weird tables and I'm
not doing allat 😎😎
--]]
local function playerObject(username)
return players:FindFirstChild(username)
end
local function validateTrade(user1, user2, tableToSearch)
if user1 and user2 and tableToSearch then
for i, instance in tableToSearch do
if tableToSearch[1] == user1 and tableToSearch[2] == user2 then
return instance
end
end
end
end
-- Trade Request Handling
local function request(Sender, Reciever)
if Sender and Reciever then
local tradeFound = validateTrade(Sender, Reciever, RequestedTrades)
if tradeFound == nil or false then
sendRem:FireClient(Reciever, Sender)
table.insert(RequestedTrades, {tostring(Sender), tostring(Reciever)})
end
end
end
local function acceptRequest(Reciever, Sender)
local tradeTable
for i, trade in ipairs(RequestedTrades) do
if (trade[1] == tostring(Sender) and trade[2] == tostring(Reciever)) or
(trade[2] == tostring(Sender) and trade[1] == tostring(Reciever)) then
local newTrade = table.clone(tradeTemp)
newTrade.Sender = trade[2]
newTrade.Reciever = trade[1]
table.remove(RequestedTrades, i)
table.insert(Trades, newTrade)
tradeTable = trade
break
end
warn("Failed to find trade! Either the other player left, or an exploiter tried to make a fake trade")
end
if tradeTable then
beginRem:FireClient(Sender)
beginRem:FireClient(Reciever)
end
end
local function declineRequest(Reciever, Sender)
if table.find(RequestedTrades, {tostring(Sender), tostring(Reciever)}) then
table.remove(RequestedTrades, table.find(RequestedTrades, {Sender, Reciever}))
end
end
-- In Trade Functions
local function cancelTrade(Sender)
for i, trade in Trades do
if trade.Sender == tostring(Sender) or trade.Reciever == tostring(Sender) then
cancelRem:FireClient(Sender)
if trade.Sender == tostring(Sender) then
cancelRem:FireClient(playerObject(trade.Reciever))
table.remove(Trades, i)
elseif trade.Reciever == tostring(Sender) then
cancelRem:FireClient(playerObject(trade.Sender))
table.remove(Trades, i)
end
break
end
end
end
local function handleItem(Sender, Item, InTrade)
local selectedTrade
local selectedPlayer
for i, trade in Trades do
if trade.Sender == tostring(Sender) then
selectedTrade = trade
selectedPlayer = "Sender"
break
elseif trade.Reciever == tostring(Sender) then
selectedTrade = trade
selectedPlayer = "Reciever"
break
end
end
if selectedTrade then
if InTrade == true then
if selectedPlayer == "Sender" then
local find = table.find(manager.Profiles[Sender].Data.Inventory.Skins, Item)
if find then
selectedTrade.Data.Sender.Accepted = false
updateRem:FireClient(playerObject(selectedTrade.Reciever), Item, InTrade)
table.insert(selectedTrade.Data.Sender.Contents, Item)
end
elseif selectedPlayer == "Reciever" then
local find = table.find(manager.Profiles[Sender].Data.Inventory.Skins, Item)
if find then
selectedTrade.Data.Reciever.Accepted = false
updateRem:FireClient(playerObject(selectedTrade.Sender), Item, InTrade)
table.insert(selectedTrade.Data.Reciever.Contents, Item)
end
end
elseif InTrade == false then
if selectedPlayer == "Sender" then
local find = table.find(manager.Profiles[Sender].Data.Inventory.Skins, Item)
if find then
selectedTrade.Data.Sender.Accepted = false
updateRem:FireClient(playerObject(selectedTrade.Reciever), Item, InTrade)
table.remove(selectedTrade.Data.Sender.Contents, table.find(selectedTrade.Data.Sender.Contents, Item))
end
elseif selectedPlayer == "Reciever" then
local find = table.find(manager.Profiles[Sender].Data.Inventory.Skins, Item)
if find then
selectedTrade.Data.Reciever.Accepted = false
updateRem:FireClient(playerObject(selectedTrade.Sender), Item, InTrade)
table.remove(selectedTrade.Data.Reciever.Contents, table.find(selectedTrade.Data.Reciever.Contents, Item))
end
end
end
end
end
local function acceptTrade(Sender)
local selectedTrade = nil
local tradeIndex = nil
for i, trade in ipairs(Trades) do
if trade.Sender == tostring(Sender) or trade.Reciever == tostring(Sender) then
selectedTrade = trade
tradeIndex = i
break
end
end
if selectedTrade then
local selectedPlayer = (selectedTrade.Sender == tostring(Sender)) and "Sender" or "Reciever"
if selectedPlayer == "Sender" then
selectedTrade.Data.Sender.Accepted = true
elseif selectedPlayer == "Reciever" then
selectedTrade.Data.Reciever.Accepted = true
end
local isTradeComplete = selectedTrade.Data.Sender.Accepted and selectedTrade.Data.Reciever.Accepted
if isTradeComplete then
for i, item in selectedTrade.Data.Sender.Contents do
local find = table.find(manager.Profiles[playerObject(selectedTrade.Sender)].Data.Inventory.Skins, item)
table.remove(manager.Profiles[playerObject(selectedTrade.Sender)].Data.Inventory.Skins, find)
table.insert(manager.Profiles[playerObject(selectedTrade.Reciever)].Data.Inventory.Skins, item)
end
for i, item in selectedTrade.Data.Reciever.Contents do
local find = table.find(manager.Profiles[playerObject(selectedTrade.Reciever)].Data.Inventory.Skins, item)
table.remove(manager.Profiles[playerObject(selectedTrade.Reciever)].Data.Inventory.Skins, find)
table.insert(manager.Profiles[playerObject(selectedTrade.Sender)].Data.Inventory.Skins, item)
end
completeRem:FireClient(playerObject(selectedTrade.Sender))
completeRem:FireClient(playerObject(selectedTrade.Reciever))
-- Remove the trade after the loop is completed
print(tradeTemp)
table.remove(Trades, tradeIndex)
print(tradeTemp)
end
end
end
-- Remote Handling
sendRem.OnServerEvent:Connect(function(Sender, Reciever)
request(Sender, Reciever)
end)
acceptRem.OnServerEvent:Connect(function(Reciever, Sender)
acceptRequest(Reciever, Sender)
end)
declineRem.OnServerEvent:Connect(function(Reciever, Sender)
declineRequest(Reciever, Sender)
end)
updateRem.OnServerEvent:Connect(function(Sender, Item, InTrade)
handleItem(Sender, Item, InTrade)
end)
cancelRem.OnServerEvent:Connect(function(Sender, Reciever)
cancelTrade(Sender)
end)
acceptTradeRem.OnServerEvent:Connect(function(Sender)
acceptTrade(Sender)
end)```