Перейти к содержимому
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

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


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

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

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

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

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

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

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

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

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


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