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

Робот и сундук

Вопрос

Как можно заставить робота выкладывать в сундук спереди определённый лут?
Допустим у робота в первом слоте алмаз, во втором слоте редстон, а в третьем слоте лежил изумруд

мне нужно выложить из робота алмаз
Как без использования select(номер слота) дать возможность роботу выкладывать алмаз в определённый слот сундука?

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


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

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

22 часа назад, _bongo_ сказал:

Как без использования select(номер слота) дать возможность роботу выкладывать алмаз в определённый слот сундука?

Плохо понимаю вопрос. Как одно связано с другим?

 

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

inventory_controller.dropIntoSlot(side:number, slot:number[, count:number])

А если задача состоит в том, чтобы никогда не использовать robot.select, то потребуется организовать процесс таким образом, чтобы нужный предмет всегда находился в первом слоте внутреннего инвентаря робота.

 

Кстати, а какова причина отказа от robot.select? Существует какая-то практическая цель такого ограничения, или это чисто теоретический интерес?

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, eu_tomat сказал:

Кстати, а какова причина отказа от robot.select?

Мне нужно чтобы робот выбрал нужный мне предмет без robot.select, а по id предмета и метаданным
( у меня всё плохо с объяснениями )

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

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


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, _bongo_ сказал:

Мне нужно чтобы робот выбрал нужный мне предмет без robot.select, а по id предмета и метаданным

Что значит, выбрать нужный предмет? Робот может выбрать слот, содержащий нужный предмет — это мне понятно. Я представляю действие, которое стоит за этим, там зелёненький курсор перемещается в нужный слот. Но как должен выглядеть выбор предмета без выбора содержащего его слота?

 

И почему именно без robot.select? Какова цель всего этого?

 

11 минуту назад, _bongo_ сказал:

у меня всё плохо с объяснениями

Постарайся сделать хорошо. Иначе с ответами тоже будет плохо.

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


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

Нужно чтобы из инвентаря робота выбор предметов осуществлялся по id и метаданным

javaw_nr0qOvUoUo.png

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


Ссылка на сообщение
Поделиться на других сайтах
14 минуты назад, _bongo_ сказал:

Нужно чтобы из инвентаря робота выбор предметов осуществлялся по id и метаданным

Это я понял. Но почему без испольозвания robot.select?

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


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

я рандомно закладываю компоненты реактора в робота, а он сам по нужным местам раскладывает 

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


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

@_bongo_ Ты специально что ли не отвечаешь на мой вопрос?

 

Я задал его три раза:

2 часа назад, eu_tomat сказал:

Кстати, а какова причина отказа от robot.select? Существует какая-то практическая цель такого ограничения, или это чисто теоретический интерес?

25 минут назад, eu_tomat сказал:

И почему именно без robot.select? Какова цель всего этого?

14 минуты назад, eu_tomat сказал:

Но почему без испольозвания robot.select?

Но ты отвечаешь мне что угодно: какую-то общеизвестную информацию про метаданые, про рандомные компоненты реактора.

 

Я спрошу иначе и последний раз. Если не хочешь, не отвечай, я тоже не буду пытаться понять.

Что плохого случится при использовании robot.select?

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


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

Я уже ответил, я не хочу чтобы мне приходилось вводить точный номер слота для выбора предмета, я хочу чтобы робот сам искал нужные вещи по id и делал с ними то что я хочу

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

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


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

Может и с помощью robot.select это можно как-то сделать
но я без понятия как

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


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, _bongo_ сказал:

Может и с помощью robot.select это можно как-то сделать
но я без понятия как

Вот оно что, значит! С этого и надо было начинать, а не повторять в каждом сообщении, что надо как-то обойтись без robot.select. Зачем морочить голову себе и другим?

 

Тогда задача упрощается: с помощью контроллера инвентаря запрашиваем информацию о предметах в каждом из слотов робота. Анализируем информацию. Если обнаружили нужный компонент реактора, то выбираем нужный слот робота, и с помощью контроллера инвентаря переносим предмет в нужный слот реактора. Для этого потребуется:

  • inventory_controller.getStackInInternalSlot(slot:number) для получения информации о предмете.
  • robot.select(slot:number) для выбора этого слота
  • inventory_controller.dropIntoSlot(side:number, slot:number[, count:number]) для перемещения предмета из текущего слота в нужный слот реактора.

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


Ссылка на сообщение
Поделиться на других сайтах
14 часа назад, eu_tomat сказал:

inventory_controller.getStackInInternalSlot(slot:number) для получения информации о предмете

image.png.93e0040098ed4284ee298ce34e569497.pngimage.png.905331727c597bddec886d20b543be8c.png

В слотах 1-7 находятся одинаковые теплоотводы, но они под разными...( что это ) 

Скорее всего я чего-то не понимаю, но как сделать нормальный вывод информации о предмете?
не судите строго мой код, я новичок в луа

Скрытый текст

 

local component = require "component"
local inv = component.inventory_controller
local rob = require "robot"

print("Слотов в роботе: ",rob.inventorySize())

for i = 1 , rob.inventorySize(), 1 do
print("слот",i," ",inv.getStackInInternalSlot(i))
if inv.getStackInInternalSlot(i) == 0x7efff97d9b210 then
rob.select(i)
inv.dropIntoSlot(i,7)
end
end

 

 и по возможности укажите на мои ошибки

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


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, _bongo_ сказал:

В слотах 1-7 находятся одинаковые теплоотводы, но они под разными...( что это )

Это разные таблицы. Посмотреть их содержимое можно, например, так:

for k,v in pairs(tbl) do
  print(k,v)
end

 

3 часа назад, _bongo_ сказал:

по возможности укажите на мои ошибки

  • if inv.getStackInInternalSlot(i) == 0x7efff97d9b210 then Этот код работать не будет. Во-первых, при каждом запуске программы адреса таблиц будут новыми. Во-вторых, сравнение таблиц по их адресам в большинстве случаев не имеет смысла, т.к. в первую очередь нас интересует содержимое таблиц, а не их адреса.
  • Желательно максимально отказаться от дублирования тяжёлых вычисления или длительных запросов. getStackInInternalSlot работает медленнно. И совершая этот запрос по два раза, мы в два раза замедляем работу программу.
  • inv.dropIntoSlot(i,7) Тут аргументы набросаны как попало. Первым аргументом должна быть указана сторона робота, с которой относительно его находится реактор. А тут зачем-то указан номер внутреннего слота робота.

Код можно написать, например, таким образом:

for i = 1, rob.inventorySize() do
  stack = inv.getStackInInternalSlot(i))
  if stack.name == "IC2:reactorVentDiamond" and stack.damage==1
    rob.select(i)
    inv.dropIntoSlot(3,i)
  end
end 

В поле stack.damage хранятся метаданные или износ предмета. Применительно к теплоотводам — их температура, поэтому часть проверки можно выбросить. Достаточно проверять их по имени.

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


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

А как stack может быть IC2:reactorVentDiamond
Если он берёт в себя getStackInInternalSlot(i)

Я сделал print(stack), и там опять эта ссылка

image.png.4e79ae447ef762ae3144039d37ecea8b.png
Или я опять туплю

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, _bongo_ сказал:

Я сделал print(stack), и там опять эта ссылка

print(stack.name)   .name - это индекс в таблице

пример как разобрать таблицу дали выше

for k,v in pairs(stack) do
  print(k,v)
end

также можно получить значения с помощью команды, один это номер слота

lua

=component.inventory_controller.getStackInInternalSlot(1)

или добавим .name

=component.inventory_controller.getStackInInternalSlot(1).name

 

можно скопировать код и вставить его в компик нажав на колёсико мыши (СКМ)

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

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


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

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

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

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

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

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

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

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

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


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