Doob 2 749 Опубликовано: 15 июня, 2015 (изменено) Зачем для разных ферм писать разные программы?При помощи двух функций, я теперь могу сделать ферму crops и кактусов с минимумом изменений.Работает на любой длине и ширине поля, на любом роботе с инвентарем, пока робот висит у сундука, можно расширить грядку (не забыв при этом обновить границу из твердых блоков) Код библиотеки: pastebin get 3fYPKZ8v /lib/farmer.luaНастройки на строках 8 и 9 Ставим робота так, чтобы он стоял задом к сундуку, закидываем в первый слот сундук, чтобы робот мог найти отправную точку, делаем бордюр вокруг поля из любого твердого блока (уткнувшись в него, робот переходит на следующую линию) Примеры использования: Ферма кактусов local computer = require('computer') local robot = require('robot') local farmer = require('farmer') local function dig()--содрать два верхних блока кактуса/тростника if robot.detectDown() then robot.swingDown()os.sleep(0.4) robot.down() os.sleep(0.4) robot.swingDown() os.sleep(0.4) robot.up() end end while true do energy = computer.energy()/computer.maxEnergy() if energy <= 0.1 then -- если энергии меньше 10% print('Уровень энергии менее 10%') os.sleep(300) -- спим 5 минут else dig() robot.forward() --идем вперед if robot.detect() then --уперлись в блок dig() if farmer.turn() then -- поворачиваем, если есть блок - включаем поиск сундука if farmer.findChest() then -- проверяем есть ли сундук for i= 2, robot.inventorySize() do -- сбрасываем урожай robot.select(i) robot.drop() end robot.turnAround() -- разворачиваемся на старт robot.select(1) os.sleep(300) -- спим 5 минут end end end end end Ферма на жердочках еще проще: local computer = require('computer') local robot = require('robot') local farmer = require('farmer') while true do energy = computer.energy()/computer.maxEnergy() if energy <= 0.1 then -- если энергии меньше 10% print('Уровень энергии менее 10%') os.sleep(300) -- спим 5 минут else robot.useDown() robot.forward() if robot.detect() then robot.useDown() if farmer.turn() then if farmer.findChest() then for i= 2, robot.inventorySize() do robot.select(i) robot.drop() end robot.turnAround() robot.select(1) os.sleep(300) end end end end end Изменено 13 декабря, 2015 пользователем Doob 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
artem211 428 Опубликовано: 15 июня, 2015 топорно и не интерактивно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 15 июня, 2015 топорно и не интерактивно Зато универсально, мне большего и не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
artem211 428 Опубликовано: 15 июня, 2015 Зато универсально, мне большего и не надо. универсально - это когда можно легко менять то или иное условие программы, у тебя же жестко заданы границы и чтоб их поменять придется лезть в код Зато универсально, мне большего и не надо. не говоря о том что встань на пути игрок или корова или зомби - привет твоей ферме Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 15 июня, 2015 универсально - это когда можно легко менять то или иное условие программы, у тебя же жестко заданы границы и чтоб их поменять придется лезть в код не говоря о том что встань на пути игрок или корова или зомби - привет твоей ферме У меня таких проблем нет, проверку на сущности я убрал, чтобы не крашилось с самой слабой памятью. К тому-же это не полноценная программа, а всего две функции, мне была интересна реализация хождения робота относительно стен - я это сделал, кому надо - тот пишет что-то другое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 17 июня, 2015 (изменено) Долго думал, зачем нормальному человеку выгуливать на огороде зомбей и коров, потом попробовал сделать ферму цветов для краски и грибов для еды - меня начали доставать зомби и слизни. Я вернул проверку на сущности, хотя это бред - робот на убийство тратит больше энергии, нежели на повторный обход того блока, который был занят сущностью. Вот пример для фермы цветов, в сундук перед запуском надо кинуть костную пыль, роботу нужен контроллер инвентаря и солнечная батарея (farmer - имя библиотеки). local component = require('component') local computer = require('computer') local robot = require('robot') local term = require('term') local farmer = require('farmer') local function findBoneMeal() robot.select(1) for sl = 1, component.inventory_controller.getInventorySize(3) do if component.inventory_controller.getStackInSlot(3, sl) == nil then else item = component.inventory_controller.getStackInSlot(3, sl) if item.name == 'minecraft:dye' and item.damage == 15 then component.inventory_controller.suckFromSlot(3, sl) end end end end robot.turnAround() findBoneMeal() robot.turnAround() while true do energy = computer.energy()/computer.maxEnergy() if energy <= 0.1 then -- если энергии меньше 10% print('Уровень энергии менее 10%') os.sleep(300) -- спим 5 минут else term.clear() x = math.random(1, 10) if x <= 1 then robot.select(1) robot.placeDown() -- ставит под себя костную муку, с вероятностью 10% end robot.swingDown() -- срезаем цветы и траву robot.suckDown() farmer.killer() -- если спереди есть сущность - убиваем robot.forward() -- делаем шаг if farmer.killer() then -- если нашли твердый блок robot.swingDown() if farmer.turn() then -- переходим на новую линию if farmer.findChest() then -- ищем сундук for i= 2, robot.inventorySize() do -- выбрасываем все, кроме сундка robot.select(i) robot.drop() end findBoneMeal() -- ищем костную муку robot.turnAround() os.sleep(30) end end end end end Изменено 13 декабря, 2015 пользователем Doob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BarBoss 89 Опубликовано: 9 августа, 2015 Для фермы кактусов желателен апгрейд "луч захвата" или как его там. Кактусы даже рубить не надо, они сами "отваливаются" при приближении робота. Отваливаются и те, что сбоку от робота. Более половины урожая теряется при этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 749 Опубликовано: 10 августа, 2015 (изменено) Для фермы кактусов желателен апгрейд "луч захвата" или как его там. Кактусы даже рубить не надо, они сами "отваливаются" при приближении робота. Отваливаются и те, что сбоку от робота. Более половины урожая теряется при этом.Робот должен быть над кактусами (максимальная высота кактуса 3 блока), тогда ничего не отваливается. Кстати, хорошо, что тема всплыла, давно хотел поправить один баг и написать универсального фермера со строительством площадок. Надо бы еще расширение фермы автоматизировать, а то вручную строить новые стены и фермленды довольно муторно. Изменено 10 августа, 2015 пользователем Doob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах