@@ -306,3 +306,29 @@
|
||||
### `имя_свойства@append`
|
||||
|
||||
Добавляет элементы в конец списка, вместо его полной перезаписи.
|
||||
|
||||
## Теги - *tags*
|
||||
|
||||
Теги позволяют обозначать обобщённые свойства блоков. Названия следует формировать как `префикс:имя_тега`.
|
||||
Префикс не является обязательным, но позволяет избегать нежелательных логических коллизий. Пример:
|
||||
|
||||
```json
|
||||
{
|
||||
"tags": [
|
||||
"core:ore",
|
||||
"base_survival:food",
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Теги блокам можно добавлять и из других паков, с помощью файла `ваш_пак:tags.toml`. Пример
|
||||
|
||||
```toml
|
||||
"префикс:имя_тега" = [
|
||||
"рандомный_пак:какой_то_блок",
|
||||
"ещё_один_пак:предмет",
|
||||
]
|
||||
"другой_префикс:другое_имя_тега" = [
|
||||
# ...
|
||||
]
|
||||
```
|
||||
|
||||
@@ -32,6 +32,11 @@
|
||||
|
||||
Пример: '~randutil' - слабая зависимость 'randutil'.
|
||||
|
||||
Версии зависимостей указываются после '@' и имеют операторы для ограничения допустимых версий.
|
||||
Отсутствие версии зависимости интерпретируется как '\*', т.е. любая версия.
|
||||
|
||||
Пример: 'randutil@>=1.0' - зависимость 'randutil' версии 1.0 и старше.
|
||||
|
||||
Пример:
|
||||
```json
|
||||
{
|
||||
|
||||
@@ -20,6 +20,22 @@
|
||||
]
|
||||
```
|
||||
|
||||
Из конфигурации сущности можно передавать значения в ARGS.
|
||||
Они будут передаваться как при создании новой сущности, так и при загрузке сохранённой.
|
||||
Для этого используется список `args`:
|
||||
|
||||
```json
|
||||
"components": [
|
||||
{
|
||||
"name": "base:drop",
|
||||
"args": {
|
||||
"item": "base:stone.item",
|
||||
"count": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Код компонентов должен находиться в `scripts/components`.
|
||||
|
||||
## Физика
|
||||
|
||||
@@ -17,6 +17,14 @@
|
||||
Значение по-умолчанию - `packid:itemname.model`.
|
||||
Если модель не указана, будет сгенерирована автоматическию
|
||||
|
||||
### Имя и Описание
|
||||
`caption` - имя предмета в инвентаре
|
||||
`description` - описание предмета в инвентаре
|
||||
|
||||
Можно использовать `md`
|
||||
|
||||
*см. [Text Styles](/doc/en/text-styles.md)*
|
||||
|
||||
## Поведение
|
||||
|
||||
### Устанавливаемый блок - `placing-block`
|
||||
@@ -57,3 +65,30 @@
|
||||
- `number` - число
|
||||
- `relation` - отношение текущего значения к изначальному (x/y)
|
||||
- `vbar` - вертикальная шкала (используется по-умолчанию)
|
||||
|
||||
|
||||
## Теги - *tags*
|
||||
|
||||
Теги позволяют обозначать обобщённые свойства предметов. Названия следует формировать как `префикс:имя_тега`.
|
||||
Префикс не является обязательным, но позволяет избегать нежелательных логических коллизий. Пример:
|
||||
|
||||
```json
|
||||
{
|
||||
"tags": [
|
||||
"core:fuel",
|
||||
"base_survival:poison",
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Теги предметам можно добавлять и из других паков, с помощью файла `ваш_пак:tags.toml`. Пример
|
||||
|
||||
```toml
|
||||
"префикс:имя_тега" = [
|
||||
"рандомный_пак:предмет",
|
||||
"ещё_один_пак:какой_то_блок",
|
||||
]
|
||||
"другой_префикс:другое_имя_тега" = [
|
||||
# ...
|
||||
]
|
||||
```
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Документация
|
||||
|
||||
Документация версии 0.28.
|
||||
Документация версии 0.29.
|
||||
|
||||
## Разделы
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
- [Сущности и компоненты](scripting/ecs.md)
|
||||
- [Библиотеки](#)
|
||||
- [app](scripting/builtins/libapp.md)
|
||||
- [assets](scripting/builtins/libassets.md)
|
||||
- [base64](scripting/builtins/libbase64.md)
|
||||
- [bjson, json, toml, yaml](scripting/filesystem.md)
|
||||
- [block](scripting/builtins/libblock.md)
|
||||
@@ -20,6 +21,7 @@
|
||||
- [gfx.blockwraps](scripting/builtins/libgfx-blockwraps.md)
|
||||
- [gfx.particles](particles.md#библиотека-gfxparticles)
|
||||
- [gfx.posteffects](scripting/builtins/libgfx-posteffects.md)
|
||||
- [gfx.skeletons](scripting/builtins/libgfx-skeletons.md)
|
||||
- [gfx.text3d](3d-text.md#библиотека-gfxtext3d)
|
||||
- [gfx.weather](scripting/builtins/libgfx-weather.md)
|
||||
- [gui](scripting/builtins/libgui.md)
|
||||
@@ -30,8 +32,10 @@
|
||||
- [mat4](scripting/builtins/libmat4.md)
|
||||
- [network](scripting/builtins/libnetwork.md)
|
||||
- [pack](scripting/builtins/libpack.md)
|
||||
- [pathfinding](scripting/builtins/libpathfinding.md)
|
||||
- [player](scripting/builtins/libplayer.md)
|
||||
- [quat](scripting/builtins/libquat.md)
|
||||
- [random](scripting/builtins/librandom.md)
|
||||
- [rules](scripting/builtins/librules.md)
|
||||
- [time](scripting/builtins/libtime.md)
|
||||
- [utf8](scripting/builtins/libutf8.md)
|
||||
|
||||
@@ -27,7 +27,10 @@ app.sleep_until(
|
||||
predicate: function() -> bool,
|
||||
-- максимальное количество тактов цикла движка, после истечения которых
|
||||
-- будет брошено исключение "max ticks exceed"
|
||||
[опционально] max_ticks = 1e9
|
||||
[опционально] max_ticks = 1e9,
|
||||
-- максимальное длительность ожидания в секундах.
|
||||
-- (работает с системным временем, включая test-режим)
|
||||
[опционально] timeout = 1e9
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
# Библиотека *assets*
|
||||
|
||||
Библиотека для работы с аудио/визуальными загружаемыми ресурсами.
|
||||
|
||||
## Функции
|
||||
|
||||
```lua
|
||||
-- Загружает текстуру
|
||||
assets.load_texture(
|
||||
-- Массив байт файла изображения
|
||||
data: table | Bytearray,
|
||||
-- Имя текстуры после загрузки
|
||||
name: str,
|
||||
-- Формат файла изображения (поддерживается только png)
|
||||
[опционально]
|
||||
format: str = "png"
|
||||
)
|
||||
|
||||
-- Парсит и загружает 3D модель
|
||||
assets.parse_model(
|
||||
-- Формат файла модели (xml / vcm)
|
||||
format: str,
|
||||
-- Содержимое файла модели
|
||||
content: str,
|
||||
-- Имя модели после загрузки
|
||||
name: str
|
||||
)
|
||||
```
|
||||
@@ -8,4 +8,10 @@ base64.encode(bytes: table|ByteArray) -> str
|
||||
|
||||
-- Декодирует base64 строку в ByteArray или таблицу чисел, если второй аргумент установлен на true
|
||||
base64.decode(base64string: str, [опционально]usetable: bool=false) -> table|ByteArray
|
||||
|
||||
-- Кодирует массив байт в urlsafe-base64 строку ('-', '_' вместо '+', '/')
|
||||
base64.encode_urlsafe(bytes: table|ByteArray) -> str
|
||||
|
||||
-- Декодирует urlsafe-base64 строку в ByteArray или таблицу чисел, если второй аргумент установлен на true
|
||||
base64.decode_urlsafe(base64string: str, [опционально]usetable: bool=false) -> table|ByteArray
|
||||
```
|
||||
|
||||
@@ -67,6 +67,9 @@ block.get_variant(x: int, y: int, z: int) -> int
|
||||
|
||||
-- Устанавливает вариант блока по индексу
|
||||
block.set_variant(x: int, y: int, z: int, index: int) -> int
|
||||
|
||||
-- Проверяет наличие тега у блока
|
||||
block.has_tag(id: int, tag: str) -> bool
|
||||
```
|
||||
|
||||
### Raycast
|
||||
@@ -171,6 +174,9 @@ block.get_hitbox(id: int, rotation_index: int) -> {vec3, vec3}
|
||||
-- возвращает тип модели блока (block/aabb/custom/...)
|
||||
block.get_model(id: int) -> str
|
||||
|
||||
-- возвращает имя модели блока
|
||||
block.model_name(id: int) -> str
|
||||
|
||||
-- возвращает массив из 6 текстур, назначенных на стороны блока
|
||||
block.get_textures(id: int) -> таблица строк
|
||||
```
|
||||
|
||||
@@ -183,3 +183,26 @@ file.join(директория: str, путь: str) --> str
|
||||
Соединяет путь. Пример: `file.join("world:data", "base/config.toml)` -> `world:data/base/config.toml`.
|
||||
|
||||
Следует использовать данную функцию вместо конкатенации с `/`, так как `префикс:/путь` не является валидным.
|
||||
|
||||
```lua
|
||||
file.open(путь: str, режим: str) --> io_stream
|
||||
```
|
||||
|
||||
Открывает поток для записи/чтения в файл по пути `путь`.
|
||||
|
||||
Аргумент `режим` это список отдельных режимов, в котором каждый обозначается одним символом
|
||||
|
||||
`r` - Чтение из файла
|
||||
`w` - Запись в файл
|
||||
`b` - Открыть поток в двоичном режиме (см. `../io_stream.md`)
|
||||
`+` - Работает совместно с `w`. Добавляет к существующим данным новые (`append-mode`)
|
||||
|
||||
```lua
|
||||
file.open_named_pipe(имя: str, режим: str) -> io_stream
|
||||
```
|
||||
|
||||
Открывает поток для записи/чтения в Named Pipe по пути `путь`
|
||||
|
||||
`/tmp/` или `\\\\.\\pipe\\` добавлять не нужно - движок делает это автоматически.
|
||||
|
||||
Доступные режимы такие же, как и в `file.open`, за исключением `+`
|
||||
@@ -0,0 +1,49 @@
|
||||
# Библиотека gfx.skeletons
|
||||
|
||||
Библиотека для работы с именованными скелетами, такими как 'hand',
|
||||
использующийся для управления, отображаемыми при виде от первого лица,
|
||||
рукой и переносимым предметом. Набор функций аналогичен компоненту skeleton
|
||||
у сущностей.
|
||||
|
||||
Первым аргументом в функции передаётся имя скелета.
|
||||
|
||||
```lua
|
||||
-- Возвращает объектную обёртку над скелетом
|
||||
local skeleton = gfx.skeletons.get(name: str)
|
||||
|
||||
-- Возвращает индекс кости по имени или nil
|
||||
skeleton:index(name: str) -> int
|
||||
|
||||
-- Возвращает имя модели, назначенной на кость с указанным индексом
|
||||
skeleton:get_model(index: int) -> str
|
||||
|
||||
-- Переназначает модель кости с указанным индексом
|
||||
-- Сбрасывает до изначальной, если не указывать имя
|
||||
skeleton:set_model(index: int, name: str)
|
||||
|
||||
-- Возвращает матрицу трансформации кости с указанным индексом
|
||||
skeleton:get_matrix(index: int) -> mat4
|
||||
|
||||
-- Устанавливает матрицу трансформации кости с указанным индексом
|
||||
skeleton:set_matrix(index: int, matrix: mat4)
|
||||
|
||||
-- Возвращает текстуру по ключу (динамически назначаемые текстуры - '$имя')
|
||||
skeleton:get_texture(key: str) -> str
|
||||
|
||||
-- Назначает текстуру по ключу
|
||||
skeleton:set_texture(key: str, value: str)
|
||||
|
||||
-- Проверяет статус видимости кости по индесу
|
||||
-- или всего скелета, если индекс не указан
|
||||
skeleton:is_visible([опционально] index: int) -> bool
|
||||
|
||||
-- Устанавливает статус видимости кости по индексу
|
||||
-- или всего скелета, если индекс не указан
|
||||
skeleton:set_visible([опционально] index: int, status: bool)
|
||||
|
||||
-- Возвращает цвет сущности
|
||||
skeleton:get_color() -> vec3
|
||||
|
||||
-- Устанавливает цвет сущности
|
||||
skeleton:set_color(color: vec3)
|
||||
```
|
||||
@@ -100,3 +100,9 @@ gui.load_document(
|
||||
```
|
||||
|
||||
Загружает UI документ с его скриптом, возвращает имя документа, если успешно загружен.
|
||||
|
||||
```lua
|
||||
gui.root: Document
|
||||
```
|
||||
|
||||
Корневой UI документ
|
||||
|
||||
@@ -68,4 +68,7 @@ hud.is_inventory_open() -> bool
|
||||
|
||||
-- Устанавливает разрешение на паузу. При значении false меню паузы не приостанавливает игру.
|
||||
hud.set_allow_pause(flag: bool)
|
||||
|
||||
-- Функция, управляющая именованным скелетом 'hand' (см. gfx.skeletons)
|
||||
hud.hand_controller: function()
|
||||
```
|
||||
|
||||
@@ -94,6 +94,40 @@ inventory.set(...)
|
||||
inventory.set_all_data(...)
|
||||
```
|
||||
для перемещения вляется неэффективным, используйте inventory.move или inventory.move_range.
|
||||
```lua
|
||||
-- Получает имя предмета в слоте
|
||||
inventory.get_caption(
|
||||
-- id инвентаря
|
||||
invid: int,
|
||||
-- индекс слота
|
||||
slot: int
|
||||
)
|
||||
-- Задает имя предмету в слоте
|
||||
inventory.set_caption(
|
||||
-- id инвентаря
|
||||
invid: int,
|
||||
-- индекс слота
|
||||
slot: int,
|
||||
-- Имя предмета
|
||||
caption: string
|
||||
)
|
||||
-- Получает описание предмета в слоте
|
||||
inventory.get_description(
|
||||
-- id инвентаря
|
||||
invid: int,
|
||||
-- индекс слота
|
||||
slot: int
|
||||
)
|
||||
-- Задает описание предмету в слоте
|
||||
inventory.set_description(
|
||||
-- id инвентаря
|
||||
invid: int,
|
||||
-- индекс слота
|
||||
slot: int,
|
||||
-- Описание предмета
|
||||
description: string
|
||||
)
|
||||
```
|
||||
|
||||
```lua
|
||||
-- Проверяет наличие локального свойства по имени без копирования его значения.
|
||||
|
||||
@@ -10,6 +10,9 @@ item.index(name: str) -> int
|
||||
-- Возвращает название предмета, отображаемое в интерфейсе.
|
||||
item.caption(itemid: int) -> str
|
||||
|
||||
-- Возвращает описание предмета, отображаемое в интерфейсе.
|
||||
item.description(itemid: int) -> str
|
||||
|
||||
-- Возвращает максимальный размер стопки для предмета.
|
||||
item.stack_size(itemid: int) -> int
|
||||
|
||||
@@ -30,6 +33,9 @@ item.emission(itemid: int) -> str
|
||||
|
||||
-- Возвращает значение свойства `uses`
|
||||
item.uses(itemid: int) -> int
|
||||
|
||||
-- Проверяет наличие тега у предмета
|
||||
item.has_tag(itemid: int, tag: str) -> bool
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -2,13 +2,19 @@
|
||||
|
||||
Библиотека для работы с сетью.
|
||||
|
||||
## HTTP-запросы
|
||||
## HTTP-Запросы
|
||||
|
||||
```lua
|
||||
-- Выполняет GET запрос к указанному URL.
|
||||
-- После получения ответа, передаёт текст в функцию callback.
|
||||
-- В случае ошибки в onfailure будет передан HTTP-код ответа.
|
||||
network.get(url: str, callback: function(str), [опционально] onfailure: function(int))
|
||||
network.get(
|
||||
url: str,
|
||||
-- Функция, вызываемая при получении ответа
|
||||
callback: function(str),
|
||||
-- Обработчик ошибок
|
||||
[опционально] onfailure: function(int, str),
|
||||
-- Список дополнительных заголовков запроса
|
||||
[опционально] headers: table<str>
|
||||
)
|
||||
|
||||
-- Пример:
|
||||
network.get("https://api.github.com/repos/MihailRis/VoxelEngine-Cpp/releases/latest", function (s)
|
||||
@@ -16,13 +22,28 @@ network.get("https://api.github.com/repos/MihailRis/VoxelEngine-Cpp/releases/lat
|
||||
end)
|
||||
|
||||
-- Вариант для двоичных файлов, с массивом байт вместо строки в ответе.
|
||||
network.get_binary(url: str, callback: function(table|ByteArray), [опционально] onfailure: function(int))
|
||||
network.get_binary(
|
||||
url: str,
|
||||
callback: function(ByteArray),
|
||||
[опционально] onfailure: function(int, Bytearray),
|
||||
[опционально] headers: table<str>
|
||||
)
|
||||
|
||||
-- Выполняет POST запрос к указанному URL.
|
||||
-- На данный момент реализована поддержка только `Content-Type: application/json`
|
||||
-- После получения ответа, передаёт текст в функцию callback.
|
||||
-- В случае ошибки в onfailure будет передан HTTP-код ответа.
|
||||
network.post(url: str, data: table, callback: function(str), [опционально] onfailure: function(int))
|
||||
network.post(
|
||||
url: str,
|
||||
-- Тело запроса в виде таблицы, конвертируемой в JSON или строки
|
||||
body: table|str,
|
||||
-- Функция, вызываемая при получении ответа
|
||||
callback: function(str),
|
||||
-- Обработчик ошибок
|
||||
[опционально] onfailure: function(int, str),
|
||||
-- Список дополнительных заголовков запроса
|
||||
[опционально] headers: table<str>
|
||||
)
|
||||
```
|
||||
|
||||
## TCP-Соединения
|
||||
@@ -98,6 +119,65 @@ server:is_open() --> bool
|
||||
server:get_port() --> int
|
||||
```
|
||||
|
||||
## UDP-Датаграммы
|
||||
|
||||
```lua
|
||||
network.udp_connect(
|
||||
address: str,
|
||||
port: int,
|
||||
-- Функция, вызываемая при получении датаграммы с указанного при открытии сокета адреса и порта
|
||||
datagramHandler: function(Bytearray),
|
||||
-- Функция, вызываемая после открытия сокета
|
||||
-- Опциональна, так как в UDP нет handshake
|
||||
[опционально] openCallback: function(WriteableSocket),
|
||||
) --> WriteableSocket
|
||||
```
|
||||
|
||||
Открывает UDP-сокет с привязкой к удалённому адресу и порту
|
||||
|
||||
Класс WriteableSocket имеет следующие методы:
|
||||
|
||||
```lua
|
||||
-- Отправляет датаграмму на адрес и порт, заданные при открытии сокета
|
||||
socket:send(table|Bytearray|str)
|
||||
|
||||
-- Закрывает сокет
|
||||
socket:close()
|
||||
|
||||
-- Проверяет открыт ли сокет
|
||||
socket:is_open() --> bool
|
||||
|
||||
-- Возвращает адрес и порт, на которые привязан сокет
|
||||
socket:get_address() --> str, int
|
||||
```
|
||||
|
||||
```lua
|
||||
network.udp_open(
|
||||
port: int,
|
||||
-- Функция, вызываемая при получении датаграмы
|
||||
-- В параметры передаётся адрес и порт отправителя, а также сами данные
|
||||
datagramHandler: function(address: str, port: int, data: Bytearray, server: DatagramServerSocket)
|
||||
) --> DatagramServerSocket
|
||||
```
|
||||
|
||||
Открывает UDP-сервер на указанном порту
|
||||
|
||||
Класс DatagramServerSocket имеет следующие методы:
|
||||
|
||||
```lua
|
||||
-- Отправляет датаграмму на переданный адрес и порт
|
||||
server:send(address: str, port: int, data: table|Bytearray|str)
|
||||
|
||||
-- Завершает принятие датаграмм
|
||||
server:stop()
|
||||
|
||||
-- Проверяет возможность принятия датаграмм
|
||||
server:is_open() --> bool
|
||||
|
||||
-- Возвращает порт, который слушает сервер
|
||||
server:get_port() --> int
|
||||
```
|
||||
|
||||
## Аналитика
|
||||
|
||||
```lua
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
# Библиотека *pathfinding*
|
||||
|
||||
Библиотека *pathfinding* предоставляет функции для работы с системой поиска пути в игровом мире. Она позволяет создавать и управлять агентами, которые могут находить маршруты между точками в мире.
|
||||
|
||||
При использовании в логике сущностей следует использовать компонент `core:pathfinding`.
|
||||
|
||||
## Компонент `core:pathfinding`
|
||||
|
||||
```lua
|
||||
local pf = entity:get_component("core:pathfinding")
|
||||
|
||||
--- ...
|
||||
local x = ...
|
||||
local y = ...
|
||||
local z = ...
|
||||
|
||||
--- Установка цели для агента
|
||||
pf.set_target({x, y, z})
|
||||
|
||||
--- Получение текущей цели агента
|
||||
local target = pf.get_target() --> vec3 или nil
|
||||
--- ...
|
||||
|
||||
--- Получение текущего маршрута агента
|
||||
local route = pf.get_route() --> table<vec3> или nil
|
||||
--- ...
|
||||
```
|
||||
|
||||
## Функции библиотеки
|
||||
|
||||
```lua
|
||||
--- Создание нового агента. Возвращает идентификатор созданного агента
|
||||
local agent = pathfinding.create_agent() --> int
|
||||
|
||||
--- Удаление агента по идентификатору. Возвращает true, если агент существовал, иначе false
|
||||
pathfinding.remove_agent(agent: int) --> bool
|
||||
|
||||
--- Установка состояния агента (включен/выключен)
|
||||
pathfinding.set_enabled(agent: int, enabled: bool)
|
||||
|
||||
--- Проверка состояния агента. Возвращает true, если агент включен, иначе false
|
||||
pathfinding.is_enabled(agent: int) --> bool
|
||||
|
||||
--- Создание маршрута на основе заданных точек. Возвращает массив точек маршрута
|
||||
pathfinding.make_route(start: vec3, target: vec3) --> table<vec3>
|
||||
|
||||
--- Асинхронное создание маршрута на основе заданных точек.
|
||||
--- Функция позволяет выполнять поиск пути в фоновом режиме, не блокируя основной поток выполнения
|
||||
pathfinding.make_route_async(agent: int, start: vec3, target: vec3)
|
||||
|
||||
--- Получение маршрута, который агент уже нашел. Используется для получения маршрута после асинхронного поиска.
|
||||
--- Если поиск ещё не завершён, возвращает nil. Если маршрут не найден, возвращает пустую таблицу.
|
||||
pathfinding.pull_route(agent: int) --> table<vec3> или nil
|
||||
|
||||
--- Установка максимального количества посещенных блоков для агента. Используется для ограничения объема работы алгоритма поиска пути.
|
||||
pathfinding.set_max_visited(agent: int, max_visited: int)
|
||||
|
||||
--- Добавление тега избегаемых блоков
|
||||
pathfinding.avoid_tag(
|
||||
agent: int,
|
||||
-- тег избегаемых блоков
|
||||
tag: string, [опционально],
|
||||
-- стоимость пересечения блока
|
||||
cost: int = 10
|
||||
)
|
||||
```
|
||||
@@ -0,0 +1,38 @@
|
||||
# Библиотека *random*
|
||||
|
||||
Библиотека функций для генерации случайный чисел.
|
||||
|
||||
## Недетерминированные числа
|
||||
|
||||
```lua
|
||||
-- Генерирует случайное число в диапазоне [0..1)
|
||||
random.random() --> number
|
||||
|
||||
-- Генерирует случайное целое число в диапазоне [0..n]
|
||||
random.random(n) --> number
|
||||
|
||||
-- Генерирует случайное целое число в диапазоне [a..b]
|
||||
random.random(a, b) --> number
|
||||
|
||||
-- Генерирует случайный массив байт длиной n
|
||||
random.bytes(n: number) -> Bytearray
|
||||
|
||||
-- Генерирует UUID версии 4
|
||||
random.uuid() -> str
|
||||
```
|
||||
|
||||
## Псевдослучайные числа
|
||||
|
||||
Библиотека предоставляет класс Random - генератор с собственным изолированным состоянием.
|
||||
|
||||
```lua
|
||||
local rng = random.Random()
|
||||
|
||||
-- Используется аналогично math.random
|
||||
local a = rng:random() --> [0..1)
|
||||
local b = rng:random(10) --> [0..10]
|
||||
local c = rng:random(5, 20) --> [5..20]
|
||||
|
||||
-- Устанавливает состояние генератора для генерации воспроизводимой последовательности случайных чисел
|
||||
rng:seed(42)
|
||||
```
|
||||
@@ -11,3 +11,21 @@ time.delta() -> float
|
||||
```
|
||||
|
||||
Возвращает дельту времени (время прошедшее с предыдущего кадра)
|
||||
|
||||
```python
|
||||
time.utc_time() -> int
|
||||
```
|
||||
|
||||
Возвращает время UTC в секундах
|
||||
|
||||
```python
|
||||
time.local_time() -> int
|
||||
```
|
||||
|
||||
Возвращает локальное (системное) время в секундах
|
||||
|
||||
```python
|
||||
time.utc_offset() -> int
|
||||
```
|
||||
|
||||
Возвращает смещение локального времени от UTC в секундах
|
||||
@@ -100,6 +100,13 @@ vecn.length(a: vector)
|
||||
|
||||
```
|
||||
|
||||
#### Дистанция - *vecn.distance(...)*
|
||||
|
||||
```lua
|
||||
-- возвращает расстояние между двумя векторами
|
||||
vecn.distance(a: vector, b: vector)
|
||||
```
|
||||
|
||||
#### Абсолютное значение - *vecn.abs(...)*
|
||||
|
||||
```lua
|
||||
@@ -136,6 +143,16 @@ vecn.pow(v: vector, exponent: number, dst: vector)
|
||||
vecn.dot(a: vector, b: vector)
|
||||
```
|
||||
|
||||
#### Смешивание - *vecn.mix(...)*
|
||||
|
||||
```lua
|
||||
-- возвращает вектор a * (1.0 - t) + b * t
|
||||
vecn.mix(a: vector, b: vector, t: number)
|
||||
|
||||
-- записывает в dst вектор a * (1.0 - t) + b * t
|
||||
vecn.mix(a: vector, b: vector, t: number, dst: vector)
|
||||
```
|
||||
|
||||
#### Перевод в строку - *vecn.tostring(...)*
|
||||
> [!WARNING]
|
||||
> Возвращает только тогда, когда содержимым является вектор
|
||||
@@ -160,6 +177,12 @@ vec2.angle(v: vec2)
|
||||
|
||||
-- возвращает угол направления вектора {x, y} в градусах [0, 360]
|
||||
vec2.angle(x: number, y: number)
|
||||
|
||||
-- возвращает повернутый вектор на угол в градусах против часовой стрелки
|
||||
vec2.rotate(v: vec2, angle: number) -> vec2
|
||||
|
||||
-- записывает повернутый вектор на угол в градусах против часовой стрелки в dst
|
||||
vec2.rotate(v: vec2, angle: number, dst: vec2) -> vec2
|
||||
```
|
||||
|
||||
|
||||
@@ -192,6 +215,10 @@ print("mul_scal: " .. vec3.tostring(result_mul_scal)) -- {6, 12, 12}
|
||||
local result_norm = vec3.normalize(v1_3d)
|
||||
print("norm: " .. vec3.tostring(result_norm)) -- {0.333, 0.667, 0.667}
|
||||
|
||||
-- дистанция между векторами
|
||||
local result_distance = vec3.distance(v1_3d, v2_3d)
|
||||
print("distance: " .. result_distance) -- 43
|
||||
|
||||
-- длина вектора
|
||||
local result_len = vec3.length(v1_3d)
|
||||
print("len: " .. result_len) -- 3
|
||||
@@ -211,4 +238,9 @@ print("pow: " .. vec3.tostring(result_pow)) -- {1, 4, 4}
|
||||
-- скалярное произведение векторов
|
||||
local result_dot = vec3.dot(v1_3d, v2_3d)
|
||||
print("dot: " .. result_dot) -- 250
|
||||
|
||||
-- смешивание векторов
|
||||
local result_mix = vec3.mix(v1_3d, v2_3d, 0.25)
|
||||
print("mix: " .. vec3.tostring(result_mix)) -- {3.25, 6.5, 11.5}
|
||||
|
||||
```
|
||||
|
||||
+12
-2
@@ -26,6 +26,8 @@ entity:get_uid() -> int
|
||||
entity:get_component(name: str) -> компонент или nil
|
||||
-- Проверяет наличие компонента по имени
|
||||
entity:has_component(name: str) -> bool
|
||||
-- Запрашивает компонент по имени. Бросает исключение при отсутствии
|
||||
entity:require_component(name: str) -> компонент
|
||||
|
||||
-- Включает/выключает компонент по имени
|
||||
entity:set_enabled(name: str, enable: bool)
|
||||
@@ -95,8 +97,10 @@ body:set_linear_damping(value: number)
|
||||
|
||||
-- Проверяет, включено ли вертикальное затухание скорости
|
||||
body:is_vdamping() -> bool
|
||||
-- Включает/выключает вертикальное затухание скорости
|
||||
body:set_vdamping(enabled: bool)
|
||||
-- Возвращает множитель вертикального затухания скорости
|
||||
body:get_vdamping() -> number
|
||||
-- Включает/выключает вертикальное затухание скорости / устанавливает значение множителя
|
||||
body:set_vdamping(enabled: bool | number)
|
||||
|
||||
-- Проверяет, находится ли сущность на земле (приземлена)
|
||||
body:is_grounded() -> bool
|
||||
@@ -188,6 +192,12 @@ function on_update(tps: int)
|
||||
|
||||
Вызывается каждый такт сущностей (на данный момент - 20 раз в секунду).
|
||||
|
||||
```lua
|
||||
function on_physics_update(delta: number)
|
||||
```
|
||||
|
||||
Вызывается после каждого шага физики
|
||||
|
||||
```lua
|
||||
function on_render(delta: number)
|
||||
```
|
||||
|
||||
@@ -46,6 +46,13 @@ function on_blocks_tick(tps: int)
|
||||
|
||||
Вызывается tps (20) раз в секунду. Используйте 1/tps вместо `time.delta()`.
|
||||
|
||||
```lua
|
||||
function on_block_tick(x, y, z, tps: number)
|
||||
```
|
||||
|
||||
Вызывается tps (20 / tick-interval) раз в секунду для конкретного блока.
|
||||
Используйте 1/tps вместо `time.delta()`.
|
||||
|
||||
```lua
|
||||
function on_player_tick(playerid: int, tps: int)
|
||||
```
|
||||
|
||||
@@ -258,3 +258,16 @@ function sleep(timesec: number)
|
||||
```
|
||||
|
||||
Вызывает остановку корутины до тех пор, пока не пройдёт количество секунд, указанное в **timesec**. Функция может быть использована только внутри корутины.
|
||||
|
||||
```lua
|
||||
function await(co: coroutine) -> result, error
|
||||
```
|
||||
|
||||
Ожидает завершение переданной корутины, возвращая поток управления. Функция может быть использована только внутри корутины.
|
||||
Возвращает значения аналогичные возвращаемым значениям *pcall*.
|
||||
|
||||
```lua
|
||||
os.pid -> number
|
||||
```
|
||||
|
||||
Константа, в которой хранится PID текущего инстанса движка
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
# Класс *io_stream*
|
||||
|
||||
Класс, предназначенный для работы с потоками
|
||||
|
||||
## Режимы
|
||||
|
||||
Поток имеет три различных вида режима:
|
||||
|
||||
**general** - Общий режим работы I/O
|
||||
**binary** - Формат записи и чтения I/O
|
||||
**flush** - Режим работы flush
|
||||
|
||||
### general
|
||||
|
||||
Имеет три режима:
|
||||
|
||||
**default** - Дефолтный режим работы потока. При read может вернуть только часть от требуемых данных, при write сразу записывает данные в поток.
|
||||
|
||||
**yield** - Почти тоже самое, что и **default**, но всегда будет возвращать все требуемые данные. Пока они не будут прочитаны, будет вызывать `coroutine.yield()`. Предназначен для работы в корутинах.
|
||||
|
||||
**buffered** - Буферизирует записываемые и читаемые данные.
|
||||
|
||||
При вызове `available`/`read` обновляет буфер чтения.
|
||||
|
||||
После обновления в `read`, если буфер чтения переполнен, то бросает ошибку `buffer overflow`.
|
||||
|
||||
Если требуемого кол-ва байт недостаточно в буфере для чтения, то бросает ошибку `buffer-underflow`.
|
||||
|
||||
При вызове `write` записывает итоговые байты в буфер для записи. Если он переполнен, то бросает ошибку `buffer overflow`.
|
||||
|
||||
При вызове `flush` проталкивает данные из буфера для записи в напрямую в поток
|
||||
|
||||
### flush
|
||||
|
||||
**all** - Сначала проталкивает данные из буфера напрямую в поток (если используется **buffered** режим), а после вызывает `flush` напрямую из библиотеки
|
||||
|
||||
**buffer** - Только проталкивает данные из буфера в поток (если используется **buffered** режим)
|
||||
|
||||
## Методы
|
||||
|
||||
Методы, позволяющие изменить или получить различные режимы поведения потока
|
||||
|
||||
```lua
|
||||
-- Возвращает true, если поток используется в двоичном режиме
|
||||
io_stream:is_binary_mode() --> bool
|
||||
|
||||
-- Включает или выключает двоичный режим
|
||||
io_stream:set_binary_mode(bool)
|
||||
|
||||
-- Возвращает режим работы потока
|
||||
io_stream:get_mode() --> string
|
||||
|
||||
-- Задаёт режим работы потока. Выбрасывает ошибку, если передан неизвестный режим
|
||||
io_stream:set_mode(string)
|
||||
|
||||
-- Возвращает режим работы flush
|
||||
io_stream:get_flush_mode() --> string
|
||||
|
||||
-- Задаёт режим работы flush
|
||||
io_stream:set_flush_mode(string)
|
||||
```
|
||||
|
||||
I/O методы
|
||||
|
||||
```lua
|
||||
|
||||
--[[
|
||||
Читает данные из потока
|
||||
|
||||
В двоичном режиме:
|
||||
|
||||
Если arg - int, то читает из потока arg байт и возвращает ввиде Bytearray или таблицы, если useTable = true
|
||||
|
||||
Если arg - string, то функция интерпретирует arg как шаблон для byteutil. Прочитает кол-во байт, которое определено шаблоном, передаст их в byteutil.unpack и вернёт результат
|
||||
|
||||
|
||||
В текстовом режиме:
|
||||
|
||||
Если arg - int, то читает нужное кол-во строк с окончанием CRLF/LF из arg и возвращает ввиде таблицы. Также, если trimEmptyLines = true, то удаляет пустые строки с начала и конца из итоговой таблицы
|
||||
|
||||
Если arg не определён, то читает одну строку с окончанием CRLF/LF и возвращает её.
|
||||
--]]
|
||||
io_stream:read(
|
||||
[опционально] arg: int | string,
|
||||
[опционально] useTable | trimEmptyLines: bool
|
||||
) --> Bytearray | table<int> | string | table<string> | ...
|
||||
|
||||
--[[
|
||||
Записывает данные в поток
|
||||
|
||||
В двоичном режиме:
|
||||
|
||||
Если arg - string, то функция интерпретирует arg как шаблон для byteutil, передаст его и ... в byteutil.pack и результат запишет в поток
|
||||
|
||||
Если arg - Bytearray | table<int>, то записывает байты в поток
|
||||
|
||||
В текстовом режиме:
|
||||
|
||||
Если arg - string, то записывает строку в поток (вместе с окончанием LF)
|
||||
|
||||
Если arg - table<string>, то записывает каждую строку из таблицы отдельно
|
||||
--]]
|
||||
io_stream:write(
|
||||
arg: Bytearray | table<int> | string | table<string>,
|
||||
[опционально] ...
|
||||
)
|
||||
|
||||
-- Читает одну строку с окончанием CRLF/LF из потока вне зависимости от двоичного режима
|
||||
io_stream:read_line() --> string
|
||||
|
||||
-- Записывает одну строку с окончанием LF в поток вне зависимости от двоичного режима
|
||||
io_stream:write_line(string)
|
||||
|
||||
--[[
|
||||
|
||||
В двоичном режиме:
|
||||
|
||||
Читает все доступные байты из потока и возвращает ввиде Bytearray или table<int>, если useTable = true
|
||||
|
||||
В текстовом режиме:
|
||||
|
||||
Читает все доступные строки из потока в table<string> если useTable = true, или в одну строку вместе с окончаниями, если нет
|
||||
|
||||
--]]
|
||||
io_stream:read_fully(
|
||||
[опционально] useTable: bool
|
||||
) --> Bytearray | table<int> | table<string> | string
|
||||
```
|
||||
|
||||
Методы, имеющие смысл в использовании только в buffered режиме
|
||||
|
||||
```lua
|
||||
--[[
|
||||
|
||||
Если length определён, то возвращает true, если length байт доступно к чтению. Иначе возвращает false
|
||||
|
||||
Если не определён, то возвращает количество байт, которое можно прочитать
|
||||
|
||||
--]]
|
||||
io_stream:available(
|
||||
[опционально] length: int
|
||||
) --> int | bool
|
||||
|
||||
-- Возвращает максимальный размер буферов
|
||||
io_stream:get_max_buffer_size() --> int
|
||||
|
||||
-- Задаёт новый максимальный размер буферов
|
||||
io_stream:set_max_buffer_size(max_size: int)
|
||||
```
|
||||
|
||||
Методы, контролирующие состояние потока
|
||||
|
||||
```lua
|
||||
|
||||
-- Возвращает true, если поток открыт на данный момент
|
||||
io_stream:is_alive() --> bool
|
||||
|
||||
-- Возвращает true, если поток закрыт на данный момент
|
||||
io_stream:is_closed() --> bool
|
||||
|
||||
-- Закрывает поток
|
||||
io_stream:close()
|
||||
|
||||
--[[
|
||||
|
||||
Записывает все данные из write-буфера в поток в buffer/all flush-режимах
|
||||
Вызывает ioLib.flush() в all flush-режиме
|
||||
|
||||
--]]
|
||||
io_stream:flush()
|
||||
```
|
||||
|
||||
Создание нового потока
|
||||
|
||||
```lua
|
||||
--[[
|
||||
|
||||
Создаёт новый поток с переданным дескриптором и использующим переданную I/O библиотеку. (Более подробно в core:io_stream.lua)
|
||||
|
||||
--]]
|
||||
io_stream.new(
|
||||
descriptor: int,
|
||||
binaryMode: bool,
|
||||
ioLib: table,
|
||||
[опционально] mode: string = "default",
|
||||
[опционально] flushMode: string = "all"
|
||||
) -> io_stream
|
||||
```
|
||||
Reference in New Issue
Block a user