VoxelEngine/doc/ru/scripting.md
2024-07-14 13:26:57 +03:00

20 KiB
Raw Blame History

Скриптинг

В качестве языка сценариев используется LuaJIT

Подразделы:

require "контентпак:имя_модуля" -- загружает lua модуль из папки modules (расширение не указывается)

Библиотека pack

pack.is_installed(packid: str) -> bool

Проверяет наличие установленного пака в мире

pack.data_file(packid: str, filename: str) -> str

Возвращает путь к файлу данных по типу: world:data/packid/filename и создает недостающие директории в пути.

Используйте эту функцию при сохранении настроек пака или иных данных в мире.

Пример:

file.write(pack.data_file(PACK_ID, "example.txt"), text)

Для пака containermod запишет текст в файл world:data/containermod/example.txt

Библиотека player

player.get_pos(playerid: int) -> number, number, number

Возвращает x, y, z координаты игрока

player.set_pos(playerid: int, x: number, y: number, z: number)

Устанавливает x, y, z координаты игрока

player.get_rot(playerid: int) -> number, number, number

Возвращает x, y, z вращения камеры (в радианах)

player.set_rot(playerid: int, x: number, y: number, z: number)

Устанавливает x, y вращения камеры (в радианах)

player.get_inventory(playerid: int) -> int, int

Возвращает id инвентаря игрока и индекс выбранного слота (от 0 до 9)

player.is_flight() -> bool
player.set_flight(bool)

Геттер и сеттер режима полета

player.is_noclip() -> bool
player.set_noclip(bool)

Геттер и сеттер noclip режима (выключенная коллизия игрока)

player.set_spawnpoint(playerid: int, x: number, y: number, z: number) 
player.get_spawnpoint(playerid: int) -> number, number, number

Сеттер и геттер точки спавна игрока

player.get_selected_block(playerid: int) -> x,y,z

Возвращает координаты выделенного блока, либо nil

player.get_selected_entity(playerid: int) -> int

Возвращает уникальный идентификатор сущности, на которую нацелен игрок

player.get_entity(playerid: int) -> int

Возвращает уникальный идентификатор сущности игрока

Библиотека world

world.get_list() -> массив таблиц {
	name: str,
	icon: str
}

Возвращает информацию о мирах: название и предпросмотр (автоматически загружаемая текстура).

world.get_day_time() -> number

Возвращает текущее игровое время от 0.0 до 1.0, где 0.0 и 1.0 - полночь, 0.5 - полдень.

world.set_day_time(time: number)

Устанавливает указанное игровое время.

world.set_day_time_speed(value: number)

Устанавливает указанную скорость для игрового времени.

world.get_day_time_speed() -> number

Возвращает скорость для игрового времени.

world.get_total_time() -> number

Возвращает общее суммарное время, прошедшее в мире

world.get_seed() -> int

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

world.exists() -> bool

Проверяет существование мира по имени.

world.is_day() -> bool

Проверяет является ли текущее время днём. От 0.2(8 утра) до 0.8(8 вечера)

world.is_night() -> bool

Проверяет является ли текущее время ночью. От 0.8(8 вечера) до 0.2(8 утра)

Библиотека pack

pack.get_folder(packid: str) -> str

Возвращает путь к папке установленного контент-пака.

pack.is_installed(packid: str) -> bool

Проверяет наличие контент-пака в мире

pack.get_installed() -> массив строк

Возращает id всех установленных в мире контент-паков.

pack.get_available() -> массив строк

Возвращает id всех доступных, но не установленных в мире контент-паков.

pack.get_base_packs() -> массив строк

Возвращает id всех базовых паков (неудаляемых)

pack.get_info(packid: str) -> {
	id: str,
	title: str,
	creator: str,
	description: str,
	version: str,
	icon: str,
	dependencies: опциональный массив строк
}

Возвращает информацию о паке (не обязательно установленном).

  • icon - название текстуры предпросмотра (загружается автоматически)
  • dependencies - строки в формате {lvl}{id}, где lvl:
    • ! - required
    • ? - optional
    • ~ - weak например !teal

Библиотека gui

Библиотека содержит функции для доступа к свойствам UI элементов. Вместо gui следует использовать объектную обертку, предоставляющую доступ к свойствам через мета-методы __index, __newindex:

print(document.some_button.text) -- где 'some_button' - id элемета
document.some_button.text = "новый текст"

В скрипте макета layouts/файл_макета.xml - layouts/файл_макета.xml.lua уже доступна переменная document содержащая объект класса Document

gui.str(text: str, context: str) -> str

Возращает переведенный текст.

gui.get_viewport() -> {int, int}

Возвращает размер главного контейнера (окна).

gui.get_env(document: str) -> table

Возвращает окружение (таблица глобальных переменных) указанного документа.

get_locales_info() -> таблица таблиц где
   ключ - id локали в формате isolangcode_ISOCOUNTRYCODE
   значение - таблица {
	   name: str # название локали на её языке
   }

Возвращает информацию о всех загруженных локалях (res/texts/*).

Библиотека inventory

Библиотека функций для работы с инвентарем.

inventory.get(invid: int, slot: int) -> int, int

Принимает id инвентаря и индекс слота. Возвращает id предмета и его количество. id = 0 (core:empty) обозначает, что слот пуст.

inventory.set(invid: int, slot: int, itemid: int, count: int)

Устанавливает содержимое слота.

inventory.size(invid: int) -> int

Возращает размер инвентаря (число слотов). Если указанного инвентаря не существует, бросает исключение.

inventory.add(invid: int, itemid: int, count: int) -> int

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

inventory.get_block(x: int, y: int, z: int) -> int

Функция возвращает id инвентаря указанного блока. Если блок не может иметь инвентарь - возвращает 0.

inventory.bind_block(invid: int, x: int, y: int, z: int)

Привязывает указанный инвентарь к блоку.

inventory.unbind_block(x: int, y: int, z: int)

Отвязывает инвентарь от блока.

Warning

Инвентари, не привязанные ни к одному из блоков, удаляются при выходе из мира.

inventory.clone(invid: int) -> int

Создает копию инвентаря и возвращает id копии. Если копируемого инвентаря не существует, возвращает 0.

inventory.move(invA: int, slotA: int, invB: int, slotB: int)

Перемещает предмет из slotA инвентаря invA в slotB инвентаря invB. invA и invB могут указывать на один инвентарь. slotB будет выбран автоматически, если не указывать явно.

Библиотека block

block.name(blockid: int) -> str

Возвращает строковый id блока по его числовому id.

block.index(name: str) -> int

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

block.material(blockid: int) -> str

Возвращает id материала блока.

block.caption(blockid: int) -> str

Возвращает название блока, отображаемое в интерфейсе.

block.get(x: int, y: int, z: int) -> int

Возвращает числовой id блока на указанных координатах. Если чанк на указанных координатах не загружен, возвращает -1.

block.get_states(x: int, y: int, z: int) -> int

Возвращает состояние (поворот + доп. информация) в виде целого числа

block.set(x: int, y: int, z: int, id: int, states: int)

Устанавливает блок с заданным числовым id и состоянием (0 - по-умолчанию) на заданных координатах.

Warning

block.set не вызывает событие on_placed.

block.is_solid_at(x: int, y: int, z: int) -> bool

Проверяет, является ли блок на указанных координатах полным

block.is_replaceable_at(x: int, y: int, z: int) -> bool

Проверяет, можно ли на заданных координатах поставить блок (примеры: воздух, трава, цветы, вода)

block.defs_count() -> int

Возвращает количество id доступных в движке блоков

block.get_picking_item(id: int) -> int

Возвращает числовой id предмета, указанного в свойстве picking-item.

block.raycast(start: vec3, dir: vec3, max_distance: number, [опционально] dest: table) -> {
    block: int, -- id блока
    endpoint: vec3, -- точка касания луча
    iendpoint: vec3, -- позиция блока, которого касается луч
    length: number, -- длина луча
    normal: vec3 -- вектор нормали поверхности, которой касается луч
} или nil

Бросает луч из точки start в направлении dir. Max_distance указывает максимальную длину луча.

Функция возвращает таблицу с результатами или nil, если луч не касается блока.

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

Вращение

Следующие функции используется для учёта вращения блока при обращении к соседним блокам или других целей, где направление блока имеет решающее значение.

-- Возвращает целочисленный единичный вектор X блока на указанных координатах с учётом его вращения (три целых числа).
-- Если поворот отсутствует, возвращает 1, 0, 0
block.get_X(x: int, y: int, z: int) -> int, int, int

-- То же, но для оси Y (по-умолчанию 0, 1, 0)
block.get_Y(x: int, y: int, z: int) -> int, int, int

-- То же, но для оси Z (по-умолчанию 0, 0, 1)
block.get_Z(x: int, y: int, z: int) -> int, int, int

-- Возвращает индекс поворота блока в его профиле вращения (не превышает 7).
block.get_rotation(x: int, y: int, z: int) -> int

-- Устанавливает вращение блока по индексу в его профиле вращения.
block.set_rotation(x: int, y: int, z: int, rotation: int)

-- Возвращает имя профиля вращения (none/pane/pipe)
block.get_rotation_profile(id: int) -> str

Расширенные блоки

Расширенные блоки - те, размер которых превышает 1x1x1

block.is_extended(id: int) -> bool

Проверяет, является ли блок расширенным.

block.get_size(id: int) -> int, int, int

Возвращает размер блока.

block.is_segment(x: int, y: int, z: int) -> bool

Проверяет является ли блок сегментом расширенного блока, не являющимся главным.

block.seek_origin(x: int, y: int, z: int) -> int, int, int

Возвращает позицию главного сегмента расширенного блока или исходную позицию, если блок не являющийся расширенным.

Пользовательские биты

Выделенная под использования в скриптах часть поля voxel.states хранящего доп-информацию о вокселе, такую как вращение блока. На данный момент выделенная часть составляет 8 бит.

block.get_user_bits(x: int, y: int, z: int, offset: int, bits: int) -> int

Возвращает выбранное число бит с указанного смещения в виде целого беззнакового числа

block.set_user_bits(x: int, y: int, z: int, offset: int, bits: int, value: int) -> int

Записывает указанное число бит значения value в user bits по выбранному смещению

Физика

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

-- Возвращает массив из двух векторов (массивов из 3 чисел):
-- 1. Минимальная точка хитбокса
-- 2. Размер хитбокса
-- rotation_index - индекс поворота блока
block.get_hitbox(id: int, rotation_index: int) -> {vec3, vec3}

Модель

Информация о модели блока.

-- возвращает тип модели блока (block/aabb/custom/...)
block.get_model(id: int) -> str

-- возвращает массив из 6 текстур, назначенных на стороны блока
block.get_textures(id: int) -> таблица строк

Библиотека item

item.name(itemid: int) -> str

Возвращает строковый id предмета по его числовому id (как block.name)

item.index(name: str) -> int

Возвращает числовой id предмета по строковому id (как block_index)

item.stack_size(itemid: int) -> int

Возвращает максимальный размер стопки для предмета.

item.defs_count() -> int

Возвращает общее число доступных предметов (включая сгенерированные)

item.icon(itemid: int) -> str

Возвращает имя иконки предмета для использования в свойстве 'src' элемента image

Библиотека hud

hud.open_inventory()

Открывает инвентарь

hud.close_inventory()

Закрывает инвентарь

hud.open_block(x: int, y: int, z: int) -> int, str

Открывает инвентарь и UI блока. Если блок не имеет макета UI - бросается исключение.

Возвращает id инвентаря блока (при "inventory-size"=0 создаётся виртуальный инвентарь, который удаляется после закрытия), и id макета UI.

hud.show_overlay(layoutid: str, playerinv: bool)

Показывает элемент в режиме оверлея. Также показывает инвентарь игрока, если playerinv - true

Note

Одновременно может быть открыт только один блок

hud.open_permanent(layoutid: str)

Добавляет постоянный элемент на экран. Элемент не удаляется при закрытии инвентаря. Чтобы не перекрывать затенение в режиме инвентаря нужно установить z-index элемента меньшим чем -1. В случае тега inventory, произойдет привязка слотов к инвентарю игрока.

hud.close(layoutid: str)

Удаляет элемент с экрана.

hud.get_block_inventory() -> int

Дает ID инвентаря открытого блока или 0.

hud.get_player() -> int

Дает ID игрока, к которому привязан пользовательский интерфейс.

hud.pause()

Открывает меню паузы.

hud.resume()

Закрывает меню паузы.

hud.is_paused() -> bool

Возвращает true если открыто меню паузы.

hud.is_inventory_open() -> bool

Возвращает true если открыт инвентарь или оверлей.

Библиотека time

time.uptime() -> float

Возвращает время с момента запуска движка в секундах.

time.delta() -> float

Возвращает дельту времени (время прошедшее с предыдущего кадра)