SaloEater (обсуждение | вклад) (Created page with " = СОЗДАНИЕ МОБОВ = Для создания нового моба нужно зарегистрировать его тип с его уникальным id, п...") |
SaloEater (обсуждение | вклад) м |
||
Строка 24: | Строка 24: | ||
Как результат этого кода при нажатии нашим новым предметом в любую точку, там появится моб, который будет стоять на месте и выглядеть примерно так: | Как результат этого кода при нажатии нашим новым предметом в любую точку, там появится моб, который будет стоять на месте и выглядеть примерно так: | ||
− | [[ | + | [https://pp.userapi.com/c638116/v638116224/49ca8/-1HCt15x470.jpg https://pp.userapi.com/c638116/v638116224/49ca8/-1HCt15x470.jpg] |
+ | |||
+ | = КОНТРОЛЛЕРЫ МОБОВ = | ||
+ | |||
+ | Новые типы мобов в Core Engine задаются как объекты, которые обладают набором контроллеров - объектов, каждый из которых обладает набором событий и отвечающих за что- то свое. С помощью настройки и изменения этих контроллеров описывается сам тип мобов. Типы мобов имеют стандартные контроллеры, но так же можно создавать свои, однако про это будет в другой главе. Для настройки контроллера в функцию его настройки передается объект, который содержит все нужные функции и значения, которые нужно изменить в контроллере. В дальнейшей документации для стандартных контроллеров будет приводиться объект со всеми значениями, которые можно изменить, однако если какое-то из них не требуется, его можно просто не прописывать. Методам, которые вызываются '''внутри '''контроллера доступные следующие значения: 1. <span style="font-size:larger;">''this.parent''</span> - объект моба, содержащий все контроллеры 2. <span style="font-size:larger;">''this.entity''</span> - сам моб, на которого будут вызываться все операции с ним (например <span style="font-size:larger;">''Entity.getPosition(this.entity)''</span>)<br/> В большинстве случаев вам не нужно будет добавлять свои контроллеры и вам достаточно будет стандартных: | ||
+ | |||
+ | #<span style="font-size:larger;">''Event Controller (event)''</span> - контроллер событий - это контроллер, настрока которого позволяет добавлять функции, которые будут вызываться, когда с мобом происходит какое то событие. | ||
+ | #<span style="font-size:larger;">''Description Controller (description)''</span> - контроллер описания - это контроллер, который позволяет описать основные параметры моба - его размеры, здоровье и дроп. | ||
+ | #<span style="font-size:larger;">''Visual Controller (visual)''</span> - визуальный контроллер - этот контроллер загружает модели и позволяет оперировать ими меняя их и запуская анимации. Отвечает за внешний вид моба. | ||
+ | #<span style="font-size:larger;">''AI Controller (AI)''</span> - контроллер ИИ (искусственного интеллекта) - это контроллер, который обеспечивает мобу ИИ, совмещая объекты ИИ и управляя ими. | ||
+ | |||
+ | В скобках даны имена, по которым один контроллер может обращаться к другому через this.parent, например к визуальному контроллеру this.parent.visual. | ||
+ | |||
+ | = КОНТРОЛЛЕР СОБЫТИЙ = | ||
+ | |||
+ | Для настройки контроллера событий используется функция | ||
+ | <blockquote> | ||
+ | <сущность>.customizeEvents(custom) | ||
+ | </blockquote> | ||
+ | где '''custom '''- объект, содержащий все события, которые вам требуются. Ниже приведен объект настройки ''(custom)'' со всеми возможными событиями и их описанием: | ||
+ | <blockquote> | ||
+ | {<br/> tick: function() {}, // вызывается каждый игровой тик для моба этого типа<br/> created: function(extra) {}, // вызывается при создании моба данного типа, extra - дополнительные данные, которые могут быть переданы в функцию спавна 5 параметром<br/> loaded: function() {}, // вызывается, когда моб загружается в мир - после создания, входа в мир или загрузки чанка, если игрок был далеко, но подошел достаточно близко<br/> unloaded: function() {}, // вызывается, когда чанк с мобом был выгружен, игрок ушел слишком далеко<br/> removed: function() {}, // вызывается, если моб уничтожен или деспавнился<br/> death: function(attacker) {}, // вызывается, если моб убит, attacker - в случае убийства мобом и игроком в него передается моб-убийца<br/> attackedBy: function(attacker) {}, // вызывается при атаке моба, attacker - атакующий<br/> hurtBy: function(attacker, amount) {}, // вызывается при получении урона, attacker определен если урон получен от моба или игрока<br/> projectileHit: function(projectile) {} // вызывается, когда в моба попадает снаряд, projectile - этот снаряд<br/> } | ||
+ | </blockquote> | ||
+ | '''Пример''': | ||
+ | <blockquote> | ||
+ | var myTestEntity = new MobRegistry.registerEntity("test-entity");<br/> myTestEntity.customizeEvents({<br/> created: function() {<br/> Game.message("Hi!"); // при создании моба напишет "Hi!" в чат<br/> },<br/> attackedBy: function(attacker) {<br/> Game.message("Ouch, " + attacker + "!"); // при атаке моба напишет "Ouch, !" в чат<br/> },<br/> tick: function() {<br/> var position = Entity.getPosition(this.entity); // получаем позицию моба<br/> Particles.addParticle(position.x, position.y + .5, position.z, Native.ParticleType.flame, 0, 0.1, 0); // создаем на позиции моба частицу огня каждый тик }<br/> }); | ||
+ | </blockquote> | ||
+ | = КОНТРОЛЛЕР ОПИСАНИЯ = | ||
+ | |||
+ | Для настроки контроллера описания используется функция | ||
+ | <blockquote> | ||
+ | <сущность>..customizeDescription(custom) | ||
+ | </blockquote> | ||
+ | где '''custom '''- объект, содержащий все настройки описания.<br/> Ниже приведен объект ''(custom)'' со всеми возможными настройками и их описанием: | ||
+ | <blockquote> | ||
+ | {<br/> getHitbox: function() {<br/> return {<br/> w: hitboxWidth,<br/> h: hitboxHeight<br/> }; // возвращает ширину и высоту хитбокса моба, если не задана, его размеры будут 1, 1<br/> },<br/> getHealth: function() { return maxHealth; // возвращает максимальное здоровье моба, которое задается ему при спавне, если не задана, то здоровье будет 20 единиц<br/> },<br/> getNameTag: function() { return "name tag"; // возвращает имя моба, если не задана, имени не будет<br/> },<br/> getDrop: function(attacker) { return dropArray; // возвращает массив возможного дропа при смерти, attacker - если определен, моб-убийца<br/> /* Формат дропа: массив, состоящий из возможных предметов, каждый предмет задается так:<br/> {<br/> id: id предмета: число,<br/> count: кол-во предмета: либо число, либо массив чисел (будет выбрано случайно из массива), либо объект {min: , max: } - кол-во будет выбрано между min и max, включая их<br/> data: метадата предмета, формат аналогичен count<br/> chance: шанс, число от 0 до 1 - вероятность дропа этого предмета<br/> separate: если true, то при количестве больше 1, предмет будет дропнут в виде нескольких предметов, каждый с кол-вом 1<br/> } */<br/> }<br/> } | ||
+ | </blockquote> | ||
+ | '''Пример''': | ||
+ | <blockquote> | ||
+ | myTestEntity.customizeDescription({<br/> getDrop: function() {<br/> return [{<br/> id: 331,<br/> count: {min: 5, max: 10},<br/> separate: true, chance: 0.5<br/> }, // редстоун в кол-ве от 5 до 10<br/> {<br/> id: 264,<br/> count: [1, 1, 3],<br/> separate: true, chance: 0.5<br/> }, // либо 1 либо 3 алмаза, при этом 1 выпадает в 2 раза чаще ];<br/> }<br/> }); | ||
+ | </blockquote> | ||
+ | = МОДЕЛИ МОБОВ ТЕКСТУРЫ = | ||
+ | |||
+ | Текстуры в Core Engine задаются специальным типом объектов и используются для рендера мобов. Текстуры содержат информацию о самой текстуре, ее разрешении, масштабировании и данные для анимации. Для создания текстуры, файл этой текстуры должен присутствовать где-то в папке images в архиве ресурсов мода '''(resources.zip по умолчанию)'''. Чтобы создать объект текстуры нужно вызвать | ||
+ | <blockquote> | ||
+ | new Texture("name") | ||
+ | </blockquote> | ||
+ | где '''name '''- имя текстуры в ресурсах с расширением. У объекта текстуры имеются базовые методы, которые нужны для установки разрешения текстуры: | ||
+ | <blockquote> | ||
+ | <текстура>.setResolution(w, h) - устанавливает разрешение, w, h - высота текстуры в пикселях.<br/> <текстура>.setPixelScale(scale) - устанавливает масштаб пикселей (чем больше, тем больше пикселей помещается на 1 единицу модели. | ||
+ | </blockquote> | ||
+ | К примеру значение 1 = текстурам 16х16, 2 = 32х32 и т.д.). По умолчанию масштаб равен 1 (16х16).<br/> '''Пример''': | ||
+ | |||
+ | Файл bird_blue.png находится в ресурсах и имеет разрешение 128x64. Однако это текстура моба, которая будет использоваться в разрешении вдвое больше стандартного. | ||
+ | <blockquote> | ||
+ | var blue_bird_texture = new Texture("bird_blue.png"); // создадим объект текстуры<br/> blue_bird_texture.setResolution(128, 64); // зададим разрешение<br/> blue_bird_texture.setPixelScale(2); // установим масштабирование | ||
+ | </blockquote> | ||
+ | Так же этот код можно записать короче, в таком формате: | ||
+ | <blockquote> | ||
+ | var blue_bird_texture = new Texture("bird_blue.png").setResolution(128, 64).setPixelScale(2); | ||
+ | </blockquote> | ||
+ | Для создания анимации текстуре используется метод | ||
+ | <blockquote> | ||
+ | .setAnimation(["name1", "name2", ...], delay) | ||
+ | </blockquote> | ||
+ | где '''name1''', '''name2 '''и т.д. - имена файлов кадров анимации, которая будет проигрываться циклично, а '''delay '''- время показа каждого кадра в тиках, если этот параметр не указан, он будет равен 1. | ||
+ | |||
+ | = РЕНДЕРЫ = | ||
+ | |||
+ | Рендеры мобов задают их статичную модель без текстуры, являясь набором параллелепипедов (боксов). Для создания объекта рендера нужно вызвать <span style="font-size:larger;">''new Render()''</span>. Основной метод объекта рендера для его создания это метод | ||
+ | <blockquote> | ||
+ | .setPart("part-name", part-data, {}) | ||
+ | </blockquote> | ||
+ | где '''part-name''' - имя части рендера, которую надо задать, а'''part-data''' - объект, описывающий эту часть.<br/> Стандартный тип рендера, который тут рассматривается имеет следующие части: | ||
+ | |||
+ | #body - тело и основная часть модели, скорее всего вся модель будет описываться через эту часть. | ||
+ | #head - голова, используется, если вам важен поворот. Все последующие части используются в стандартном рендере, только если результат должен выглядеть примерно как модель игрока (плюс минус детали). | ||
+ | #leftArm - левая рука | ||
+ | #rightArm - правая рука | ||
+ | #leftLeg - левая нога | ||
+ | #rightLeg - правая нога | ||
+ | |||
+ | Так же стоит заметить важные особенности системы координат части body: | ||
+ | |||
+ | # Единица системы координат равна 1\16 блока и 1 пикселю текстуры 16х16 | ||
+ | # Ось Y системы координат направлена вниз, остальные оси направлены в нормальных направлениях. | ||
+ | # Позиция моба (его нижняя центральная точка) в этой системе координат будет находиться на координатах (0, 24, 0) | ||
+ | |||
+ | Эта система позаимствована напрямую из MCPE без всяких конвертаций, так что она выглядит немного странно. | ||
+ | |||
+ | '''Формат объекта описания части рендера (part-data)''': | ||
+ | |||
+ | Объект представляет собой массив элементов, каждый из которых может быть боксом (параллелепипедом) или пустым объектом. | ||
+ | <blockquote> | ||
+ | [<br/> Object1,<br/> Object2,<br/> ...<br/> ]; | ||
+ | </blockquote> | ||
+ | Бокс задается в следующем формате: | ||
+ | <blockquote> | ||
+ | {<br/> type: "box", // определяет, что это бокс, а не пустой объект<br/> coords: {x: x, y: y, z: z}, // координаты центра бокса x, y, z<br/> size: {x: x, y: y, z: z}, // размер бокса (x, y, z / ширина, высота, длина),<br/> uv: {x: x, y: y} // координаты текстуры бокса x, y<br/> } | ||
+ | </blockquote> | ||
+ | Пустой объект имеет только параметр coords, все остальные значения не требуются. Кроме того любой объект может иметь параметр children, который является таким же массивом, как и сама часть, но началом его системы координат будет не (0, 0, 0), а координаты части-родителя.<br/> '''Координаты текстур (uv)''':<br/> Текстура на бокс накладывается как показано на рисунке, координаты UV должны быть координатами верхнего левого угла, а размеры бокса должны совпадать с размерами прямоугольников на рисунке. Важно то, что при измененном масштабе текстуры (pixel scale) координаты должны указываться с его учетом (их нужно разделить на масштаб).<br/> [https://pp.userapi.com/c638116/v638116250/55929/mFzqr8DvHOo.jpg [1]] | ||
+ | |||
+ | = МОДЕЛИ = | ||
+ | |||
+ | Модели совмещают текстуру и рендер, являясь полноценной визуальной составляющей, которую можно использовать для мобов. Модель создается с помощью <span style="font-size:larger;">''new EntityModel();''</span> Для задания модели используются следующие методы: | ||
+ | |||
+ | # .setTexture(texture) - устанавливает текстуру, где texture - объект текстуры | ||
+ | # .setRender(render) - устанавливает рендер, где render - объект рендера | ||
+ | # .createAnimation(frames, function(frame) { ... return ; }, delay) - создает анимацию модели, где frames - кол-во кадров анимации, далее идет код, который от номера кадра (от 0 до frames – 1) должен вернуть рендер для этого кадра, если ренден не возвращается, используется предыдущий кадр, delay - задержка между кадрами в тиках, если не указан, равен 1. | ||
+ | |||
+ | '''Пример будет в главе про визуальный контроллер.''' |
Для создания нового моба нужно зарегистрировать его тип с его уникальным id, по которому в последствии моб будет определяться. После создания, объект типа моба будет использоваться для описания этого типа. Для регистрации нового типа мобов используется метод
MobRegistry.registerEntity("name")
где name - уникальное название данного типа мобов. Эта функция возвращает созданный ею объект типа моба. Новый моб по умолчанию не будет иметь стандартную модель, стандартными здоровьем и размерами, не будет обладать искусственным интеллектом (будет стоять на месте) и дропом. Все это ему предстоит добавить. Пример:
var myTestEntity = MobRegistry.registerEntity("test-entity"); // создаем тип моба под названием test-entity и сохраняем его в переменную, этот моб пока ничего не делает и имеет стандартные параметры
Для спавна новых мобов в мир используется функция
Entity.spawnCustom("name", x, y, z) - создает моба типа name на данных координатах и возвращает объект этого моба.
Пример:
IDRegistry.genItemID("test-entity-spawn"); // регистрируем id предмета-спавнера
Item.createItem("test-entity-spawn", "spawn test entity", {name: "stick"}); // создаем предмет- спавнер
Item.registerUseFunction("test-entity-spawn", function(coords, item, block){ // задаем предмету- спавнеру функцию использования
Entity.spawnCustom("test-entity", coords.relative.x + .5, coords.relative.y + .5, coords.relative.z + .5); // при использовании создать моба нашего типа на координатах использования });
Как результат этого кода при нажатии нашим новым предметом в любую точку, там появится моб, который будет стоять на месте и выглядеть примерно так:
Новые типы мобов в Core Engine задаются как объекты, которые обладают набором контроллеров - объектов, каждый из которых обладает набором событий и отвечающих за что- то свое. С помощью настройки и изменения этих контроллеров описывается сам тип мобов. Типы мобов имеют стандартные контроллеры, но так же можно создавать свои, однако про это будет в другой главе. Для настройки контроллера в функцию его настройки передается объект, который содержит все нужные функции и значения, которые нужно изменить в контроллере. В дальнейшей документации для стандартных контроллеров будет приводиться объект со всеми значениями, которые можно изменить, однако если какое-то из них не требуется, его можно просто не прописывать. Методам, которые вызываются внутри контроллера доступные следующие значения: 1. this.parent - объект моба, содержащий все контроллеры 2. this.entity - сам моб, на которого будут вызываться все операции с ним (например Entity.getPosition(this.entity))
В большинстве случаев вам не нужно будет добавлять свои контроллеры и вам достаточно будет стандартных:
В скобках даны имена, по которым один контроллер может обращаться к другому через this.parent, например к визуальному контроллеру this.parent.visual.
Для настройки контроллера событий используется функция
<сущность>.customizeEvents(custom)
где custom - объект, содержащий все события, которые вам требуются. Ниже приведен объект настройки (custom) со всеми возможными событиями и их описанием:
{
tick: function() {}, // вызывается каждый игровой тик для моба этого типа
created: function(extra) {}, // вызывается при создании моба данного типа, extra - дополнительные данные, которые могут быть переданы в функцию спавна 5 параметром
loaded: function() {}, // вызывается, когда моб загружается в мир - после создания, входа в мир или загрузки чанка, если игрок был далеко, но подошел достаточно близко
unloaded: function() {}, // вызывается, когда чанк с мобом был выгружен, игрок ушел слишком далеко
removed: function() {}, // вызывается, если моб уничтожен или деспавнился
death: function(attacker) {}, // вызывается, если моб убит, attacker - в случае убийства мобом и игроком в него передается моб-убийца
attackedBy: function(attacker) {}, // вызывается при атаке моба, attacker - атакующий
hurtBy: function(attacker, amount) {}, // вызывается при получении урона, attacker определен если урон получен от моба или игрока
projectileHit: function(projectile) {} // вызывается, когда в моба попадает снаряд, projectile - этот снаряд
}
Пример:
var myTestEntity = new MobRegistry.registerEntity("test-entity");
myTestEntity.customizeEvents({
created: function() {
Game.message("Hi!"); // при создании моба напишет "Hi!" в чат
},
attackedBy: function(attacker) {
Game.message("Ouch, " + attacker + "!"); // при атаке моба напишет "Ouch, !" в чат
},
tick: function() {
var position = Entity.getPosition(this.entity); // получаем позицию моба
Particles.addParticle(position.x, position.y + .5, position.z, Native.ParticleType.flame, 0, 0.1, 0); // создаем на позиции моба частицу огня каждый тик }
});
Для настроки контроллера описания используется функция
<сущность>..customizeDescription(custom)
где custom - объект, содержащий все настройки описания.
Ниже приведен объект (custom) со всеми возможными настройками и их описанием:
{
getHitbox: function() {
return {
w: hitboxWidth,
h: hitboxHeight
}; // возвращает ширину и высоту хитбокса моба, если не задана, его размеры будут 1, 1
},
getHealth: function() { return maxHealth; // возвращает максимальное здоровье моба, которое задается ему при спавне, если не задана, то здоровье будет 20 единиц
},
getNameTag: function() { return "name tag"; // возвращает имя моба, если не задана, имени не будет
},
getDrop: function(attacker) { return dropArray; // возвращает массив возможного дропа при смерти, attacker - если определен, моб-убийца
/* Формат дропа: массив, состоящий из возможных предметов, каждый предмет задается так:
{
id: id предмета: число,
count: кол-во предмета: либо число, либо массив чисел (будет выбрано случайно из массива), либо объект {min: , max: } - кол-во будет выбрано между min и max, включая их
data: метадата предмета, формат аналогичен count
chance: шанс, число от 0 до 1 - вероятность дропа этого предмета
separate: если true, то при количестве больше 1, предмет будет дропнут в виде нескольких предметов, каждый с кол-вом 1
} */
}
}
Пример:
myTestEntity.customizeDescription({
getDrop: function() {
return [{
id: 331,
count: {min: 5, max: 10},
separate: true, chance: 0.5
}, // редстоун в кол-ве от 5 до 10
{
id: 264,
count: [1, 1, 3],
separate: true, chance: 0.5
}, // либо 1 либо 3 алмаза, при этом 1 выпадает в 2 раза чаще ];
}
});
Текстуры в Core Engine задаются специальным типом объектов и используются для рендера мобов. Текстуры содержат информацию о самой текстуре, ее разрешении, масштабировании и данные для анимации. Для создания текстуры, файл этой текстуры должен присутствовать где-то в папке images в архиве ресурсов мода (resources.zip по умолчанию). Чтобы создать объект текстуры нужно вызвать
new Texture("name")
где name - имя текстуры в ресурсах с расширением. У объекта текстуры имеются базовые методы, которые нужны для установки разрешения текстуры:
<текстура>.setResolution(w, h) - устанавливает разрешение, w, h - высота текстуры в пикселях.
<текстура>.setPixelScale(scale) - устанавливает масштаб пикселей (чем больше, тем больше пикселей помещается на 1 единицу модели.
К примеру значение 1 = текстурам 16х16, 2 = 32х32 и т.д.). По умолчанию масштаб равен 1 (16х16).
Пример:
Файл bird_blue.png находится в ресурсах и имеет разрешение 128x64. Однако это текстура моба, которая будет использоваться в разрешении вдвое больше стандартного.
var blue_bird_texture = new Texture("bird_blue.png"); // создадим объект текстуры
blue_bird_texture.setResolution(128, 64); // зададим разрешение
blue_bird_texture.setPixelScale(2); // установим масштабирование
Так же этот код можно записать короче, в таком формате:
var blue_bird_texture = new Texture("bird_blue.png").setResolution(128, 64).setPixelScale(2);
Для создания анимации текстуре используется метод
.setAnimation(["name1", "name2", ...], delay)
где name1, name2 и т.д. - имена файлов кадров анимации, которая будет проигрываться циклично, а delay - время показа каждого кадра в тиках, если этот параметр не указан, он будет равен 1.
Рендеры мобов задают их статичную модель без текстуры, являясь набором параллелепипедов (боксов). Для создания объекта рендера нужно вызвать new Render(). Основной метод объекта рендера для его создания это метод
.setPart("part-name", part-data, {})
где part-name - имя части рендера, которую надо задать, аpart-data - объект, описывающий эту часть.
Стандартный тип рендера, который тут рассматривается имеет следующие части:
Так же стоит заметить важные особенности системы координат части body:
Эта система позаимствована напрямую из MCPE без всяких конвертаций, так что она выглядит немного странно.
Формат объекта описания части рендера (part-data):
Объект представляет собой массив элементов, каждый из которых может быть боксом (параллелепипедом) или пустым объектом.
[
Object1,
Object2,
...
];
Бокс задается в следующем формате:
{
type: "box", // определяет, что это бокс, а не пустой объект
coords: {x: x, y: y, z: z}, // координаты центра бокса x, y, z
size: {x: x, y: y, z: z}, // размер бокса (x, y, z / ширина, высота, длина),
uv: {x: x, y: y} // координаты текстуры бокса x, y
}
Пустой объект имеет только параметр coords, все остальные значения не требуются. Кроме того любой объект может иметь параметр children, который является таким же массивом, как и сама часть, но началом его системы координат будет не (0, 0, 0), а координаты части-родителя.
Координаты текстур (uv):
Текстура на бокс накладывается как показано на рисунке, координаты UV должны быть координатами верхнего левого угла, а размеры бокса должны совпадать с размерами прямоугольников на рисунке. Важно то, что при измененном масштабе текстуры (pixel scale) координаты должны указываться с его учетом (их нужно разделить на масштаб).
[1]
Модели совмещают текстуру и рендер, являясь полноценной визуальной составляющей, которую можно использовать для мобов. Модель создается с помощью new EntityModel(); Для задания модели используются следующие методы:
Пример будет в главе про визуальный контроллер.