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

Зарядка двух вещей

Вопрос

Простенькая прога в роботе которая юзает 2 предмета с энергией, т.е. один активный (пила) второй лежит в 16 слоте (мотыга роста(работает как костная мука)), не могу разобраться как заставить робота проверять колво энергии в обоих итемах и заставлять его заряжать каким либо способом (лазуротроновый кристалл заряжающий не работает), хелп!

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


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

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

  • 0

Только через внешний зарядник, с предметами робот не работает как игрок. Контейнеры предметные открывает только свои - сервера.

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


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

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

robot.durability()

Из кристалла увы и ах энергию не вытянуть роботу. И из ранца заряжающего, и из портативного аккумулятора любого типа. Даже генераторы специальные накачки не работают в роботах. Единственное что заряжается - инструмент из TConstruct-1.7.10 обмазанный мохом (автопочинка на свету).

Так что зарядка электроинструментов - только через внешнее оборудование. Попробуйте кстати затолкать инструмент в зарядку робота, там много чего заряжается, хотя крайне медленно и с дикими потерями.

Насчет магических вещей - по пределу укрепляйте и восстановление 1 вешайте, а в программе вешайте проверку целостности вещи. Как подберется к 3% лучше выплюнуть в сундук с отработавшим инструментом и взять новый. А потом игрок ручками, магией воскресит из ничего вещь.

Рекомендую так же почитать про контроллер инвентаря он вам сильно облегчит жизнь по поиску целых мотыг.

 

P.S. Да, я в курсе что инфа на том сайте уже сильно устарела, но для базовой работы новичку и этого будет за глаза

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


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

а заряд предмета в инвентаре?

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


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

а нет на примете программы с активным использованием этой библиотеки? мне проще учиться разбирая чужие коды

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


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

а нет на примете программы с активным использованием этой библиотеки?

это базовый функционал компонента "Контроллер инвентаря"

просто в любом месте программы в любое удобное время вызови проверку инструмента в инвентаре, как написал Асиор.
damage = component.inventory_controller.getStackInInternalSlot(номер слота).damage

и если он больше, например, 25 ед., выбрасывай его, или вези куда-то этот нано-лук на зарядку. Ну или чардж проверяй. Это уже как тебе удобнее. Только убедись для начала, что в слоте именно лук. Потому что если там будет уголь или яблоко, то такой вызов даст ошибку, потому что у яблока нет никакого дэмэджа и чарджа.


 

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


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

Нет, дамаг есть у абсолютно всех предметов, это метаданные. А вот заряд есть у предметов из модов, в разных модах он может отличаться, хотя в OC идет дело к унификации данных, но MC1.7.10 она не затрагивает.

У меня в дубокопе пока проверяется только ванильный дамаг, для электроинструментов он не очень точно работает, но свою функцию выполняет. А с инструментами Tinkers' Construct не работает вообще.

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


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

да точный дамаг и не нужен, робот стоит на месте и просто берет саженцы из сундука, так что заряжать можно и на 20 и на 30 и на 50 %

 

9 часов назад, Alex сказал:

damage = component.inventory_controller.getStackInInternalSlot(номер слота).damage

при вводе этой команды в луа робота, происходит ничего, ни ошибок, ни действий, единственное как у меня получилось проверить дамаг: 

local component = require("component")
local sides = require("sides")
 
local slot = 1
local item = component.inventory_controller.getStackInInternalSlot(1)
 
if item then
	print("Item name: ", item.name)
	print("Item count: ", item.size)
	print("Item damage: ", item.damage)
else
	print("Slot " .. slot .. " is empty")
end

 

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


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

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

так в интерпретаторе ничего и не должно происходить в этом конкретном случае. Мы просто переменной присвоили значение, как если бы мы написали a=2

Если хочешь прямо в интерпретаторе увидеть какое-то значение переменной, или значение поля damage и charge, то напиши так:

=a  или =component.inventory_controller.getStackInInternalSlot(номер слота).charge, можно знак равно и не писать, и нажми enter.

 

А для полноценной и автономной работы робота в общем и контроллера инвентаря в частности(будь это садилка, копалка или туамкрафт сапалка) нужно написать программу(скрипт на языке луа) и запустить ее. И уже в этой программе робот может бесконечно долго что-то садить, сапать, копать, куда-то кататься, проверять инструменты, заряжать их по мере надобности, менять их и выполнять любую другую логику, которая заложена в алгоритме твоей программы.

 

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


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

local r = require("robot")
local component = require("component")
local slot = 1
local item = component.inventory_controller.getStackInInternalSlot(slot)
local grab
local charge
local sides = require("sides")
io.write("Опять работа?\n")
io.write("Сколько рубить?: ")
count = io.read()
io.write("Ну, я пошел..\n")
for c = 1 , count do
  grab = true
  io.write("Нарубил дерьма " , c , " \n")
  r.select(2)
  r.turnRight()
  os.sleep(2)
  while(grab) do
  if (r.suck(1)) then
    grab = false
  else 
    io.write("Убей меня\n")
  end
      r.turnLeft()
  r.place()
  os.sleep(2)
  r.select(1)
  os.sleep(1)
  if item then  
    charge = component.inventory_controller.getStackInInternalSlot(1).charge 
    if (item.charge < 5001) then 
      print("****ская тяпка ломаеца")
      r.dropUp(1)
      os.sleep(15)
    end
  else
    print("Slot " .. slot .. " is empty")
  end
end    
    for i = 1,12 do
       r.place()
    end
    r.swing()
    for b = 2, 16 do
      r.select(b)
      r.dropUp()
    end
    os.sleep(5)
  end
io.write("Дело сделано\n")

 

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

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


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

я как на уроке информатики :D

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


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

local r = require("robot")
local component = require("component")
local slot = 1
local i_c = component.inventory_controller
local grab
local charge
local sides = require("sides")
io.write("Опять работа?\n")
io.write("Сколько рубить?: ")
count = io.read()
io.write("Ну, я пошел..\n")
for c = 1 , count do
  grab = true
  io.write("Нарубил дерьма " , c , " \n")
  r.select(2)
  r.turnRight()
  os.sleep(2)
  while(grab) do
    if (r.suck(1)) then
      grab = false
    else 
      io.write("Убей меня\n")
    end
    r.turnLeft()
    r.place()
    os.sleep(2)
    r.select(1)
    os.sleep(1)
    local item = i_c.getStackInInternalSlot(slot)
    if item then  
      charge = i_c.getStackInInternalSlot(1).charge 
      if (item.charge < 5001) then 
        print("****ская тяпка ломаеца")
        r.dropUp(1)
        os.sleep(15)
      end
    else
      print("Slot " .. slot .. " is empty")
    end
  end    
  for i = 1,12 do
    r.place()
  end
  r.swing()
  for b = 2, 16 do
    r.select(b)
    r.dropUp()
  end
  os.sleep(5)
end
io.write("Дело сделано\n")

 

немного поправил отступы кода. Проще контроллер объявить в начале, а потом через его ссылку получать доступ. Запоминает предмет? А ничего что он в самом начале его запоминает. Я в логику сильно не ударялся, просто переместил обновление item в цикл.

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


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

логики нет, в одиночке все работает, а там где играю, нет, так что приходится через трубы и големов половину делать

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
20 часов назад, EFL сказал:

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

А с чего ей забиваться? Чтоб забить память надо или данные с геосканера пачками хранить или обработку массивов делать. В твоем случае идет тупо перезапись нескольких переменных.

Не работает на сервере? Стандартная ситуация, впиши робота в приват, как это делать уточняй на том серваке где играешь. Ну или попробуй его заюзать за приватом.

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


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

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

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

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

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

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

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

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

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


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