local minecoloniesBridgeName = " [Minecolonies Bridge]"
local mainNetworkBridgeName = " [Main Network Bridge]"
local mainToMinecoloniesDirection = "bottom"
local minecoloniesToMainDirection = "top"
local loopInterval = 5
local minecoloniesMaxAllowedItemCount = 256
local minecoloniesNetworkCleanupIterations = 10
local minecoloniesBridge = nil
local mainNetworkBridge = nil
local colonyIntegrator = nil
local next = next
local function InitalizeComponents()
local sucessfulInitialization = true
repeat
if sucessfulInitialization == false then
sleep(0.1)
term.clear()
term.setCursorPos(1,1)
end
sucessfulInitialization = true
local deviceList = peripheral.getNames()
local bridges = {}
for i = 1, #deviceList do
local device = peripheral.getType(deviceList[i])
if device == "colonyIntegrator" then
colonyIntegrator = peripheral.wrap(deviceList[i])
elseif device == "rsBridge" then
bridges[#bridges + 1] = peripheral.wrap(deviceList[i])
end
end
if #bridges ~= 2 then
print("You need exactly 2 RS Bridges")
sucessfulInitialization = false
else
for i = 1, #bridges do
local bridge = bridges[i]
if bridge.getName() == minecoloniesBridgeName then
minecoloniesBridge = bridge
elseif bridge.getName() == mainNetworkBridgeName then
mainNetworkBridge = bridge
end
end
end
if minecoloniesBridge == nil or mainNetworkBridge == nil then
print("At least one RS Bridge is missing.");
sucessfulInitialization = false;
end
if colonyIntegrator == nil then
print("Colony Integrator is missing");
sucessfulInitialization = false;
end
until (sucessfulInitialization)
end
local function RequestAddOrIncreaseCount(flatRequests,request)
local itemname = request.items[1].name
for i=1,#flatRequests do
if flatRequests[i].name == itemname then
flatRequests[i].count = flatRequests[i].count + request.count
return
end
end
flatRequests[#flatRequests + 1] = {name = itemname,count = request.count,displayName = request.items[1].displayName}
end
local function GetFlattenRequests()
local requests = colonyIntegrator.getRequests()
if requests == nil or next(requests) == nil then
return nil
end
local flatRequests = {}
for i=1,#requests do
RequestAddOrIncreaseCount(flatRequests,requests[i])
end
return flatRequests
end
local function PrintFlatRequests(flatRequests)
term.clear()
term.setCursorPos(1,1)
for i=1,#flatRequests do
print(flatRequests[i].count .. flatRequests[i].displayName)
end
end
local function ArrayRemove(t, fnKeep)
local j, n = 1, #t;
for i=1,n do
if (fnKeep(t, i, j)) then
if (i ~= j) then
t[j] = t[i];
t[i] = nil;
end
j = j + 1;
else
t[i] = nil;
end
end
return t;
end
local function CheckRequestsInMinecolonies(flatRequests)
for i=1,#flatRequests do
local req = flatRequests[i]
local mineItem = minecoloniesBridge.getItem(req)
if mineItem ~= nil then
req.count = math.max(req.count-mineItem.amount,0)
end
end
return ArrayRemove(flatRequests,function(t, i, j)
local v = t[i];
return (v.count > 0);
end)
end
local function MoveOrCraftRequestedItemsFromMain(flatRequests)
for i=1,#flatRequests do
local req = flatRequests[i]
local mnitem = mainNetworkBridge.getItem(req)
local pattern = mainNetworkBridge.getPattern(req)
if mnitem == nil and pattern == nil then
--nothing we can do
elseif (mnitem ~= nil and pattern ~= nil and mnitem.amount == pattern.outputs[1].amount) or (mnitem == nil and pattern ~= nil) then
--network reports something, but its likely bug https://github.com/Seniorendi/AdvancedPeripherals/issues/270 or we dont have any but we can craft it
if not mainNetworkBridge.isItemCrafting(req.name) then
mainNetworkBridge.craftItem(req)
end
else
local missing = 0
local inNet = 0
if mnitem == nil then
missing = req.count
else
inNet = mnitem.amount
missing = math.max(req.count-inNet,0)
end
if inNet > 0 then
mainNetworkBridge.exportItem(req,mainToMinecoloniesDirection)
end
if pattern ~= nil and missing > 0 then
if not mainNetworkBridge.isItemCrafting(req.name) then
req.count = missing
mainNetworkBridge.craftItem(req)
end
end
end
end
end
local function CheckItemExistsInBlacklist(blacklist,item)
for i=1,#blacklist do
if blacklist[i].name == item.name then
return true
end
end
return false
end
local function MoveItemsToMainNetworkWhenOverLimit(blacklist)
local minecoloniesItems = minecoloniesBridge.listItems()
for i=1,#minecoloniesItems do
local mineitem = minecoloniesItems[i]
if mineitem.amount > minecoloniesMaxAllowedItemCount then
if not CheckItemExistsInBlacklist(blacklist,mineitem) then
minecoloniesBridge.exportItem({name = mineitem.name,count = mineitem.amount - minecoloniesMaxAllowedItemCount},minecoloniesToMainDirection)
end
end
end
end
InitalizeComponents()
local cycle = minecoloniesNetworkCleanupIterations
repeat
local flatRequests = GetFlattenRequests()
if cycle >= minecoloniesNetworkCleanupIterations then
MoveItemsToMainNetworkWhenOverLimit(flatRequests or {})
cycle = 0
end
if flatRequests == nil or next(flatRequests) == nil then
term.clear()
--term.setCursorPos(1,1)
else
flatRequests = CheckRequestsInMinecolonies(flatRequests)
PrintFlatRequests(flatRequests);
MoveOrCraftRequestedItemsFromMain(flatRequests)
end
cycle = cycle + 1
sleep(loopInterval)
until (false)
Comments
0 B
|👍
/👎