Advertisement
imk0tter

Trade plugin for Oxide

Feb 11th, 2014
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.71 KB | None | 0 0
  1. PLUGIN.Title = "Trade"
  2. PLUGIN.Description = "Trade Plugin (Requires Basic Economy Plugin)"
  3.  
  4. function PLUGIN:Init()
  5.     print("Trade plugin loading.")
  6.     econ_plugin = plugins.Find("economy")
  7.     if (not econ_plugin) then
  8.         econ_plugin = plugins.Find("econ")
  9.     end
  10.     self.Data = {}
  11.     self:AddChatCommand("accept", self.cmdTradeAccept)
  12.     self:AddChatCommand("trade", self.cmdTradeInit)
  13.     self:AddChatCommand("offer", self.cmdTradeOffer)
  14.     self:AddChatCommand("cancel", self.cmdTradeCancel)
  15.     self:AddChatCommand("tradehelp", self.cmdTradeHelp)
  16.    
  17. end
  18.  
  19. function PLUGIN:cmdTradeAccept(netuser, cmd, args)
  20.     local userdata = self:GetUserData( netuser )
  21.     if (userdata.Trade.Init) then
  22.         local targetdata = self:GetUserDataFromID(userdata.Trade.Target)
  23.         local targetdata, targetuser = self:FindUser(netuser, targetdata.Name, false)
  24.         if (targetuser) then
  25.             if (targetdata.Trade.Init and targetdata.Trade.Target == userdata.ID) then
  26.                 self:AcceptTrade(netuser, userdata, targetuser, targetdata)
  27.             else
  28.                 rust.SendChatToUser(netuser, "Target is currently not in a trade with you. Type /tradehelp for help")
  29.             end
  30.         else
  31.             rust.SendChatToUser(netuser, "Could not find trade target. Type /tradehelp for help")
  32.         end
  33.     else
  34.         rust.SendChatToUser(netuser, "You are currently not in a trade. Type /tradehelp for help")
  35.     end
  36. end
  37. function PLUGIN:getInventoryCount(inventory, datablock)
  38.     local ret = 0
  39.     local iterator = inventory.occupiedIterator
  40.     while (iterator:Next()) do
  41.         local item = iterator.item
  42.         if (item.datablock == datablock) then
  43.             if (item.datablock.IsSplittable()) then
  44.                 ret = ret + item.uses
  45.             else
  46.                 ret = ret + 1
  47.             end
  48.         end
  49.     end
  50.     return ret
  51. end
  52. function PLUGIN:cmdTradeOffer(netuser, cmd, args)
  53.     local userdata = self:GetUserData( netuser )
  54.     if (userdata.Trade.Init) then
  55.         if (not args[1]) then
  56.             self:DisplayTradeOffer(netuser, userdata)
  57.         else
  58.             local targetdata = self:GetUserDataFromID(userdata.Trade.Target, "")
  59.             local targetdata, targetuser = self:FindUser(netuser, targetdata.Name, false)
  60.             local qty = tonumber(args[1])
  61.             if (targetuser) then
  62.                 if (not args[2]) then
  63.                     if (econ_plugin) then
  64.                         local econ_data = econ_plugin:GetUserData(netuser)
  65.                         if (not econ_data) then
  66.                             print("Could not find user's economy data")
  67.                         else
  68.                             if (qty >= 0) then
  69.                                 if (qty <= econ_data.Money) then
  70.                                     userdata.Trade.Offer.Money = qty
  71.                                     self:DisplayTradeOffer(netuser, userdata)
  72.                                     self:DisplayTradeOffer(targetuser, targetdata)
  73.                                 else
  74.                                     rust.SendChatToUser(netuser, "You do not have " .. econ_plugin:GetSymbol() .. tostring(qty) .. ". Type /tradehelp for help")           
  75.                                 end
  76.                             else
  77.                                 rust.SendChatToUser(netuser, "You cannot offer this ammount. Type /tradehelp for help")
  78.                             end
  79.                         end
  80.                     else
  81.                         rust.SendChatToUser(netuser, "You must specify an item to offer. Type /tradehelp for help")
  82.                     end
  83.                 else
  84.                     local datablock = rust.GetDatablockByName( args[2] )
  85.                     if (not datablock) then
  86.                         rust.SendChatToUser(netuser, "Cannot add item to trade. No such Item. Type /tradehelp for help" )
  87.                     else
  88.                         local inv = netuser.playerClient.rootControllable.idMain:GetComponent( "Inventory" )
  89.                         if (not inv)  then
  90.                             rust.Notice(netuser, "Inventory not found!")
  91.                         else
  92.                             --local totalNum, invItem = inv:FindItem(datablock)
  93.                             local totalNum = self:getInventoryCount(inv, datablock)
  94.                             if (totalNum > 0) then
  95.                                 if (totalNum <= qty) then
  96.                                     local item = {}
  97.                                     local edit = 0
  98.                                     item.Count = qty
  99.                                     item.Name = args[2]
  100.                                     for key,value in pairs(userdata.Trade.Offer.Items) do
  101.                                         if (value.Name == args[2]) then
  102.                                             edit = 1
  103.                                             value.Count = qty
  104.                                         end
  105.                                     end
  106.                                     if (edit == 0) then
  107.                                         table.insert(userdata.Trade.Offer.Items, item)
  108.                                     end
  109.                                     self:DisplayTradeOffer(netuser, userdata)
  110.                                     self:DisplayTradeOffer(targetuser, targetdata)
  111.                                 else
  112.                                     rust.SendChatToUser(netuser, "Cannot add (" .. tostring(qty) .. ") \"" .. args[2] .. "\" to trade. You only have (" .. tostring(totalNum) .. "). Type /tradehelp for help")
  113.                                 end
  114.                             else
  115.                                 rust.SendChatToUser(netuser, "Cannot add (" .. tostring(qty) .. ") \"" .. args[2] .. "\" to trade. Type /tradehelp for help")
  116.                             end
  117.                         end
  118.                     end
  119.                 end
  120.             else
  121.                 rust.SendChatToUser(netuser, "Could not find trade target. Type /tradehelp for help")
  122.             end
  123.         end
  124.     else
  125.         rust.SendChatToUser(netuser, "You are currently not in a trade. Type /tradehelp for help")
  126.     end
  127. end
  128.  
  129. function PLUGIN:cmdTradeCancel(netuser, cmd, args)
  130.     local userdata = self:GetUserData(netuser)
  131.    
  132.     if (userdata.Trade.Init) then
  133.         self:CancelTrade(netuser, userdata, false)
  134.     else
  135.         rust.SendChatToUser(netuser, "You are currently not in a trade. Type /tradehelp for help")
  136.     end
  137. end
  138.  
  139. function PLUGIN:cmdTradeHelp(netuser, cmd, args)
  140.     rust.SendChatToUser( netuser, "--------------------------------------------------------------------------------" )
  141.     rust.SendChatToUser( netuser, "------------------ LiTHiuM's Trade Plugin ------------------------" )
  142.     rust.SendChatToUser( netuser, "Use /tradehelp to show trade help" )
  143.     rust.SendChatToUser( netuser, "Use /trade \"name\" to send a trade request to the specified user")
  144.     rust.SendChatToUser( netuser, "Use /trade to accept a trade from the last requester")
  145.     rust.SendChatToUser( netuser, "Use /trade to list the current trade offers")
  146.     rust.SendChatToUser( netuser, "Use /offer to list the current trade offers")
  147.     rust.SendChatToUser( netuser, "Use /offer <quantity> \"Item Name\" to add an item to the trade")
  148.     rust.SendChatToUser( netuser, "Use /offer <number> to offer money to the trade")
  149.     rust.SendChatToUser( netuser, "Use /accept to accept a trade")
  150.     rust.SendChatToUser( netuser, "Use /cancel to cancel a trade")
  151.     rust.SendChatToUser( netuser, "--------------------------------------------------------------------------------" )
  152.  
  153. end
  154.  
  155. function PLUGIN:cmdTradeInit(netuser, cmd, args)
  156.     local userdata = self:GetUserData(netuser)
  157.     local targetdata = nil
  158.     local targetuser = nil
  159.     local removeList = { }
  160.     if (userdata.Trade.Init) then
  161.         self:DisplayTradeOffer(netuser, userdata)
  162.     else
  163.         if (args[1]) then
  164.             targetdata, targetuser = self:FindUser(netuser, args[1], false)
  165.             if (not targetdata) then
  166.                 rust.SendChatToUser(netuser, "No player found with that name. Type /tradehelp for help")
  167.             else
  168.                 if (targetdata.Trade.Init) then
  169.                     rust.SendChatToUser(netuser, "Player " .. "\"" .. targetdata.Name .. "\" already in a trade. Type /tradehelp for help")
  170.                 else
  171.                     if (targetuser ~= netuser) then
  172.                         self:InitTrade(netuser, userdata, targetuser, targetdata)
  173.                     else
  174.                         rust.SendChatToUser(netuser, "You cannot trade with your self. Type /tradehelp for help")
  175.                     end
  176.                 end
  177.             end
  178.         else
  179.             local initTradeDone = false
  180.             for key,value in pairs(self.Data) do
  181.                 if (value.Trade.Target == userdata.ID) then
  182.                     targetuser = self:FindUser(netuser, value.Name, false)
  183.                     if (targetdata) then
  184.                         self:InitTrade(netuser, userdata, targetuser, targetdata)
  185.                         initTradeDone = true
  186.                     else
  187.                     end
  188.                 end
  189.             end
  190.             if (not initTradeDone) then
  191.                 rust.SendChatToUser(netuser, "You have no trade requests pending. Type /tradehelp for help")
  192.             else
  193.             end
  194.         end
  195.     end
  196. end
  197.  
  198. function PLUGIN:DisplayTradeOffer(netuser, userdata)
  199.     targetdata = self:GetUserDataFromID(userdata.Trade.Target, "")
  200.     rust.SendChatToUser(netuser, "--------------------------------------------------------------------------------" )
  201.     rust.SendChatToUser(netuser, "--------------- Current Trade With \"" .. targetdata.Name .. "\" ---------------")
  202.     rust.SendChatToUser(netuser, "--- Your Offer ---")
  203.     if (econ_plugin) then
  204.         rust.SendChatToUser(netuser, "Money: " .. econ_plugin:GetSymbol() .. tostring(userdata.Trade.Offer.Money))
  205.     end
  206.     for key,value in pairs(userdata.Trade.Offer.Items) do
  207.         rust.SendChatToUser(netuser, tostring(value.Count) .. "x " .. value.Name)
  208.     end
  209.     rust.SendChatToUser(netuser, "--- Their Offer ---")
  210.     if (econ_plugin) then
  211.         rust.SendChatToUser(netuser, "Money: " .. econ_plugin:GetSymbol() .. tostring(targetdata.Trade.Offer.Money))
  212.     end
  213.     for key,value in pairs(targetdata.Trade.Offer.Items) do
  214.         rust.SendChatToUser(netuser, tostring(value.Count) .. "x " .. value.Name)
  215.     end
  216.     rust.SendChatToUser(netuser, "End of trade data. Type /tradehelp for help")
  217.     rust.SendChatToUser(netuser, "--------------------------------------------------------------------------------" )
  218. end
  219.  
  220. function PLUGIN:CancelTrade(netuser, userdata, disconnect)
  221.     local targetdata = self:GetUserDataFromID(userdata.Trade.Target, "")
  222.     local targetdata, targetuser = self:FindUser(netuser, targetdata.Name, false)
  223.     if (not disconnect) then
  224.         userdata.Trade.Target = nil
  225.         userdata.Trade.Init = false
  226.         userdata.Trade.Accepted = false
  227.         userdata.Trade.Offer = {}
  228.         rust.SendChatToUser(netuser, "Your trade with \"" .. targetdata.Name .. "\" has been canceled. Type /tradehelp for help")
  229.     end
  230.         targetdata.Trade.Target = nil
  231.         targetdata.Trade.Init = false
  232.         targetdata.Trade.Accepted = false
  233.         targetdata.Trade.Offer = {}
  234.     rust.SendChatToUser(targetuser, "Your trade with \"" .. userdata.Name .. "\" has been canceled. Type /tradehelp for help")
  235. end
  236.  
  237. function PLUGIN:InitTrade(netuser, userdata, targetuser, targetdata)
  238.     if (userdata.Trade.Init) then
  239.         rust.SendChatToUser(netuser, "You are already in a trade. Type /tradehelp for help")
  240.     else
  241.         if (targetdata.Trade.Init) then
  242.             rust.SendChatToUser(netuser, "Target is already in a trade. Type /tradehelp for help")
  243.         else
  244.             if (targetdata.Trade.Target == userdata.ID) then
  245.                 userdata.Trade.Target = targetdata.ID
  246.                 userdata.Trade.Init = true
  247.                 userdata.Trade.Accepted = false
  248.                
  249.                 targetdata.Trade.Init = true
  250.                 targetdata.Trade.Accepted = false
  251.                
  252.                 userdata.Trade.Offer = {}
  253.                 userdata.Trade.Offer.Money = 0
  254.                 userdata.Trade.Offer.Items = {}
  255.                
  256.                 targetdata.Trade.Offer = {}
  257.                 targetdata.Trade.Offer.Money = 0
  258.                 targetdata.Trade.Offer.Items = {}
  259.                
  260.                 rust.SendChatToUser(targetuser, "You are now trading with \"" .. userdata.Name .. "\". Type /tradehelp for help")
  261.                 rust.SendChatToUser(netuser, "You are now trading with \"" .. targetdata.Name .. "\". Type /tradehelp for help")
  262.             else
  263.                 userdata.Trade.Target = targetdata.ID
  264.                 rust.SendChatToUser(targetuser, "\"" .. userdata.Name .. "\" has sent you a trade request. Type /tradehelp for help")
  265.                 rust.SendChatToUser(netuser, "You have sent a trade request to \"" .. targetdata.Name .. "\". Type /tradehelp for help")
  266.             end
  267.         end
  268.     end
  269. end
  270. function PLUGIN:AcceptTrade(netuser, userdata, targetuser, targetdata)
  271.     local userEconData = econ_plugin:GetUserData(netuser)
  272.     local targetEconData = econ_plugin:GetUserData(targetuser)
  273.    
  274.     local userinv = netuser.playerClient.rootControllable.idMain:GetComponent( "Inventory" )
  275.     local targetinv = targetuser.playerClient.rootControllable.idMain:GetComponent( "Inventory" )
  276.    
  277.     if (userEconData.Money < userdata.Trade.Offer.Money and econ_plugin) then
  278.         rust.SendChatToUser(netuser, "You do not have enough money to accept this trade. Type /tradehelp for help")
  279.         return
  280.     end
  281.     for key,value in pairs(userdata.Trade.Offer.Items) do
  282.         local datablock = rust.GetDatablockByName( value.Name )
  283.         --local totalNum, invItem = userinv:FindItem(datablock)
  284.         local totalNum = self:getInventoryCount(userinv, datablock)
  285.         if (totalNum < value.Count) then
  286.             rust.SendChatToUser(netuser, "You do not have enough \"" .. value.Name .. "\" to complete this trade. Type /tradehelp for help")
  287.             return
  288.         end
  289.     end
  290.    
  291.     if (targetEconData.Money < targetdata.Trade.Offer.Money and econ_plugin) then
  292.         rust.SendChatToUser(netuser, "Target does not have enough money to accept this trade. Type /tradehelp for help")
  293.         return
  294.     end
  295.    
  296.     for key,value in pairs(targetdata.Trade.Offer.Items) do
  297.         local datablock = rust.GetDatablockByName( value.Name )
  298.         --local totalNum, invItem = targetinv:FindItem(datablock)
  299.         local totalNum = self:getInventoryCount(targetinv, datablock)
  300.         if (totalNum < value.Count) then
  301.             rust.SendChatToUser(netuser, "Target does not have enough \"" .. value.Name .. "\" to complete this trade. Type /tradehelp for help")
  302.             return
  303.         end
  304.     end
  305.    
  306.     if (targetdata.Trade.Accepted) then
  307.    
  308.         if (econ_plugin) then
  309.             if (userdata.Trade.Offer.Money > 0) then
  310.                 econ_plugin:takeMoneyFrom(netuser, userdata.Trade.Offer.Money)
  311.                 econ_plugin:giveMoneyTo(targetuser, userdata.Trade.Offer.Money)
  312.             end
  313.             if (targetdata.Trade.Offer.Money > 0) then
  314.                 econ_plugin:giveMoneyTo(netuser, targetdata.Trade.Offer.Money)
  315.                 econ_plugin:takeMoneyFrom(targetuser, targetdata.Trade.Offer.Money)
  316.             end
  317.         end
  318.        
  319.         for key,value in pairs(userdata.Trade.Offer.Items) do
  320.             local datablock = rust.GetDatablockByName( value.Name )
  321.             local amount = value.Count
  322.             local i = 0
  323.             local item = userinv:FindItem(datablock)
  324.             if (item) then
  325.                 if (datablock.IsSplittable()) then
  326.                     while (i < amount) do
  327.                         if (item.uses > 0) then
  328.                             item:SetUses( item.uses - 1 )
  329.                             i = i + 1
  330.                         else
  331.                             userinv:RemoveItem( item )
  332.                             item = userinv:FindItem(datablock)
  333.                             if (not item) then
  334.                                 break
  335.                             end
  336.                         end
  337.                     end
  338.                 else
  339.                     while (i < amount) do
  340.                         userinv:RemoveItem( item )
  341.                         i = i + 1
  342.                         item = userinv:FindItem(datablock)
  343.                         if (not item) then
  344.                             break
  345.                         end
  346.                     end
  347.                 end
  348.             end
  349.         end
  350.        
  351.         for key,value in pairs(targetdata.Trade.Offer.Items) do
  352.             local datablock = rust.GetDatablockByName( value.Name )
  353.             local amount = value.Count
  354.             local i = 0
  355.             local item = targetinv:FindItem(datablock)
  356.             if (item) then
  357.                 if (datablock.IsSplittable()) then
  358.                     while (i < amount) do
  359.                         if (item.uses > 0) then
  360.                             item:SetUses( item.uses - 1 )
  361.                             i = i + 1
  362.                         else
  363.                             targetinv:RemoveItem( item )
  364.                             item = targetinv:FindItem(datablock)
  365.                             if (not item) then
  366.                                 break
  367.                             end
  368.                         end
  369.                     end
  370.                 else
  371.                     while (i < amount) do
  372.                         targetinv:RemoveItem( item )
  373.                         i = i + 1
  374.                         item = targetinv:FindItem(datablock)
  375.                         if (not item) then
  376.                             break
  377.                         end
  378.                     end
  379.                 end
  380.             end
  381.         end
  382.        
  383.         for key,value in pairs(userdata.Trade.Offer.Items) do
  384.             rust.RunServerCommand("inv.giveplayer \"" .. util.QuoteSafe( targetuser.displayName ) .. "\" \"" .. util.QuoteSafe( value.Name ) .. "\" " .. tostring(value.Count) )
  385.         end
  386.        
  387.         for key,value in pairs(targetdata.Trade.Offer.Items) do
  388.             rust.RunServerCommand("inv.giveplayer \"" .. util.QuoteSafe( netuser.displayName ) .. "\" \"" .. util.QuoteSafe( value.Name ) .. "\" " .. tostring(value.Count) )
  389.         end
  390.        
  391.         rust.SendChatToUser(netuser, "Trade complete! Type /tradehelp for help")
  392.         rust.SendChatToUser(targetuser, "Trade complete! Type /tradehelp for help")
  393.        
  394.         userdata.Trade.Init = false
  395.         userdata.Trade.Accepted = false
  396.         userdata.Trade.Offer = {}
  397.         userdata.Trade.Target = nil
  398.        
  399.         targetdata.Trade.Init = false
  400.         targetdata.Trade.Accepted = false
  401.         targetdata.Trade.Offer = {}
  402.         targetdata.Trade.Target = nil
  403.     else
  404.         rust.SendChatToUser(netuser, "Trade accepted. Waiting for target to accept. Type /tradehelp for help")
  405.         rust.SendChatToUser(targetuser, "Target accepted trade. Waiting for you to /accept. Type /tradehelp for help")
  406.         userdata.Trade.Accepted = true
  407.     end
  408.    
  409. end
  410.  
  411. function PLUGIN:FindUser( netuser, name, sendMsg)
  412.     local targetdata = nil
  413.     local b, targetuser = rust.FindNetUsersByName( name )
  414.     if (not b) then
  415.         if (targetuser == 0) then
  416.             targetdata = self:GetUserDataFromName(name)
  417.         else
  418.             --if (sendMsg) rust.Notice( netuser, "Multiple players found with that name!" ) end
  419.             return nil,nil
  420.         end
  421.         if (not targetdata) then
  422.             --if (sendMsg) rust.Notice(netuser, name .. " not found!") end
  423.             return nil,nil
  424.         end
  425.         targetuser = self:GetUserDataFromID(targetdata.ID, "")
  426.         if (not targetuser) then
  427.             --if (sendMsg) rust.Notice(netuser, name .. " not found!") end
  428.             return nil,nil
  429.         end
  430.     else
  431.         targetdata = self:GetUserData( targetuser )
  432.     end
  433.    
  434.     if (not targetdata) then
  435.         --if (sendMsg) rust.Notice(netuser, args[1] .. " not found!") end
  436.         return nil,nil
  437.     end
  438.  
  439.     return targetdata, targetuser
  440. end
  441.  
  442.  
  443. function PLUGIN:GetUserDataFromID( userID, name )
  444.     local userentry = self.Data[ userID ]
  445.     if (not userentry) then
  446.         print(name .. " user data not found")
  447.     end
  448.     return userentry
  449. end
  450.  
  451. function PLUGIN:GetUserDataFromName(name)
  452.     for key,value in pairs(self.Data) do
  453.         if (value.Name == name) then
  454.             return value
  455.         end
  456.     end
  457.     return nil
  458. end
  459.  
  460. function PLUGIN:GetUserData( netuser )
  461.     local userID = rust.GetUserID( netuser )
  462.     return self:UpdateUserDataFromID( userID, netuser.displayName )
  463. end
  464.  
  465. function PLUGIN:UpdateUserDataFromID( userID, name )
  466.     local userentry = self.Data[ userID ]
  467.     if (not userentry) then
  468.         userentry = {}
  469.         userentry.ID = userID
  470.         userentry.Name = name
  471.        
  472.         userentry.Trade = {}
  473.         userentry.Trade.Target = nil
  474.         userentry.Trade.Init = false
  475.         userentry.Trade.Accepted = false
  476.        
  477.         userentry.Trade.Offer = {}
  478.         userentry.Trade.Offer.Money = 0
  479.         userentry.Trade.Offer.Items = {}
  480.        
  481.         self.Data[ userID ] = userentry
  482.     end
  483.     return userentry
  484. end
  485.  
  486. function PLUGIN:OnUserConnect( netuser )
  487.     local data = self:GetUserData( netuser )
  488. end
  489. function PLUGIN:OnUserDisconnect( netuser )
  490.     local data = self:GetUserData( netuser )
  491.     if (data.Trade.Init) then
  492.         self:CancelTrade( netuser, data, true )
  493.     end
  494.     self.Data [ data.ID ] = nil
  495. end
  496.  
  497. api.Bind(PLUGIN, "trade")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement