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

Питание инструмента в роботе

Вопрос

Здравствуйте, вот например в роботе лежит бур из IC2, по программе робот им копает => бур разряжается. Как можно его зарядить не доставая?

Ах да, и ещё один вопрос. Как можно переименовать робота? 

P.s робот стоит на месте и никуда не двигается.

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

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


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

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

Ну через самого же робота можно заряжать , если робот будет выкладывать бур например в МФСУ, через компонент контроллер инвентаря.

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


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

Бур - в заряднике из ОС

Лучше через МФСУ

 

Ну через самого же робота можно заряжать , если робот будет выкладывать бур например в МФСУ, через компонент контроллер инвентаря.

Но как сделать проверку на кол-во энергии? Я не шарю

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

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


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

Смотри через durabiliti предмета.

 

 

Но как сделать проверку на кол-во энергии? Я не шарю

Вики в помощь и гайды на ютубе. 

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

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


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

Смотри через durabiliti предмета.

 

 

Вики в помощь и гайды на ютубе. 

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

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


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

Но как сделать проверку на кол-во энергии? Я не шарю

Например, так:

--Программа выполняет зарядку инструмента в руке робота, зарядник спереди.
local sides = require "sides"
local robot = require "robot"
local component = require "component"
local inv = component.inventory_controller

-- в какой стороне от робота находится зарядник (front, left, right, down, up)
local CHARGER_SIDE = sides.front -- спереди
-- слот в котором будет заряжаться инструмент (слот 1 подходит для зарядников OC/IC2)
local CHARGER_SLOT = 1 

function charge_tool()
  -- перемещаем инструмент из руки в инвентарь (equip() меняет местами содержимое текущего слота и руки)
  inv.equip()
  -- получаем информацию об инструменте в текущем слоте
  local tool = inv.getStackInInternalSlot(robot.select())
  -- перемещаем инструмент в зарядник
  inv.dropIntoSlot(CHARGER_SIDE, CHARGER_SLOT)
  -- зарядка инструмента
  while inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT).charge < tool.maxCharge do
    os.sleep(10)
  end
  -- забираем инструмент из зарядника
  inv.suckFromSlot(CHARGER_SIDE, CHARGER_SLOT)
  -- перемещаем инструмент обратно в руку робота
  inv.equip()
end

-- зарядка потребуется при понижении прочности инструмента ниже этого значения
-- для электроинструмента прочность соответствует его заряду (1 - полный заряд, 0 - разряжен)
local TOOL_MIN_ENERGY = 0.3

function check_tool_energy()
  -- проверяем нужно ли зарядить инструмент
  if robot.durability() < TOOL_MIN_ENERGY then
    -- ставим зарядник или возвращаемся на базу к установленному заряднику
    -- ...
    -- заряжаем инструмент
    charge_tool()
    -- возвращаемся к прерванной работе
    -- ...
  end
end

check_tool_energy()
Программа выполняет зарядку инструмента в руке робота, зарядник спереди.

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


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

Например, так:

--Программа выполняет зарядку инструмента в руке робота, зарядник спереди.
local sides = require "sides"
local robot = require "robot"
local component = require "component"
local inv = component.inventory_controller

-- в какой стороне от робота находится зарядник (front, left, right, down, up)
local CHARGER_SIDE = sides.front -- спереди
-- слот в котором будет заряжаться инструмент (слот 1 подходит для зарядников OC/IC2)
local CHARGER_SLOT = 1 

function charge_tool()
  -- перемещаем инструмент из руки в инвентарь (equip() меняет местами содержимое текущего слота и руки)
  inv.equip()
  -- получаем информацию об инструменте в текущем слоте
  local tool = inv.getStackInInternalSlot(robot.select())
  -- перемещаем инструмент в зарядник
  inv.dropIntoSlot(CHARGER_SIDE, CHARGER_SLOT)
  -- зарядка инструмента
  while inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT).charge < tool.maxCharge do
    os.sleep(10)
  end
  -- забираем инструмент из зарядника
  inv.suckFromSlot(CHARGER_SIDE, CHARGER_SLOT)
  -- перемещаем инструмент обратно в руку робота
  inv.equip()
end

-- зарядка потребуется при понижении прочности инструмента ниже этого значения
-- для электроинструмента прочность соответствует его заряду (1 - полный заряд, 0 - разряжен)
local TOOL_MIN_ENERGY = 0.3

function check_tool_energy()
  -- проверяем нужно ли зарядить инструмент
  if robot.durability() < TOOL_MIN_ENERGY then
    -- ставим зарядник или возвращаемся на базу к установленному заряднику
    -- ...
    -- заряжаем инструмент
    charge_tool()
    -- возвращаемся к прерванной работе
    -- ...
  end
end

check_tool_energy()
[spoiler] 
Программа выполняет зарядку инструмента в руке робота, зарядник спереди.

 

Cпасибо что откликнулся. Но есть пару пробем. У меня стоит зарядник справа, я указываю в исходнике right и при запуске выдаёт 2 ошибки функции. А так же например из робота (всё что в нём от 1 слота до N) импортируется в МЭ систему (AE2), а из неё в сундук. А когда бур кладётся в первый слот, то бур попадает в МЭ систему, а из неё в сундук. Можно ли сделать, чтобы он сразу из активного слота клал в зарядник?

А да, можешь как-нибудь засунуть это:

   local robot = require("robot")
while true do
   robot.swing()
end

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

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

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


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

А так же например из робота (всё что в нём от 1 слота до N) импортируется в МЭ систему (AE2), а из неё в сундук. А когда бур кладётся в первый слот, то бур попадает в МЭ систему, а из неё в сундук.

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

Можно ли сделать, чтобы он сразу из активного слота клал в зарядник?

equip() - это единственный способ доступа к инструменту робота.

А да, можешь как-нибудь засунуть это в свой исходник?

    -- ...
    while true do
       check_tool_energy()
       robot.swing()
    end

У меня стоит зарядник справа, я указываю в исходнике right и при запуске выдаёт 2 ошибки функции.

Какие ошибки?

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


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

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

Да сама, ну тогда ты прав, надо сделать чтобы с задней стороны весь(корме бура) инвентарь робота скидывался в сундук.

 

 

Какие ошибки?

 

 

1TLjMvdl6sQ.jpg

 

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


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

Да сама, ну тогда ты прав, надо сделать чтобы с задней стороны весь(корме бура) инвентарь робота скидывался в сундук.

 

 

1TLjMvdl6sQ.jpg

 

Робот должен повернуться в нужную сторону. Оказывается, доступны только стороны front, up, down. Изменено пользователем vx13

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


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

Робот должен повернуться в нужную сторону. Оказывается, доступны только стороны front, up, down.

Когда робот кладёт бур в зарядник, программа крашится.

7uui1u5FsVE.jpg

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


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

Такая ошибка может возникнуть в строке

while inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT).charge < tool.maxCharge do

если в слоте зарядника не будет предмета, inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT) вернёт nil.

Робот смог положить бур в зарядник или он остался в инвентаре? Если не смог, то зарядник стоит не с той стороны. (Можно проверить смог ли робот положить бур в зарядник - dropIntoSlot() возвращает true в случае успеха.)

Забирать бур из зарядника во время зарядки нельзя.

 

 

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


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

Такая ошибка может возникнуть в строке

while inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT).charge < tool.maxCharge do

если в слоте зарядника не будет предмета, inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT) вернёт nil.

Робот смог положить бур в зарядник или он остался в инвентаре? Если не смог, то зарядник стоит не с той стороны. (Можно проверить смог ли робот положить бур в зарядник - dropIntoSlot() возвращает true в случае успеха.)

Забирать бур из зарядника во время зарядки нельзя.

Смог

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


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

Если игрок заберет из зарядника инструмент, программа упадет.

Поэтому, надо проверять наличие инструмента в слоте или забирать из зарядника.

local component = require('component')
local computer = require('computer')
local i_c = component.inventory_controller
local robot = component.robot
local i_size = 1 -- количество слотов у зарядника, чтобы не путать с другими блоками

local function charge()
  local st = nil
  for d = 1, 4 do -- найти сторону с зарядником
    if i_c.getInventorySize(3) and i_c.getInventorySize(3) == i_size then -- проверить размер инвентаря
      while not st do
        if robot.durability() ~= 1 then -- если не заряжен
          i_c.equip() robot.drop(3) -- скинуть в зарядник
          os.sleep(10) -- подождать
          robot.suck(3) i_c.equip() -- взять из зарядника
        else -- иначе
          st = true -- остановить цикл
        end
      end
      break
    end
    robot.turn(true)
  end
end

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

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


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

Вариант с доп. проверками. Выводит сообщения об ошибках.

 

 

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

-- в какой стороне от робота находится зарядник (front, down, up)
local CHARGER_SIDE = sides.front -- спереди
-- слот в котором будет заряжаться инструмент (слот 1 подходит для зарядников OC/IC2)
local CHARGER_SLOT = 1 

function charge_tool()
  -- перемещаем инструмент из руки в инвентарь (equip() меняет местами содержимое текущего слота и руки)
  inv.equip()
  -- получаем информацию об инструменте в текущем слоте
  local tool = inv.getStackInInternalSlot(robot.select())
  if tool == nil then
    print("Нет инструмента")
    os.exit(1)
  elseif tool.maxCharge == nil then
    print("Инструмент нельзя зарядить")
    os.exit(1)
  end
  -- перемещаем инструмент в зарядник
  if not inv.dropIntoSlot(CHARGER_SIDE, CHARGER_SLOT) then
    print("Не удалось положить инструмент в зарядник")
    os.exit(1)
  end
  -- зарядка инструмента
  while true do
    local tool = inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT)
    if not tool then
      print("В заряднике нет инструмента")
    else
      if tool.charge >= tool.maxCharge then
        break
      end
    end
    os.sleep(1)
  end
  -- забираем инструмент из зарядника
  if not inv.suckFromSlot(CHARGER_SIDE, CHARGER_SLOT) then
    print("Не удалось забрать инструмент из зарядника")
    os.exit(1)
  end
  -- перемещаем инструмент обратно в руку робота
  inv.equip()
end

-- зарядка потребуется при понижении прочности инструмента ниже этого значения
-- для электроинструмента прочность соответствует его заряду (1 - полный заряд, 0 - разряжен)
local TOOL_MIN_ENERGY = 0.3

function check_tool_energy()
  -- проверяем нужно ли зарядить инструмент (если он есть и может терять прочность)
  local d = robot.durability()
  if d and (d < TOOL_MIN_ENERGY) then
    -- ставим зарядник или возвращаемся на базу к установленному заряднику
    -- ...
    -- заряжаем инструмент
    charge_tool()
    -- возвращаемся к прерванной работе
    -- ...
  end
end

check_tool_energy()
 

 

 

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


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

Если игрок заберет из зарядника инструмент, программа упадет.

Поэтому, надо проверять наличие инструмента в слоте или забирать из зарядника.

local component = require('component')
local computer = require('computer')
local i_c = component.inventory_controller
local robot = component.robot
local i_size = 1 -- количество слотов у зарядника, чтобы не путать с другими блоками
 
local function charge()
  local st = nil
  for d = 1, 4 do -- найти сторону с зарядником
    if i_c.getInventorySize(3) and i_c.getInventorySize(3) == i_size then -- проверить размер инвентаря
      while not st do
        if robot.durability() ~= 1 then -- если не заряжен
          i_c.equip() robot.drop(3) -- скинуть в зарядник
          os.sleep(10) -- подождать
          robot.suck(3) i_c.equip() -- взять из зарядника
        else -- иначе
          st = true -- остановить цикл
        end
      end
      break
    end
    robot.turn(true)
  end
end
Если вынуть инструмент, то робот будет и дальше пытаться его достать, пока не получит полностью заряженным.

 

Я вот пытаюсь вснуть цикл robot.swing() в твой скрипт и у меня выходит, помоги пожалуйста :(

 

Вариант с доп. проверками. Выводит сообщения об ошибках.

 

 

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

-- в какой стороне от робота находится зарядник (front, down, up)
local CHARGER_SIDE = sides.front -- спереди
-- слот в котором будет заряжаться инструмент (слот 1 подходит для зарядников OC/IC2)
local CHARGER_SLOT = 1 

function charge_tool()
  -- перемещаем инструмент из руки в инвентарь (equip() меняет местами содержимое текущего слота и руки)
  inv.equip()
  -- получаем информацию об инструменте в текущем слоте
  local tool = inv.getStackInInternalSlot(robot.select())
  if tool == nil then
    print("Нет инструмента")
    os.exit(1)
  elseif tool.maxCharge == nil then
    print("Инструмент нельзя зарядить")
    os.exit(1)
  end
  -- перемещаем инструмент в зарядник
  if not inv.dropIntoSlot(CHARGER_SIDE, CHARGER_SLOT) then
    print("Не удалось положить инструмент в зарядник")
    os.exit(1)
  end
  -- зарядка инструмента
  while true do
    local tool = inv.getStackInSlot(CHARGER_SIDE, CHARGER_SLOT)
    if not tool then
      print("В заряднике нет инструмента")
    else
      if tool.charge >= tool.maxCharge then
        break
      end
    end
    os.sleep(1)
  end
  -- забираем инструмент из зарядника
  if not inv.suckFromSlot(CHARGER_SIDE, CHARGER_SLOT) then
    print("Не удалось забрать инструмент из зарядника")
    os.exit(1)
  end
  -- перемещаем инструмент обратно в руку робота
  inv.equip()
end

-- зарядка потребуется при понижении прочности инструмента ниже этого значения
-- для электроинструмента прочность соответствует его заряду (1 - полный заряд, 0 - разряжен)
local TOOL_MIN_ENERGY = 0.3

function check_tool_energy()
  -- проверяем нужно ли зарядить инструмент (если он есть и может терять прочность)
  local d = robot.durability()
  if d and (d < TOOL_MIN_ENERGY) then
    -- ставим зарядник или возвращаемся на базу к установленному заряднику
    -- ...
    -- заряжаем инструмент
    charge_tool()
    -- возвращаемся к прерванной работе
    -- ...
  end
end

check_tool_energy()
 

 

 

Когда бур разряжается и робот его кладёт в зарядник, выдаёт ошибку "Не удалось забрать инструмент из зарядника".

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

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


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

Я как понимаю он пытается доставить бур из зарядника из OC? А я его тестирую с МФСУ... Да, конечно можно и в заряднике, но он очень долго заряжает его. Можно как-нибудь с МФСУ провернуть? 

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

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


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

Я как понимаю он пытается доставить бур из зарядника из OC? А я его тестирую с МФСУ... Да, конечно можно и в заряднике, но он очень долго заряжает его. Можно как-нибудь с МФСУ провернуть?

У зардника OC и МФСУ для зарядки используется слот 1.

 

Я не понимаю, почему у тебя не работает.

 

Попробуй запустить код из предыдущего поста на полигоне:

 

 

Стоит МФСУ. Рядом робот, мордой в МФСУ. В руке робота бур.

tjU1xIniSgo.jpg

CZoID54aJ6I.jpg

 

 

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


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

У зардника OC и МФСУ для зарядки используется слот 1.

 

Я не понимаю, почему у тебя не работает.

 

Попробуй запустить код из предыдущего поста на полигоне:

 

 

Стоит МФСУ. Рядом робот, мордой в МФСУ. В руке робота бур.

tjU1xIniSgo.jpg

CZoID54aJ6I.jpg

 

 

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

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


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

Действительно, робот не может забрать предмет из МФСУ, если МФСУ над роботом.

Почему так, я не знаю. suckFromSlot возвращает false без сообщения об ошибке.

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


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

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

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

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

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

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

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

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

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


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