Arseniy10 50 Опубликовано: 7 июля, 2016 Как мне брать что-либо из сундука? Как мне положить предмет из инвентаря робота в слот для инструмента? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob 2 749 Опубликовано: 8 июля, 2016 А теперь, подведем итог. Допустим, нам надо взять из сундука перед роботом железную кирку. local component = require("component") -- загружаем компоненты local robot = component.robot -- подключаем компонент робота local i_c = component.inventory_controller -- подключаем компонент контроллера local function finditem(side, name) -- функция поиска предмета в контейнере, первый параметр - сторона, второй - системное имя local inv, item = i_c.getInventorySize(side) -- узнаем количество слотов инвентаря if inv then -- если удалось узнать количество слотов for slot = 1, inv do -- в цикле проходим по всем слотам item = i_c.getStackInSlot(side, slot) -- получаем информацию о слоте if item and item.name == name then -- если имя предмета в слоте совпадает с нужным return slot -- возвращаем номер слота end end end return nil end local i = finditem(3, "minecraft:iron_pickaxe") -- ищем предмет в контейнере перед роботом if i then -- если предмет найден robot.select(1) -- выбираем первый слот робота i_c.suckFromSlot(3, i) -- берем предмет i_c.equip() -- переносим в слот для инструмента end Справка по сторонам - 1 = сверху, 0 = снизу, 3 = спереди. Функцией поиска можно найти любой предмет по системному имени, можно сделать, чтобы возвращалось и количество предметов в слоте. 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 7 июля, 2016 Как мне брать что-либо из сундука? Как мне положить предмет из инвентаря робота в слот для инструмента? В роботе должны быть установлены 2 улучшения : инвентарь и контроллер инвентаря. Взять предмет с сундука - robot.suck([count: number]): boolean Сделать активным слот - robot.select([slot: number]): number P.S. Хотя ... глянь здесь http://minecraft-ru.gamepedia.com/OpenComputers/Robot_API 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 7 июля, 2016 В роботе должны быть установлены 2 улучшения : инвентарь и контроллер инвентаря. Взять предмет с сундука - robot.suck([count: number]): boolean Сделать активным слот - robot.select([slot: number]): number P.S. Хотя ... глянь здесь http://minecraft-ru.gamepedia.com/OpenComputers/Robot_API Хм, странно. Когда я тестил роботов недавно, у меня стояло только одно улучшение "инвентарь" (ибо в робота 1 лвл больше улучшений не смог установить, и всё при этом нормально работало. Робот мог как брать вещи, так и класть их в сундук. Многие функции робот может выполнять без лишних улучшений. Сложнее конечно, но всё же может. Я даже думал в ближайшее время библиотеку под робота написать. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 7 июля, 2016 Хм, странно. Когда я тестил роботов недавно, у меня стояло только одно улучшение "инвентарь" (ибо в робота 1 лвл больше улучшений не смог установить, и всё при этом нормально работало. Робот мог как брать вещи, так и класть их в сундук. Многие функции робот может выполнять без лишних улучшений. Сложнее конечно, но всё же может. Я даже думал в ближайшее время библиотеку под робота написать. А с внутренним инвентарём, как работал ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 7 июля, 2016 А с внутренним инвентарём, как работал ? suck и drop спокойно справляются с элементарными прогами, вот например как попытаться всё забрать из сундука: while robot.suck() do end С распознаванием предметов та же шляпа. Без геолайзера можно только сравнивать предметы, что может помочь в простых прогах, где например мы знаем что будет в инвентаре у робота, а чего точно не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 155 Опубликовано: 7 июля, 2016 Контроллер инвентаря нужен как минимум для перемещения предмета в слот инструмента (inventory_controller.equip()). Кроме того он позволяет не вытаскивать всё содержимое сундука, которое, кстати, может и не поместиться в инвентарь робота, в поисках нужного предмета, а проверить слоты сундука (inventory_controller.getStackInSlot(side,slot)) и взять из него нужный предмет (inventory_controller.suckFromSlot(side,slot,count)). 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 8 июля, 2016 (изменено) А теперь, подведем итог. Допустим, нам надо взять из сундука перед роботом железную кирку. local component = require("component") -- загружаем компоненты local robot = component.robot -- подключаем компонент робота local i_c = component.inventory_controller -- подключаем компонент контроллера local function finditem(side, name) -- функция поиска предмета в контейнере, первый параметр - сторона, второй - системное имя local inv, item = i_c.getInventorySize(side) -- узнаем количество слотов инвентаря if inv then -- если удалось узнать количество слотов for slot = 1, inv do -- в цикле проходим по всем слотам item = i_c.getStackInSlot(side, slot) -- получаем информацию о слоте if item and item.name == name then -- если имя предмета в слоте совпадает с нужным return slot -- возвращаем номер слота end end end return nil end local i = finditem(3, "minecraft:iron_pickaxe") -- ищем предмет в контейнере перед роботом if i then -- если предмет найден robot.select(1) -- выбираем первый слот робота i_c.suckFromSlot(3, i) -- берем предмет i_c.equip() -- переносим в слот для инструмента end Справка по сторонам - 1 = сверху, 0 = снизу, 3 = спереди. Функцией поиска можно найти любой предмет по системному имени, можно сделать, чтобы возвращалось и количество предметов в слоте. Класс. Красивый инструмент получился. Понятно даже, такому неумехе - как я. Можно ещё добавить принты, в функции поиска. Принтить причины невыполнения условий, типа : " Не найдено хранилище." и " Данный предмет отсутствует в хранилище." Изменено 8 июля, 2016 пользователем davial Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bugmenot 0 Опубликовано: 12 июля, 2016 (изменено) Приветствую. Дабы не создавать новую тему... У меня такой вопрос, можно ли как-то залезть в сундук, который перед роботом но на один блок ниже? Или, к примеру, можно как-то зажигалкой поджечь блок перед роботом? Изменено 13 июля, 2016 пользователем bugmenot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 12 июля, 2016 Приветствую. Дабы не создавать новую тему... У меня такой вопрос, можно ли как-то залезть в сундук, который перед роботом но на один блок ниже? Или, к примеру, можно как-то зажигалкой поджечь блок перед роботом? Поджечь, это ПКМ с зажигалкой. Даёшь ему в активный слот зажигалку и через команду robot.use() вроде бы он делает ПКМ этой зажигалкой или чем нибудь другим вроде гаечного ключа. Взаимодействовать робот может лишь с блоком перед собой, с блоком сверху и снизу. До остальных блоков нужно передвигаться. Не думаю, что это так сложно прописывать robot.up() и robot.down() чтобы подыматься и опускаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bugmenot 0 Опубликовано: 12 июля, 2016 (изменено) Поджечь, это ПКМ с зажигалкой. Даёшь ему в активный слот зажигалку и через команду robot.use() вроде бы он делает ПКМ этой зажигалкой или чем нибудь другим вроде гаечного ключа. Взаимодействовать робот может лишь с блоком перед собой, с блоком сверху и снизу. До остальных блоков нужно передвигаться. Не думаю, что это так сложно прописывать robot.up() и robot.down() чтобы подыматься и опускаться. Ну я бы не стал задавать такой вопрос, если бы не знал о базовых командах робота. Проблема не в передвижении, а во взаимодействии. Робот не поджигает блок перед ним через robot.use(), потому что перед ним по-сути воздух. Он должен как-то ткнуть блок впереди снизу... Тоже самое с сундуком. Представьте, что сундук утоплен в землю, в углу стены, единственная возможность подобраться к нему - это верх, НО, что если сверху какой-нибудь полублок, допустим, кнопка. Для игрока совершенно не составит труда открыть сундук. А вот как тут поступить с роботом, потому что кнопка для него помеха. Изменено 13 июля, 2016 пользователем bugmenot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 723 Опубликовано: 12 июля, 2016 (изменено) Ну я бы не стал задавать такой вопрос, если бы не знал о базовых командах робота. Проблема не в передвижении, а во взаимодействии. Робот не поджигает блок перед ним через robot.use(), потому что перед ним по-сути воздух. Он должен как-то ткнуть блок впереди снизу... Тоже самое с сундуком. Представьте, что сундук утоплен в землю, в углу стены, единственная возможность подобраться к нему - это верх, НО, что если сверху какой-нибудь полублок, допустим, кнопка. Для игрока совершенно не составит труда открыть сундук. А вот как тут поступить с роботом, потому что кнопка для него помеха. Попробуй robot.use(side.down) Только перед этом подключи библиотеку side. С сундуком та же история. Попробуй в аргументах функции указывать стороны как я показал. Изменено 12 июля, 2016 пользователем qwertyMAN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bugmenot 0 Опубликовано: 12 июля, 2016 (изменено) Попробуй robot.use(side.down) Только перед этом подключи библиотеку side. С сундуком та же история. Попробуй в аргументах функции указывать стороны как я показал. Прошу прощения с огнивом, я и забыл, что тут с заприваченой зоной у робота косяки, в одиночной игре через use все зажигается, а с сундуком вопрос все еще открыт. robot.suck(sides.bottom) и даун, и не даун уже пробовал и в других различных вариациях, ничего не выходит. Да и судя по API-Robot у suck() вообще не выбирается сторона блока... помимо up и down неплохо было бы и что-то типа по-диагонали. Изменено 12 июля, 2016 пользователем bugmenot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
davial 1 972 Опубликовано: 12 июля, 2016 ...помимо up и down неплохо было бы и что-то типа по-диагонали. По-диагонали ... Это к Сангару ... Разраб который. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
bugmenot 0 Опубликовано: 13 июля, 2016 По-диагонали ... Это к Сангару ... Разраб который. Ну, то понятно, что разработчик царь и бог. Но видимо есть какие-то причины, почему он не сделал какие-нибудь FrontUp, FrontDown. Одна из причин, что есть просто другой способ, чтобы так взаимодействовать с сундуком (о чем я и пришел сюда спросить), либо просто технически блок (в нашем случае робот) не может взаимодействовать с блоком, к которому не прилегает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 13 июля, 2016 (изменено) Сигнатура функции use: function(side:number[, face:number=side[, sneaky:boolean=false[, duration:number=0]]]):boolean, string -- Perform a 'right click' towards the specified side. The `face' allows a more precise click calibration, and is relative to the targeted blockspace.. (Требуется component.robot, не require("robot")!) Как видно, вторым аргументом является загадочный face, который принимает число и по умолчанию равняется стороне, куда кликаем. Насколько я могу судить, нужно вызвать component.robot.use(3, 0). P. S. Взаимодействовать с сундуком по-диагонали невозможно. Изменено 13 июля, 2016 пользователем Fingercomp 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Как мне брать что-либо из сундука?
Как мне положить предмет из инвентаря робота в слот для инструмента?
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах