Перейти к публикации
Форум - ComputerCraft
jammer312

Карьер для робота

Рекомендованные сообщения

Не последняя версия, но все же. Работает даже на роботе с минимальными комплектующими,однако нужен апгрейд инвентаря(но с двумя вставками памяти, не тестировал на роботе с одной вставкой).

 

ОБНОВЛЕНИЕ

Добавлена функция подзарядки робота через генератор, используя топлива, котое робот выкапывает в процессе работы. Программа сама определяет наличие генератора, если его нету, то работает как предыдущая версия.

 

Инструкция:

поставить робота, дать ему инструмент, поставить сзади него сундук

запустить с 3 аргументами из командной строки( если сохранили как minequarry, то надо вводить "minequarry x y z", где x,y и z - значения, выбранные вами)

первый аргумент определяет ширину

второй аргумент - длину

третий - глубину

 

робот копает вперед-вправо-вниз ( то есть стоит над верхним левом ближнем углу рабочей зоны(параллелепипеда , который будет выкапывать)), всегда рабочая зона начинается с блока под роботом включительно.

 

Для предотвращения потери ценных ресурсов робот копает в штатном режиме, пока последние 2 слота инвентаря не заполнены, однако, это можно изменить(slotstocheck отвечает за это, находится в начале программы). Проверяются 2 слота вместо одного, так как из некоторых блоков может выпадать по 2 вида ресурса(как из блока кварца кристаллы оного и пыль). Как только в них появляется хоть 1 предмет, робот возвращается в начальную позицию и выгружает весь инвентарь в сундук.

Также, в конце работы робот возвращается в исходное положение и выгружает предметы

 

Плюсы:

программа неприхотлива, работает даже на простых роботах

минимум настроек, точная отработка, эффективность( ну уж получше excavate из CC)

робот не остановится, пока не выкопает каждый блок или не разрядится

робот будет убивать мобов, на которых наткнется

 

Минусы:

Если неправильно задать координаты, и робот врежется в нерушимый блок, он в него упрется и не будет продолжать работу

робот может разрядиться, если его не заряжать у сундука, в который будет помещаться выкопанное роботом

робот не умеет менять инструменты

 

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

Прога:

if require("component").isAvailable("generator")
   then
   generator=require("component").generator
end
withg=(generator~=nil)
slots=16
slotstocheck=2
robot=require("robot")
coords={x=0,y=0,z=0,side=1}
extcoords={x=0,y=0,z=0,side=1}
sx={0,1,0,-1}
sy={1,0,-1,0}
--1,2,3,4
--tl  --  coords.side = (coords.side + 3)%4
--tr  --  coords.side = (coords.side + 1)%4
--ta  --  coords.side = (coords.side + 2)%4
--all --  if coords.side == 0 then coords.side =4 end
function go() while not robot.forward() do robot.swing()end coords.x=coords.x + sx[coords.side];coords.y = coords.y + sy[coords.side] end
function godown() while not robot.down() do robot.swingDown()end coords.z = coords.z - 1 end
function goup() while not robot.up() do robot.swingUp()end coords.z = coords.z + 1 end
function check() return robot.count(slots-(slotstocheck-1)) > 0 end
function turnLeft() robot.turnLeft(); coords.side = (coords.side + 3)%4;if coords.side == 0 then coords.side =4 end; end
function turnRight() robot.turnRight(); coords.side = (coords.side + 1)%4; if coords.side == 0 then coords.side =4 end; end
function tosurf()
   extcoords.x=coords.x
   extcoords.y=coords.y
   extcoords.z=coords.z
   extcoords.side=coords.side
   while coords.z ~= 0 do goup() end
   while coords.side ~= 3 do turnRight() end
   while coords.y ~= 0 do go() end
   turnRight();
   while coords.x ~= 0 do go() end
   turnLeft();
end
function back()
   while coords.z ~= extcoords.z do godown() end
   while coords.side~= 1 do turnRight() end
   while coords.y ~= extcoords.y do go() end
   turnRight();
   while coords.x ~= extcoords.x do go() end
   while coords.side ~= extcoords.side do turnRight() end
end
function clearinv()
   alreadyhave=false
   for invcounter=1,slots do
       robot.select(invcounter)
       if withg then 
           suc,error=generator.insert()
           if (error=="selected slot does not contain fuel" or alreadyhave) then robot.drop() else alreadyhave=true end
       else
           robot.drop()
       end
   end
   robot.select(1)
   sort()
end
function sort()
   curs=1
   for q=1,slots do
       if robot.count(q) > 0 then robot.select(q);robot.transferTo(curs);curs=curs+1 end
   end
   robot.select(1)
end
function prevent()
   if check() then
       tosurf()
       clearinv()
       back()
   end
end

function digrow(n)
prevent()
robot.swingUp()
prevent()
robot.swingDown()
for k=1,n do
prevent()
go()
prevent()
robot.swingUp()
prevent()
robot.swingDown()
end
end
function digdim(x,y)
godown()
godown()
for n=1,y do
if tl then turnLeft() else turnRight() end
digrow(ex)
if tl then turnRight() else turnLeft() end
tl = not tl
if n==y then print("ok") else go() end
end
turnRight();
turnRight();
tl= not tl
end
x,y,z=...
tl=false
x=x+0
y=y+0
z=z+0
ex=x-1
fullz=(z-z%3)/3
print("Fullz = " .. fullz)
for i=1,fullz do
digdim(x,y)
godown()
end
if fullz*3==z then elseif fullz*3+1==z then goup();goup();digdim(tl,x,y) else goup();digdim(tl,x,y) end
tosurf()
clearinv()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обновление, читайте основной пост(сверху)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот новая версия, позволяющая продолжить работу карьера с последней точки, если вдруг было прерывание работы(энергия кончилась, еще чего).

Не уверен в работоспособности на 100%, тем более есть 1 проблема с файлами, потому выкладываю отдельно.

Для возобновления работы надо всего лишь поставить робота в начальное положение и передать только 1 аргумент -restore (minequarry -restore)

if require("component").isAvailable("generator")
   then
   generator=require("component").generator
end
withg=(generator~=nil)
slots=16
slotstocheck=2
robot=require("robot")
coords={x=0,y=0,z=0,side=1}
extcoords={x=0,y=0,z=0,side=1}
sx={0,1,0,-1}
sy={1,0,-1,0}
falsemode=false
counter=0
tocount=0
--1,2,3,4
--tl  --  coords.side = (coords.side + 3)%4
--tr  --  coords.side = (coords.side + 1)%4
--ta  --  coords.side = (coords.side + 2)%4
--all --  if coords.side == 0 then coords.side =4 end
function save() 
   file = io.open("quarryrest","w")
   file:write(coords.x.."\n"..coords.y.."\n"..coords.z.."\n"..coords.side.."\n"..counter.."\n"..x.."\n"..y.."\n"..z.."\n")
   file:close()
end
function restore()
   local file = io.open("quarryrest","r")
   extcoords.x=file:read()+0
   extcoords.y=file:read()+0
   extcoords.z=file:read()+0
   extcoords.side=file:read()+0
   back()
   tocount=file:read()+0
   x=file:read()+0
   y=file:read()+0
   z=file:read()+0
   falsemode=true
end
function checkfalse()
   if counter>=tocount then falsemode=false end
end

function sgo() while not robot.forward() do robot.swing()end coords.x=coords.x + sx[coords.side];coords.y = coords.y + sy[coords.side]  end
function sgodown() while not robot.down() do robot.swingDown()end coords.z = coords.z - 1 end
function sgoup() while not robot.up() do robot.swingUp()end coords.z = coords.z + 1 end
function sturnLeft() robot.turnLeft(); coords.side = (coords.side + 3)%4;if coords.side == 0 then coords.side =4 end; end
function sturnRight() robot.turnRight(); coords.side = (coords.side + 1)%4; if coords.side == 0 then coords.side =4 end; end


function go()  if not falsemode then while not robot.forward() do robot.swing()end coords.x=coords.x + sx[coords.side];coords.y = coords.y + sy[coords.side] end counter=counter+1; save();checkfalse(); end
function godown()  if not falsemode then while not robot.down() do robot.swingDown()end coords.z = coords.z - 1 end counter=counter+1; save();checkfalse(); end
function goup()  if not falsemode then while not robot.up() do robot.swingUp()end coords.z = coords.z + 1 end counter=counter+1; save();checkfalse(); end
function check() return robot.count(slots-(slotstocheck-1)) > 0 end
function turnLeft() if not falsemode then robot.turnLeft(); coords.side = (coords.side + 3)%4;if coords.side == 0 then coords.side =4 end; end counter=counter+1; save();checkfalse(); end
function turnRight() if not falsemode then robot.turnRight(); coords.side = (coords.side + 1)%4; if coords.side == 0 then coords.side =4 end; end counter=counter+1; save();checkfalse(); end
function tosurf()
   extcoords.x=coords.x
   extcoords.y=coords.y
   extcoords.z=coords.z
   extcoords.side=coords.side
   while coords.z ~= 0 do sgoup() end
   while coords.side ~= 3 do sturnRight() end
   while coords.y ~= 0 do sgo() end
   sturnRight();
   while coords.x ~= 0 do sgo() end
   sturnLeft();
end
function back()
   while coords.z ~= extcoords.z do sgodown() end
   while coords.side~= 1 do sturnRight() end
   while coords.y ~= extcoords.y do sgo() end
   sturnRight();
   while coords.x ~= extcoords.x do sgo() end
   while coords.side ~= extcoords.side do sturnRight() end
end
function clearinv()
   alreadyhave=false
   for invcounter=1,slots do
       robot.select(invcounter)
       if withg then 
           suc,error=generator.insert()
           if (error=="selected slot does not contain fuel" or alreadyhave) then robot.drop() else alreadyhave=true end
       else
           robot.drop()
       end
   end
   robot.select(1)
   sort()
end
function sort()
   curs=1
   for q=1,slots do
       if robot.count(q) > 0 then robot.select(q);robot.transferTo(curs);curs=curs+1 end
   end
   robot.select(1)
end
function prevent()
   if check() then
       tosurf()
       clearinv()
       back()
   end
end

function digrow(n)
prevent()
robot.swingUp()
prevent()
robot.swingDown()
for k=1,n do
prevent()
go()
prevent()
robot.swingUp()
prevent()
robot.swingDown()
end
end
function digdim(x,y)
godown()
godown()
for n=1,y do
if tl then turnLeft() else turnRight() end
digrow(ex)
if tl then turnRight() else turnLeft() end
tl = not tl
if n==y then print("ok") else go() end
end
turnRight();
turnRight();
tl= not tl
end
x,y,z=...
if x=="-restore" then
   restore()
end
tl=false
x=x+0
y=y+0
z=z+0
ex=x-1
fullz=(z-z%3)/3
print("Fullz = " .. fullz)
for i=1,fullz do
digdim(x,y)
godown()
end
if fullz*3==z then elseif fullz*3+1==z then goup();goup();digdim(tl,x,y) else goup();digdim(tl,x,y) end
tosurf()
clearinv()

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нашел лажу, не позволявшую использовать проги на роботах без генераторов.

Перезалил обе с исправлениями

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я правильно понял, что генератор заправляется только во время очистки инвентаря?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я правильно понял, что генератор заправляется только во время очистки инвентаря?

Похоже на то. Во время разгрузки инвентаря он набивает топку углем по максимуму, а если остается лишний - сбрасывает вместе с остальной добычей.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я уже понял, что тут много нерационально. Единственное преимущество - быстро.

Я только начал изучение этого мода, но пробный заезд кое-что показал. Отвратительно работает с песком, он разлетается и затем не собирается. Опустим жидкости, но при копании сверху решается вопрос с лавой. Не следится за зарядкой батарей. Если вопрос стоит о сохранении всего лута, то главной ошибкой считаю копание под собой. Часть лута теряется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Странно, но потери лута снизу зависят от сборки, очевидно. На МТ потерь не наблюдал. Заметил недочет и подправил. Недочет заключается в следующем: робот с места старта уходит вертикально, а приходит на выгрузку горизонтально, то же и с позицией прерывания. Первое не позволяет окружить его полезными вещами, например зарядником, при возврате он его срубит. Второе приводит к тому, что робот в некоторых случаях натыкается на несрубленную породу и егозит туда-сюда. Доработал следующим образом: разделил подъем и спуск на 2 части, от места останова поднимается не доходя 2 блока, потом смещается к месту старта и поднимается на исходную; спуск наоборот.

Предстоит доработать добычу. Думаю поставить маленькую задержку после взмаха киркой. Это позволит упасть, или начать падать, сыпучим блокам, и пропусков не будет. Такой вариант я делал в своей программе, но с анализатором, все работало четко и чисто.

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×