jammer312 45 Опубликовано: 28 июля, 2014 Не последняя версия, но все же. Работает даже на роботе с минимальными комплектующими,однако нужен апгрейд инвентаря(но с двумя вставками памяти, не тестировал на роботе с одной вставкой). ОБНОВЛЕНИЕ Добавлена функция подзарядки робота через генератор, используя топлива, котое робот выкапывает в процессе работы. Программа сама определяет наличие генератора, если его нету, то работает как предыдущая версия. Инструкция: поставить робота, дать ему инструмент, поставить сзади него сундук запустить с 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() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
jammer312 Автор темы 45 Опубликовано: 30 июля, 2014 Обновление, читайте основной пост(сверху) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
jammer312 Автор темы 45 Опубликовано: 5 августа, 2014 Вот новая версия, позволяющая продолжить работу карьера с последней точки, если вдруг было прерывание работы(энергия кончилась, еще чего). Не уверен в работоспособности на 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() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
jammer312 Автор темы 45 Опубликовано: 5 августа, 2014 Нашел лажу, не позволявшую использовать проги на роботах без генераторов. Перезалил обе с исправлениями Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bamik 75 Опубликовано: 22 февраля, 2015 Я правильно понял, что генератор заправляется только во время очистки инвентаря? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 22 февраля, 2015 Я правильно понял, что генератор заправляется только во время очистки инвентаря? Похоже на то. Во время разгрузки инвентаря он набивает топку углем по максимуму, а если остается лишний - сбрасывает вместе с остальной добычей. Вторая версия программы использует запись в файл текущих координат. Причем делает это после каждого движения, что на мой взгляд немного нерационально. Выкопав карьер 10 на 10 на 10 блоков, программа перезапишет злосчастный файл с координатами около 1000 раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bamik 75 Опубликовано: 22 февраля, 2015 Я уже понял, что тут много нерационально. Единственное преимущество - быстро. Я только начал изучение этого мода, но пробный заезд кое-что показал. Отвратительно работает с песком, он разлетается и затем не собирается. Опустим жидкости, но при копании сверху решается вопрос с лавой. Не следится за зарядкой батарей. Если вопрос стоит о сохранении всего лута, то главной ошибкой считаю копание под собой. Часть лута теряется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bamik 75 Опубликовано: 18 апреля, 2015 Странно, но потери лута снизу зависят от сборки, очевидно. На МТ потерь не наблюдал. Заметил недочет и подправил. Недочет заключается в следующем: робот с места старта уходит вертикально, а приходит на выгрузку горизонтально, то же и с позицией прерывания. Первое не позволяет окружить его полезными вещами, например зарядником, при возврате он его срубит. Второе приводит к тому, что робот в некоторых случаях натыкается на несрубленную породу и егозит туда-сюда. Доработал следующим образом: разделил подъем и спуск на 2 части, от места останова поднимается не доходя 2 блока, потом смещается к месту старта и поднимается на исходную; спуск наоборот. Предстоит доработать добычу. Думаю поставить маленькую задержку после взмаха киркой. Это позволит упасть, или начать падать, сыпучим блокам, и пропусков не будет. Такой вариант я делал в своей программе, но с анализатором, все работало четко и чисто. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
niklin 0 Опубликовано: 18 сентября, 2015 как задать координаты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах