Hi everyone I’m currently working on an Inventory and Trading System and pls help cuz no one was responsing on my other Topics because they maybe thought it was too much Text but I think it’s easy.So now I can only trade a Tool that is in my Backpack because if I change,receiverTool.Parent = senderPlr.Backpack" to ,receiverTool.Parent = senderPlr.Inventory" it doesn’t work because the Tools look like Image Buttons when they are in my Inventory.(I have 2 important scripts and 2 that may help but aren’t the main ones)
Now what I need is to code it that way so I can trade the Tools in my Inventory .I got some little scripts that should help:
--InventoryServerScript:
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)
--TradeServer(ServerScriptService)(This is where I have to change the function)
--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
TradingScript(Gui)(This one might help)(Not sure if hes important like the 2 others)
--VARIABLES
local client = game.Players.LocalPlayer
local rs = game.ReplicatedStorage:WaitForChild("TradeReplicatedStorage")
local re = rs:WaitForChild("RemoteEvent")
local config = require(rs:WaitForChild("CONFIGURATION"))
local tradeRequestsFolder = rs:WaitForChild("TRADE REQUESTS")
local ongoingTradesFolder = rs:WaitForChild("ONGOING TRADES")
local gui = script.Parent
local openBtn = gui:WaitForChild("OpenSendTrades")
local sendTradesFrame = gui:WaitForChild("SendTradesFrame")
local tradeRequestFrame = gui:WaitForChild("TradeRequestFrame")
local tradeFrame = gui:WaitForChild("TradeFrame")
sendTradesFrame.Visible = false
tradeRequestFrame.Visible = false
tradeFrame.Visible = false
--TRADE REQUESTS
tradeRequestsFolder.ChildAdded:Connect(function(child)
if child.Value == client.Name then
tradeRequestFrame.TradeText.Text = child.Name .. " sent you a trade request!"
tradeRequestFrame.AcceptButton.Visible = true
tradeRequestFrame.RejectButton.Visible = true
tradeRequestFrame.Visible = true
elseif child.Name == client.Name then
tradeRequestFrame.TradeText.Text = "You sent a trade request to " .. child.Value
tradeRequestFrame.AcceptButton.Visible = false
tradeRequestFrame.RejectButton.Visible = true
tradeRequestFrame.Visible = true
end
end)
tradeRequestsFolder.ChildRemoved:Connect(function(child)
if child.Value == client.Name or child.Name == client.Name then
tradeRequestFrame.Visible = false
end
end)
--ONGOING TRADES
ongoingTradesFolder.ChildAdded:Connect(function(child)
if child:WaitForChild("Sender").Value == client.Name or child:WaitForChild("Receiver").Value == client.Name then
local clientValue = child:WaitForChild("Sender").Value == client.Name and child.Sender or child.Receiver
local otherPlrValue = clientValue.Name == "Sender" and child.Receiver or child.Sender
clientValue.AncestryChanged:Connect(function()
if clientValue.Parent == nil then
tradeFrame.Visible = false
openBtn.Visible = true
end
end)
tradeRequestFrame.Visible = false
sendTradesFrame.Visible = false
openBtn.Visible = false
tradeFrame.TradingFrame.TradingWithName.Text = "Trading with " .. otherPlrValue.Value
tradeFrame.TradingFrame.TheirOfferFrame.TheirOfferText.Text = otherPlrValue.Value .. "'s offer"
tradeFrame.TradingFrame.PlayerAccepted.Text = ""
tradeFrame.TradingFrame.AcceptButton.BackgroundColor3 = Color3.fromRGB(58, 191, 232)
for i, child in pairs(tradeFrame.TradingFrame.YourOfferFrame:GetChildren()) do
if child:IsA("TextButton") or child:IsA("ImageButton") or child:IsA("Frame") then
child:Destroy()
end
end
for i, child in pairs(tradeFrame.TradingFrame.TheirOfferFrame:GetChildren()) do
if child:IsA("TextButton") or child:IsA("ImageButton") or child:IsA("Frame") then
child:Destroy()
end
end
--Alert client when other player has accepted
otherPlrValue.ChildAdded:Connect(function(child)
if child.Name == "ACCEPTED" then
tradeFrame.TradingFrame.PlayerAccepted.Text = otherPlrValue.Value .. " has accepted"
end
end)
otherPlrValue.ChildRemoved:Connect(function(child)
if child.Name == "ACCEPTED" then
tradeFrame.TradingFrame.PlayerAccepted.Text = ""
end
end)
--Display player's inventory
local inventoryList = tradeFrame.InventoryFrame.InventoryList
for i, child in pairs(inventoryList:GetChildren()) do
if child:IsA("TextButton") or child:IsA("ImageButton") then
child:Destroy()
end
end
local clientTools = config.GetTools(client)
for i, tool in pairs(clientTools) do
local newToolButton = script:WaitForChild("ItemButton"):Clone()
newToolButton.Name = tool["TRADING ID"].Value
newToolButton.ItemName.Text = tool.Name
newToolButton.IsInTrade.Visible = false
if string.len(tool.TextureId) > 0 then
newToolButton.ItemViewportFrame.Visible = false
newToolButton.ItemImageLabel.Image = tool.TextureId
else
newToolButton.ItemImageLabel.Visible = false
local toolModel = Instance.new("Model")
for x, descendant in pairs(tool:GetDescendants()) do
if descendant:IsA("BasePart") then
descendant:Clone().Parent = toolModel
end
end
toolModel.PrimaryPart = toolModel:FindFirstChild("Handle") or toolModel:FindFirstChildOfClass("BasePart", true)
toolModel:SetPrimaryPartCFrame(CFrame.new(0, 0, -3))
toolModel.Parent = newToolButton.ItemViewportFrame
local vpfCamera = Instance.new("Camera")
vpfCamera.CFrame = CFrame.new()
vpfCamera.Parent = newToolButton.ItemViewportFrame
end
newToolButton.MouseButton1Click:Connect(function()
if not tradeFrame.TradingFrame.YourOfferFrame.Slots:FindFirstChild(tool["TRADING ID"].Value) then
newToolButton.IsInTrade.Visible = true
re:FireServer("add item to trade", {tool})
else
newToolButton.IsInTrade.Visible = false
re:FireServer("remove item from trade", {tool})
end
end)
newToolButton.Parent = inventoryList
end
--Display client's offer
local clientOffer = child[clientValue.Value .. "'s offer"]
clientOffer.ChildAdded:Connect(function(child)
local newToolButton = inventoryList[child:WaitForChild("TRADING ID").Value]:Clone()
newToolButton.IsInTrade.Visible = false
newToolButton.Size = script.ItemButton.Size
newToolButton.MouseButton1Click:Connect(function()
local plrTools = config.GetTools(client)
for i, plrTool in pairs(plrTools) do
if child["TRADING ID"].Value == plrTool["TRADING ID"].Value then
re:FireServer("remove item from trade", {plrTool})
break
end
end
end)
child.AncestryChanged:Connect(function()
if child.Parent == nil then
tradeFrame.InventoryFrame.InventoryList[newToolButton.Name].IsInTrade.Visible = false
newToolButton:Destroy()
end
end)
newToolButton.Parent = tradeFrame.TradingFrame.YourOfferFrame.Slots
end)
--Display other player's offer
local otherPlrOffer = child[otherPlrValue.Value .. "'s offer"]
otherPlrOffer.ChildAdded:Connect(function(child)
local newToolButton = script.ItemButton:Clone()
newToolButton.Name = child:WaitForChild("TRADING ID").Value
newToolButton.ItemName.Text = child.Name
newToolButton.IsInTrade.Visible = false
newToolButton.AutoButtonColor = false
if string.len(child.TextureId) > 0 then
newToolButton.ItemViewportFrame.Visible = false
newToolButton.ItemImageLabel.Image = child.TextureId
else
newToolButton.ItemImageLabel.Visible = false
local toolModel = Instance.new("Model")
for x, descendant in pairs(child:GetDescendants()) do
if descendant:IsA("BasePart") then
descendant:Clone().Parent = toolModel
end
end
toolModel.PrimaryPart = toolModel:FindFirstChild("Handle") or toolModel:FindFirstChildOfClass("BasePart", true)
toolModel:SetPrimaryPartCFrame(CFrame.new(0, 0, -3))
toolModel.Parent = newToolButton.ItemViewportFrame
local vpfCamera = Instance.new("Camera")
vpfCamera.CFrame = CFrame.new()
vpfCamera.Parent = newToolButton.ItemViewportFrame
end
child.AncestryChanged:Connect(function()
if child.Parent == nil then
newToolButton:Destroy()
end
end)
newToolButton.Parent = tradeFrame.TradingFrame.TheirOfferFrame.Slots
end)
tradeFrame.Visible = true
end
end)
--SEND TRADE REQUESTS
openBtn.MouseButton1Click:Connect(function()
if sendTradesFrame.Visible == true then
sendTradesFrame.Visible = false
elseif tradeFrame.Visible == false then
for i, child in pairs(sendTradesFrame.PlayerList:GetChildren()) do
if child:IsA("Frame") then
child:Destroy()
end
end
for i, plr in pairs(game.Players:GetPlayers()) do
if plr ~= client then
local playerFrame = script:WaitForChild("PlayerFrame"):Clone()
playerFrame.PlayerDisplayName.Text = plr.DisplayName
playerFrame.PlayerUserName.Text = "@" .. plr.Name
playerFrame.PlayerImage.Image = game.Players:GetUserThumbnailAsync(plr.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size100x100)
playerFrame.SendButton.MouseButton1Click:Connect(function()
if tradeRequestFrame.Visible == false then
re:FireServer("send trade request", {plr})
end
end)
playerFrame.Parent = sendTradesFrame.PlayerList
end
end
sendTradesFrame.Visible = true
end
end)
sendTradesFrame.CloseButton.MouseButton1Click:Connect(function()
sendTradesFrame.Visible = false
end)
--ACCEPT OR REJECT TRADE REQUESTS
tradeRequestFrame.RejectButton.MouseButton1Click:Connect(function()
re:FireServer("reject trade request")
end)
tradeRequestFrame.AcceptButton.MouseButton1Click:Connect(function()
re:FireServer("accept trade request")
end)
--ACCEPT OR REJECT TRADES
tradeFrame.TradingFrame.RejectButton.MouseButton1Click:Connect(function()
re:FireServer("reject trade")
end)
tradeFrame.TradingFrame.AcceptButton.MouseButton1Click:Connect(function()
re:FireServer("accept trade")
if tradeFrame.TradingFrame.AcceptButton.BackgroundColor3 == Color3.fromRGB(58, 191, 232) then
tradeFrame.TradingFrame.AcceptButton.BackgroundColor3 = Color3.fromRGB(40, 109, 152)
else
tradeFrame.TradingFrame.AcceptButton.BackgroundColor3 = Color3.fromRGB(58, 191, 232)
end
end)
--Last and shortest Script(Not sure if this is important too)
local InventoryEvent = game.ReplicatedStorage.Remotes.InventoryEvent
local itemFrame = script.Parent:FindFirstChild("ItemsFrame")
InventoryEvent.OnClientEvent:Connect(function(ItemName, Value)
if Value == true then
local ItemButton = script.Parent.ItemsFrame.ItemButton
ItemButton.Visible = true
ItemButton.Name = ItemName
ItemButton.Text = ItemName
ItemButton.Parent = itemFrame
local equipButton = script.Parent.EquipFrame["EquipButton"]
ItemButton.MouseButton1Click:Connect(function()
script.Parent.EquipFrame.Title.Text = ItemName
script.Parent.EquipFrame.Title.Visible = true
equipButton.Visible = true
end)
end
end)