Let the Tool in my Inventory be Tradeable(easy)

Hi everyone I’m currently working on an Inventory and Trading System and rn I can only Trade a Tool that is equipped like in my Hotbar I want to change this so I can trade the Tool that is located in my Inventory(but the Tool I get from another Players Trade (Hotbar) appears in my Inventory!

I found this pic that shows what I mean and Im gonna show 2 Scripts first one for trading and second one for Inventory(The issue is in the Trading Script at the end:receiverTool.Parent = senderPlr.Backpack I tried putting Inventory instead of Backpack but someway it didn’t work)

--TradeServer(ServerScriptService)
--VARIABLES
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.Inventory
							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)

















































--InventoryScript

local inventoryEvent = game.ReplicatedStorage.Remotes.InventoryEvent

game.Players.PlayerAdded:Connect(function(player)
	
	local inventory = player:WaitForChild("Inventory")
	
	local inventoryFrame = player.PlayerGui:WaitForChild("InventoryGui").InventoryFrame.ItemsFrame:GetChildren()
	
	inventory.ChildAdded:Connect(function(Item)
		inventoryEvent:FireClient(player, Item.Name, true)
	end)
end)

inventoryEvent.OnServerEvent:Connect(function(player, ItemName, Value, button)
	
	 if Value == false then
			local SelectedItem = player.Inventory:FindFirstChild(ItemName)
			local backpack = player.Backpack:GetChildren()
			local stuff = player.Character:GetChildren()
			
			if #backpack == 0 and not player.Character:FindFirstChildWhichIsA("Tool") then
				button.Text = "Unequip"
				button.BackgroundColor3 = Color3.new(255,0,0)
				SelectedItem:Clone().Parent = player.Backpack
			else
				for i,v in ipairs(backpack) do
					button.Text = "Equip"
					button.BackgroundColor3 = Color3.new(0,255,0)
					v:Destroy()
				end
				for i, v in ipairs(stuff) do
					if v:IsA("Tool") then
						button.Text = "Equip"
						button.BackgroundColor3 = Color3.new(0,255,0)
						v:Destroy()
					end
				end
			end
	 end
end)

Try printing the variable senderPlr. Is it nil or is it a player object?

EDIT: Try print debugging too if that isn’t the issue. To do it, just place a bunch of print statements wherever you think the issue is, and if it prints, the issue isn’t there. Else, the issue is most likely around the area.

if senderPlr is nil, then the whole script would print out a big error, i don’t think that’s the problem, or he just hadn’t checked the output yet.

Yeah, I’m just trying to confirm that isn’t the issue. The post is pretty vague on the issue (besides knowing it doesn’t work), so I have to figure out what works and what doesn’t work.