Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --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.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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement