Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --//Const
- local TableUtil = require(script.Parent.TableUtil);
- local TradeSystem = game.ReplicatedStorage.TradeSystem;
- local TradeInfo = TradeSystem.TradeInfo;
- local Events = TradeSystem.Events;
- local PetsFolder = game.ReplicatedStorage.Pets;
- --//State
- local CurrentId = 0;
- local Requests = {};
- local InTrade = {};
- --//Functions
- local function CreateTrade(TradeId, Player1, Player2)
- local TradeFolder = Instance.new("Folder");
- TradeFolder.Name = tostring(TradeId);
- local Player1Deposit = Instance.new("Folder");
- Player1Deposit.Name = Player1.Name;
- Player1Deposit.Parent = TradeFolder;
- local Player2Deposit = Instance.new("Folder");
- Player2Deposit.Name = Player2.Name;
- Player2Deposit.Parent = TradeFolder;
- local Player1Accept = Instance.new("BoolValue");
- Player1Accept.Name = Player1.Name.."Accept";
- Player1Accept.Parent = TradeFolder;
- local Player2Accept = Instance.new("BoolValue");
- Player2Accept.Name = Player2.Name.."Accept";
- Player2Accept.Parent = TradeFolder;
- TradeFolder.Parent = TradeInfo;
- return TradeFolder;
- end
- local function EndTrade(TradeObj)
- local Players = TableUtil.Map(TradeObj:GetChildren(), function(Item)
- local plr = game.Players:FindFirstChild(Item.Name);
- if (plr) then
- return plr;
- end
- end)
- for i,v in pairs(Players) do
- InTrade[v] = nil;
- Events.EndTrade:FireClient(v);
- end
- TradeObj:Destroy();
- end
- local function FinishTrade(TradeObj)
- local Owner, GiveTo;
- local Containers = TableUtil.Filter(TradeObj:GetChildren(), function(Item)
- return game.Players:FindFirstChild(Item.Name)
- end)
- table.foreach(Containers, print);
- Owner = game.Players:FindFirstChild(Containers[1].Name);
- GiveTo = game.Players:FindFirstChild(Containers[2].Name);
- for i,v in pairs(Containers[1]:GetChildren()) do
- Owner.PetInventory:FindFirstChild(v.Name).Parent = GiveTo.PetInventory;
- end
- Owner = game.Players:FindFirstChild(Containers[2].Name);
- GiveTo = game.Players:FindFirstChild(Containers[1].Name);
- for i,v in pairs(Containers[2]:GetChildren()) do
- Owner.PetInventory:FindFirstChild(v.Name).Parent = GiveTo.PetInventory;
- end
- EndTrade(TradeObj)
- end
- --//Events
- Events.SendRequest.OnServerEvent:Connect(function(plr, Target)
- print("Linx", Target);
- if (Target and not Requests[Target] and not InTrade[Target] and not InTrade[plr]) and Target.TradeRequests.Value then
- Requests[Target] = plr;
- Events.SendRequest:FireClient(Target, plr);
- wait(10)
- if (Requests[Target]) then
- Requests[Target] = nil;
- end
- end
- end)
- Events.StartTrade.OnServerEvent:Connect(function(plr)
- local Partner = Requests[plr];
- if (Partner) then
- local Trade = CreateTrade(CurrentId, Partner, plr);
- InTrade[plr] = true;
- InTrade[Partner] = true;
- Events.StartTrade:FireClient(plr, Trade);
- Events.StartTrade:FireClient(Partner, Trade);
- CurrentId = CurrentId + 1;
- end
- end)
- Events.AddItem.OnServerInvoke = function(plr, TradeId, ItemName, IsRainbow)
- local Trade = TradeInfo:FindFirstChild(tostring(TradeId));
- if (Trade and Trade:FindFirstChild(plr.Name) and plr.PetInventory:FindFirstChild(ItemName)) then
- local Item = PetsFolder:FindFirstChild(ItemName);
- if (Item) then
- local OtherPlr;
- TableUtil.Filter(Trade:GetChildren(), function(v)
- if (v.Name ~= plr.Name and game.Players:FindFirstChild(v.Name)) then
- OtherPlr = game.Players:FindFirstChild(v.Name);
- end
- return v.Name ~= plr.Name.."Accept" and v.Name:find("Accept");
- end)
- local Owned = TableUtil.Filter(plr:WaitForChild("PetInventory"):GetChildren(), function(item)
- return item.Name == Item.Name and item.Rainbow.Value == IsRainbow;
- end)
- local Placed = TableUtil.Filter(Trade:FindFirstChild(plr.Name):GetChildren(), function(item)
- return item.Name == Item.Name and item.Rainbow.Value == IsRainbow;
- end)
- if (#Owned > #Placed) then
- local Item = Item:Clone()
- Item.Rainbow.Value = IsRainbow;
- Item.Parent = Trade:FindFirstChild(plr.Name);
- Trade:FindFirstChild(plr.Name.."Accept").Value = false;
- Events.UpdateTrade:FireClient(plr)
- Events.UpdateTrade:FireClient(OtherPlr)
- end
- end
- end
- end
- Events.RemoveItem.OnServerInvoke = function(plr, TradeId, ItemName, IsRainbow)
- local Trade = TradeInfo:FindFirstChild(tostring(TradeId));
- if (Trade) then
- local OtherPlr
- local PlayerFolder = Trade:FindFirstChild(plr.Name);
- TableUtil.Filter(Trade:GetChildren(), function(v)
- if (v.Name ~= plr.Name and game.Players:FindFirstChild(v.Name)) then
- OtherPlr = game.Players:FindFirstChild(v.Name);
- end
- return v.Name ~= plr.Name.."Accept" and v.Name:find("Accept");
- end)
- if (PlayerFolder) then
- --local Item = PlayerFolder:FindFirstChild(ItemName);
- local Items = TableUtil.Filter(PlayerFolder:GetChildren(), function(Item)
- return Item.Name == ItemName and Item.Rainbow.Value == IsRainbow
- end)
- local Item = Items[1];
- if (Item) then
- Trade:FindFirstChild(plr.Name.."Accept").Value = false;
- Trade:FindFirstChild(OtherPlr.Name.."Accept").Value = false;
- Item:Destroy();
- Events.UpdateTrade:FireClient(plr)
- Events.UpdateTrade:FireClient(OtherPlr)
- end
- end
- end
- end
- Events.AcceptTrade.OnServerInvoke = function(plr, TradeId)
- local Trade = TradeInfo:FindFirstChild(tostring(TradeId));
- if (Trade) then
- local OtherPlr;
- local AcceptBool = Trade:FindFirstChild(plr.Name.."Accept");
- local OtherBoolTbl = TableUtil.Filter(Trade:GetChildren(), function(v)
- if (v.Name ~= plr.Name and game.Players:FindFirstChild(v.Name)) then
- OtherPlr = game.Players:FindFirstChild(v.Name);
- end
- return v.Name ~= plr.Name.."Accept" and v.Name:find("Accept");
- end)
- if (AcceptBool) then
- AcceptBool.Value = not AcceptBool.Value;
- if (AcceptBool.Value and OtherBoolTbl[1].Value) then
- FinishTrade(Trade);
- end
- Events.UpdateTrade:FireClient(plr)
- Events.UpdateTrade:FireClient(OtherPlr)
- end
- end
- end
- Events.EndTrade.OnServerEvent:Connect(function(plr, TradeId)
- local TradeObj = TradeInfo:FindFirstChild(tostring(TradeId));
- if (TradeObj) then
- if (TradeObj:FindFirstChild(plr.Name)) then
- EndTrade(TradeObj);
- end
- end
- end)
- game.Players.PlayerRemoving:Connect(function(plr)
- for i,v in pairs(TradeInfo:GetDescendants()) do
- if (v.Name == plr.Name) then
- EndTrade(v.Parent);
- end
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment