VoxelEngine/doc/ru/8.Скриптинг.md
2024-03-20 10:18:08 +03:00

17 KiB
Raw Blame History

Скриптинг

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

Функции, доступные в скриптах

load_script("контентпак:scripts/имя_скрипта.lua") -- загружает скрипт, если ещё не загружен
load_script("контентпак:scripts/имя_скрипта.lua", true) -- перезагружает скрипт
require "контентпак:имя_модуля" -- загружает lua модуль из папки modules (расширение не указывается)

Библиотека 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

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

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

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

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

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

Библиотека world

world.get_day_time() -> number

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

world.set_day_time(time: number)

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

world.get_total_time() -> number

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

world.get_seed() -> int

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

Библиотека gui

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

local inventory_doc = Document.new("id-макета")
print(inventory_doc.some_button.text)
indentory_doc.some_button.text = "new text"

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

Библиотека 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.

Библиотека block

block.name(blockid: int) -> str

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

block.index(name: str) -> int

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

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_X(x: int, y: int, z: int) -> int, int, int

Возвращает целочисленный единичный вектор X блока на указанных координатах с учётом его вращения (три целых числа). Если поворот отсутствует, возвращает 1, 0, 0

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

Возвращает целочисленный единичный вектор Y блока на указанных координатах с учётом его вращения (три целых числа). Если поворот отсутствует, возвращает 0, 1, 0

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

Возвращает целочисленный единичный вектор Z блока на указанных координатах с учётом его вращения (три целых числа). Если поворот отсутствует, возвращает 0, 0, 1

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

Возвращает индекс поворота блока в его профиле вращения.

block.set_rotation(x: int, y: int, z: int, rotation: 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 по выбранному смещению

Библиотека 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

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

Библиотека 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)

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

События блоков

function on_placed(x, y, z, playerid)

Вызывается после установки блока игроком

function on_broken(x, y, z, playerid)

Вызывается после разрушения блока игроком

function on_interact(x, y, z, playerid) -> bool

Вызывается при нажатии на блок ПКМ. Предотвращает установку блоков, если возвращает true

function on_update(x, y, z)

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

function on_random_update(x, y, z)

Вызывается в случайные моменты времени (рост травы на блоках земли)

function on_blocks_tick(tps: int)

Вызывается tps (20) раз в секунду

События предметов

function on_use(playerid: int)

Вызывается при нажатии ПКМ не на блок.

function on_use_on_block(x: int, y: int, z: int, playerid: int)

Вызывается при нажатии ПКМ на блок. Предотвращает установку блока, прописанного в placing-block если возвращает true

function on_block_break_by(x: int, y: int, z: int, playerid: int)

Вызывается при нажатии ЛКМ на блок (в т.ч неразрушимый). Предотвращает разрушение блока, если возвращает true

События мира

События мира для контент-пака прописываются в scripts/world.lua

function on_world_open()

Вызывается при загрузке мира

function on_world_save()

Вызывается перед сохранением мира

function on_world_tick()

Вызывается 20 раз в секунду

function on_world_quit()

Вызывается при выходе из мира (после сохранения)

События макета

События прописываются в файле layouts/имя_макета.xml.lua.

function on_open(invid: int, x: int, y: int, z: int)

Вызывается при добавлении элемента на экран. При отсутствии привязки к инвентарю invid будет равен 0. При отсутствии привязки к блоку x, y, z так же будут равны 0.

function on_close(invid: int)

Вызывается при удалении элемента с экрана.

События HUD

События связанные с игровым интерфейсом прописываются в файле scripts/hud.lua

function on_hud_open(playerid: int)

Вызывается после входа в мир, когда становится доступна библиотека hud. Здесь на экран добавляются постоянные элементы.

function on_hud_close(playerid: int)

Вызывается при выходе из мира, перед его сохранением.

Библиотеки движка

file

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

file.resolve(путь: str) -> str

Функция приводит запись точкахода:путь (например user:worlds/house1) к обычному пути. (например C://Users/user/.voxeng/worlds/house1)

Note

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

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

file.read(путь: str) -> str

Читает весь текстовый файл и возвращает в виде строки

file.read_bytes(путь: str) -> array of integers

Читает файл в массив байт.

file.write(путь: str, текст: str) -> nil

Записывает текст в файл (с перезаписью)

file.write_bytes(путь: str, data: array of integers)

Записывает массив байт в файл (с перезаписью)

file.length(путь: str) -> int

Возвращает размер файла в байтах, либо -1, если файл не найден

file.exists(путь: str) -> bool

Проверяет, существует ли по данному пути файл или директория

file.isfile(путь: str) -> bool

Проверяет, существует ли по данному пути файл

file.isdir(путь: str) -> bool

Проверяет, существует ли по данному пути директория

file.mkdir(путь: str) -> bool

Создает директорию. Возвращает true если была создана новая директория

file.mkdirs(путь: str) -> bool

Создает всю цепочку директорий. Возвращает true если были созданы директории.

time

time.uptime() -> float

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

Доступные модули

TOML сериализация/десериализация

local toml = require "core:toml"

local t = {a=53, b=42, s="test", sub={x=1, y=6}}
local s = toml.serialize(t)
print(s)
local t2 = toml.deserialize(s) 

вывод:

b = 42
s = "test"
a = 53
[sub]
y = 6
x = 1