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

Гайд по геосканеру

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

Как пользоваться функцией scan?
Итак, в этой функции можно задать два параметра, это относительные координаты по горизонтали (относительно блока геосканера/планшета или робота с геосканером), возвращаемое значение - таблица. Таблица содержит список плотностей блоков по вертикали.

Чем дальше по вертикали находится блок (относительно геосканера), тем больше помех дает геосканер. Уровень помех можно настроить в конфиге мода.

Ну тут вроде-как все понятно, разберемся с вертикальными координатами.
При сканировании, геосканер возвращает таблицу, которая представляет собой столб из блоков. Кроме плотности ничего узнать нельзя.
Возьмем, к примеру, scan(0, 0) это будет столб, выстой 64 блока, в котором находится устройство (геосканер/робот/планшет)
В стандартнои конфиге радиус действия геосканера = 32 блока, следовательно можно просканировать кубоид 65x65x64 блока.
Геосканер у нас находится на уровне 33 (индекс таблицы), на этом уровне при сканировании устройстрво почти не дает шумов, т. е. по горизонтали можно легко узнать истинную плотность блока.

Индексы в таблице возрастают с высотой, т. е. блок с индексом 1 это -32 блок относительно устройства, 2 это -31 ... 33 это 0 и т. д.

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

scan(1, 0) это столб на один блок на восток от устройства, следовательно, scan(-1, 0) - на запад.
scan(0, 1) это южный столб, scan(0, -1) - северный.


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

local tbl = {}

for x = -32, 32 do
  for y = -32, 32 do
    if not tbl[x] then
      tbl[x] = {}
    end
    tbl[x][y] = geolyzer.scan(x, y)
  end
end

Он у нас будет сканировать с северо-запада на юго-восток, т. е. будет захватывать всю доступную зону.

К примеру, нам надо сканировать определенный квадрат, стоящий по-диагонали от геосканера, обозначим их вот так: NE - северо-восточный, NW - северо-западный, SE - юго-восточный, SW - юго-западный.
 

local function scan(d, r) -- направление, дальность
  if d == 'NE' then
    x1, x2, y1, y2 = 1, r, -r, -1
  elseif d == 'NW' then
    x1, x2, y1, y2 = -r, -1, -r, -1
  elseif d == 'SE' then
    x1, x2, y1, y2 = 1, r, 1, r
  elseif d == 'SW' then
    x1, x2, y1, y2 = -r, -1, 1, r
  end
  for x = x1, x2 do
    for y = y1, y2 do
      geolyzer.scan(x, y) -- тут должна быть фунция обработки или сохранения результатов сканирования
    end
  end
end

Чтобы просканировать квадрат со стороной 20 блоков, находящийся на юго-восток от геосканера надо запустить scan('SE', 20)
Вроде-бы все очевидно.

Функция analyze() намного проще, она возвращает таблицу с информацией о блоке, стоящем вплотную к устройству. Индексы таблицы не числовые, например, чтобы узнать плотность блока вводим analyze(сторона).hardness
Чтобы задать сторону можно использовать sides API, либо просто задать цифрой.

 

 

...Будет дополняться...

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

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


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

После обновы OC 1.6 расширился функционал геосканера.
Теперь, помимо обычного сканирования вертикальных столбов появилась возможность сканировать произвольный кубоид, содержащий не более 64х блоков (т. к. функция в любом случае возвращает таблицу из 64х элементов)

scan(x, z[, y, w, d, h][, игнорировать_замещаемые])
Если задать только x, z, то геосканер будет работать в обычном режиме. А при добавлении y, необходимо указать ширину, длину и высоту кубоида, соответственно: w, d, h. Т. е. первые три значения это стартовые координаты, откуда начинать сканирование, а дальше его размеры. Четвертое значение это указатель, приравнивать ли замещаемые блоки (трава, саженцы и т. д.) к воздуху.

Возвращаемые значения приходят в не очень удобном формате. Чтобы отобразить отсканированный объем в одномерной таблице, сканирование происходит в виде трех циклов, один в другом: for x(for z(for y()))
Т. е. сначала идет заполнение по x, потом по z, потом по y. (Запад->Восток, Север->Юг, Низ->Верх)

К примеру, надо просканировать куб x2, где какой блок будет отображен в таблице?
Зададим область сканирования: scan(0, 0, 0, 2, 2, 2) - точкой старта будет блок геосканера, точка финиша в относительных координатах 1, 1, 1
Сначала у нас идет x, следовательно, первый элемент таблицы - плотность самого геосканера (0, 0, 0), второй элемент - блок на восток от сканера (1, 0, 0). Далее у нас идет второй блок по z, следовательно это южный блок (0, 1, 0), затем - юго-восток (1, 1, 0). Второй блок по оси y - (0, 0, 1) и т. д.
Следовательно, таблица у нас будет выглядеть так:

[1] = 0, 0, 0
[2] = 1, 0, 0
[3] = 0, 1, 0
[4] = 1, 1, 0
[5] = 0, 0, 1
[6] = 1, 0, 1
[7] = 0, 1, 1
[8] = 1, 1, 1

Остальные элементы можно отбросить, т. к. это шум.

В голове это держать может быть неудобно. Поэтому, напишем функцию, через которую можно будет задать кубоид и координаты блока, а она выдаст позицию в таблице, где указана плотность этого блока.

local function tblpos(x, z, y, w, d, h, tx, tz, ty) -- первые 6 значений это то, что мы задаем геосканеру, tx, ty, tz = координаты искомго блока
  local p = 1 -- создаем счетчик
  local xmax, zmax, ymax = x + w - 1, z + d - 1, y + h - 1 -- преобразуем размеры кубоида в финишные координаты
  for y1 = y, ymax do
    for z1 = z, zmax do
      for x1 = x, xmax do
        if x1 == tx and z1 == tz and y1 == ty then -- если счетчик допрыгал до искомых координат
          return p -- возвращаем позицию
        end
        p = p + 1
      end
    end
  end
end

Например, зададим тот же кубоид и узнаем позицию блока, с координатами 1, 1, 1
pos = tblpos(0, 0, 0, 2, 2, 2, 1, 1, 1)
pos станет равно 8
Чтобы проверить плотность этого блока, обратимся к таблице
print(geolyzer.scan(0, 0, 0, 2, 2, 2)[pos])
Либо, более наглядно - print(geolyzer.scan(0, 0, 0, 2, 2, 2)[tblpos(0, 0, 0, 2, 2, 2, 1, 1, 1)])

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

Чтобы узнать плотность блока в определенных координатах, достаточно сделать так:
scan(x, z, y, 1, 1, 1)[1]
Т. е. задаем координаты блока, указываем размер кубоида 1x1x1 блок и сразу обращаемся к первому элементу таблицы.

Стоит помнить, что при одном сканировании доступно только 64 блока, т. е. можно просканировать куб x4, либо квадрат x8, думаю, это понятно.
Вот примеры:
scan(-32, -32, -32, 4, 4, 4)
scan(5, 5, 5, 1, 8, 8)
scan(-32, 0, 0, 64, 1, 1)

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

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


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

Недавнo завезли нескoлькo нoвых функций.

canSeeSky():boolean - вoзвращает true, если виднo небo. Прoзрачные блoки, стекла, крoвати не мешают, а ступеньки и пoлублoки считаются непрoзрачными.

 

detect(стoрoна:number):boolean, string - кoпия функции component.robot, прoверяет наличие блoка с указаннoй стoрoны. Вoзмoжные варианты выдачи:
(false, 'air') - пустo, блoк вoздуха.
(false, 'replaceable') - есть блoк, кoтoрый мoжнo сдвинуть этo цветы, трава, лианы (пoка неизвестнo, как будет пoсле апдейта MC1.14). В приватах мoжнo считать за true, т. к. рoбoтoм лoмаются тoлькo кактусы.
(false, 'liquid') - блoк жидкoсти, текущая жидкoсть
(true, 'solid') - есть твердый блoк.
(true, 'entity') - какая-тo сущнoсть.
(true, 'passable') - блoк, через кoтoрый мoжет хoдить сущнoсть - флаг, кувшинка, паутина, пoртал и т. п. Некoтoрые блoки имеют нескoлькo сoстoяний, например, дверь и люк в oбoих solid, а вoрoта тoлькo закрытые.

 

store(стoрoна:number, адрес_БД:string, слoт_БД:number):boolean - сoхранить блoк с указаннoй стoрoны в базу данных.

 

isSunVisible():boolean - вoзвращает true, если пoгoда ясная, вo время дoждя или грoзы - false

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

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


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

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

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

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


×