Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- apis/MasterControl
- os.loadAPI("apis/BasketNet")
- os.loadAPI("apis/ChestManagement")
- local tComputerNames = {}
- local tStorageCells = {}
- function init()
- if not rednet.isOpen("left") then
- rednet.open("left")
- end
- BasketNet.registerAsMasterControl()
- BasketNet.broadcast("Reboot", "BasketNet")
- end
- function processRequest()
- local iSenderID, sMessage, sProtocol = BasketNet.receive(60, "BasketNet")
- if iSenderID == nil then
- return false
- end
- print("Processing Request from " .. iSenderID .. "\n\t\t\t" .. sMessage)
- local tParsedMessage = {}
- for sPart in string.gmatch(sMessage, "%S+") do
- table.insert(tParsedMessage, sPart)
- end
- if sMessage == "RefuelRequest" then
- processFuelRequest(iSenderID)
- elseif tParsedMessage[1] == "StartConversation" then
- BasketNet.joinConversation(iSenderID, tParsedMessage[2])
- processConversation()
- elseif tParsedMessage[1] == "Register" then
- if tParsedMessage[2] == "StorageCell" then
- tStorageCells[string.sub(tComputerNames[iSenderID], 12) + 0] = iSenderID
- BasketNet.send(iSenderID, "Ack", "BasketNetAck")
- end
- elseif tParsedMessage[1] == "Name" then
- processComputerName(iSenderID, tParsedMessage[2])
- elseif sMessage == "StorageCellList" then
- BasketNet.send(iSenderID, getListOfStorageCells(), "BasketNet")
- elseif tParsedMessage[1] == "GetInventory" then
- BasketNet.send(iSenderID, getInventory(tParsedMessage[2]), "BasketNet")
- elseif sMessage == "Reboot" then
- os.reboot()
- elseif sMessage == "RefuelingComplete" then
- processFuelRequest(iSenderID)
- end
- end
- function processConversation()
- local tLastParsedMessage = {}
- local tParsedMessage = {}
- local iAttempts = 0
- while iAttempts < 5 do
- iAttempts = iAttempts + 1
- local iSenderID, sMessage, sProtocol = BasketNet.receiveFromConversation(2)
- if iSenderID ~= nil then
- if type(sMessage) == "table" then
- if tLastParsedMessage[1] == "Retrieve" then
- for iStorageCellID, iComputerID in pairs(tStorageCells) do
- BasketNet.send(iComputerID, tLastParsedMessage[1] .. " " .. tLastParsedMessage[2] .. " " .. tLastParsedMessage[3], "BasketNet")
- BasketNet.send(iComputerID, sMessage, "BasketNetRetrieve")
- local iSenderID, sMessage, sProtocol = BasketNet.receive(3, "BasketNetRetrieve")
- if iSenderID ~= nil and sMessage == "Retrieving" then
- BasketNet.sendToConversation("Retrieving")
- end
- break
- end
- iAttempts = 0;
- end
- else
- tParsedMessage = {}
- for sPart in string.gmatch(sMessage, "%S+") do
- table.insert(tParsedMessage, sPart)
- end
- print("\t\tRequest: " .. sMessage)
- if tParsedMessage[1] == "EndConversation" then
- BasketNet.endConversation()
- return true
- elseif tParsedMessage[1] == "Retrieve" then
- BasketNet.sendToConversation("Ready")
- iAttempts = 0;
- end
- end
- if iAttempts == 0 then
- tLastParsedMessage = tParsedMessage
- end
- end
- end
- end
- function getListOfStorageCells()
- local tStorageCellNames = {}
- for iStorageCellID, iComputerID in pairs(tStorageCells) do
- tStorageCellNames[iStorageCellID] = {}
- tStorageCellNames[iStorageCellID]["iComputerID"] = iComputerID
- tStorageCellNames[iStorageCellID]["sName"] = tComputerNames[iComputerID]
- end
- return tStorageCellNames
- end
- function getInventory(sOwnerName)
- local tItems = {}
- for iStorageCellID, iComputerID in pairs(tStorageCells) do
- -- TODO check if the Storage Cell is owned by sOwnerName
- local iAttempts = 0
- while iAttempts < 5 do
- print("Requesting Inventory from " .. tStorageCells[iStorageCellID])
- BasketNet.send(iComputerID, "GetInventory", "BasketNet")
- local iSenderID, sMessage, sProtocol = BasketNet.receive(5, "BasketNetGetInventory")
- if iSenderID == iComputerID then
- print("\t\tInventory Received")
- iAttempts = 0
- local tItems2 = {}
- for iChestID, tChestItems in ipairs(sMessage) do
- for k, iItem in ipairs(tChestItems) do
- table.insert(tItems2, iItem)
- end
- end
- tItems = combineItemLists(tItems, tItems2)
- break
- end
- iAttempts = iAttempts + 1
- end
- end
- return tItems
- end
- function combineItemLists(tItems1, tItems2)
- tItems1 = condenseItemList(tItems1)
- tItems2 = condenseItemList(tItems2)
- for k1, tItem1 in pairs(tItems1) do
- for k2, tItem2 in pairs(tItems2) do
- if ChestManagement.itemsAreTheSame(tItem1, tItem2) then
- tItems[k1].count = tItems[k1].count + tItems[k2].count
- table.remove(tItems2, k2)
- end
- end
- end
- for k, tItem2 in pairs(tItems2) do
- table.insert(tItems1, tItem2)
- end
- return tItems1
- end
- function condenseItemList(tItems)
- for k1, tItem1 in pairs(tItems) do
- for k2, tItem2 in pairs(tItems) do
- if k1 ~= k2 and ChestManagement.itemsAreTheSame(tItem1, tItem2) then
- tItems[k1].count = tItems[k1].count + tItems[k2].count
- table.remove(tItems, k2)
- end
- end
- end
- return tItems
- end
- function processComputerName(iComputerID, sComputerName)
- tComputerNames[iComputerID] = sComputerName
- BasketNet.send(iComputerID, "NameReceived", "BasketNetAck")
- end
- function processFuelRequest(iSenderID)
- BasketNet.send(iStorageID, "RequestReceived", "BasketNet")
- print(iSenderID .. " wants fuel. Place it in their chest and hit enter")
- read("*")
- BasketNet.send(iStorageID, "Refuel", "BasketNet")
- end
- function processFuelingCompleteRequest(iSenderID)
- BasketNet.send(iStorageID, "RequestReceived", "BasketNet")
- print(iSenderID .. " has refueld. Please remove the empty buckets and hit enter")
- read("*")
- BasketNet.send(iStorageID, "Clear", "BasketNet")
- end
- function processItemMoveRequest(sSourceType, iSourceID, sDestinationType, sDestinationID, sItemName, iAmount)
- end
- function isTargetReady(iTarget)
- BasketNet.send(iTarget, "Ready?", "BasketNet")
- while true do
- local iSenderId, sMessage, sProtocol = BasketNet.receive(3, "BasketNetReadyCheck")
- -- If message not from iTarget
- if iSenderId == iTarget then
- -- If timeout
- if iSenderId == nil then
- return false
- end
- -- If replied back with not ready
- if sMessage ~= "Ready" then
- return false
- end
- return true
- end
- end
- end
- function sendStorageCellStoreBufferRequest(iStorageCellID)
- if not isTargetReady(iStorageCellID) then
- return false
- end
- BasketNet.send(iStorageCellID, "Store", "BasketNet")
- return true
- end
- function sendStorageCellFillBufferRequest(iStorageCellID, sItem, iAmount)
- if not isTargetReady(iStorageCellID) then
- return false
- end
- BasketNet.send(iStorageCellID, "Retrieve " .. sItem .. " " .. iAmount, "BasketNet")
- return true
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement