Advertisement
BasketMC

ComputerCraft: Master Control API

Dec 7th, 2015
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.65 KB | None | 0 0
  1. -- apis/MasterControl
  2.  
  3. os.loadAPI("apis/BasketNet")
  4. os.loadAPI("apis/ChestManagement")
  5.  
  6. local tComputerNames = {}
  7.  
  8. local tStorageCells = {}
  9.  
  10. function init()
  11.     if not rednet.isOpen("left") then
  12.                 rednet.open("left")
  13.         end
  14.  
  15.     BasketNet.registerAsMasterControl()
  16.  
  17.     BasketNet.broadcast("Reboot", "BasketNet")
  18. end
  19.  
  20. function processRequest()
  21.     local iSenderID, sMessage, sProtocol = BasketNet.receive(60, "BasketNet")
  22.     if iSenderID == nil then
  23.         return false
  24.     end
  25.  
  26.     print("Processing Request from " .. iSenderID .. "\n\t\t\t" .. sMessage)
  27.  
  28.     local tParsedMessage = {}
  29.  
  30.     for sPart in string.gmatch(sMessage, "%S+") do
  31.         table.insert(tParsedMessage, sPart)
  32.     end
  33.  
  34.     if sMessage == "RefuelRequest" then
  35.         processFuelRequest(iSenderID)
  36.     elseif tParsedMessage[1] == "StartConversation" then
  37.         BasketNet.joinConversation(iSenderID, tParsedMessage[2])
  38.         processConversation()
  39.     elseif tParsedMessage[1] == "Register" then
  40.         if tParsedMessage[2] == "StorageCell" then
  41.             tStorageCells[string.sub(tComputerNames[iSenderID], 12) + 0] = iSenderID
  42.             BasketNet.send(iSenderID, "Ack", "BasketNetAck")
  43.         end
  44.     elseif tParsedMessage[1] == "Name" then
  45.         processComputerName(iSenderID, tParsedMessage[2])
  46.     elseif sMessage == "StorageCellList" then
  47.         BasketNet.send(iSenderID, getListOfStorageCells(), "BasketNet")
  48.     elseif tParsedMessage[1] == "GetInventory" then
  49.         BasketNet.send(iSenderID, getInventory(tParsedMessage[2]), "BasketNet")
  50.     elseif sMessage == "Reboot" then
  51.         os.reboot()
  52.     elseif sMessage == "RefuelingComplete" then
  53.         processFuelRequest(iSenderID)
  54.     end
  55. end
  56.  
  57. function processConversation()
  58.  
  59.     local tLastParsedMessage = {}
  60.     local tParsedMessage = {}
  61.  
  62.     local iAttempts = 0
  63.     while iAttempts < 5 do
  64.         iAttempts = iAttempts + 1
  65.         local iSenderID, sMessage, sProtocol = BasketNet.receiveFromConversation(2)
  66.         if iSenderID ~= nil then           
  67.             if type(sMessage) == "table" then
  68.                 if tLastParsedMessage[1] == "Retrieve" then
  69.                     for iStorageCellID, iComputerID in pairs(tStorageCells) do
  70.                         BasketNet.send(iComputerID, tLastParsedMessage[1] .. " " .. tLastParsedMessage[2] .. " " .. tLastParsedMessage[3], "BasketNet")
  71.                         BasketNet.send(iComputerID, sMessage, "BasketNetRetrieve")
  72.                         local iSenderID, sMessage, sProtocol = BasketNet.receive(3, "BasketNetRetrieve")
  73.                         if iSenderID ~= nil and sMessage == "Retrieving" then
  74.                             BasketNet.sendToConversation("Retrieving")
  75.                         end
  76.                         break
  77.                     end
  78.                     iAttempts = 0;
  79.                 end
  80.             else
  81.                 tParsedMessage = {}
  82.                 for sPart in string.gmatch(sMessage, "%S+") do
  83.                     table.insert(tParsedMessage, sPart)
  84.                 end
  85.        
  86.                 print("\t\tRequest: " .. sMessage)
  87.  
  88.                 if tParsedMessage[1] == "EndConversation" then
  89.                     BasketNet.endConversation()
  90.                     return true
  91.                 elseif tParsedMessage[1] == "Retrieve" then
  92.                     BasketNet.sendToConversation("Ready")
  93.                     iAttempts = 0;
  94.                 end
  95.             end
  96.             if iAttempts == 0 then
  97.                 tLastParsedMessage = tParsedMessage
  98.             end
  99.         end
  100.     end
  101. end
  102.  
  103. function getListOfStorageCells()
  104.    
  105.     local tStorageCellNames = {}
  106.  
  107.     for iStorageCellID, iComputerID in pairs(tStorageCells) do
  108.         tStorageCellNames[iStorageCellID] = {}
  109.         tStorageCellNames[iStorageCellID]["iComputerID"] = iComputerID
  110.         tStorageCellNames[iStorageCellID]["sName"] = tComputerNames[iComputerID]
  111.     end
  112.  
  113.     return tStorageCellNames
  114.  
  115. end
  116.  
  117. function getInventory(sOwnerName)
  118.     local tItems = {}
  119.     for iStorageCellID, iComputerID in pairs(tStorageCells) do
  120.         -- TODO check if the Storage Cell is owned by sOwnerName
  121.         local iAttempts = 0
  122.         while iAttempts < 5 do
  123.             print("Requesting Inventory from " .. tStorageCells[iStorageCellID])
  124.             BasketNet.send(iComputerID, "GetInventory", "BasketNet")
  125.             local iSenderID, sMessage, sProtocol = BasketNet.receive(5, "BasketNetGetInventory")
  126.             if iSenderID == iComputerID then  
  127.                 print("\t\tInventory Received")                                  
  128.                 iAttempts = 0
  129.                 local tItems2 = {}
  130.                 for iChestID, tChestItems in ipairs(sMessage) do
  131.                     for k, iItem in ipairs(tChestItems) do
  132.                         table.insert(tItems2, iItem)
  133.                     end
  134.                 end
  135.                 tItems = combineItemLists(tItems, tItems2)
  136.                 break
  137.             end
  138.             iAttempts = iAttempts + 1
  139.         end
  140.     end
  141.     return tItems
  142. end
  143.  
  144. function combineItemLists(tItems1, tItems2)
  145.     tItems1 = condenseItemList(tItems1)
  146.     tItems2 = condenseItemList(tItems2)
  147.     for k1, tItem1 in pairs(tItems1) do
  148.         for k2, tItem2 in pairs(tItems2) do
  149.             if ChestManagement.itemsAreTheSame(tItem1, tItem2) then
  150.                 tItems[k1].count = tItems[k1].count + tItems[k2].count
  151.                 table.remove(tItems2, k2)
  152.             end
  153.         end
  154.     end
  155.     for k, tItem2 in pairs(tItems2) do
  156.         table.insert(tItems1, tItem2)
  157.     end
  158.     return tItems1
  159. end
  160.  
  161. function condenseItemList(tItems)
  162.     for k1, tItem1 in pairs(tItems) do
  163.         for k2, tItem2 in pairs(tItems) do
  164.             if k1 ~= k2 and ChestManagement.itemsAreTheSame(tItem1, tItem2) then
  165.                 tItems[k1].count = tItems[k1].count + tItems[k2].count
  166.                 table.remove(tItems, k2)
  167.             end
  168.         end
  169.     end
  170.     return tItems
  171. end
  172.  
  173. function processComputerName(iComputerID, sComputerName)
  174.     tComputerNames[iComputerID] = sComputerName
  175.     BasketNet.send(iComputerID, "NameReceived", "BasketNetAck")
  176. end
  177.  
  178. function processFuelRequest(iSenderID)
  179.    
  180.     BasketNet.send(iStorageID, "RequestReceived", "BasketNet")
  181.     print(iSenderID .. " wants fuel.  Place it in their chest and hit enter")
  182.     read("*")
  183.  
  184.     BasketNet.send(iStorageID, "Refuel", "BasketNet")
  185.  
  186. end
  187.  
  188. function processFuelingCompleteRequest(iSenderID)
  189.    
  190.     BasketNet.send(iStorageID, "RequestReceived", "BasketNet")
  191.     print(iSenderID .. " has refueld.  Please remove the empty buckets and hit enter")
  192.     read("*")
  193.  
  194.     BasketNet.send(iStorageID, "Clear", "BasketNet")
  195.  
  196. end
  197.  
  198. function processItemMoveRequest(sSourceType, iSourceID, sDestinationType, sDestinationID, sItemName, iAmount)
  199.  
  200. end
  201.  
  202. function isTargetReady(iTarget)
  203.  
  204.     BasketNet.send(iTarget, "Ready?", "BasketNet")
  205.     while true do
  206.         local iSenderId, sMessage, sProtocol = BasketNet.receive(3, "BasketNetReadyCheck")
  207.  
  208.         -- If message not from iTarget
  209.         if iSenderId == iTarget then
  210.  
  211.             -- If timeout
  212.             if iSenderId == nil then
  213.                 return false
  214.             end
  215.  
  216.             -- If replied back with not ready
  217.             if sMessage ~= "Ready" then
  218.                 return false
  219.             end
  220.  
  221.             return true
  222.  
  223.         end
  224.     end
  225.  
  226. end
  227.  
  228. function sendStorageCellStoreBufferRequest(iStorageCellID)
  229.     if not isTargetReady(iStorageCellID) then
  230.         return false
  231.     end
  232.    
  233.     BasketNet.send(iStorageCellID, "Store", "BasketNet")
  234.  
  235.     return true
  236. end
  237.  
  238. function sendStorageCellFillBufferRequest(iStorageCellID, sItem, iAmount)
  239.     if not isTargetReady(iStorageCellID) then
  240.         return false
  241.     end
  242.    
  243.     BasketNet.send(iStorageCellID, "Retrieve " .. sItem .. " " .. iAmount, "BasketNet")
  244.  
  245.     return true
  246. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement