Data Store for Tool Trading System

Hello, I’m working on a trading System rn, and everything works except if I trade a tool with someone and the guy dies it doesn’t save the tool and it disappears from the hotbar/Inventory can you tell me the code for that it’s pretty easy for you but hard for me cuz im not a pro scripted but anyway here’s the code im using:

local rs = game.ReplicatedStorage:WaitForChild(“TradeReplicatedStorage”)
local re = rs:WaitForChild(“RemoteEvent”)
local config = require(rs:WaitForChild(“CONFIGURATION”))

local tradeRequestsFolder = Instance.new(“Folder”)
tradeRequestsFolder.Name = “TRADE REQUESTS”
tradeRequestsFolder.Parent = rs

local ongoingTradesFolder = Instance.new(“Folder”)
ongoingTradesFolder.Name = “ONGOING TRADES”
ongoingTradesFolder.Parent = rs

–REMOVE TRADES FOR THIS PLAYER
function removeTrades(plr)
for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
trade:Destroy()
end
end

for i, request in pairs(tradeRequestsFolder:GetChildren()) do
	if request.Name == plr.Name or request.Value == plr.Name then
		request:Destroy()
	end
end

end

–REMOVE TRADES WHEN PLAYER DIES
game.Players.PlayerAdded:Connect(function(plr)
plr.CharacterAdded:Connect(function(char)

	char:WaitForChild("Humanoid").Died:Connect(function()
		removeTrades(plr)
	end)
end)

end)

–REMOVE TRADES WHEN PLAYER LEAVES
game.Players.PlayerRemoving:Connect(removeTrades)

–RECEIVE CLIENT INFORMATION
re.OnServerEvent:Connect(function(plr, instruction, data)

--Send a request
if instruction == "send trade request" then
	
	local playerSent = data[1]
	
	if playerSent and playerSent ~= plr then
		local inTrade = false
		
		for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
			if trade.Sender.Value == playerSent.Name or trade.Sender.Value == plr.Name or trade.Receiever.Value == playerSent.Name or trade.Receiver.Value == plr.Name then
				inTrade = true
				break
			end
		end
		
		for i, request in pairs(tradeRequestsFolder:GetChildren()) do
			if request.Name == playerSent.Name or request.Name == plr.Name or request.Value == playerSent.Name or request.Value == plr.Name then
				inTrade = true
				break
			end
		end
		
		if not inTrade then
			
			local newRequest = Instance.new("StringValue")
			newRequest.Name = plr.Name
			newRequest.Value = playerSent.Name
			newRequest.Parent = tradeRequestsFolder
		end
	end
	
	
--Reject a request
elseif instruction == "reject trade request" then
	
	local requestValue = nil
	for i, request in pairs(tradeRequestsFolder:GetChildren()) do
		if request.Name == plr.Name or request.Value == plr.Name then
			requestValue = request
			break
		end
	end
	
	if requestValue.Parent == tradeRequestsFolder and requestValue.Name == plr.Name or requestValue.Value == plr.Name then
		requestValue:Destroy()
	end
	
	
--Accept a request
elseif instruction == "accept trade request" then
	
	local requestValue = nil
	for i, request in pairs(tradeRequestsFolder:GetChildren()) do
		if request.Name == plr.Name or request.Value == plr.Name then
			requestValue = request
			break
		end
	end
	
	if requestValue.Parent == tradeRequestsFolder and requestValue.Value == plr.Name then
		
		local senderPlr = game.Players[requestValue.Name]
		local receiverPlr = game.Players[requestValue.Value]
		
		
		requestValue:Destroy()
		
		local tradeFolder = Instance.new("Folder")
		
		local senderValue = Instance.new("StringValue")
		senderValue.Name = "Sender"
		senderValue.Value = senderPlr.Name
		senderValue.Parent = tradeFolder
		
		local receiverValue = Instance.new("StringValue")
		receiverValue.Name = "Receiver"
		receiverValue.Value = receiverPlr.Name
		receiverValue.Parent = tradeFolder
		
		local senderOffer = Instance.new("Folder")
		senderOffer.Name = senderPlr.Name .. "'s offer"
		senderOffer.Parent = tradeFolder
		
		local receiverOffer = Instance.new("Folder")
		receiverOffer.Name = receiverPlr.Name .. "'s offer"
		receiverOffer.Parent = tradeFolder
		
		tradeFolder.Parent = ongoingTradesFolder
		
		
		local toolIds = {}
		
		local senderTools = config.GetTools(senderPlr)
		for i, tool in pairs(senderTools) do
			tool.CanBeDropped = false
			
			local toolId = tool:FindFirstChild("TRADING ID") or Instance.new("NumberValue")
			toolId.Name = "TRADING ID"
			
			while string.len(tostring(toolId.Value)) < 1 or table.find(toolIds, toolId.Value) do
				toolId.Value = Random.new():NextNumber(0, 1000000)
			end
			table.insert(toolIds, toolId.Value)
			
			toolId.Parent = tool
		end
		
		local receiverTools = config.GetTools(receiverPlr)
		for i, tool in pairs(receiverTools) do
			tool.CanBeDropped = false

			local toolId = tool:FindFirstChild("TRADING ID") or Instance.new("NumberValue")
			toolId.Name = "TRADING ID"

			while string.len(tostring(toolId.Value)) < 1 or table.find(toolIds, toolId.Value) do
				toolId.Value = Random.new():NextNumber(0, 1000000)
			end
			table.insert(toolIds, toolId.Value)

			toolId.Parent = tool
		end
	end
	
	
--Add an item to the trade
elseif instruction == "add item to trade" then
	
	local item = data[1]
	
	if item.Parent == plr.Backpack or item.Parent == plr.Character then
		
		local currentTrade = nil
		for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
			if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
				currentTrade = trade
				break
			end
		end
		
		if currentTrade then
			
			local plrSlots = currentTrade[plr.Name .. "'s offer"]
			local numItems = #plrSlots:GetChildren()
			
			if numItems < config.MaxSlots then
				
				local itemInTrade = false
				
				for i, plrItem in pairs(plrSlots:GetChildren()) do
					if plrItem["TRADING ID"].Value == item["TRADING ID"].Value then
						itemInTrade = true
						break
					end
				end
				
				if not itemInTrade then
					
					if currentTrade.Receiver:FindFirstChild("ACCEPTED") then
						currentTrade.Receiver.ACCEPTED:Destroy()
					end
					if currentTrade.Sender:FindFirstChild("ACCEPTED") then
						currentTrade.Sender.ACCEPTED:Destroy()
					end
					
					item:Clone().Parent = plrSlots
				end
			end
		end
	end
	
	
--Remove an item from the trade
elseif instruction == "remove item from trade" then
	
	local item = data[1]
	
	if item.Parent == plr.Backpack or item.Parent == plr.Character then
		
		local currentTrade = nil
		for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
			if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
				currentTrade = trade
				break
			end
		end
		
		if currentTrade then
			
			local plrSlots = currentTrade[plr.Name .. "'s offer"]
			
			for i, plrItem in pairs(plrSlots:GetChildren()) do
				if plrItem["TRADING ID"].Value == item["TRADING ID"].Value then
					
					if currentTrade.Receiver:FindFirstChild("ACCEPTED") then
						currentTrade.Receiver.ACCEPTED:Destroy()
					end
					if currentTrade.Sender:FindFirstChild("ACCEPTED") then
						currentTrade.Sender.ACCEPTED:Destroy()
					end
					
					plrItem:Destroy()
					break
				end
			end
		end
	end
	
	
--Accept a trade
elseif instruction == "accept trade" then
	
	local currentTrade = nil
	for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
		if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
			currentTrade = trade
			break
		end
	end
	
	if currentTrade then
		local plrValue = currentTrade.Sender.Value == plr.Name and currentTrade.Sender or currentTrade.Receiver.Value == plr.Name and currentTrade.Receiver
		
		if plrValue then
			
			if not plrValue:FindFirstChild("ACCEPTED") then
				local acceptedValue = Instance.new("StringValue")
				acceptedValue.Name = "ACCEPTED"
				acceptedValue.Parent = plrValue
				
			else
				plrValue.ACCEPTED:Destroy()
			end
		end
		
		if currentTrade.Sender:FindFirstChild("ACCEPTED") and currentTrade.Receiver:FindFirstChild("ACCEPTED") then
			
			task.wait(config.TimeBeforeTradeConfirmed)
			
			if currentTrade.Sender:FindFirstChild("ACCEPTED") and currentTrade.Receiver:FindFirstChild("ACCEPTED") then
				
				local senderPlr = game.Players[currentTrade.Sender.Value]
				local senderSlots = currentTrade[senderPlr.Name .. "'s offer"]
				
				local receiverPlr = game.Players[currentTrade.Receiver.Value]
				local receiverSlots = currentTrade[receiverPlr.Name .. "'s offer"]
				
				local senderTools = config.GetTools(senderPlr)
				local receiverTools = config.GetTools(receiverPlr)
				
				for i, senderTool in pairs(senderTools) do
					for x, senderSlot in pairs(senderSlots:GetChildren()) do
						if senderTool["TRADING ID"].Value == senderSlot["TRADING ID"].Value then
							senderTool.Parent = receiverPlr.Backpack
						end
					end
				end
				
				for i, receiverTool in pairs(receiverTools) do
					for x, receiverSlot in pairs(receiverSlots:GetChildren()) do
						if receiverTool["TRADING ID"].Value == receiverSlot["TRADING ID"].Value then
							receiverTool.Parent = senderPlr.Backpack
						end
					end
				end
				
				currentTrade:Destroy()
			end
		end
	end
	
	
--Reject a trade
elseif instruction == "reject trade" then

	for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
		
		if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then		
			trade:Destroy()
			
			break
		end
	end
end

end)

1 Like

You should just be able to put tools back into the players backpack to make sure they aren’t lost.

--REMOVE TRADES FOR THIS PLAYER
function removeTrades(plr)
    for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
        if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
            -- Return tools to the player's Backpack if they were in the trade
            local senderPlr = game.Players[trade.Sender.Value]
            local receiverPlr = game.Players[trade.Receiver.Value]
            local senderSlots = trade[senderPlr.Name .. "'s offer"]
            local receiverSlots = trade[receiverPlr.Name .. "'s offer"]

            for _, slot in ipairs(senderSlots:GetChildren()) do
                local tool = slot:FindFirstChildOfClass("Tool")
                if tool then
                    tool.Parent = senderPlr.Backpack
                end
            end

            for _, slot in ipairs(receiverSlots:GetChildren()) do
                local tool = slot:FindFirstChildOfClass("Tool")
                if tool then
                    tool.Parent = receiverPlr.Backpack
                end
            end

            trade:Destroy()
        end
    end

    for i, request in pairs(tradeRequestsFolder:GetChildren()) do
        if request.Name == plr.Name or request.Value == plr.Name then
            request:Destroy()
        end
    end
end

--REMOVE TRADES WHEN PLAYER DIES
game.Players.PlayerAdded:Connect(function(plr)
    plr.CharacterAdded:Connect(function(char)
        char:WaitForChild("Humanoid").Died:Connect(function()
            removeTrades(plr)
        end)
    end)
end)

A651C366-C20C-4705-822D-6047704565A2_2_0_a.mov…]()

first thx for responding
second like I said im a noob and I paste a link I couldn’t paste the vid cuz it was more than 10mb
third I tried it and got my tool but when I died it disappeard
fourth if u see the vid sry that its so laggy it always gets laggy when I record