OpenComputers/Robot API
Этот программный интерфейс доступен только тогда, когда исполняющий компьютер является роботом.

## Общие функции

`robot.level(): number`


Получает текущий уровень робота. Дробная часть обозначает текущий прогресс до следующего уровня. Например, если это число `1.5`

, робот имеет уровень 1, и на 50% достиг второго уровня.

**Внимание**: начиная с версии **1.3** функция устарела. Используйте `component.experience.level()`

, поскольку робот получает очки опыта, только при наличии апгрейда на опыт.

`robot.name(): string`


Получает название робота.



## Работа с блоками

`robot.detect(): boolean, string`


Проверяет, есть ли что-нибудь перед роботом. Возвращает `true`

если что-то может препятствовать движению робота, `false`

в противном случае. Второе возвращаемое значение определяет что именно находится перед роботом. Это может быть `entity`

, `solid`

, `replaceable`

, `liquid`

или `air`

. Первые два могут блокировать робота, остальные — нет. В случае `entity`

это может быть как животным или мобом, так и игроком или вагонеткой.

*Примечание*: для того чтобы получить более подробную информацию (ID, метаданные) о блоке, вы можете использовать функцию `analyze()`

геосканера.

`robot.detectUp(): boolean, string`


Аналогично `robot.detect()`

, только проверяет блок над роботом.

`robot.detectDown(): boolean, string`


Аналогично `robot.detect()`

, только проверяет блок под роботом.



`robot.swing([side: number]): boolean[, string]`


Производит "левый щелчок мыши" роботом, используя при этом экипированный инструмент. Результат зависит от инструмента и того, какой блок располагается перед роботом. Возвращает `true`

и дескриптор, если был обработан какой-то блок, либо `false`

и возможную причину в случае неудачи.

Параметр `side`

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

Возвращаемая строка может быть одной из следующих:

`entity`

— если робот атаковал живое существо


`block`

— если робот сломал блок


`fire`

— если робот потушил огонь


`air`

— если перед роботом ничего не было


`robot.swingUp([side: number]): boolean[, string]`


Аналогично `robot.swing()`

, но работает с блоком над роботом.

`robot.swingDown([side: number]): boolean[, string]`


Аналогично `robot.swing()`

, но работает с блоком под роботом.



`robot.use([side: number[, sneaky: boolean[, duration: number]]]): boolean[, string]`


Делает "правый щелчок мыши" роботом, используя экипированный инструмент. Результат зависит от инструмента и блока перед роботом.
Возвращает `true`

в случае успеха, либо `false`

в случае неудачи.

Параметр `side`

определяет сторону, куда направлено действие. Если параметр опущен, робот попробует воздействовать на все стороны. Это позволяет точнее контролировать действие, если необходимо. К примеру — сторону в которую полетит стрела, если использовать лук.

Параметр `sneaky`

определяет "присел" ли робот (для игрока — клавиша `⇧ Shift`), совершая действие. Это необходимо, к примеру, если робот пытается разместить блок на устройстве, которое по "правому щелчку" открывает свой интерфейс.

Параметр `duration`

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

Возвращаемое значение может быть:

`block_activated`

— если блок перед роботом был активирован (например — рычаг)


`item_placed`

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


`item_used`

— если экипированный инструмент был использован непосредственно (например — робот выстрелил из лука)


`air`

— если ничего нельзя использовать в выбранном направлении, или экипированный инструмент нельзя использовать сам по себе


`robot.useUp([side: number[, sneaky: boolean[, duration: number]]]): boolean[, string]`


Аналогично `robot.use()`

, но работает с блоком над роботом.

`robot.useDown([side: number[, sneaky: boolean[, duration: number]]]): boolean[, string]`


Аналогично `robot.use()`

, но работает с блоком под роботом.



## Работа с инвентарем

`robot.durability(): number or nil, string`


Если робот имеет инструмент, функция возвращает состояние этого инструмента. Возможные значение: 0 - сломан, 1 - цел.

Если робот не имеет инструмента, или инструмент не может быть сломан, функция возвратит `nil`

и соответствующую строку: `no tool equipped`

или `tool cannot be damaged`

.

`robot.inventorySize(): number`


Возвращает внутренний размер инвентаря.

`robot.select([slot: number]): number`


Делает активным слот инвентаря с заданным индексом. Индекс — число в интервале от 1 до N, где N — число слотов (зависит от количества апгрейдов на инвентарь). Нумерация начинается в левом верхнем углу, и идет слева направо и сверху вниз. Таким образом левый верхний слот имеет номер 1, верхний правый — 4, левый нижний — 13, правый нижний — 16. Создает ошибку, если введен неверный индекс. Возвращаемое значение — номер выбранного слота. Функция может использоваться без аргументов, для получения номера активного слота.

`robot.count([slot: number]): number`


Возвращает количество предметов в заданном слоте. Если номер слота не задан, возвращает количество предметов в активном слоте.

`robot.space([slot: number]): number`


Возвращает количество предметов которое может еще поместиться в заданный слот. Это число зависит от типа предметов, которые уже находятся в слоте. (К примеру, ведра складываются в стеки только по 16. Если в слоте уже есть два ведра, функция вернет число 14.) Если слот не задан, функция работает с активным слотом.

`robot.compareTo(slot: number): boolean`


Сравнивает предметы в заданном и активном слотах. Если предметы одинаковы (количество предметов в слотах не имеет значение) — возвращает `true`

. Иначе — `false`

.

`robot.transferTo(slot: number[, count: number]): boolean`


Перемещает предметы из активного слота в заданный. Если определен параметр `count`

, функция перемещает заданное количество предметов. Возвращает `true`

, если был перемещен хотя бы один предмет, и `false`

— если ни одного.

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



`robot.compare(): boolean`


Сравнивает предмет в заданном слоте и блок перед роботом. Если блок эквивалентен предмету в слоте — возвращает `true`

. Иначе — `false`

.

`robot.compareUp(): boolean`


Аналогично `robot.compare()`

, но сравнивает с блоком над роботом.

`robot.compareDown(): boolean`


Аналогично `robot.compare()`

, но сравнивает с блоком под роботом.



`robot.drop([count: number]): boolean`


Выбрасывает предмет из активного слота. `count`

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

, если один или больше предмет был выброшен. Иначе — `false`

. Если инвентарь (сундук) полон, функция вернет `false`

и предметы выброшены не будут.

Также функция работает для вагонеток с сундуками и вагонеток с воронками.

`robot.dropUp([count: number]): boolean`


Аналогично `robot.drop()`

, но работает с блоком над роботом.

`robot.dropDown([count: number]): boolean`


Аналогично `robot.drop()`

, но работает с блоком под роботом.



`robot.place([side: number[, sneaky: boolean]]): boolean`


Помещает блок из активного слота перед роботом. Возвращает `true`

в случае успеха, иначе — `false`

. Параметр `side`

определяет сторону на которую будет помещен блок. Если параметр опущен, робот попробует все поверхности. Это позволяет точнее ставить блоки, которые имеют ориентацию. (Например — факел. Значение `5`

или `sides.left`

позволит разместить факел на стене слева.) Параметр `sneaky`

определяет "присел" (для игрока — клавиша `⇧ Shift`) ли робот когда ставил блок. Это необходимо для некоторых модов.

**Важно**: по умолчанию, робот не может ставить блок в воздухе без опоры (как и игрок). В пространстве перед роботом должна быть хотя бы одна "стенка". Если вы хотите, чтобы роботы могли ставить блоки в воздухе (как черепашки из ComputerCraft) установите роботу апгрейд-"ангел".

`robot.placeUp([side: number[, sneaky: boolean]]): boolean`


Аналогично `robot.place()`

, но работает с блоком над роботом.

`robot.placeDown([side: number[, sneaky: boolean]]): boolean`


Аналогично `robot.place()`

, но работает с блоком под роботом.



`robot.suck([count: number]): boolean`


Захватывает максимум один стек предметов в активный слот, или первый свободный слот после активного. Возвращает `true`

если захватил один или больше предметов, иначе — `false`

. Если перед роботом находится блок с инвентарем (например — сундук), робот попытается забрать предметы из него. Параметр `count`

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

Если перед роботом нет инвентаря, он попытается подобрать предмет "с земли". В этом случае параметр `count`

будет проигнорирован.

`robot.suckUp([count: number]): boolean`


Аналогично `robot.suck()`

, но работает с блоком над роботом.

`robot.suckDown([count: number]): boolean`


Аналогично `robot.suck()`

, но работает с блоком под роботом.



## Работа с внутренними цистернами

`robot.tankCount():number`


Возвращает число внутренних цистерн робота.

`robot.selectTank(tank)`


Выбирает одну из цистерн активной.

`robot.tankLevel([tank:number]):number`


Возвращает уровень жидкости в заданной (а если параметр не указан — в активной) цистерне.

`robot.tankSpace([tank:number]):number`


Возвращает объем свободного пространства в заданной (а если параметр не указан — в активной) цистерне.

`robot.compareFluidTo(tank:number):boolean`


Сравнивает жидкости в активной и указанной параметром цистернах.

`robot.transferFluidTo(tank:number[, count:number]):boolean`


Перемещает указанное количество жидкости из активной цистерны в заданную. Если количество не указано — перемещает 1000 mB (1 ведро).

`robot.compareFluid():boolean`


Сравнивает жидкость в активной цистерне с жидкостью перед роботом (или в хранилище перед роботом).

`robot.compareFluidUp():boolean`


Аналогично `compareFluid()`

, но сравнивает с жидкостью над роботом.

`robot.compareFluidDown():boolean`


Аналогично `compareFluid()`

, но сравнивает с жидкостью под роботом.

`robot.drain([count:number]):boolean`


Закачивает жидкость из блока перед роботом в активную внутреннюю цистерну. Если объем не указан, закачивает 1000 mB (1 ведро).

`robot.drainUp([count:number]):boolean`


Аналогично `drain()`

, но закачивает жидкость над роботом.

`robot.drainDown([count:number]):boolean`


Аналогично `drain()`

, но закачивает жидкость под роботом.

`robot.fill([count:number]):boolean`


Выкачивает жидкость из активного внутреннего хранилища в блок перед роботом. Если объем не указан, выкачивает 1000 mB (1 ведро).

`robot.fillUp([count:number]):boolean`


Аналогично `fill()`

, но выкачивает жидкость в пространство над роботом.

`robot.fillDown([count:number]):boolean`


Аналогично `fill()`

, но выливает жидкость в пространство под роботом.



## Движение робота

`robot.forward(): boolean[, string]`


Робот делает попытку двигаться вперед на один блок. Возвращает `true`

в случае успеха. Иначе — `nil`

и возможную причину — в противном случае. Причина — одна из строк функции `robot.detect()`

.

`robot.back(): boolean[, string]`


Аналогично `robot.forward()`

, но двигает робота на один блок назад.

`robot.up(): boolean[, string]`


Аналогично `robot.forward()`

, но двигает робота на один блок вверх.

`robot.down(): boolean[, string]`


Аналогично `robot.forward()`

, но двигает робота на один блок вниз.

`robot.turnLeft()`


Поворачивает робота на 90° влево.

`robot.turnRight()`


Поворачивает робота на 90° вправо.

`robot.turnAround()`


Поворачивает робота на 180°.