gelatine87 icon

Colorapplicator

gelatine87 | PRO | 08/16/16 09:20:11 PM UTC | 0 ⭐ | 443 👁️ | Never ⏰ | []
Lua |

6.01 KB

|

None

|

0 👍

/

0 👎

local maxItem = 2176
 
--######################--
 
local IMPORT = true
local chest = {}
local hasChest = false
local hasRChest = false
local rChestName = ""
local Int = {}
local hasInt = false
local hasRInt = false
local rIntName = ""
local directions = {"top", "bottom", "front", "back", "left", "right"}
local validItems ={"Snowball","Paint Ball"}
local IIDs =
    {
        "minecraft:snowball",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall",
        "appliedenergistics2:item.ItemPaintBall"
    }
local IDMGs =
    {
        0,
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15
    }
local exportDirection = "south"
 
local function findPeripherals()
    for k, v in pairs(peripheral.getNames()) do
        if string.find(v, "draconic_chest") then
            hasChest = true
            hasRChest = true
            rChestName = v
            term.setCursorPos(1, 1)
            term.write("INFO: Found remote "..v)
            os.sleep(1)
        elseif string.find(v, "tileinterface") then
            hasInt = true
            hasRInt = true
            rIntName = v
            term.setCursorPos(1, 2)
            term.write("INFO: Found remote "..v)
            os.sleep(1)
        end
    end
end
 
local function findInt()
    if hasRInt then return end
        for k, v in pairs(directions) do
            local p = peripheral.wrap(v)
            if p ~= nil then
                if string.find(peripheral.getType(v), "tileinterface") then
                    Int = p
                    hasInt = true
                    return
                end
            end
        end
    term.setCursorPos(1, 2)
    term.write("ERROR: No Interface detected!")
    os.sleep(5)
end
 
local function findChest()
    if hasRChest then return end
    for k, v in pairs(directions) do
        local p = peripheral.wrap(v)
        if p ~= nil then
            if string.find(peripheral.getType(v), "draconic_chest") then
                chest = p
                hasChest = true
                return
            end
        end
    end
    term.setCursorPos(1, 1)
    term.write("WARNING: No Draconic Chest detected!")
    os.sleep(5)
end
 
function invSize()
    local chest
    if hasChest then
        chest = peripheral.call(rChestName, "getInventorySize")
    else
        chest = chest.getInventorySize()
    end
    return chest
end
 
function StackSlot(Slot)
    local chest
    if hasChest then
        chest = peripheral.call(rChestName, "getStackInSlot", Slot)
    else
        chest = chest.getStackInSlot(Slot)
    end
    return chest
end
 
function string.starts(String,Start)
    pre = string.sub(Start,1,string.len(String))
    return pre == Start
end
 
function tablelength(T)
    local count = 0
    for _ in pairs(T) do
        count = count + 1
    end
    return count
end
 
function contains(table, String)
    for i = 1, tablelength(table), 1 do
        if string.starts(String, table[i]) then
            return true
        end
    end
    return false
end
 
function isValidItem(itemStack)
    if contains(validItems, itemStack.display_name) then
        return true
    end
    return false
end
 
function setGreen(sSide)
    rs.setBundledOutput(sSide, colors.green)
end
 
function chestEmpty()
    ic = 0
    for i = 1, invSize() - 1, 1 do
        stack = StackSlot(i)
        if stack ~= nil then
            if isValidItem(stack) then
                ic = ic + stack.qty
            end
        end
    end
    return ic == 0
end
 
function setRed(sSide)
    rs.setBundledOutput(sSide, colors.red)
end
 
function setNull(sSide)
    rs.setBundledOutput(sSide, 0)
end
 
function chestValid(validItemCount)
    if validItemCount > maxItem then
        term.setCursorPos(1, 3)
        term.write("ERROR - Chest inventory exceeds set storage limits!")
    elseif validItemCount == maxItem then
        setGreen("bottom")
        IMPORT = false
    end
end
 
local function init()
    findPeripherals()
    findChest()
    findInt()
end
 
init()
 
function refill()
    for _, aes in pairs(Int.getAvailableItems()) do
        for i = 1, tablelength(IIDs), 1 do
            id = IIDs[i]
            dmg = IDMGs[i]
            if aes.fingerprint.id == id and aes.fingerprint.dmg == dmg then
                valS = 0
                for j = 1, invSize() - 1, 1 do
                    stack = StackSlot(j)
                    if stack ~= nil then
                        if stack.id == id and stack.dmg == dmg then
                            valS = valS + stack.qty
                            --print(aReq)
                            --print(valS)
                        end
                    end
                end
                aReq = 128 - valS
                if aReq > 0 then
                    --print(aes.size)
                    --print(aReq)
                    if aes.size > aReq then
                        --Transfer items from ME to Chest (*aReq)
                        Int.exportItem(aes.fingerprint, exportDirection, aReq)
                    else
                        --Transfer and request recrafting
                        Int.requestCrafting(aes.fingerprint, 512)
                    end
                end
            end
        end
     end
end
 
while true do
    if IMPORT then
        slot = 0
        slotqt = 0
        valI = 0
        for CurrSlot = 1, invSize() -1, 1 do
            tableIS = StackSlot(CurrSlot)
            if tableIS ~= nil then
                slotqt = tableIS.qty
                slot = slot + slotqt
                if isValidItem(tableIS) then
                    --print("valid")
                    valI = valI + slotqt
                else
                    term.setCursorPos(1, 3)
                    term.write("Invalid Items found! (Please kill the person responsible.)")
                end
                --print("Slot Stack size: "..slotqt)
                --print("Total Item count: "..slot)
                --print("Valid Items: "..valI)
            end
        end
        if valI >= maxItem then
            chestValid(valI)
        else
            term.setCursorPos(1, 3)
            term.write("Refilling chest")
            refill()
        end
    else
        prevImport = IMPORT
        IMPORT = chestEmpty()
    end
    if not IMPORT then
        term.setCursorPos(1, 3)
        term.write("Import Process on hold until chest is emptied")
        sleep(2)
    elseif prevImport == false then
        term.setCursorPos(1, 3)
        term.write("Pausing Operations for Refilling Color Applicator")
        setRed("bottom")
        sleep(1)
        setNull("bottom")
    else
        sleep(5)
    end
end

Comments