Перейти к публикации
Aizark

Анализ блока перед роботом

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

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

 

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

 

Натолкнулся на то, что для анализа блока, получения айди или похожей информации нужно использовать функцию analyze() геоанализатора.
Как я понял Геонализатор надо вложить в робота при сборке.

 

Но как пользоваться analyze() ?

 

Банальный пример:
Условие - если перед роботом блок грязи, то снести блок. 

 

Видел я примерно это так:

local robot = require("robot")
local comp = require("computer")


if analyze() == 3 then
robot.swing()

end
 
Конечно это не работает, он выдает ошибку.
Прошу помощи, с правкой примера выше, что бы он ломал только если перед ним блок грязи. Благодарю.
 
Ссылка на вики:
 
Ссылка на статью c небольшой инфой:
Изменено пользователем Aizark

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


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

В самом начале можно зайти в интерпретатор луа чтобы попробовать части кода вживую, не создавая отдельную программу (запустить его можно введя lua в шелле, т.е. в самом начале, а выйти из него сочетанием ctrl+c). Тебя интересует что возвращает функция analyze()
 
Mtip6K2.png
 
 
видим что она возвращает таблицу с ключами color, hardness, harvestLevel, metadata, name. Тебя интересует name, так как он указывает на название блока перед роботом. Теперь к программе
геоанализатор это компонент, поэтому сверху в программе делаешь

local component = require("component") 

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

local geo = component.geolyzer 

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

local t = geo.analyze(3)
local block = t.name
if block == "minecraft:dirt" then
   -- перед роботом земля
else if block == "minecraft:air" then
   -- перед роботом воздух
else
   -- перед роботом что-то другое
end

или, если короче

if geo.analyze(3).name == "minecraft:dirt"
   -- перед роботом земля
end

но я не очень понял зачем тебе нужно знать, что именно находится перед роботом. Геоанализатор тратит немало энергии на каждое сканирование. У робота есть дешевый метод component.robot.detect(3) который возвращает true если перед роботом что-то стоит, а еще есть камера из computronics которая может измерить расстояние до ближайшего блока по линии вперед. А еще component.robot.move(3) возвращает true если удалось пойти вперед

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


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

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

Чуть позже я поработаю с выше написанным. Может замучу гайд.

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


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

Узнавать потребовалось, для того, что бы создать бесконечные цыклы, до остановки. Из за багов мода, при отгрузке или загрузке чанка, робот может не сделать нужные шаги, и уперется в стену. Я делаю лесоруба для плантации  в 6 блоков. Блоками я хочу заставить его понимать его положение на плантации и передвигаться основываясь на блоках что рядом с ним. Он не может через обычный детект понять что за блок перед ним, срабать его и двигаться, или пора уже подняться на пару блоков вверх что бы срубить верхушки деревьев

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


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

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

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


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

О, пойду погуглю навигацию, может тогда что получиться. Спасибо.

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


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

Посмотрел. Как я вижу он возвращает 3 цифры. xyz. 
В каком формате это можно словить и сравнить на том же примере "If"

 

local robot = require("robot")
local comp = require("computer")


if getPosition() == 1, 0, 30 then
robot.swing()

end

Я правильно понимаю?. Еще как я понл. там где мы создали карту, там будут координаты у робота 0, 0, "высота"

Хотя полюбому программа не поймет запятую. А возращает три переменных. Как с этим быть. Еще не проверял. Посути то я буду знать куда будет ходить робот и где ему надо повернутся и что сделать. Другой вопрос что без помощи и опытных подсказок будет сделать сложно. Заранее спасибо.

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


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

не забудь сверху дописать

local component = require("component") 

и позицию узнавать функцией

component.navigation.getPosition()

(потому что навигация - это компонент)
 
иначе просто getPosition будет ссылаться на несуществующую функцию
 
 
самый простой пример условия if
 

local x, y, z = component.navigation.getPosition()

x = math.floor(x)
y = math.floor(y)
z = math.floor(z)

if x == 1 and y == 0 and z == 30 then
    -- робот на координатах 1 0 30
end

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

 

 

да, 0,0,0 будет там, где была создана карта. Еще улучшение "навигация" можно вставлять в слот для апгрейдов робота (чтобы можно было его доставать, не разбирая самого робота), тогда его можно будет перекрафтить с новой картой и вставить обратно

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


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

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

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


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

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

Поставил на свой же уровень земли, на котором стоял я. 
Записал программу. Стоит в апгрейдах навигация.

local robot = require("robot")
local component = require("component")

local x, y, z = component.navigation.getPosition()

x = math.floor(x)
y = math.floor(y)
z = math.floor(z)

if x == 0 and y == 0 and z == 7 then
robot.place()

end

В итоге выдает ошибку.

 

4fZ9gvO78KY.jpg

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


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

приложи скриншот ошибки

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


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

так вон же, приложен. Он написал что не так. Или там какой либо надо дебаг писать что бы он показал более подробно?

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


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

а, вижу, скриншот с вк не грузился, и у меня было пустое место, подумал что там ничего нет
 
Судя по ошибке, переменной component на 4-й строчке не существует, хотя такого не может быть, т.к. значение ей присвоено на второй. Проверь правильность написания скрипта, перепиши его заново и запусти программу снова. Можешь еще в интерпретаторе луа выполнить строчку за строчкой чтобы убедиться что все работает (только в таком случае не используй модификатор local). Если не получится то напиши мне в дискорде, зайду на сервер гляну в чем дело

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


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

Да вопросов больше и больше. Я отправил запрос с ником Тень.

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×