Minecraft Script Engine — различия между версиями

(Новая страница: «<div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">'''Вним…»)
 
Строка 1: Строка 1:
<div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">'''Внимание!&nbsp;'''Данная документация предназначена исключительно для ознакомления, так как&nbsp;'''Minecraft Script Engine''' находится в разработке и конечный его вариант может существенно отличаться от текущего.</div>  
+
<div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output"><div class="mw-parser-output">'''Внимание!&nbsp;'''Данная документация предназначена исключительно для ознакомления, так как&nbsp;'''Minecraft Script Engine''' находится в разработке и конечный его вариант может существенно отличаться от текущего.</div>  
 
== Система скриптинга ==
 
== Система скриптинга ==
  
Строка 52: Строка 52:
  
 
Также возможна отладка на ходу, для этого необходимо установить JIT Debugger и модули разработки Javascript&nbsp;в Visual Studio, затем подключиться к процессу Minecraft (''Debug ->&nbsp;Attach to Process''). Теперь с помощью кнопки Pause можно остановить выполнение скрипта и увидеть значения переменных непосредственно в процессе его выполнения. При этом через некоторое время&nbsp;может произойти отключение клиентов от сервера (''time out'').&nbsp;
 
Также возможна отладка на ходу, для этого необходимо установить JIT Debugger и модули разработки Javascript&nbsp;в Visual Studio, затем подключиться к процессу Minecraft (''Debug ->&nbsp;Attach to Process''). Теперь с помощью кнопки Pause можно остановить выполнение скрипта и увидеть значения переменных непосредственно в процессе его выполнения. При этом через некоторое время&nbsp;может произойти отключение клиентов от сервера (''time out'').&nbsp;
</div> </div> </div> </div>
+
 
 +
== Команды ==
 +
 
 +
Все команды выполняются внутри функций с помощью контекста this. Это работает как в приведенных выше функциях, так и в определенных таким же образом собственных.&nbsp;
 +
 
 +
=== Сущности ===
 +
 
 +
Для сущностей используются следующие команды:
 +
 
 +
*createEntity() - создает пустую сущность без <s>признаков жизни</s>&nbsp;компонентов и не добавляет её в мир. Возвращает объект ''EntityObject'', представляющий данную сущность, либо ''null'', если что-то пошло не так.
 +
*createEntity(type, template) - создает сущность с типом ''type ''(собственный тип сущности, должен соответствовать правилам имен переменных) и компонентами, взятыми из сущности текущего пакета поведений (например,&nbsp;''minecraft:cow'').
 +
*destroyEntity(EntityObject)&nbsp; - уничтожает объект&nbsp;''EntityObject ''и делает его невалидным. При этом всесущности данного типа просто убираются из мира (без события смерти).
 +
*isValidEntity(EntityObject) - возвращает ''true'', если&nbsp;''EntityObject ''валден, в противном случае ''false''. Может также возвращать ''null ''при возникновении ошибки.&nbsp;
 +
 
 +
=== Компоненты ===
 +
 
 +
Компоненты используются для задания параметров сущностям. По-сути, они являются тем и же компонентами, что используются в пакетах поведения, но могут быть динамически присвоены сущностям во время игры.
 +
 
 +
*registerComponent(name, data) - регистрирует новый компонент сущности с названием ''name ''и объектом данных ''data''. Рекомендуется называть свои компоненты в формате ''packName:customComponent'' во избежание конфликтов с другими наборами поведений. Возвращает ''ture'', если вызов функции прошел успешно, в противном случае ''null''.&nbsp;
 +
*createComponent(EntityObject, componentName) - создает экземпляр компонента с названием&nbsp;''componentName ''и присваивает его сущности ''EntityObject''. Возвращает объект компонента, если вызов функции прошел успешно, в противном случае ''null''.&nbsp;
 +
*hasComponent(EntityObject, componentName) -&nbsp;возвращает ''true'', если&nbsp;''EntityObject ''содержит компонент с названием ''componentName'', в противном случае ''false''. Может также возвращать ''null ''при возникновении ошибки.&nbsp;
 +
*getComponent(EntityObject, сomponentName) - ищет компонент с именем&nbsp;''componentName''&nbsp;в&nbsp;''EntityObject.'' Возвращает объект компонента, если он есть, в противном случае ''null''.
 +
*applyComponentChanges(componentObject) - применяет изменения в объекте компонента&nbsp;''componentObject''.&nbsp;Возвращает ''ture'', если вызов функции прошел успешно, в противном случае ''null''.&nbsp;
 +
*destroyComponent(EntityObject, сomponentName) - убирает компонент с названием&nbsp;''сomponentName ''из объекта&nbsp;''EntityObject''. На данный моменнт работает только с компонентами, добавленными скриптом, и не работает с компонентами, определенными в JSON.&nbsp;Возвращает ''ture'', если вызов функции прошел успешно, в противном случае ''null''.&nbsp;
 +
 
 +
=== События ===
 +
 
 +
События - одна из самых важных частей любой системы. В&nbsp;'''Minecraft Script Engine&nbsp;'''для управления событиями используются следующие функции:
 +
 
 +
*&nbsp;
 +
 
 +
==== broadcastEvent(EventIdentifier, EventData) - вызывает событие с идентификатором&nbsp;''EventIdentifier ''и данными&nbsp;''EventData''.&nbsp;Возвращает ''ture'', если вызов события прошел успешно, в противном случае ''null''.&nbsp; ====
 +
 
 +
*&nbsp;
 +
 
 +
==== listenForEvent(EventIdentifier, CallbackObject) - подписывает функцию&nbsp;''CallbackObject'' на событие&nbsp;''EventIdentifier''. Событие может быть как собственным (вызваным с помощью&nbsp;''broadcastEvent''), так и внутриигровым.&nbsp;Возвращает ''ture'', если вызов функции прошел успешно, в противном случае ''null''.&nbsp; ====
 +
 
 +
&nbsp;
 +
</div> </div> </div> </div> </div> </div> </div> </div> </div>

Версия 14:48, 25 октября 2018

Внимание! Данная документация предназначена исключительно для ознакомления, так как Minecraft Script Engine находится в разработке и конечный его вариант может существенно отличаться от текущего.

Система скриптинга

В Minecraft Script Engine использован язык программирования Javascript. Скрипты связываются с пакетами поведений, могут отлавливать внутриигровые события и выполнять определенные команды, в частности изменять данные различных компонентов игры.

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

Пример Ссылка
Mob Arena https://aka.ms/minecraftscripting_mobarena
Turn-Based RPG https://aka.ms/minecraftscripting_turnbased

Структура файлов и папок

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

Все скрипты разделены на две основные группы - серверные и клиентские. Серверные скрипты управляют глобальными игровыми событиями, такими как спавн сущностей или изменение их компонентов. Клиентские скрипты обрабатывают лишь отдельные действия, связанные с игроком. Такая структура позволяет избавиться от необходимости разделять кодом серверную и клиентскую логику и создавать скрипты как для одиночной игры (где сервером будет выступать сам клиент), так и для многопользовательской. Следует также отметить, что количество скриптов в одном пакете поведений неограничено, и все скрипты будут запускаться независимо друг от друга. Все скрипты с расширением .js будут автоматически подгружены из папок client и server.

Пока Minecraft Script Engine находится в бета-версии, для его работы необходимо будет включение экспериментального геймплея в настройках мира. 

Структура файлов и папок для пакета поведения со скриптами приведена ниже:

RTENOTITLE

Структура скрипта

Каждый скрипт должен регистрировать систему (клиентский - клиентскую, серверный - серверную). Достигается это следующим кодом:

var sampleClientSystem == client.registerSystem(0, 0); // Для клиентских скриптов
var sampleServerSystem == server.registerSystem(0, 0); // Для серверных скриптов

Далее необходимо задать нашим системам функции initialize,update и shutdown:

sampleSystem.initialize == function() { 
    //Код инициализации 
};
sampleSystem.update == function() { 
    //Код обновления
};
sampleSystem.shutdown == function() { 
    //Код завершения работы 
};

Для отладки кода (обнаружения ошибок и даже построчного выполнения) нам понадобится компьютер с установленной Windows 10, Visual Studio и Minecraft Bedrock Edition

Файлы логов могут быть расположены в различных местах на различных платформах. В Windows 10 это %APPDATA%\..\Local\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\logs.

Также возможна отладка на ходу, для этого необходимо установить JIT Debugger и модули разработки Javascript в Visual Studio, затем подключиться к процессу Minecraft (Debug -> Attach to Process). Теперь с помощью кнопки Pause можно остановить выполнение скрипта и увидеть значения переменных непосредственно в процессе его выполнения. При этом через некоторое время может произойти отключение клиентов от сервера (time out). 

Команды

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

Сущности

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

  • createEntity() - создает пустую сущность без признаков жизни компонентов и не добавляет её в мир. Возвращает объект EntityObject, представляющий данную сущность, либо null, если что-то пошло не так.
  • createEntity(type, template) - создает сущность с типом type (собственный тип сущности, должен соответствовать правилам имен переменных) и компонентами, взятыми из сущности текущего пакета поведений (например, minecraft:cow).
  • destroyEntity(EntityObject)  - уничтожает объект EntityObject и делает его невалидным. При этом всесущности данного типа просто убираются из мира (без события смерти).
  • isValidEntity(EntityObject) - возвращает true, если EntityObject валден, в противном случае false. Может также возвращать null при возникновении ошибки. 

Компоненты

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

  • registerComponent(name, data) - регистрирует новый компонент сущности с названием name и объектом данных data. Рекомендуется называть свои компоненты в формате packName:customComponent во избежание конфликтов с другими наборами поведений. Возвращает ture, если вызов функции прошел успешно, в противном случае null
  • createComponent(EntityObject, componentName) - создает экземпляр компонента с названием componentName и присваивает его сущности EntityObject. Возвращает объект компонента, если вызов функции прошел успешно, в противном случае null
  • hasComponent(EntityObject, componentName) - возвращает true, если EntityObject содержит компонент с названием componentName, в противном случае false. Может также возвращать null при возникновении ошибки. 
  • getComponent(EntityObject, сomponentName) - ищет компонент с именем componentName в EntityObject. Возвращает объект компонента, если он есть, в противном случае null.
  • applyComponentChanges(componentObject) - применяет изменения в объекте компонента componentObject. Возвращает ture, если вызов функции прошел успешно, в противном случае null
  • destroyComponent(EntityObject, сomponentName) - убирает компонент с названием сomponentName из объекта EntityObject. На данный моменнт работает только с компонентами, добавленными скриптом, и не работает с компонентами, определенными в JSON. Возвращает ture, если вызов функции прошел успешно, в противном случае null

События

События - одна из самых важных частей любой системы. В Minecraft Script Engine для управления событиями используются следующие функции:

  •  

broadcastEvent(EventIdentifier, EventData) - вызывает событие с идентификатором EventIdentifier и данными EventData. Возвращает ture, если вызов события прошел успешно, в противном случае null

  •  

listenForEvent(EventIdentifier, CallbackObject) - подписывает функцию CallbackObject на событие EventIdentifier. Событие может быть как собственным (вызваным с помощью broadcastEvent), так и внутриигровым. Возвращает ture, если вызов функции прошел успешно, в противном случае null