Перейти к содержимому
  • 0
Arseniy10

Как взять из сундука и положить в слот инструмента

Вопрос

Как мне брать что-либо из сундука?

Как мне положить предмет из инвентаря робота в слот для инструмента?

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


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

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

  • 0

А теперь, подведем итог. Допустим, нам надо взять из сундука перед роботом железную кирку.

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 = спереди.

Функцией поиска можно найти любой предмет по системному имени, можно сделать, чтобы возвращалось и количество предметов в слоте.

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


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

Как мне брать что-либо из сундука?

Как мне положить предмет из инвентаря робота в слот для инструмента?

   В роботе должны быть установлены 2 улучшения : инвентарь и контроллер инвентаря.

   Взять предмет с сундука - robot.suck([count: number]): boolean

   Сделать активным слот - robot.select([slot: number]): number

 

P.S. Хотя ... глянь здесь http://minecraft-ru.gamepedia.com/OpenComputers/Robot_API

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


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

   В роботе должны быть установлены 2 улучшения : инвентарь и контроллер инвентаря.

   Взять предмет с сундука - robot.suck([count: number]): boolean

   Сделать активным слот - robot.select([slot: number]): number

 

P.S. Хотя ... глянь здесь http://minecraft-ru.gamepedia.com/OpenComputers/Robot_API

Хм, странно. Когда я тестил роботов недавно, у меня стояло только одно улучшение "инвентарь" (ибо в робота 1 лвл больше улучшений не смог установить, и всё при этом нормально работало. Робот мог как брать вещи, так и класть их в сундук.

 

Многие функции робот может выполнять без лишних улучшений. Сложнее конечно, но всё же может.

Я даже думал в ближайшее время библиотеку под робота написать.

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


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

Хм, странно. Когда я тестил роботов недавно, у меня стояло только одно улучшение "инвентарь" (ибо в робота 1 лвл больше улучшений не смог установить, и всё при этом нормально работало. Робот мог как брать вещи, так и класть их в сундук.

 

Многие функции робот может выполнять без лишних улучшений. Сложнее конечно, но всё же может.

Я даже думал в ближайшее время библиотеку под робота написать.

А с внутренним инвентарём, как работал ?

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


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

А с внутренним инвентарём, как работал ?

suck и drop спокойно справляются с элементарными прогами, вот например как попытаться всё забрать из сундука:

while robot.suck() do end

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

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


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

Контроллер инвентаря нужен как минимум для перемещения предмета в слот инструмента (inventory_controller.equip()).

Кроме того он позволяет не вытаскивать всё содержимое сундука, которое, кстати, может и не поместиться в инвентарь робота, в поисках нужного предмета, а проверить слоты сундука (inventory_controller.getStackInSlot(side,slot)) и взять из него нужный предмет (inventory_controller.suckFromSlot(side,slot,count)).

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


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

 

 

А теперь, подведем итог. Допустим, нам надо взять из сундука перед роботом железную кирку.

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 = спереди.

Функцией поиска можно найти любой предмет по системному имени, можно сделать, чтобы возвращалось и количество предметов в слоте.

 

 

Класс. Красивый инструмент получился. Понятно даже, такому неумехе - как я. :)

Можно ещё добавить принты, в функции поиска. Принтить причины невыполнения условий, типа : " Не найдено хранилище." и " Данный предмет отсутствует в хранилище."

Изменено пользователем davial

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


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

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

Изменено пользователем bugmenot

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


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

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

Поджечь, это ПКМ с зажигалкой. Даёшь ему в активный слот зажигалку и через команду robot.use() вроде бы он делает ПКМ этой зажигалкой или чем нибудь другим вроде гаечного ключа.

Взаимодействовать робот может лишь с блоком перед собой, с блоком сверху и снизу. До остальных блоков нужно передвигаться. Не думаю, что это так сложно прописывать robot.up() и robot.down() чтобы подыматься и опускаться.

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


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

Поджечь, это ПКМ с зажигалкой. Даёшь ему в активный слот зажигалку и через команду robot.use() вроде бы он делает ПКМ этой зажигалкой или чем нибудь другим вроде гаечного ключа.

Взаимодействовать робот может лишь с блоком перед собой, с блоком сверху и снизу. До остальных блоков нужно передвигаться. Не думаю, что это так сложно прописывать robot.up() и robot.down() чтобы подыматься и опускаться.

Ну я бы не стал задавать такой вопрос, если бы не знал о базовых командах робота. Проблема не в передвижении, а во взаимодействии. Робот не поджигает блок перед ним через robot.use(), потому что перед ним по-сути воздух. Он должен как-то ткнуть блок впереди снизу... Тоже самое с сундуком. Представьте, что сундук утоплен в землю, в углу стены, единственная возможность подобраться к нему - это верх, НО, что если сверху какой-нибудь полублок, допустим, кнопка. Для игрока совершенно не составит труда открыть сундук. А вот как тут поступить с роботом, потому что кнопка для него помеха.

Изменено пользователем bugmenot

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


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

Ну я бы не стал задавать такой вопрос, если бы не знал о базовых командах робота. Проблема не в передвижении, а во взаимодействии. Робот не поджигает блок перед ним через robot.use(), потому что перед ним по-сути воздух. Он должен как-то ткнуть блок впереди снизу... Тоже самое с сундуком. Представьте, что сундук утоплен в землю, в углу стены, единственная возможность подобраться к нему - это верх, НО, что если сверху какой-нибудь полублок, допустим, кнопка. Для игрока совершенно не составит труда открыть сундук. А вот как тут поступить с роботом, потому что кнопка для него помеха.

Попробуй robot.use(side.down) Только перед этом подключи библиотеку side. С сундуком та же история. Попробуй в аргументах функции указывать стороны как я показал.

Изменено пользователем qwertyMAN

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


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

Попробуй robot.use(side.down) Только перед этом подключи библиотеку side. С сундуком та же история. Попробуй в аргументах функции указывать стороны как я показал.

 

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

 

robot.suck(sides.bottom) и даун, и не даун уже пробовал и в других различных вариациях, ничего не выходит. Да и судя по API-Robot у suck() вообще не выбирается сторона блока... помимо up и down неплохо было бы и что-то типа по-диагонали.

Изменено пользователем bugmenot

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


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

...помимо up и down неплохо было бы и что-то типа по-диагонали.

 

По-диагонали ... Это к Сангару ... Разраб который. :)

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


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

По-диагонали ... Это к Сангару ... Разраб который. :)

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

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


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

Сигнатура функции 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. Взаимодействовать с сундуком по-диагонали невозможно.

Изменено пользователем Fingercomp

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...