Issues with table cloning and removing?

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)```

Nevermind, apparentely I’m just an idiot and don’t know how table.clone works.

There’s 3 hours of my life gone…

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.