Об аддоне

Skcrew - это аддон для плагина Skript , расширающий возможности языка.

Аддон включает следующий функционал:

  • работа с файлами и папками
  • побитовые и логические операции с числами
  • поддержка плагина floodgate и отправка форм
  • упрощенное создание игровых GUI
  • парсинг и выполнение кода из текста
  • рисование на картах
  • редактирование прав игрока
  • выполнение команд от лица игрока с правами оператора
  • реализация InventoryDragEvent и необходимых ему выражений
  • асинхронные/синхронные web запросы
  • получение сведений о технических составляющих сервера
  • взаимодействие с SQL-подобными базами данных
  • работа со строками при помощи регулярных выражений
  • поддержка плагина ViaVersion для получения версии игроков
  • работа с игровыми мирами: загрузка, копирование, удаление
  • поддержка прокси-общения между серверами ( Velocity , Bungeecord )
  • работа с пакетами: создание, отправка, получение, редактирование

Подразделы Об аддоне

Установка

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

Стандартная конфигурация для игрового сервера (Spigot и ему подобные форки):

bitwise:
  enabled: true
files:
  enabled: true
floodgate:
  enabled: true
gui:
  enabled: true
interpretate:
  enabled: true
maps:
  enabled: true
other:
  enabled: true
packets:
  enabled: true
permissions:
  enabled: true
requests:
  enabled: true
runtime:
  enabled: true
sockets:
  enabled: false
  server-address: "127.0.0.1"
  server-port: 1337
  client-autoreconnect-time: 5
sql:
  enabled: true
  driver-class-name: "default"
string-utils:
  enabled: true
viaversion:
  enabled: true
world:
  enabled: true

Стандартная конфигурация для прокси сервера ( Velocity или Bungeecord ):

socket-server-port: 1337

web-server-enabled: true
web-server-port: 1338
web-server-user: admin
web-server-password: admin

Поддерживаемые версии Skript:

Модули аддона и их поддержка на разных версиях сервера:

Модуль1.8.81.12.21.14+
bitwise
files
floodgate
gui
interpretate
maps
other
packets
permissions
requests
runtime
sockets
sql
string-utils
viaversion
world

Модуль будет автоматически отключен, если не поддерживается версией сервера, поэтому не переживайте, если что-то сделали не так

Подразделы Модули

BITWISE

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

Специальная благодарность Pesekjak за создание аддона Bitshift . Часть кода и идея была позаимствованная у него.

Бинарная операция ИЛИ

Копирует бит в результат, если он существует в обоих операндах.

%number% | %number%

Логическая операция ИЛИ

Если хоть один равен True, то будет возвращена истина.

%boolean% || %boolean%

Бинарная операция И

Копирует бит, если он существует в любом из операндов.

%number% & %number%

Логическая операция И

Если оба операнда равны True, то будет возвращена истина.

%boolean% && %boolean%

Бинарная операция XOR

Копирует бит, если он установлен в одном операнде, но не в обоих.

%number% ^^ %number%

Побитовый сдвиг влево

Значение левых операндов перемещается влево на количество бит, заданных правым операндом.

%number% << %number%

Побитовый сдвиг вправо

Значение правых операндов перемещается вправо на количество бит, заданных левых операндом.

%number% >> %number%

Побитовый нулевой сдвиг вправо

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

%number% >>> %number%

Бинарная операция дополнения (отражения)

Каждый бит числа будет инвертирован.

~%number% 

Число в бинарной записи

0(b|B)<[0-1]+>
set {_binary} to 0b22

Число в шестнадцатиричной системе

0(x|X)<[A-Fa-f0-9]+>
set {_hexadecimal} to 0xFF

Files

Данный модуль позволяет совершать операции с файлами.

Специальная благодарность Olyno за создание аддона Skent . Данный модуль был разработан в связи с тем, что в тот момент он забросил разработку, но сейчас его аддон имеет вариант асинхронной работы с файлами. Часть кода была позаимствованна из первой версии его аддона.

EXPRESSIONS
CONDITIONS
EFFECTS

Подразделы Files

EXPRESSIONS

Получить ссылку на абстрактный файл

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

[the] (file[s]|dir[ector(y|ies)]) %strings%
set {_file} to file "eula.txt"

Получить абсолютный файл

Абсолютный - то есть тот, у которого путь начинается с корня файловой системы

absolute [(file|dir[ectory])] of %path%
%path%'s absolute [(file|dir[ectory])] 
set {_file} to absolute file of file "eula.txt"

Получить все файлы внутри директории

Позволяет так же делать это рекурсивно, получая файлы в директории и во всех внутренних директориях

all [the] files and [all] [the] dir[ectorie]s (in|of|from) %path%
all [the] files (in|of|from) %path%
all [the] dir[ectorie]s (in|of|from) %path%
all [the] sub[(-| )]files and [all] [the] sub[(-| )]dir[ectorie]s (in|of|from) %path%
all [the] sub[(-| )]dir[ectorie]s (in|of|from) %path%
all [the] sub[(-| )]files (in|of|from) %path%
glob (files|dir[ectorie]s) %string% (in|of|from) %path%
loop all files from file "plugins/":
  broadcast "%loop-value%"

Получить текстовое содержимое файла

[the] content of %path%
[the] %path%'s content
set {_file} to content of file "eula.txt"
replace all "false" with "true" in {_file}
set content of file "eula.txt" to {_file}

Получить название файла или директории

[the] (file|dir[ectory])name of %path%
[the] %path%'s (file|dir[ectory])name
loop all files from file "plugins/":
  broadcast filename of loop-value

Прочитать строку/строки файла или изменить их

[the] line %number% (from|of|in) %path%
[all] [the] lines (from|of|in) %path%
set line 1 of file "eula.txt" to "eula=true"

Получить директорию в которой находится файл/папка

parent [(file|dir[ectory])] of %path%
%path%'s parent [(file|dir[ectory])]
set {_file} to parent of file "eula.txt"

Получить размер файла в байтах

file size of %path%
%path%'s file size

Получить дату последнего доступа к файлу

[last] access (date|time) of %path%
%path%'s [last] access (date|time)

Получить дату последнего изменения файла

[last] modified (date|time) of %path%
%path%'s [last] modified (date|time)

Получить дату создания файла

create[d] (date|time) of %path%
%path%'s create[d] (date|time)

CONDITIONS

Проверка файла на его фактическое наличие

%path% (is|does)[(n't| not)] exist[s]
if file "eula.txt" is exists:
  broadcast "Yea, file eula.txt is exists"

Проверка что файл является директорией

%path% is[(n't| not)] dir[ectory]
if file "eula.txt" is not directory:
  broadcast "Yea, file eula.txt is not directory, it is regular file"

Проверка что файл является файлом

%path% is[(n't| not)] file
if file "eula.txt" is file:
  broadcast "Yea, file eula.txt is regular file"

EFFECTS

Скопировать файл или директорию

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

copy %path% to %path% [with (replac|overwrit)(e|ing)]
copy file "plugins/Skcrew.jar" to file "./"

Создать простой файл

Позволяет так же указать текстовое содержимое создаваемого файла

create %paths% [with [(text|string|content)] %strings%]
create file "eula.txt" with content "eula=true"

Удалить файл или директорию

delete %paths%
delete file "plugins/Skcrew.jar"

Переместить файл или директорию

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

move %paths% to %path% [with (overwrit|replac)(e|ing)]
move file "plugins" to file "disabled_plugins"

Переименовать файл или директорию

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

rename %paths% to %string% [with (overwrit|replac)(e|ing)]
rename file "plugins/Skript/scripts/mycoolscript.sk" to "-mycoolscript.sk"

Распаковать zip архив

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

unzip %path% to %path% [with (overwrit|replac)(e|ing)]
unzip file "myarchive.zip" to file "./"

Создать zip архив

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

zip %paths% to %path% [with (overwrit|replac)(e|ing)]
zip file "world/" to file "backupworld.zip"

FLOODGATE

Данный модуль позволяет взаимодействовать с плагином Floodgate , а так же создавать интерактивные формы

Для работы модуля необходим плагин Floodgate

Проверить, что игрок зашел с Bedrock Edition

%player% [(is|does)](n't| not) from floodgate

Получить локализацию игрока

[the] be[[drock] [edition]] (locale|language) of [the] [floodgate] %player% 
%player%'s be[[drock] [edition]] (locale|language) [of [the] floodgate]

Получить название устройства игрока

[the] [be[[drock] [edition]]] (platform|device) of [the] [floodgate] %player%
%player%'s [be[[drock] [edition]]] (platform|device) [of [the] floodgate]

Получить версию Bedrock клиента

[the] be[[drock] [edition]] version of [the] [floodgate] %player%
%player%'s be[[drock] [edition]] version [of [the] floodgate]

Подразделы Floodgate

FORM TYPES

Создание новой формы

Представляет собой самую простую форму, которая имеет лишь две кнопки и блок описания. Кнопки - это условный выбор ‘да’ или ‘нет’.
Созданная форма будет помещена в выражение last created form

create [a] [new] modal form (with (name|title)|named) %string%
create modal form named "Modal form":
  set form content to "Please select one option"
  run on form close:
    broadcast "closed"
  run on form open:
    broadcast "opened"
  form button named "I like skript!":
    broadcast "Thank you!!!"
  form button named "I didnt like skript!":
    broadcast "USE DENIZEN INSTEAD!!!"
open last created form to player

modal form
modal form

Simple form

Представляет собой форму c кнопками. Кнопок может быть неограниченное количество, помимо этого, кнопки могут иметь изображения из интернета.
Созданная форма будет помещена в выражение last created form

create [a] [new] simple form (with (name|title)|named) %string%
create simple form named "Simple form":
  form button named "button 1" with image "https://pics.clipartpng.com/Carrots_PNG_Clipart-465.png":
    broadcast "button 1 pressed"
  form button named "button 2":
    broadcast "button 2 pressed"
  form button named "button 3":
    broadcast "button 3 pressed"
open last created form to player

simple form
simple form

Custom form

Представляет собой форму c любыми элементами, кроме кнопок. Данный вид форм позволяет использовать слайдеры, переключатели, поля ввода, поля выбора и т.д
Обработка элементов формы осуществляется в секции on form result
Созданная форма будет помещена в выражение last created form

create [a] [new] custom form (with (name|title)|named) %string%
create custom form named "Custom form":
  form dropdown named "Select one value from list" with elements "one", "two", "three"
  form input named "Your password?" with placeholder "write your password"
  form label named "sample text"
  form slider named "music volume????" with minimum value 0 and maximum value 10
  form textslider named "select shit" with elements "value 1","value 2","value 3"
  form toggle named "yes or no?"
  run on form result:
    broadcast "%form toggle 1 value%"
open last created form to player

custom form
custom form

Последняя созданная форма

[the] (last[ly] [(created|edited)]|(created|edited)) form

Открыть форму игроку

open %form% (for|to) %players%

ЭЛЕМЕНТЫ ФОРМ

Кнопки

Кнопка представляет собой секцию, код внутри которой будет выполнен при клике на нее. После клика на кнопку - форма будет автоматически закрыта (особенность Bedrock форм).

Могут быть использованы только в Modal form и Simple form .
Кнопка с изображением может быть использована только в Simple form

form(-| )button ((with (name|title))|named) %string% [with image %string%]
create modal form named "Modal form":
  form button named "My button":
    broadcast "Pressed button"
open last created form to player

Текст Modal form.

Позволяет указать или получить текстовое описание в Modal form. Позволяет указать как в уже созданной форме, так и в секции создания Modal form

form['s] content
content of form 
%form%['s] content
content of %form%
create modal form named "Modal form":
  set content of form to "Sample text"
open last created form to player

Элементы Custom form

Получить значение элементов Custom form после закрытия можно только в секции run on form result.

Элемент пользовательского ввода

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

form(-| )input (with name|named) [%string% (with|and) [placeholder] %string%[(, | (with|and) ) [def[ault] [value]] %string%]]
Выбор из списка

Создает элемент в котором пользователь может выбрать одно из предложенных значений. Позволяет указать изначальное значение по индексу.

form(-| )drop[(-| )]down (with name|named) %string% (with|and) [elements] %strings%[(, | (with|and) ) [def[ault] [(element [index]|index)]] %number%]
Метка, заметка, текст

Создает элемент с текстом.

form(-| )label [(with (name|title)|named)] %string%
Ползунок с числовым выбором значения

Создает элемент в виде полоски со регулятором, в котором пользователь может указать значение. Позволяет указать минимальный и максимальный порог чисел, начальное значение и шаг ползунка.

form(-| )slider (with name|named) %string% [[(with|and) [min[imum] [value]] %number%[(, | (with|and) ) [max[imum] [value]] %number%[(, | (with|and) ) [def[ault] [value]] %number%[(, | (with|and) ) [[step] [value]] %number%]]]]
Ползунок с выбором значений

Создает аналогичный числовому ползунку элемент, но уже с текстовыми значениями. Позвлояет указать начальное значение по индексу.

form(-| )(text|step)[(-| )]slider (with name|named) %string% (with|and) [elements] %strings%[(, | (with|and) ) [def[ault] [(element [index]|index)]] %number%]
Элемент переключатель.

Имеет лишь два состояния , включено или выключено. Можно указать начальное состояние.

form(-| )toggle (with name|named) %string% [(with|and) [def[ault]] [value] %boolean%]

Обработка результатов

Получить игрока внутри формы

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

form(-| )player

Получение типа созданной формы

form[(-| )]type of %form%
%form%'s form[(-| )]type

Доступные типы форм для сравнения:

  • custom form
  • modal form
  • simple form

Выполнить код при открытии/закрытии формы

run (when|while) (open[ing]|clos(e|ing)) [[the] form]
run (when|while) [the] form (opens|closes)
run on form (open[ing]|clos(e|ing))
create modal form named "Modal form":
  run on form close:
  	broadcast "%formplayer%" #will show name of player what close form
open last created form to player

Отменить или разрешить закрытие формы

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

cancel [the] form clos(e|ing)
uncancel [the] form clos(e|ing)

Получить причину закрытия формы

Данное выражение может быть использовано только в секции при закрытии формы

[form(-| )]close reason

Доступные причины закрытия для сравнения:

  • close
  • (submit|success)
  • invalid[ response]

Выполнить код при успешном закрытии формы

run on form (result|submit)
create custom form named "Custom form":
  form toggle named "toggle value"
  run on form result:
    broadcast "%form toggle 1 value%"
open last created form to player

Элементы Custom form

Данное выражение может быть использовано только в секции при успешном закрытии формы

[form[(-| )]](drop[(-| )]down|input|slider|step[(-| )]slider|toggle) %number% [value]
value of [form[(-| )]](drop[(-| )]down|input|slider|step[(-| )]slider|toggle) %number%

Для обработки кнопок Modal form и Simple form используйте секцию создания кнопки

Подразделы GUI

Создание GUI

Создание нового GUI

Создает новое GUI и помещает его в результат выражения последнее созданное gui

create [a] [new] gui with %inventory% [(and|with) ([re]move[e]able|stealable) items] [(and|with) shape %strings%]
create a gui with chest inventory with 3 rows named "My GUI":
  #do some stuff
open last created gui to player

empty gui
empty gui

Последний аргумент позволяет использовать заготовленные шаблоны расположения интерактивных элементов. Например, если мы открываем инвентарь воронки, то можем указать шаблон “xxixx”, и тогда, при создании элемента “x” первый, второй, четвертый и пятый слоты будут с этим элементом.

create a gui with chest inventory with 3 rows named "My GUI" with shape "xxxxxxxxx","x-------x","xxxxxxxxx":
  make gui slot "x" with dirt
open last created gui to player

gui shape
gui shape

Изменить уже созданное GUI

Позволяет переопределить интерактивные элементы внутри уже созданного GUI

(change|edit) [gui] %gui%

Создать интерактивный элемент

При клике на этот элемент будет выполнен код внутри секции. Выражение ниже создает интерактивный элемент на следующем пустом слоте инвентаря.

(make|format) [the] next gui [slot] (with|to) [([re]mov[e]able|stealable)] %itemtype%

Следующее выражение позволяет указать значение из шаблона или номер слота для создания элемента.

(make|format) gui [slot[s]] %strings/numbers% (with|to) [([re]mov[e]able|stealable)] %itemtype%
create a gui with chest inventory with 3 rows named "My GUI":
  make gui slot 1 with stone named "Click for hello world!":
    broadcast "Hello world!"

Удалить интерактивный элемент

(un(make|format)|remove) [the] next gui [slot]
(un(make|format)|remove) gui [slot[s]] %strings/numbers%
(un(make|format)|remove) all [[of] the] gui [slots]

При открытии GUI

Код внутри данной секции будет выполнен после открытия GUI игроку.

run (when|while) open[ing] [[the] gui]
run (when|while) [the] gui opens
run on gui open[ing]

При закрытии GUI

Код внутри данной секции будет выполнен после закрытия GUI игроком.

run (when|while) clos(e|ing) [[the] gui]
run (when|while) [the] gui closes
run on gui clos(e|ing)

Последнее созданное GUI

Возвращает последнее созданное/измененное GUI

[the] last[ly] [(created|edited)] gui

ОБРАБОТКА РЕЗУЛЬТАТОВ

Открытое GUI у игрока

Возвращает открытое в текущий момент GUI у игрока

%players%'s gui
gui of %player%'s

Проверить открыто или нет какое-либо GUI у игрока

%players% (has|have) a gui [open]
%players% do[es](n't| not) have a gui [open]

Следующий слот GUI

Возвращает номер или букву шаблона следующего слота GUI

%guis%'[s] next gui slot[s]
[the] next gui slot[s] of %guis%

Последующие выражения могут быть использованы только в секциях создания GUI и создания интерактивного элемента

[the] next gui slot

Название инвентаря GUI

%gui%'s gui(-| )name
gui(-| )name of %gui%

Размер инвентаря GUI

%gui%'s gui(-| )size
gui(-| )size of %gui%

Шаблон GUI

%gui%'s gui(-| )shape
gui(-| )shape of %gui%

Возможность брать предметы в GUI

%gui%'s gui(-| )lock(-| )status
gui(-| )lock(-| )status of %gui%

Текущее, редактируемое GUI

[the] gui

Кликнутый слот

[the] gui(-| )raw(-| )slot

Горячая клавиша кликнутого слота

[the] gui(-| )hotbar(-| )slot

Инвентарь, редактируемого GUI

[the] gui(-| )inventory

Действие внутри GUI

Например, игрок сделал двойной клик, из-за чего вещи собрались в слоте курсора.

[the] gui(-| )inventory(-| )action

Тип клика

Например, игрок сделал клик с зажатой клавишей Shift.

[the] gui(-| )click(-| )(type|action)

Слот курсора

[the] gui(-| )cursor[(-| )item]

Тип кликнутого слота

[the] gui(-| )slot(-| )type

Кликнутый предмет

[the] gui[(-| )(clicked|current)](-| )item

Выражение используемое вместо игрока внутри секции GUI

[the] gui(-| )player

Обязательно используйте это выражение внутри секции создания GUI или интерактивного элемента вместо player, иначе ваш код будет работать не так, как вы это предполагаете.

Игроки у которых открыто GUI

[the] gui(-| )(viewer|player)s

ID кликнутого слота

[the] gui(-| )slot(-| )id

Последующие выражения могут быть использованы только в секции закрытия GUI

Отменить закрытие

Запрещает игроку закрыть GUI, переоткрывая его с сохранением параметров GUI

cancel [the] gui clos(e|ing)

Разрешить закрытие

Разрешает игроку закрыть GUI

uncancel [the] gui close(e|ing)

Interpretate

Выполнить блок кода из текста

Позволяет передать список строк кода чтобы их выполнить

evalnode %strings%
evalnode "if 1 is 2:","  broadcast ""yes"""

Выполнить блок кода из текста

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

eval[uate] %strings%
evaluate "broadcast ""yes"""

Подразделы Maps

Создание карты

Создание холста

Возвращает объект из которого в последующем, можно получить карту в виде предмета

[new|empty] drawing map

При создании карты в папке /skcrew/maps/ будет создан файл изображения карты. Название файла будет соотстветствовать ID игровой карты.

Получение холста по ID карты

[drawing] map (by|with) id %number%

Получение предмета из холста

Принимает как аргумент - холст, возвращает игровой предмет - карту

[the] map item (from|of) %map%

Получение холста из предмета

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

[drawing] map (of|from) item %itemstack%

Принудительное сохранение холста

save map %map%

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

Аддон поддерживает автоматическую сериализацию данных связанных с холстами.

Рисование на холсте

Получить цвет пикселя на холсте

pixel %number%(,[ ]| )%number% of %map%

Не позволяет изменить цвет пикселя, для этого используйте выражение закрасить пиксель

Закрасить пиксель

Позволяет задать пикселю определенный цвет по его координатам. Первые два аргумента указывают на координаты на холсте, последующие цвет в формате RGB или RGBA, и последний - это холст.

draw pixel [at] %number%(,[ ]| )%number% [with colo[u]r] %number%(,[ ]| )%number%(,[ ]| )%number%[(,[ ]| )%-number%] on [map] %map%
set {_map} to new drawing map
draw pixel at 1,1 with color 255,0,0 on map {_map}
# will draw pixel at 1,1 with pure red color

Закрасить пиксели

Позволяет установить пикселям в диапазоне определенный цвет.
Первые четыре аргумента указывают на координаты на холсте, последующие цвет в формате RGB или RGBA, и последний - это холст.

draw pixels (from|between) %number%(,[ ]| )%number% [to] %number%(,[ ]| )%number% [with colo[u]r] %number%(,[ ]| )%number%(,[ ]| )%number%[(,[ ]| )%-number%] on [map] %map%
set {_map} to new drawing map
draw pixels from 10,10 to 50,50 with color 255,0,0 on map {_map}
# will draw pure red square on map

Нарисовать линию

Принимает аналогичные аргументы с закрашиванием пикселей.

draw line (from|between) %number%(,[ ]| )%number% [to] %number%(,[ ]| )%number% [with colo[u]r] %number%(,[ ]| )%number%(,[ ]| )%number%[(,[ ]| )%-number%] on [map] %map%

Нарисовать кривую безье

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

draw bezier curve (from|between) %number%(,[ ]| )%number% [to] %number%(,[ ]| )%number% [[with] control points] %number%(,[ ]| )%number% [and] %number%(,[ ]| )%number% [with colo[u]r] %number%(,[ ]| )%number%(,[ ]| )%number%[(,[ ]| )%-number%] on [map] %map%

Нарисовать круг

Первые два аргумента - это центр круга, последующий - радиус круга. Остальные аргументы являются цветом и холстом.

draw circle at %number%(,[ ]| )%number% with radius %number% [with colo[u]r] %number%(,[ ]| )%number%(,[ ]| )%number%[(,[ ]| )%-number%] on [map] %map%

Нарисовать изображение

Изображение должно находиться в папке images/ аддона. Принимает первым аргументом название файла с изображением.

draw image %string% on [[the] map] %map%

Написать текст на карте

Первый аргумент - текст, который должен быть написан, последующие два аргумента описывают название шрифта и размер шрифта.

draw text %string% [at] %number%(,[ ]| )%number% [with font %-string%] [with size %-number%] [with colo[u]r] %number%(,[ ]| )%number%(,[ ]| )%number%[(,[ ]| )%-number%] on [map] %map%

OTHER

Выдать или выбросить

Выдает предметы игроку, при не наличии места в его инвентаре - выбрасывает рядом с ним

give or drop %itemtypes/experiences% to %players%

Inventory drag event

Событие, вызываемое когда игрок зажимает клавишу мыши, чтобы распределить вещи в инвентаре

on inventory drag

Получение добавленных вещей в этом событии

Вернет список вещей, которые были добавлены

new items
added items

Получить затронутые слоты

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

changed slot[s]
event[-]slots

Подразделы Packets

Создание пакета

Изучение wiki.vg

Данный сайт содержит в себе описание пакетов, использующихся в серверной части Minecraft.
Выбираем на сайте версию ядра, на которой стоит сервер и переходим по ссылке этой версии.
Для начала требуется найти пакет, который нам необходим. Все пакеты, находящиеся в разделе SERVERBOUND - отправляются игроком - серверу, пакеты в разделе CLIENTBOUND - от сервера к игроку. Нас, очевидно интересует раздел пакетов CLIENTBOUND.
Выберем пакет SET CAMERA , так как он не изменялся с версии 1.8.
Данный пакет позволяет задать игроку камеру, аналогичную камере, которая происходит при клике на сущность в режиме наблюдателя.
Перед нами предстает следующая таблица на сайте:

Packet IDStateBound ToField NameField TypeNotes
0x50PlayClientCamera IDVarIntID of the entity to set the client’s camera to.

Данная таблица содержит в себе номер пакета, момент игрового процесса, когда он может быть получен, к чему привязан пакет, и описание его содержимого.
Первым делом нам необходимо выяснить, как этот пакет называется на сервере. Для этого нам понадобится три первых поля:

  • id
  • state
  • bound

Получение названия пакета

[wrapped] packet name (by|of) id %number% [(and|,)] state %string% [(and|,)] bound %string%

ID на сайте обозначено числом в шестнадцатиричной системе счисления, при помощи модуля Bitwise мы можем указать значение как описано на сайте, так и перевести число с сайта в десятичную систему счисления (выбирайте как вам удобно).

on load:
  broadcast packet name of id 0x50 and state "play" and bound "client"

После загрузки скрипта, в чате будет написано название данного пакета - PacketPlayOutCamera.
Больше код выше нам не понадобится, он был необходим чтобы узнать название пакета.
Дальше нам необходимо заполнить буфер данными, которые описаны в столбцах Field Name, Field Type, Notes.
Заполнять мы будем новую структуру - ByteBuf. Она представляет из себя набор байт, в который можно записывать байты и считывать их.

Создание буфера

Для создания пустого буфера используется выражение ниже:

empty buffer
command packet_example:
  trigger:
    set {_buffer} to empty buffer

Заполнение буфера данными

Для записи в буфер используется следующие выражения:

write bytes %bytebuf% to %bytebuf%
write bool[ean] %boolean% to %bytebuf%
write uuid %string% to %bytebuf%
write string %string% to %bytebuf%
write utf[-| ]8 %string% to %bytebuf%
write position %vector% to %bytebuf%
write position %location% to %bytebuf%
write [unsigned] byte %number% to %bytebuf%
write [unsigned] short %number% to %bytebuf%
write float %number% to %bytebuf%
write double %number% to %bytebuf%
write int[eger] %number% to %bytebuf%
write long %number% to %bytebuf%
write angle %number% to %bytebuf%
write var[iable][ ]int[eger] %number% to %bytebuf%
write var[iable][ ]long %number% to %bytebuf%

Каждое выражение предоставляет определенный тип, описанный в разделе Data type на wiki.vg .
Некоторые сложные типы, описанные на сайте, могут быть составлены из простых, поэтому они отсутствуют в выражениях.
Пакет PacketPlayOutCamera принимает в себя поле с типом VarInt и значением равным идентификатору сущности.
Для получения идентификатора воспользуемся следующим выражением .
Из таблицы, мы знаем что записать данный идентификатор нужно с типом VarInt. Воспользуемся необходимым выражением:

command packet_example:
  trigger:
    set {_buffer} to empty buffer
    set {_entity} to target entity of player
    set {_id} to entity id of {_entity}
    write varint {_id} to {_buffer}

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

Write index

Каждая запись в буфер сдвигает его Writer index, это количество записанных байт внутри буфера.
Writer index можно узнать, или изменить при помощи следующего выражеения:

writer index of %bytebuf%
%bytebuf%'s writer index

Создание пакета из буфера

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

[create] packet %string% (from|of|with) %bytebuf%
command packet_example:
  trigger:
    set {_buffer} to empty buffer
    set {_entity} to target entity of player
    set {_id} to entity id of {_entity}
    write varint {_id} to {_buffer}
    set {_packet} to create packet "PacketPlayOutCamera" with {_buffer}

Мы создали наш первый пакет, осталось только отправить его игроку.

Отправка пакетов

Для отправки пакетов используется следующее выражение:

send packet %packets% to %players%

Выражения ниже позволяют отправить пакет, без вызова события on packet

send packet %packets%  without [(trigger|call)[ing]] [the] event to %players%
send packet %packets% to %players%  without [(trigger|call)[ing]] [the] event

command packet_example:
  trigger:
    set {_buffer} to empty buffer
    set {_entity} to target entity of player
    set {_id} to entity id of {_entity}
    write varint {_id} to {_buffer}
    set {_packet} to create packet "PacketPlayOutCamera" with {_buffer}
    send packet {_packet} to player
Для проверки работоспособности кода выше, направьте прицел на любую сущность, а затем пропишите команду /packet_example.
После выполнения команды, вы будете смотреть от лица сущности, даже если вы не в режиме наблюдателя.

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

ОТСЛЕЖИВАНИЕ ПАКЕТОВ

Событие получения или отправки пакета.

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

on packet:
on packet <packet name>:

<packet name> - позволяет указать название пакета для отслеживания.

Событие может быть отменено. В этом случае пакет не будет получен сервером, или отправлен игроку

Данное событие имеет встроенные выражения.

  • event-packet - для получения пакета
  • event-player - для получения игрока

event-packet может быть заменен при помощи set event-packet to %packet%, при условии, что не использовалась задержка выполнения

on packet PacketPlayOutOpenSignEditor:
  broadcast "%event-player%"
  broadcast "%event-packet%"
  cancel event

В данном примере происходит вывод ника игрока и названия пакета в чат. А после отмена отправки этого события игроку.
Сам пакет - заставляет игрока открыть окно редактирования текста таблички.

Получение буфера из пакета

После получения буфера из пакета мы можем читать поля указанные на wiki.vg

buffer (of|from) %packet%
%packet%'s buffer

Чтение буфера

Для получения значений из буфера существуют следующие выражения, аналогичные записи в буфер

read bool[ean] from %bytebuf%
read uuid from %bytebuf%
read string from %bytebuf%
read position from %bytebuf%
read [unsigned] byte from %bytebuf%
read [unsigned] short from %bytebuf%
read float from %bytebuf%
read double from %bytebuf%
read int[eger] from %bytebuf%
read long from %bytebuf%
read angle from %bytebuf%
read var[iable][ ]int[eger] from %bytebuf%
read var[iable][ ]long from %bytebuf%
read utf[(-| )]8 [with [len[gth]]] %number% from %bytebuf%

Для чтения utf-8 необходимо так же указать длину текста в байтах

Чтение происходит в том же порядке, что и запись пакета, при условии, что этот пакет не был создан вами. Если же вы создали пакет, и хотите его прочитать (не известно по какой причине), то сместите его reader index в позицию нуля.
Рассмотрим пакет PacketPlayOutOpenSignEditor

Packet IDStateBound ToField NameField TypeNotes
0x32PlayClientLocationPosition
Is Front TextBooleanWhether the opened editor is for the front or on the back of the sign
on packet PacketPlayOutOpenSignEditor:
  set {_buffer} to buffer from event-packet
  set {_position} to read position from {_buffer}
  set {_isFrontText} to read boolean from {_buffer}
  broadcast "%{_position}%"
  cancel event

Код выше выведет в чат Vector с координатами открытой таблички.

Reader index

Каждое чтение буфера сдвигает его Reader index, это количество прочитанных байт внутри буфера.
Reader index можно узнать, или изменить при помощи следующего выражеения:

reader index of %bytebuf%
%bytebuf%'s reader index

Отключение или включение отслеживания пакетов

Для любого игрока можно включить или отключить отслеживание входящих, или исходящих пакетов.

[(handl(e|ing))|(listen[ing] [of])] (in|out)coming packets of %player%
%player%'s [(handl(e|ing))|(listen[ing] [of])] (in|out)coming packets
on join:
  set listening incoming packet of player to false

ДОПОЛНИТЕЛЬНО

Получить ID сущности

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

entity id of %entity%
%entity%'s entity id

Получить или изменить Skin value игрока

skin value of %player%   
%player%'s skin value

Получить или изменить Skin signature игрока

skin signature of %player%   
%player%'s skin signature

Очистить signature и value скина игрока

delete skin properties of %player%
delete %player%'s skin properties

Получить байты текста

Возвращает список байтов.
Возможно также указать необходимую кодировку. По умолчанию UTF-8

bytes of %string% [with charset %string%]
%string%'s bytes [with charset %string%]

PERMISSIONS

Выполнить команду с правами оператора

[execute] [the] command %strings% [by %-commandsenders%] as op
[execute] [the] %commandsenders% command %strings% as op
(let|make) %commandsenders% execute [[the] command] %strings% as op

Управление правами пользователя

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

%player%'s perm[ission][s]
perm[ission][s] of %player%
add "my.cool.permission" to player's perms
remove "not.cool.permission" from player's perms
broadcast "%player's perms%"

Подразделы Requests

EXPRESSIONS

Заголовок запроса

Создает новый заголовок запроса в стиле ключ : значение

request (header|property) %string% %string%

Ключ заголовка запроса

%request property%'s key
key of %request property%

Значение заголовка запроса

%request property%'s value
value of %request property%

EFFECTS

Асинхронный HTTP/S запрос

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

[async[hronously]] request [%string%] to [url] %string% [with header[s] %request properties%] [(and|with) body %string%] [and store [[the] (body|result) in %object%] [and] [code in %object%]]

async request "GET" to url "https://crewpvp.xyz" and store the result in {_data} and code in {_code}

Асинхронный запрос нельзя использовать в функциях, где возвращается значение. Результатом асинхронного запроса будет <none>

Синхронный HTTP/S запрос

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

sync[hronously] request [%string%] to [url] %string% [with header[s] %request properties%] [(and|with) body %string%] [and store [[the] (body|result) in %object%] [and] [code in %object%]]

Приостанавливает основной поток на время выполнения запроса, используйте с умом.

RUNTIME

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

Выполнить команду в операционной системе

Выполняет команду в консоли/терминале операционной системы.

[execute] [the] system command %strings%
(let|make) system execute [[the] command] %strings%

Количество выделенной оперативной памяти на процесс в байтах

[the] [server['s]] max memory
max memory of server
Количество используемой оперативной памяти процессом в байтах
[the] [server['s]] used memory
used memory of server

Ап-тайм сервера (время жизни процесса)

[the] server['s] uptime
[the] uptime of server

Количество ядер процессора, установленного на ЭВМ

processor['s] cores amount
[amount of] processor cores

Коэффициент нагрузки ЭВМ этим процессом

[the] process['s] [average] load
[average] load of process

Коэффициент нагрузки ЭВМ

[the] (system|cpu)['s] [average] load
[average] load of (system|cpu)

SOCKETS

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

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

Конфигурация на прокси сервере

socket-server-port: 1337

Конфигурация на игровом сервере

sockets:
  enabled: false
  server-address: "127.0.0.1"
  server-port: 1337
  client-autoreconnect-time: 5

client-autoreconnect-time - описывает время, через которое игровой сервер попробует переподключиться в случае отключения прокси сервера.

EXPRESSIONS
CONDITIONS
EFFECTS
EVENTS
SIGNALS
WEB API

Подразделы Sockets

EXPRESSIONS

Получить текущий сервер

Вовзращает текущий игровой сервер

(current|this) server

Получить сервер по названию

Возвращает сервер по названию, под которым он записан в конфигурации прокси сервера.
Если данный сервер не числится в конфигурации прокси сервера - будет возвращено <none>

server %string%

Получить название сервера

server[ ]name of %server%
%server%'s server[ ]name

Получить список серверов

Выражение ниже возвращает список всех серверов описанных в конфигурации прокси сервера.

[all] servers

Получить только те сервера, которые включены. Чтобы сервер был определен как включенный - он должен быть подключен к сокет серверу.

[all] online servers

Получить игроков с сервера

Возвращает список игроков в виде сетевых игроков.

players (from|of|on) %servers%
%servers%'s players

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

Принимает ник игрока или его UUID , возвращает сетевого игрока, или <none>, если игрока нет онлайн

network[ ]player %string%

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

Получить сервер игрока

server of %networkplayer%
%networkplayer%'s server

CONDITIONS

Проверить, что сервер онлайн

%servers% is (online|connected)
%servers% is(n't| not) (online|connected)

Проверить, что игрок онлайн

Позволяет сменить сервер игрока, если он находится на сервере, который подключен к прокси серверу

%offlineplayers% is ([online ]on|connected to) proxy
%offlineplayers% (does|is)(n't| not) ([online ]on|connected to) proxy

EFFECTS

Кикнуть игрока с прокси сервера

Позволяет указать причину. Причина может быть простым текстом, или компонентом AdventureAPI ( Velocity ) или ChatComponentAPI ( Bungeecord ) в формате JSON.

kick %offlineplayers% from proxy [(by reason of|because [of]|on account of|due to) %string%]

Переместить игрока на сервер

Позволяет сменить сервер игрока, если он находится на сервере, который подключен к прокси серверу

switch %offlineplayers% to %server%

EVENTS

Игрок подключился к прокси серверу

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

on player (join|connect)[(ed|s)] [to] proxy [server]

Событие имеет встроенные данные, при помощи event-player можно получить подключенного игрока в виде OfflinePlayer

Игрок отключился с прокси сервера

on player (leave|disconnect)[(ed|s)] [from] proxy [server]

Событие имеет встроенные данные, при помощи event-player можно получить подключенного игрока в виде OfflinePlayer

Текущий сервер подключился к прокси

Вызывается после того, как сервер был подключен к прокси.

on connect(ed|s) [to] proxy [server]
on proxy connect

Текущий сервер отключился от прокси

Вызывается после того, как сервер был отключен от прокси.

on disconnect(ed|s) [from] proxy [server]
on proxy disconnect

Попытка переподключения к прокси

Вызывается когда сервер пытается переподключиться к прокси.

on reconnect(ing|s) [to] proxy [server]
on proxy reconnect

Сервер подключился к прокси

Вызывается после того, как какой-либо сервер подключился к прокси

on server connect(ed|s) [to] proxy [server]

Событие имеет встроенные данные, при помощи event-server можно получить подключенный сервер

Сервер был отключен от прокси

Вызывается после того, как какой-либо сервер отключился от прокси

on server disconnect(ed|s) [from] proxy [server]

Событие имеет встроенные данные, при помощи event-server можно получить отключенный сервер

Игрок подключился к игровому серверу

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

on player (join|connect)[(ed|s)] [to] (proxied|network) server

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

on player (join|connect)[(ed|s)] [to] (proxied|network) server %string%

Событие имеет встроенные данные, при помощи event-server можно получить сервер игрока, а при помощи event-player можно получить игрока в виде OfflinePlayer

Игрок отключился от игрового сервера

Вызывается после того, как игрок отключается от игрового сервера, который подключен к прокси.

on player (leave|disconnect[e])[(d|s)] [from] (proxied|network) server

Выражение ниже позволяет отслеживать отключения только от определенного сервера по его названию.

on player (leave|disconnect[e])[(d|s)] [from] (proxied|network) server %string%

Событие имеет встроенные данные, при помощи event-server можно получить сервер игрока, с которого он вышел, а при помощи event-player можно получить игрока в виде OfflinePlayer

SIGNALS

Сигналы позволяют передавать необходимую вам информацию между серверами.

Создать сигнал

Сигнал имеет вид ключ : значения, позволяет передать любые данные, которые могут быть сериализованны.

signal [(with key|keyed)|(with name|named)] %string% (and|with) [data] %objects%
set {_signal} to signal named "broadcast" with data "Hello world!","My name is Bjork."

Получить ключ сигнала.

(key|signal name) of %signal%
%signal%'s (signal name|key)

Получить данные сигнала

Возвращает список объектов

data of %signal%
%signal%'s data

Отправить сигнал

Позволяет отправить сигнал на какой-либо подключенный сервер

send signal %signals% to %servers%
set {_signal} to signal named "broadcast" with data "Hello world!","My name is Bjork."
send signal {_signal} to all servers

Событие получения сигнала

Позволяет так же отслеживать сигналы по ключу.

signal [(with key|keyed) %string%]

Событие имеет встроенные данные, при помощи event-signal можно получить пришедший сигнал.

on load:
  set {_signal} to signal named "broadcast" with data "Hello world!","My name is Bjork."
  send signal {_signal} to all servers
  
on signal with key "broadcast":
  send data of event-signal to all players, console

WEB API

API позволяет получить информацию с серверов, а так же отправить сигналы из вне.
Убедитесь, что web-сервер включен в настройках Skcrew вашего прокси сервера.

web-server-enabled: true
web-server-port: 1338
web-server-user: admin
web-server-password: admin

Тут вы так же можете конфигурировать порт web-сервера и данные для авторизации, чтобы получить доступ к API.
Авторизация происходит путем передачи логина и пароля в base64 в заголовке запроса:

Authorization: Basic base64_encode("login:password")
curl localhost:1338/players -H "Authorization: Basic YWRtaW46YWRtaW4="

Доступные маршруты для запросов.

GET    /players

Позволяет получить список всех игроков с названием сервера, на котором они находятся.
Возможные параметры:

  • server:string - позволяет получить игроков с определенных серверов

curl localhost:1338/players -H "Authorization: Basic YWRtaW46YWRtaW4="
{
  "data": [
    {
      "name": "Lotzy",
      "uuid": "a0970e26-b9f4-3f73-bd06-ede16c390d34",
      "join_date": 1706008310,
      "time_played": 1089,
      "server_name": "lobby"
    }
  ]
}

GET    /players/{UUID/NICKNAME}

Позволяет получить игрока, если он онлайн, по его нику или UUID. А также сервер целиком, на котором он находится.

curl localhost:1338/players/Lotzy -H "Authorization: Basic YWRtaW46YWRtaW4="
{
  "data": {
    "name": "Lotzy",
    "uuid": "a0970e26-b9f4-3f73-bd06-ede16c390d34",
    "join_date": 1706008310,
    "time_played": 2335,
    "server_name": "lobby",
    "server": {
      "name": "lobby",
      "address": "127.0.0.1",
      "port": 25565,
      "hostname": "127.0.0.1",
      "online": true,
      "connection_date": 1706008017,
      "uptime": 2628,
      "players_count": 1,
      "players": [
        {
          "name": "Lotzy",
          "uuid": "a0970e26-b9f4-3f73-bd06-ede16c390d34",
          "join_date": 1706008310,
          "time_played": 2335,
          "server_name": "lobby"
        }
      ]
    }
  }
}

GET  POST    /players/{UUID/NICKNAME}/kick

Позволяет кикнуть игрока с прокси сервера, по его нику или UUID.
При использовании POST запроса можно указать причину кика. Причина может быть указана как обычным текстом, так и компонентом AdventureAPI ( Velocity ) или ChatComponentAPI ( Bungeecord ) в формате JSON.

curl localhost:1338/players/Lotzy/kick -X POST -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Content-Type: application/json" -d '"GO OUT FROM SERVER"'
{ 
  "data":
    "Player Lotzy kicked"
}

GET    /players/{UUID/NICKNAME}/connect/{SERVER}

Позволяет переместить игрока на другой сервер, по его нику или UUID.

curl localhost:1338/players/Lotzy/connect/lobby -H "Authorization: Basic YWRtaW46YWRtaW4="
{ 
  "data":
    "Player Lotzy connected to server lobby"
}

GET    /servers

Получить список всех серверов и игроков на них.
Возможные параметры:

  • online:boolean - позволяет получить только те сервера, которые включены

curl localhost:1338/servers?online=true -H "Authorization: Basic YWRtaW46YWRtaW4="
{
  "data": [
    {
      "name": "lobby",
      "address": "127.0.0.1",
      "port": 25565,
      "hostname": "127.0.0.1",
      "online": true,
      "connection_date": 1706008017,
      "uptime": 2132,
      "players_count": 1,
      "players": [
        {
          "name": "Lotzy",
          "uuid": "a0970e26-b9f4-3f73-bd06-ede16c390d34",
          "join_date": 1706008310,
          "time_played": 1839,
          "server_name": "lobby"
        }
      ]
    }
  ]
}

POST    /servers/{SERVER}/signal

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

curl localhost:1338/servers/lobby/signal -X POST -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Content-Type: application/json" -d "{'signals':[{'key':'broadcast','data':['Hello world!']}]}"
{ 
  "data": {
    "response": "Signals successfully sended to servers" 
  } 
}

POST    /signal

Позволяет отправить сигнал на подключенные сервера.
В теле запроса передается сам сигнал и список серверов.

curl localhost:1338/servers/lobby/signal -X POST -H "Authorization: Basic YWRtaW46YWRtaW4=" -H "Content-Type: application/json" -d "{'servers':['lobby'],'signals':[{'key':'broadcast','data':['Hello world!']}]}"
{ 
  "data": {
    "response": "Signals successfully sended to servers" 
  } 
}

Пример реализации доступа к API на языке Python вы можете посмотреть по этой ссылке

SQL

Данный модуль позволяет подключаться к СУБД и совершать синхронные и асинхронные запросы.

Специальная благодарность btk5h (Bryan Terce), FranKusmiruk, Govindas, TPGamesNL за поддержку аддона Skript-db . Часть кода и идея была позаимствованны отсюда.

Подключение к СУБД

Инициализирует подключение к СУБД и возвращает это подключение. Возвращает объект типа datasource (com.zaxxer.hikari.HikariDataSource class).

[the] data(base|[ ]source) [(of|at)] %string% [with [a] [max[imum]] [connection] life[ ]time of %timespan%]
set {_database} to "mysql://IP:3306/DATABASENAME?user=USERNAME&password=PASSWORD&useSSL=false"

Асинхронный запрос к СУБД

[async[hronously]] execute %string% [with (data|(param[eter][s])) %objects%] (in|on) %datasource% [and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %objects%]

Первый параметр - выполняемый запрос.
Второй параметр - вставка значений для экранирования. Первый символ ? будет заменен на первое значение из переданного списка во втором аргументе, второй ? на второй из списка и т.д.

execute "select * from ? where name=?" with "books","worldatwar" in {_database}

Первый ? будет заменен на books перед выполнением запроса, а второй на ‘worldatwar’.

Используйте экранирование значений для любых запросов, где используется пользовательский ввод чтобы избежать SQL-инъекций


Третий параметр - подключение к СУБД, объект типа datasource из прошлого выражения.
Последний параметр - куда будет помещен результат запроса, необходимо указать переменную - список. После запроса названия столбцов станут индексами этого списка, значения столбов будут хранится в новом под-списке с названием столбца.

Например у нас есть следующая таблица:

id (INT)name (VARCHAR)age (INT)
1Lotzy22
2w0w019


При выполнении кода:

execute "select * from table" in {_database} and store the result in {_output::*}

Список {_output::*} будет иметь следующий вид:

{_output::id::1} = 1  
{_output::name::1} = "Lotzy"  
{_output::age::1} = 22 
{_output::id::2} = 2  
{_output::name::2} = "w0w0"  
{_output::age::2} = 19
{_output::*} = "id", "name" and "age" 

Асинхронный запрос нельзя использовать в функциях, где возвращается значение. Результатом асинхронного запроса будет <none>

Синхронный запрос к СУБД

sync[hronously] execute %string% [with (data|(param[eter][s])) %objects%] (in|on) %datasource% [and store [[the] (output|result)[s]] (to|in) [the] [var[iable]] %objects%]

Приостанавливает основной поток на время выполнения запроса, используйте с умом.

STRING UTILS

Проверить, что текст соответствует регулярному выражению

%string% (does|is)[n't| not] regex match(es|ed) %string%
if "1361" is regex matches "1..1":
  broadcast "Matched"

Найти группы по регулярному выражению

regex group[s] %integer% of %string% matched to %string%
set {_group::*} to regex group 1 of "123123123123" matched to "123"

Замена по регулярному выражению

regex replace %string% with %string% in %string%
set {_text} to regex replace "3.*" with "" in "123123123123"

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

regex split %string% at %string%
set {_text::*} to regex split "123123123123" at ".3"

Отзеркалить текст

(reverse[d]|backward(s|ed)) [(string|text)] %string%
set {_text} to reversed "321"

Разбить строку каждые N символов

%string% split [(by|at)] every %integer% (symbol|char[acter])[s]
split %string% [(by|at)] every %integer% (symbol|char[acter])[s]
set {_text::*} to "123123123123" split eveny 3 symbols

VIAVERSION

Данный модуль позволяет взаимодействовать с плагином ViaVersion

Для работы модуля необходим плагин ViaVersion

Получить версию клиента игрока в виде текста

[the] version of %player%
%player%'s version

Получить номер протокола клиента игрока

[the] protocol of %player%        
%player%'s protocol

Подразделы World

EFFECTS

Загрузить мир

Загружает мир по его названию. Мир должен находиться в корневой директории сервера.

load world %string%

Выгрузить мир

Выгрузить мир. Так же позволяет не сохранять изменения при выгрузке.

unload [world] %world% [without save]

Загрузить чанк

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

load %chunk% [without gen[erate]]

Выгрузить чанк

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

unload [chunk] %chunk% [without save]

Создать мир

Позволяет так же создать плосский мир.

create world %string% [[with type] [super]flat]

Удалить мир

delete world %world/string%

Создать копию мира

(copy|duplicate) world %string% [(with|using)] name[d] %string%

EXPRESSIONS

Получить главный мир сервера

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

main[ ]world

Получить чанк по его координатам

В данном выражении используются не координаты блоков, а координаты чанка.
Чтобы получить координаты чанка, координата X и Z делятся на 16.

chunk [at] %number%[ ],[ ]%number% (in|at) %world%

Получить всех сущностей внутри чанка

entit(y|ies) (of|in) %chunk%
%chunk%'s entit(y|ies)

Получить все загруженные чанки в мире

[all [[of] the]] loaded chunks (in|at|of) %world%
%world%'s [all [[of] the]] loaded chunks

Постоянная прогрузка чанка

Не поддерживается на версиях ниже чем 1.13.1

Данное выражение поддерживает изменение состояния

force load[ed] of %chunk%
%chunk%'s force load[ed]

Центр барьера мира

Данное выражение поддерживает изменение состояния

[world] border center of %world%
%world%'s [world] border center

Размер барьера мира

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

[world[ ]]border size of %world% [for %-timespan%]
%world%'s [world[ ]]border size [for %-timespan%]
[the] size of %world%'s [world[ ]]border [for %-timespan%]

Conditions

Проверить, что чанк загружен

%chunk% [(does|is)][(n't| not)] load[ed]

Проверить, наличие мира

world %string% [(does|is)][(n't| not)] (exist[s]|available)