Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 100: | Строка 100: | ||
*getEntitiesFromSpatialView(SpatialView, X_0, Y_0, Z_0, X_1, Y_1, Z_1) - возвращает массив сущностей, которые попадают в коробку с координатами X_0, Y_0, Z_0, X_1, Y_1, Z_1, где нулевые координаты - координаты начала коробки, а первые - конца (У направлен вверх), либо ''null ''в случае ошибки. | *getEntitiesFromSpatialView(SpatialView, X_0, Y_0, Z_0, X_1, Y_1, Z_1) - возвращает массив сущностей, которые попадают в коробку с координатами X_0, Y_0, Z_0, X_1, Y_1, Z_1, где нулевые координаты - координаты начала коробки, а первые - конца (У направлен вверх), либо ''null ''в случае ошибки. | ||
+ | <div class="mw-parser-output"><div class="mw-parser-output"> | ||
== Компоненты скрипта == | == Компоненты скрипта == | ||
Строка 114: | Строка 115: | ||
molangComponent["entity.molangexample"] = 1.0; | molangComponent["entity.molangexample"] = 1.0; | ||
this.needsUpdate(molangComponent);</syntaxhighlight> | this.needsUpdate(molangComponent);</syntaxhighlight> | ||
− | + | <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"> | ||
=== Серверные компоненты === | === Серверные компоненты === | ||
Строка 160: | Строка 160: | ||
**''health ''(по умолчанию 1) - текущее здоровье сущности. | **''health ''(по умолчанию 1) - текущее здоровье сущности. | ||
**''maxHealth ''(по умолчанию 10) - максимальное здоровье, до которого сущность может вылечится. | **''maxHealth ''(по умолчанию 10) - максимальное здоровье, до которого сущность может вылечится. | ||
− | </div> </div> </div> | + | *minecraft:interact - определяет, каким образом игрок может взаимодействовать с сущностью. Имеет для этого следующие свойства: |
+ | **''spawn_entities ''- задает массив ID сущностей, которые призываются при взаимодействии с игроком. | ||
+ | **''on_interact ''- задает строковой ID события, которое вызывается при взаимодействии с игроком. | ||
+ | **''particle_on_start ''- задает эффект частиц в момент начала взаимодействия. Эффект задается объектом со следующими свойствами: | ||
+ | ***''particle_type ''- строковой ID частицы | ||
+ | ***''particle_y_offset ''(по умолчанию 0.0) - смещение эффекта вверх по оси Y | ||
+ | ***''particle_offset_towards_interactor'' (по умолчанию ''false'') - если ''true'', эффект появится ближе к игроку | ||
+ | **''cooldown ''- "охлаждение" - время, через которое сущность может снова взаимодействовать с игроком. По у молчанию 0.0 | ||
+ | **''swing ''(по умолчанию ''false'') - если установлен в true, игрок будет иметь анимацию "swing" (кивок головой) при взаимодействии с сущностью. | ||
+ | **''use_item ''(по умолчанию ''false'') - если установлен в true, при взаимодействии будет тратится прдмет. | ||
+ | **''hurt_item'' (по умолчанию 0) - прочность, на которую будет умньшатся предмет при взаимодействии. | ||
+ | **''interact_text ''- текст, который будет показан на кнопке взаимодействия. | ||
+ | **''add_items.table'' - путь к файлу (относительно корня пакета поведений), в котором хранится информация о предметах, добавляемых в инвентарь после взаимодействия. | ||
+ | **''spawn_items.table'' - путь к файлу (относительно корня пакета поведений), в котором хранится информация о предметах, дропающихся рядом после взаимодействия. | ||
+ | **''transform_to_item ''- используемый прдмет превратится в указанный тут предмет после взаимодействия. Предмет указывается в формате "id:data". | ||
+ | **''play_sounds'' - массив строковых ID звуков, проигрываемых при взаимодействии. | ||
+ | *minecraft:inventory - позволяет управлять инвентарем сущности, но не умеет менять его содержимое (к сожалению). Свойства: | ||
+ | **''container_type ''- задает тип интерфейса, может быть одним из следующих значений: ''horse'', ''minecart_chest'', ''minecart_hopper'', ''inventory'', ''container ''и ''hopper''. | ||
+ | **''inventory_size ''- задает размер инвентаря (количество доступных слотов). По умолчанию 5. | ||
+ | **''can_be_siphoned_from ''(по умолчанию ''false'') - если установлено в true, содержимое инвентаря сущности может быть вытянуто воронкой. | ||
+ | **''private ''(по умолчанию ''false'') - если установлено в true, только сущность имеет доступ к своему инвентарю. | ||
+ | **''restrict_to_owner ''(по умолчанию ''false'') - если установлено в true, доступ к инвентарю сущности имеет только она сама и её владелец. | ||
+ | **''additional_slots_per_strength ''(по умолчанию 0) - количество дополнительных слотов, которые сущность может получить (?). | ||
+ | *minecraft:look_at - заставляет сущность некоторое время "пялиться" на другую сущность. Свойства: | ||
+ | **''filters ''(по умолчанию игрок) - фильтры, которыми определяется, на каких сущностей будет смотреть данная сущность. | ||
+ | **''look_cooldown ''(по умолчанию [0, 0]) - время, которое сущность будет стоять на месте и не будет искать цель/атаковать. Задается массивом из двух чисел (минимальное и максимальное значения). | ||
+ | **''look_event ''- идентификатор события, вызываемого, когда сущности из списка фильтров смотрят на эту сущность. | ||
+ | **''mAllowInvulnerable ''(по умолчанию ''false'') - если установлено в ''true'', сущность будет смотреть даже на игрока в креативе. | ||
+ | **''searchRadius ''(по умолчанию 10.0) - максимальное расстояние в блоках, на котором будет срабатывать событие. | ||
+ | **''setTarget ''(по умолчанию ''true'') - если ''true'', сущность установит объект наблюдения в качестве цели для нападения. | ||
+ | *minecraft:nameable - позволяет настраивать поведение и события сущности, когда к ней применяется бирка. Также позволяет заранее задавать имя сущности. Основные свойства: | ||
+ | **''name_actions ''- объект, представляющий собой описание события назначения имени мобу. Объект имеет следующую структуру: | ||
+ | ***''on_named ''- название события, вызываемого при переименовании, если имя сущности входит в список ''name_filter'' | ||
+ | ***''name_filter ''- список специальніх имен сущностей, для которых сработает событие ''on_named'' | ||
+ | **''default_trigger ''- переключатель, который срабатывает, когда сущность называют. | ||
+ | **''alwaysShow ''(по умолчанию ''false'') - если выставлен в ''true'', имя будет всегда показываться над мобом. | ||
+ | **''allowNameTagRenaming ''(по умолчанию ''true'') - если выставлен в ''true'', сущность можно будет переименовать с помощью бирки. | ||
+ | **''name ''- позволяет задать или получить имя сущности, если оно было задано ранее. | ||
+ | *minecraft:position - позволяет управлять положением сущности в мире. При применении мгновнно перемещает сущность в новое расположение. Свойства - координаты ''x, y z'' сущности entity. | ||
+ | *minecraft:rotation - возмоляет управлять поворотом сущности. Особое внимание стоит уделить свойствам, поскольку их названия семантически некорректны: | ||
+ | **''x'' (по умолчанию 0) - поворот головы вверх-вниз (по оси X). Является состовляющей '''''pitch'''''поворота объекта в общепринятой терминологии. | ||
+ | **y (по умолчанию 0) - поворот головы влево-вправо (по оси Y). Является состовляющей '''''yaw '''''поворота объекта в общепринятой терминологии. | ||
+ | *minecraft:shooter - определяет, какими снарядами сущность будет вести дальний бой (стрельбу). Свойства: | ||
+ | **''def ''- идентификатор сущности, которая будет испольщована для дальнего боя. Для возможности стрельбы у этой сущности должен быть определен компонент projectile. | ||
+ | **''auxVal ''- ID эффекта зелья, который будет применен к сущности при попадании. | ||
+ | *minecraft:spawn_entity - контроллирует способность моба призывать сущность или дроп. В качестве примера из ванильного Minecraft'а - курица, которая несет яйца. Свойста: | ||
+ | **''min_wait_time ''- минимальное время между призывами.в секундах. По умолчанию 300 секунд. | ||
+ | **''max_wait_time ''- максимальное время между призывами в секундах. По умолчанию 600 секунд. | ||
+ | **''spawn_sound ''- строковой ID звука, проигрываемого при спавне сущности. | ||
+ | **''spawn_item ''(по умолчанию egg) - если spawn_entity пустой, задает ID предмета, дропаемого сущностью. | ||
+ | **''spawn_entity ''- задает сущность, которую необходимо свавнить. | ||
+ | **''spawn_method ''- способ появления сущности. По умолчанию - ''born ''(рождение). | ||
+ | **''spawn_event ''- событие, вызываемое при спавне сущности. По умолчанию - ''minecraft:entity_born''. | ||
+ | *minecraft:teleport - задает возможность телепортации сущности (подобно Эндермену). Для разового перемещения используйте компонент minecraft:position. | ||
+ | **''darkTeleportChance ''- вероятность телепорта сущности, если она попадает в темноту. По умолчанию - 0.01. | ||
+ | **''lightTeleportChance'' - вероятность телепорта сущности, если она попадает на солнечный свет. По умолчанию - 0.01. | ||
+ | **''maxRandomTeleportTime ''- максимальное время в секунду между случайными перемещениями. По умолчанию - 20.0. | ||
+ | **''minRandomTeleportTime ''- минимальное время в секунду между случайными перемещениями. По умолчанию - 0.0. | ||
+ | **''randomTeleportCube ''- бокс случайной телепортации. Сущность будет телепортирована в приделах этого куба. Задается массивом из трех элементов - размерностей по осям ''x, y, z'' последовательно. По умолчанию - [32.0, 16.0, 32.0]. | ||
+ | **''randomTeleports ''(по умолчанию ''true'') - если ''true'', сущность будет случайны образом тлепортироваться. | ||
+ | **''targetDistance ''- максимальное расстояние, на которое сущность будет телепортироваться во время атаки. По умолчанию - 16.0. | ||
+ | **''target_teleport_chance ''- вероятность телепортации, по умолчанию 1.0. | ||
+ | |||
+ | === Пользовательские компоненты === | ||
+ | |||
+ | Пользовательские компоненты - особый вид компонентов, которые могут быть опрделены пользователем, но не дают сущности никакого поведения. Компонент должен быть зарегистрирован в Script Engine, для этого необходимо указать его имя и набор полей в формате name: value. После применения компонент ведет себя как и встроенный: вы можете получить его у сущности, изменить его значения и применить изменения. На данный момент пользовательские компоненты - единственные компоненты, которые могут быть добавлены к сущности на лету. Также они не сохраняются при выходе с уровня, поэтому заново присваивать их сущности необходимо при каждом заходе в мир. | ||
+ | |||
+ | Пример регистрации компонента: | ||
+ | <syntaxhighlight lang="Javascript">this.registerComponent("myNamespace:myComponent", { myString: "TamerJeison", myInt: 42, myFloat: 1.0, myArray: [1, 2, 3] }); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | | ||
+ | </div> </div> </div> </div> </div> </div> </div> </div> </div> | ||
== Ссылки == | == Ссылки == |
В 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 находится в бета-версии, для его работы необходимо будет включение экспериментального геймплея в настройках мира.
Структура файлов и папок для пакета поведения со скриптами приведена ниже:
Каждый скрипт должен регистрировать систему (клиентский - клиентскую, серверный - серверную). Достигается это следующим кодом:
var sampleClientSystem == client.registerSystem(0, 0); // Для клиентских скриптов
var sampleServerSystem == server.registerSystem(0, 0); // Для серверных скриптов
Аргументами функции registerSystem является версия Minecraft Script Engine, под которую заточен данный скрипт. В примере выше это версия 0.0. Версии API будут различаться набором функционала и, соответственно, совместимостью с версиями майнкрафта.
Далее необходимо задать нашим системам функции 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. Это работает как в приведенных выше функциях, так и в определенных таким же образом собственных.
Для сущностей используются следующие команды:
Компоненты используются для задания параметров сущностям. По-сути, они являются тем и же компонентами, что используются в пакетах поведения, но могут быть динамически присвоены сущностям во время игры.
События - одна из самых важных частей любой системы. В Minecraft Script Engine для управления событиями используются следующие функции:
Фильтры (Англ. Script Views) - способ отсортировать сущностей на основе их компонентов. Дополнительные возможности фильтрования предоставлют пространственные фильтры. Все фильтры возвращают сущностей, на данный момент прогруженных в мире.
Данный раздел документации посвящен описанию всех компонентов сущностей, доступных в Minecraft Script Engine. Компоненты разделяются на два типа - клиентские и серверные. Подробнее о том, в чем их различие, будет рассказано в соответствующих разделах документации ниже.
Компонент можно добавить к сущности, получить, изменить и убрать из сущности. Чтобы получить и обновить компонент, он должен быть привязан к сущности. Подробнее можно узнать в разделе команд для работы с компонентами выше.
Эти компоненты могут быть использованы только в клиентских скриптах:
var molangComponent = this.createComponent(entity, "minecraft:molang");
molangComponent["entity.molangexample"] = 1.0;
this.needsUpdate(molangComponent);
Серверные компоненты предназначены для использования в серверных скриптах и синхронизируются со всеми клиентами (игроками) в игровом мире. Данные компоннты созданы так, чтобы по-максимуму соответствовать компонентам JSON-формата, использующимся в аддонах. На данный момнт доступны следующие компоненты:
Пользовательские компоненты - особый вид компонентов, которые могут быть опрделены пользователем, но не дают сущности никакого поведения. Компонент должен быть зарегистрирован в Script Engine, для этого необходимо указать его имя и набор полей в формате name: value. После применения компонент ведет себя как и встроенный: вы можете получить его у сущности, изменить его значения и применить изменения. На данный момент пользовательские компоненты - единственные компоненты, которые могут быть добавлены к сущности на лету. Также они не сохраняются при выходе с уровня, поэтому заново присваивать их сущности необходимо при каждом заходе в мир.
Пример регистрации компонента:
this.registerComponent("myNamespace:myComponent", { myString: "TamerJeison", myInt: 42, myFloat: 1.0, myArray: [1, 2, 3] });