Hiranus icon

Minecolonies RS integration

Hiranus | PRO | 03/06/22 11:52:01 AM UTC (Edited) | 0 ⭐ | 3091 👁️ | Never ⏰ | []
Lua |

6.51 KB

|

None

|

0 👍

/

0 👎

 
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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎