Minecraft Script Engine — возможности и ограничения

В данной статье я хотел бы проанализировать все, что на данный момент известно про Minecraft Script Engine (ранее упоминавшийся во многих ресурсах как Script API/Scripting API) и составить некое полноценное виденье того, что это и для чего может быть применено. Сразу оговорю, что данная статья написана 25.10.2018 и может содержать неактуальные на момент прочтения сведения. Также на данный момент у меня нет возможности запускать и тестировать приведенные ниже примеры, поскольку возможности доступны только в закрытой бете игры.

Итак, тщательно ознакомившись с документацией по Minecraft Script Engine (и даже переведя большую её часть) и примерами, я смог сложить для себя определенное мнение о данной платформе. Попробую описать это в срезе плюсов/минусов по сравнению с InnerCore/BlockLauncher.

Итак, несомненные преимущества:

  • Отсутствие необходимости устанавливать дополнительное программное обеспечение
  • Официальная поддержка от Mojang и, вероятно, частые обновления
  • Поддержка клиент-серверной архитектуры заложена в самом приложении, полное разделение клиентской и серверной логики
  • Используется уже известный нам язык программирования JavaScript и его формат хранения данных — JSON.
  • Возможность полноценной отладки с помощью отладчика JIT Debug (Visual Studio).
  • Для создания интерфейсов используется формат WEB-страниц (HTML5), что позволяет с легкостью создавать окна и достаточно просто с ними работать.
  • Возможна прямая работа с пакетами поведений, что несомненно является плюсом для тех, кто умеет с ними работать.
  • Сохранена архитектура пакетов поведений, многие функции принимают аргументы в том же формате, в  котором они используются в JSON-файлах поведений.
  • Сами скрипты являются частью пакетов поведений, а значит, их можно упаковывать в архивы с пакетами ресурсов и картами.

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

  • Файловая система. Несомненно лучше, чем один файл ModPE (что решается с помощью системы сборки NIDE), но далека от гибкости и мощности файловой системы InnerCore. Все скрипты Minecraft Script Engine являются независимыми исполняемыми файлами и коммуницируют только на уровне событий.
  • Архитектура. В ванильном варианте архитектура скрипта очень ограниченна контекстом вызова функций. Нужно либо объявлять все функции в пространстве имен системы (см. документацию), либо передавать во все функции, использующие API Script Engine’a, контекст их выполнения. Яркий пример:
var system = client.registerSystem(0,0);
system.initialize = function() {
    // Обратите внимание на поддержку стрелочных функций
    this.listenForEvent("minecraft:client_entered_world", 
        (eventData) => this.playerJoin());
    // Альтернативный вариант - передать контекст 
    // в качестве параметра обычной функции
    this.listenForEvent("minecraft:client_entered_world", 
        (eventData) => playerJoin(this));
}
// Функции приходится объявлять так
system.playerJoin = function() { 
    this.broadcastEvent("minecraft:display_chat_event ", 
        "Hello, world!");
}
// Альтернативный вариант - передать контекст в качестве параметра
function playerJoin(ctx){
    ctx.broadcastEvent("minecraft:display_chat_event ", 
        "Hello, world!");
}
  •  Использование команд командного блока в качестве команд. Разбирая примеры, приведенные в документации, я часто наталкивался на подобные строки:
this.broadcastEvent("minecraft:execute_command", 
    "/fill -6 0 -4 -6 7 -4 barrier");
this.broadcastEvent("minecraft:execute_command", 
    "/tp @a -5.87 8 -4.0 -28 40");
this.broadcastEvent("minecraft:execute_command", 
    "/clear @p");

Вроде бы хорошо, в чем проблема? А их даже 2, а именно: читабельность (этот код сложно назвать интуитивно понятным) и скорость выполнения. Поскольку парсер команд — штука относительно медленная, вызывать подобные методы достаточно часто нельзя в принципе — слишком высокая нагрузка на клиент/сервер, так как команда будет передана из Minecraft Script Engine парсеру команд командного блока, а уже он её превратит в набор необходимых аргументов и вызовет нужные функции. Процесс, мягко говоря, медленный. Хотя, с другой стороны, гибкость этого метода все равно остается на высоте.

  • Повторюсь, но отсутствие читабельности кода. Для того, чтобы получить всех сущностей в мире, например, нужно выполнить следующий код:
var view = this.registerView();
let entities = this.getEntitiesFromView(customView);

Согласитесь, не очень очевидно, о чем речь?)

  • Отсутствие доступа к внешнему миру. В отличии от Inner Core & BlockLauncher, разработчики Minecraft Script Engine ни за что не предоставят доступ к Java (безопасность для них прежде всего). Тем не менее, запуск чего-либо «в коробке» сразу урезает возможности АПИ в разы.
  • Наконец, полная недоделанность. Я все-таки отнесу это к минусам, хотя и понимаю, что большая часть функционала будет ждать нас впереди.

Моё личное мнение — не стоит возлагать больших надежд на Minecraft Script Engine. В корне неправильная архитектура и ограничения, связанные с безопасностью и скоростью работы, сделают это АПИ лишь очередным инструментом для создания карт либо отдельных модов, слабо интегрируемых друг с другом, следующей ступенью после пакетов поведений и текстур.

Что будет на самом деле — время покажет. Ваши предположения жду в комментариях)

Запись опубликована в рубрике Minecraft Script Engine. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *