[Пример] Автокрафт (провода) для робота OpenComputers

Artmoneyse

Администратор
Команда форума
Администратор
робот.jpg

Долго я возился с крафтом проводов для электросхем, которые мне нужно было сделать для 500 улучшенных солнечных панелей. Понял что данный процесс нужно автоматизировать.
Автоверстак из мода Buildcraft конечно можно приспособить для крафта проводов но скорость будет просто ужасная, настроить его нормально вообще не получиться, нужно постоянно бегать смотреть чтобы не забилось.

Решил написать код для робота чтобы он сам крафтил.
На написания и устранение основных багов ушло 2 часа.
Робот крафтит изолированные медные провода, вещи для крафта берет из сундука над собой.
Готовые провода складывает обратно в сундук.
Приблизительная скорость крафта равна 3 проводам в секунду (автоверстак крафтит 1 провод более 5 секунд).
С начало нужно загрузить в сундук ресурсы для крафта и запустить программу в роботе, будет крафтить пока не закончатся ресурсы в сундуке.

Код (еще сырой):
Код:
local component = require("component")
local c = component.crafting
local ic = component.inventory_controller
local r = require("robot")

function craftik(countik)
i = 0
while i < countik do
c.craft(1)
r.dropUp(2)
i = i + 1
end
end

function findcable()
i = 0
while i < numslot do
i = i + 1
ItemStack = ic.getStackInSlot(1,i)
if ItemStack ~= nil then
if ic.getStackInSlot(1,i)["label"] == "Copper Cable" then
return i
end
end
end
return 0
end

function findrubber()
i = 0
while i < numslot do
i = i + 1
ItemStack = ic.getStackInSlot(1,i)
if ItemStack ~= nil then
if ic.getStackInSlot(1,i)["label"] == "Rubber" then
return i
end
end
end
return 0
end

function loadItem(robotslot, chestslot)
ic.suckFromSlot(1,chestslot,64)
r.transferTo(robotslot,64)
end


numslot = ic.getInventorySize(1)
if numslot == nil then
print("Сундук над роботом не найден!")
else
print("Всего слотов в сундуке:"..numslot)
doWork = true
while doWork do
craftik(16)
if r.count(5) < 1 then
print("Кончились провода...")
loadItem(5,findcable())
if r.count(5) < 1 then
doWork = false
end
end
if r.count(6) < 1 then
print("Кончилась резина...")
loadItem(6,findrubber())
if r.count(6) < 1 then
doWork = false
end
end
end
end
В роботе должны быть улучшения:
- Контроллер инвентаря
- Создание
 
Последнее редактирование:
N

Nimer

Guest
а зачем в каждой функции столько ендов-то?
 

Artmoneyse

Администратор
Команда форума
Администратор
а зачем в каждой функции столько ендов-то?
Код написан спец. примитивно чтобы новичкам было понятно где начало и конец циклов\функций\ветвлений.
По сути его можно укоротить но тогда он станет сложнее для понимания.
Да и вообще тот код писался давно, мною уже был написан более универсальный код который работает в разы быстрее и крафтит всё. Возможно скоро выложу на данном форуме новый код.
 
Сверху