Продвинутое создание блоков и предметов — различия между версиями

Строка 1: Строка 1:
 
<div class="b-pageLayout b-pageLayout__xs" data-layout="xs" id="pageLayout"><div class="b-pageContent m-pageContent__withoutLeft m-pageContent__withoutRight" id="pageContent">
 
<div class="b-pageLayout b-pageLayout__xs" data-layout="xs" id="pageLayout"><div class="b-pageContent m-pageContent__withoutLeft m-pageContent__withoutRight" id="pageContent">
{| class="b-pageContent__layout"
+
Кроме создания простейших блоков и предметов, Core Engine позволяет настраивать их и добавлять различные события для конкретного блока или предмета.
|-
+
 
| class="b-pageContent__side" |
+
&nbsp;
{| id="internal_wrapper"
+
 
|-
 
| class="b-pageContent__side m-pageContent__side__middle" id="pageContentMiddle" | <div class="b-workZone m-workZone__withoutSideNav" id="workZone" style="height: auto">
 
{| class="b-workZone__layout"
 
|-
 
| class="b-workZone__side m-workZone__side__article" id="workZone_article" | <div class="b-workZone__content" id="workZone_article__content"><div class="b-article" id="article" style="height: auto"><div class="b-article__preWrapper" style="height: auto"><div class="b-article__wrapper" style="height: auto;  min-height: 0px"><div class="b-article__innerWrapper" id="description_on_page_placeholder" style="height: auto"><div class="description_on_page"><div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Кроме создания простейших блоков и предметов, Core Engine позволяет настраивать их и добавлять различные события для конкретного блока или предмета.</div>
 
 
=== Специальные типы блоков ===
 
=== Специальные типы блоков ===
<div class="b-pageLayout b-pageLayout__xs" data-layout="xs" id="pageLayout"><div class="b-pageContent m-pageContent__withoutLeft m-pageContent__withoutRight" id="pageContent">
 
{| class="b-pageContent__layout"
 
|-
 
| class="b-pageContent__side" |
 
{| id="internal_wrapper"
 
|-
 
| class="b-pageContent__side m-pageContent__side__middle" id="pageContentMiddle" | <div class="b-workZone m-workZone__withoutSideNav" id="workZone" style="height: auto">
 
{| class="b-workZone__layout"
 
|-
 
| class="b-workZone__side m-workZone__side__article" id="workZone_article" | <div class="b-workZone__content" id="workZone_article__content"><div class="b-article" id="article" style="height: auto"><div class="b-article__preWrapper" style="height: auto"><div class="b-article__wrapper" style="height: auto;  min-height: 0px"><div class="b-article__innerWrapper" id="description_on_page_placeholder" style="height: auto"><div class="description_on_page"><div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Чтобы создать блок с параметрами, которые отличаются от стандартных (свечение, модель), используются специальные типы блоков. Регистрируются они с помощью функции Block.createSpecialType(объект характеристик) - функция принимает объект характеристик, которые нужно изменить и отдает специальный тип блока с этими характеристиками.</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Специальный тип, созданный этой функцией передается в функцию Block.createBlock и Block.createBlockWithRotation третим параметром, чтобы блок был создан для данного специального типа. На 1 специальном типе может быть создано суммарно до 16 вариаций различных блоков.</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Все характеристики, их значения по-умолчанию и разъяснение:</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><div class="b-pageLayout b-pageLayout__xs" data-layout="xs" id="pageLayout"><div class="b-pageContent m-pageContent__withoutLeft m-pageContent__withoutRight" id="pageContent">
 
{| class="b-pageContent__layout"
 
|-
 
| class="b-pageContent__side" |
 
{| id="internal_wrapper"
 
|-
 
| class="b-pageContent__side m-pageContent__side__middle" id="pageContentMiddle" | <div class="b-workZone m-workZone__withoutSideNav" id="workZone" style="height: auto">
 
{| class="b-workZone__layout"
 
|-
 
| class="b-workZone__side m-workZone__side__article" id="workZone_article" | <div class="b-workZone__content" id="workZone_article__content"><div class="b-article" id="article" style="height: auto"><div class="b-article__preWrapper" style="height: auto"><div class="b-article__wrapper" style="height: auto;  min-height: 0px"><div class="b-article__innerWrapper" id="description_on_page_placeholder" style="height: auto"><div class="description_on_page"><pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><span class="code">{</span>
 
  
<span class="code">     base: 20, // блок из MCPE, который будет взят за основу в создании блока, могут быть скопированы некоторые свойства и материал</span>
+
Чтобы создать блок с параметрами, которые отличаются от стандартных (свечение, модель), используются специальные типы блоков. Регистрируются они с помощью функции Block.createSpecialType(объект характеристик) - функция принимает объект характеристик, которые нужно изменить и отдает специальный тип блока с этими характеристиками.
 +
 
 +
&nbsp;
 +
 
 +
Специальный тип, созданный этой функцией передается в функцию Block.createBlock и Block.createBlockWithRotation третим параметром, чтобы блок был создан для данного специального типа. На 1 специальном типе может быть создано суммарно до 16 вариаций различных блоков.
 +
 
 +
&nbsp;
 +
 
 +
Все характеристики, их значения по-умолчанию и разъяснение:
 +
<pre>{
 +
 
 +
    base: 20, // блок из MCPE, который будет взят за основу в создании блока, могут быть скопированы некоторые свойства и материал
 +
 
 +
    opaque: false, // непрозрачность, если true, то внутри блока мобы будут получать урон, а так же места соприкосновения этого блока с другими не будут отрисованы
 +
 
 +
    rendertype: 0, // тип модели, не работает в 0.15.7 и выше
 +
 
 +
    renderlayer: 4, // тип рендера, 4 означает, что прозрачные части будут отрисованы прозрачными, а не черными
  
<span class="code">    opaque: false, // непрозрачность, если true, то внутри блока мобы будут получать урон, а так же места соприкосновения этого блока с другими не будут отрисованы</span>
+
    destroytime: 1, // не работает в 0.15.0 и выше, время ломания блока
  
<span class="code">    rendertype: 0, // тип модели, не работает в 0.15.7 и выше</span>
+
    redstoneconsumer: true, // будет ли происходить событие изменения редстоун-сигнала для этого блока
  
<span class="code">    renderlayer: 4, // тип рендера, 4 означает, что прозрачные части будут отрисованы прозрачными, а не черными</span>
+
    lightopacity: 1, // непрозрачность для света, сколько света будет поглощаться при прохождении через этот блок, 0 - полностью прозрачен, 15 - полностью непрозрачен
  
<span class="code">    destroytime: 1, // не работает в 0.15.0 и выше, время ломания блока</span>
+
    lightlevel: 0, // свечение блока, 0 - нет свечения, 15 - максимальное свечение
  
<span class="code">    redstoneconsumer: true, // будет ли происходить событие изменения редстоун-сигнала для этого блока</span>
+
    explosionres: 2, // взрывоустойчивость
  
<span class="code">    lightopacity: 1, // непрозрачность для света, сколько света будет поглощаться при прохождении через этот блок, 0 - полностью прозрачен, 15 - полностью непрозрачен</span>
+
    color: [0xFFFFFF] // цвет для каждой стороны в формате 0xRRGGBB, если в массиве 1 элемент, то цвет будет установлен для всего блока
  
<span class="code">    lightlevel: 0, // свечение блока, 0 - нет свечения, 15 - максимальное свечение</span>
+
}
  
<span class="code">    explosionres: 2, // взрывоустойчивость</span>
+
</pre>
  
<span class="code">    color: [0xFFFFFF] // цвет для каждой стороны в формате 0xRRGGBB, если в массиве 1 элемент, то цвет будет установлен для всего блока</span>
+
Пример создания специального типа блока и самого блока:
  
<span class="code">}</span></pre>
+
&nbsp;
<div class="b-pageLayout b-pageLayout__xs" data-layout="xs" id="pageLayout"><div class="b-pageContent m-pageContent__withoutLeft m-pageContent__withoutRight" id="pageContent">
+
<pre>var BLOCK_TYPE_LOW_LIGHT = Block.createSpecialType({ // блок этого типа будет абсолютно прозрачен для света и сам будет слабо светиться
{| class="b-pageContent__layout"
 
|-
 
| class="b-pageContent__side" |
 
{| id="internal_wrapper"
 
|-
 
| class="b-pageContent__side m-pageContent__side__middle" id="pageContentMiddle" | <div class="b-workZone m-workZone__withoutSideNav" id="workZone" style="height: auto">
 
{| class="b-workZone__layout"
 
|-
 
| class="b-workZone__side m-workZone__side__article" id="workZone_article" | <div class="b-workZone__content" id="workZone_article__content"><div class="b-article" id="article" style="height: auto"><div class="b-article__preWrapper" style="height: auto"><div class="b-article__wrapper" style="height: auto;  min-height: 0px"><div class="b-article__innerWrapper" id="description_on_page_placeholder" style="height: auto"><div class="description_on_page"><div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Пример создания специального типа блока и самого блока:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">
 
<span class="code">var BLOCK_TYPE_LOW_LIGHT = Block.createSpecialType({ // блок этого типа будет абсолютно прозрачен для света и сам будет слабо светиться</span>
 
  
<span class="code">    lightlevel: 11,</span>
+
    lightlevel: 11,
  
<span class="code">    lightopacity: 0</span>
+
    lightopacity: 0
  
<span class="code">});</span>
+
});
  
  
<span class="code">IDRegistry.genBlockID("testBlock"); // регистрациа id</span>
+
IDRegistry.genBlockID("testBlock"); // регистрациа id
  
  
<span class="code">Block.createBlock("testBlock", [</span>
+
Block.createBlock("testBlock", [
  
<span class="code">    {name: "test block", texture: [["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0]]}</span>
+
    {name: "test block", texture: [["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0]]}
 +
 
 +
], BLOCK_TYPE_LOW_LIGHT); // создаем блок на данном специальном типе
 +
 
 +
</pre>
 +
 
 +
&nbsp;
 +
 
 +
&nbsp;
  
<span class="code">], BLOCK_TYPE_LOW_LIGHT); // создаем блок на данном специальном типе</span></pre>
 
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div>
 
 
=== Функция дропа (ломания) ===
 
=== Функция дропа (ломания) ===
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">К конкретному блоку можно привязать функцию дропа, которая выполняется при ломании блока с данным id. Делается это с помощью функций Block.registerDropFunction("строковый id блока", функция дропа) и Block.registerDropFunctionForID(числовой id блока, функция дропа)</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Функция дропа имеет такой формат:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><span class="code">function(coords, id, data, diggingLevel, toolLevel){</span>
 
  
<span class="code">    // coords - объект, содержащий координаты разрушенного блока - {x: , y: , z: } - coords.x, coords.y, coords.z</span>
+
К конкретному блоку можно привязать функцию дропа, которая выполняется при ломании блока с данным id. Делается это с помощью функций Block.registerDropFunction("строковый id блока", функция дропа) и Block.registerDropFunctionForID(числовой id блока, функция дропа)
  
<span class="code">    // id, data - id и data блока, id всегда совпадает с тем, на который была зарегистрирована функция и нужно, если одинаковая функция регистрируется на разные блоки</span>
+
&nbsp;
  
<span class="code">     // diggingLevel - уровень ломания блока, где рука или инструмент другого типа - 0. Если же инструмент совпадает с материалом блока, то уровень будет равен уровню инструмента</span>
+
Функция дропа имеет такой формат:
 +
<pre>function(coords, id, data, diggingLevel, toolLevel){
  
<span class="code">    // toolLevel - уровень инструмента в руке, не зависит от самого блока</span>
+
    // coords - объект, содержащий координаты разрушенного блока - {x: , y: , z: } - coords.x, coords.y, coords.z
  
<span class="code">    </span>
+
    // id, data - id и data блока, id всегда совпадает с тем, на который была зарегистрирована функция и нужно, если одинаковая функция регистрируется на разные блоки
  
<span class="code">    // если блок что то дропает, эта функция должна вернуть массив из предметов, которые надо дропнуть, каждый предмет имеет формат [id, count, data]</span>
+
    // diggingLevel - уровень ломания блока, где рука или инструмент другого типа - 0. Если же инструмент совпадает с материалом блока, то уровень будет равен уровню инструмента
  
<span class="code">}</span>
+
    // toolLevel -  уровень инструмента в руке, не зависит от самого блока
  
 +
   
 +
 +
    // если блок что то дропает, эта функция должна вернуть массив из предметов, которые надо дропнуть, каждый предмет имеет формат [id, count, data]
 +
 +
}</pre>
 +
 +
&nbsp;
  
 
Пример:
 
Пример:
 +
<pre>Block.registerDropFunction("testBlock", function(coords, id, data, diggingLevel, toolLevel){
  
<span class="code">Block.registerDropFunction("testBlock", function(coords, id, data, diggingLevel, toolLevel){</span>
+
    return [[id, 1, data], [264, 1, 0]]; // дропнуть сам блок и алмаз
  
<span class="code">    return [[id, 1, data], [264, 1, 0]]; // дропнуть сам блок и алмаз</span>
+
});
  
<span class="code">});</span>
 
  
 +
// Полный аналог предыдущей функции, но с числовым id
  
<span class="code">// Полный аналог предыдущей функции, но с числовым id</span>
+
Block.registerDropFunctionForID(BlockID.testBlock, function(coords, id, data, diggingLevel, toolLevel){
  
<span class="code">Block.registerDropFunctionForID(BlockID.testBlock, function(coords, id, data, diggingLevel, toolLevel){ </span>
+
    return [[id, 1, data], [264, 1, 0]]; // дропнуть сам блок и алмаз
  
<span class="code">    return [[id, 1, data], [264, 1, 0]]; // дропнуть сам блок и алмаз</span>
+
});</pre>
  
<span class="code">});</span></pre>
+
&nbsp;
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div>
+
 
 +
&nbsp;
  
 
=== Функция установки ===
 
=== Функция установки ===
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">К конкретному блоку можно привязать функцию установки, которая выполняется при установке блока с данным id. Если функция зарегистрирована, то вместо стандартной установки блока на потенциальные координаты вызовется она, а из руки отнимется 1 блок. Делается это с помощью функций Block.registerPlaceFunction("строковый id блока", функция установки) и Block.registerPlaceFunctionForID(числовой id блока, функция установки).</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Функция установки имеет такой формат:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><span class="code">function(coords, item, block){</span>
 
  
<span class="code">     // coords - объект, содержащий координаты блока, на который было произведено нажатие - {x: , y: , z: } - coords.x, coords.y, coords.z</span>
+
К конкретному блоку можно привязать функцию установки, которая выполняется при установке блока с данным id. Если функция зарегистрирована, то вместо стандартной установки блока на потенциальные координаты вызовется она, а из руки отнимется 1 блок. Делается это с помощью функций Block.registerPlaceFunction("строковый id блока", функция установки) и Block.registerPlaceFunctionForID(числовой id блока, функция установки).
 +
 
 +
&nbsp;
 +
 
 +
Функция установки имеет такой формат:
 +
<pre>function(coords, item, block){
 +
 
 +
    // coords - объект, содержащий координаты блока, на который было произведено нажатие - {x: , y: , z: } - coords.x, coords.y, coords.z
 +
 
 +
    // coords.relative - объект, содержащий потенциальные координаты установки - {x: , y: , z: } - coords.relative.x, coords.relative.y, coords.relative.z
  
<span class="code">    // coords.relative - объект, содержащий потенциальные координаты установки - {x: , y: , z: } - coords.relative.x, coords.relative.y, coords.relative.z</span>
+
    // item - объект, содержащий предмет в руке игрока - {id: , count: , data: } - item.id, item.count, item.data
  
<span class="code">    // item - объект, содержащий предмет в руке игрока - {id: , count: , data: } - item.id, item.count, item.data</span>
+
    // block - блок, на который было произведено нажатие.
  
<span class="code">    // block - блок, на который было произведено нажатие.</span>
+
 
  
<span class="code">    </span>
+
    // если функция произвела установку основного блока на координаты, отличающиеся от coords.relative, то она должна вернуть их в формате {x: , y: , z: }
  
<span class="code">     // если функция произвела установку основного блока на координаты, отличающиеся от coords.relative, то она должна вернуть их в формате {x: , y: , z: }</span>
+
}</pre>
 +
<div>Пример:<span id="cke_bm_170E" style="display: none">&nbsp;</span></div> <pre>Block.registerPlaceFunction("testBlock", function(coords, item, block){
  
<span class="code">}</span></pre>
+
    World.setBlock(coords.relative.x, coords.relative.y, coords.relative.z, item.id, item.data); // установим наш блок
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Пример:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><span class="code">Block.registerPlaceFunction("testBlock", function(coords, item, block){</span>
 
  
<span class="code">    World.setBlock(coords.relative.x, coords.relative.y, coords.relative.z, item.id, item.data); // установим наш блок</span>
+
    World.setBlock(coords.relative.x, coords.relative.y + 1, coords.relative.z, item.id, item.data); // над ним установим алмазный блок
  
<span class="code">    World.setBlock(coords.relative.x, coords.relative.y + 1, coords.relative.z, item.id, item.data); // над ним установим алмазный блок</span>
+
});
  
<span class="code">});</span>
+
// Полный аналог предыдущей функции, но с числовым id
  
 +
Block.registerPlaceFunctionForID(BlockID.testBlock, function(coords, item, block){
  
<span class="code">// Полный аналог предыдущей функции, но с числовым id</span>
+
    World.setBlock(coords.relative.x, coords.relative.y, coords.relative.z, item.id, item.data); // установим наш блок
  
<span class="code">Block.registerPlaceFunctionForID(BlockID.testBlock, function(coords, item, block){</span>
+
    World.setBlock(coords.relative.x, coords.relative.y + 1, coords.relative.z, item.id, item.data); // над ним установим алмазный блок
  
<span class="code">    World.setBlock(coords.relative.x, coords.relative.y, coords.relative.z, item.id, item.data); // установим наш блок</span>
+
});
 +
 
 +
</pre>
  
<span class="code">    World.setBlock(coords.relative.x, coords.relative.y + 1, coords.relative.z, item.id, item.data); // над ним установим алмазный блок</span>
+
&nbsp;
  
<span class="code">});</span></pre>
 
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div>
 
 
=== Установка формы ===
 
=== Установка формы ===
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Блоку с конкретным id и data можно установить форму, отличную от кубической. Для этого используется функция Block.setBlockShape(числовой id, {x: , y: , z: }, {x: , y: , z: }, data) - принимает id блока, координаты начала и координаты конца, а так же, если вы хотите сделать это для конкретной вариации блока, то определите последний параметр. Координаты в блоке могут быть от 0 до 1, стандартный блок имеет форму (0, 0, 0) - (1, 1, 1)</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Block.setBlockShape(BlockID.testBlock, {x: 0.2, y: 0, z: 0.2}, {x: 0.8, y: 1, z: 0.8}) // установить всем вариациям форму столба</pre>
 
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div>
 
  
=== Установка свойств предметов ===
+
Блоку с конкретным id и data можно установить форму, отличную от кубической. Для этого используется функция Block.setBlockShape(числовой id, {x: , y: , z: }, {x: , y: , z: }, data) - принимает id блока, координаты начала и координаты конца, а так же, если вы хотите сделать это для конкретной вариации блока, то определите последний параметр. Координаты в блоке могут быть от 0 до 1, стандартный блок имеет форму (0, 0, 0) - (1, 1, 1)
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Для установки свойств предметов используется функция Item.describeItem("строковый id", объект описания).</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Все параметры в объекте описания, их стандартные значения и описание:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">
+
 
  category: 0, // категория в креативе</span>
+
&nbsp;
 +
<pre>Block.setBlockShape(BlockID.testBlock, {x: 0.2, y: 0, z: 0.2}, {x: 0.8, y: 1, z: 0.8}) // установить всем вариациям форму столба</pre>
 +
 
 +
&nbsp;
 +
 
 +
=== Установка свойств предмета ===
 +
 
 +
Для установки свойств предметов используется функция Item.describeItem("строковый id", объект описания).
 +
 
 +
&nbsp;
 +
 
 +
Все параметры в объекте описания, их стандартные значения и описание:
 +
<pre>{
 +
 
 +
    category: 0, // категория в креативе
  
  enchant: {value: 0, type: 0}, // тип зачарования</span>
+
    enchant: {value: 0, type: 0}, // тип зачарования
  
  toolRender: false, // рендер в руке, как инструмент</span>
+
    toolRender: false, // рендер в руке, как инструмент
  
  maxDamage: 0, // максимальный дамаг предмета (шкала прочности)</span>
+
    maxDamage: 0, // максимальный дамаг предмета (шкала прочности)
  
  stackByData: false, // стакается по data</span>
+
    stackByData: false, // стакается по data
  
  properties: {}, // родной объект параметров MCPE</span>
+
    properties: {}, // родной объект параметров MCPE
  
  useAnimation: 0 // анимация использозвания</span>
+
    useAnimation: 0 // анимация использозвания
 +
 
 +
}</pre>
 +
 
 +
&nbsp;
 +
 
 +
Функции - аналоги параметров:
  
</pre>
 
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Функции - аналоги параметров:</div>
 
 
*Item.setCategory(id, category) - аналог параметра category  
 
*Item.setCategory(id, category) - аналог параметра category  
 
*Item.setEnchantType(id, enchant, value) - аналог параметра enchant  
 
*Item.setEnchantType(id, enchant, value) - аналог параметра enchant  
Строка 179: Строка 202:
 
*Item.setProperties(id, props) - аналог параметра properties  
 
*Item.setProperties(id, props) - аналог параметра properties  
 
*Item.setUseAnimation(id, animType) - аналог параметра useAnimation  
 
*Item.setUseAnimation(id, animType) - аналог параметра useAnimation  
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Функции - получение параметров:</div>
+
 
 +
&nbsp;
 +
 
 +
Функции - получение параметров:
 +
 
 
*Item.getName(id, data, encode) - отдает имя предмета или блока с данным id и data, если encode true, то возвращает его в формате item.имя.name или block.имя.name  
 
*Item.getName(id, data, encode) - отдает имя предмета или блока с данным id и data, если encode true, то возвращает его в формате item.имя.name или block.имя.name  
 
*Item.getMaxDamage(id) - отдает максимальный дамаг предмета  
 
*Item.getMaxDamage(id) - отдает максимальный дамаг предмета  
Строка 186: Строка 213:
 
*Item.isValid(id, data) - возвращает, существует ли данный предмет  
 
*Item.isValid(id, data) - возвращает, существует ли данный предмет  
 
*Item.isNativeItem(id) - возвращает, является ли этот предмет предметом из MCPE, а не из модов  
 
*Item.isNativeItem(id) - возвращает, является ли этот предмет предметом из MCPE, а не из модов  
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div>
+
 
 +
&nbsp;
 +
 
 +
&nbsp;
  
 
=== Функция использования предмета ===
 
=== Функция использования предмета ===
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">К конкретному предмету можно привязать функцию использования, которая выполняется при использовании предмета с данным id. Делается это с помощью функций Item.registerPlaceFunction("строковый id предмета", функция использования) и Item.registerPlaceFunctionForID(числовой id предмета, функция использования).</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Функция использования имеет такой формат:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><span class="code">function(coords, item, block){</span>
 
  
<span class="code">    // coords - объект, содержащий координаты блока, на который было произведено нажатие - {x: , y: , z: } - coords.x, coords.y, coords.z</span>
+
К конкретному предмету можно привязать функцию использования, которая выполняется при использовании предмета с данным id. Делается это с помощью функций Item.registerPlaceFunction("строковый id предмета", функция использования) и Item.registerPlaceFunctionForID(числовой id предмета, функция использования).
  
<span class="code">    // coords.relative - объект, содержащий потенциальные координаты установки блока - {x: , y: , z: } - coords.relative.x, coords.relative.y, coords.relative.z</span>
+
&nbsp;
  
<span class="code">     // item - объект, содержащий предмет в руке игрока - {id: , count: , data: } - item.id, item.count, item.data</span>
+
Функция использования имеет такой формат:
 +
<pre>function(coords, item, block){
  
<span class="code">    // block - блок, на который было произведено нажатие.</span>
+
    // coords - объект, содержащий координаты блока, на который было произведено нажатие - {x: , y: , z: } - coords.x, coords.y, coords.z
  
<span class="code">}</span></pre>
+
    // coords.relative - объект, содержащий потенциальные координаты установки блока - {x: , y: , z: } - coords.relative.x, coords.relative.y, coords.relative.z
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div>
+
 
 +
    // item - объект, содержащий предмет в руке игрока - {id: , count: , data: } - item.id, item.count, item.data
 +
 
 +
    // block - блок, на который было произведено нажатие.
 +
 
 +
}</pre>
  
 
=== Функция броска предмета ===
 
=== Функция броска предмета ===
<div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">К конкретному предмету можно привязать функцию, которая выполняется при разбивании брошенного предмета с данным id. Делается это с помощью функций Item.registerThrowableFunction("строковый id предмета", функция разбивания) и Item.registerThrowableFunctionForID(числовой id предмета, функция разбивания).</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">&nbsp;</div> <div class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr">Функция разбивания имеет такой формат:</div> <pre class="p" style="text-align: left;  text-indent: 0px;  margin-left: 0px;  direction: ltr"><span class="code">function(projectile, item, target){</span>
 
 
<span class="code">    // projectile - entity кинутого предмета</span>
 
  
<span class="code">    // target - объект, содержащий координаты цели, а так же entity цели, если она является мобом - {x: , y: , z: } - target.x, target.y, target.z и target.entity</span>
+
К конкретному предмету можно привязать функцию, которая выполняется при разбивании брошенного предмета с данным id. Делается это с помощью функций Item.registerThrowableFunction("строковый id предмета", функция разбивания) и Item.registerThrowableFunctionForID(числовой id предмета, функция разбивания).
  
<span class="code">    // item - объект, содержащий предмет, который был брошен - {id: , count: , data: } - item.id, item.count, item.data</span>
+
&nbsp;
  
<span class="code">}</span></pre>
+
Функция разбивания имеет такой формат:
</div> </div> </div> </div> </div> </div>
+
<pre>function(projectile, item, target){
|}
 
</div>
 
|}
 
  
|}
+
    // projectile - entity кинутого предмета
</div> </div> </div> </div> </div> </div> </div> </div>
 
|}
 
</div>
 
|}
 
  
|}
+
    // target - объект, содержащий координаты цели, а так же entity цели, если она является мобом - {x: , y: , z: } - target.x, target.y, target.z и target.entity
</div> </div> </div> </div> </div> </div> </div> </div> </div>
 
|}
 
</div>
 
|}
 
  
|}
+
    // item - объект, содержащий предмет, который был брошен - {id: , count: , data: } - item.id, item.count, item.data
</div> </div> </div> </div> </div> </div> </div> </div>
 
|}
 
</div>
 
|}
 
  
|}
+
}</pre>
 
</div> </div>
 
</div> </div>

Версия 23:02, 7 июля 2017

Кроме создания простейших блоков и предметов, Core Engine позволяет настраивать их и добавлять различные события для конкретного блока или предмета.

 

Специальные типы блоков

Чтобы создать блок с параметрами, которые отличаются от стандартных (свечение, модель), используются специальные типы блоков. Регистрируются они с помощью функции Block.createSpecialType(объект характеристик) - функция принимает объект характеристик, которые нужно изменить и отдает специальный тип блока с этими характеристиками.

 

Специальный тип, созданный этой функцией передается в функцию Block.createBlock и Block.createBlockWithRotation третим параметром, чтобы блок был создан для данного специального типа. На 1 специальном типе может быть создано суммарно до 16 вариаций различных блоков.

 

Все характеристики, их значения по-умолчанию и разъяснение:

{

     base: 20, // блок из MCPE, который будет взят за основу в создании блока, могут быть скопированы некоторые свойства и материал

     opaque: false, // непрозрачность, если true, то внутри блока мобы будут получать урон, а так же места соприкосновения этого блока с другими не будут отрисованы

     rendertype: 0, // тип модели, не работает в 0.15.7 и выше

     renderlayer: 4, // тип рендера, 4 означает, что прозрачные части будут отрисованы прозрачными, а не черными

     destroytime: 1, // не работает в 0.15.0 и выше, время ломания блока

     redstoneconsumer: true, // будет ли происходить событие изменения редстоун-сигнала для этого блока

     lightopacity: 1, // непрозрачность для света, сколько света будет поглощаться при прохождении через этот блок, 0 - полностью прозрачен, 15 - полностью непрозрачен

     lightlevel: 0, // свечение блока, 0 - нет свечения, 15 - максимальное свечение

     explosionres: 2, // взрывоустойчивость

     color: [0xFFFFFF] // цвет для каждой стороны в формате 0xRRGGBB, если в массиве 1 элемент, то цвет будет установлен для всего блока

}

Пример создания специального типа блока и самого блока:

 

var BLOCK_TYPE_LOW_LIGHT = Block.createSpecialType({ // блок этого типа будет абсолютно прозрачен для света и сам будет слабо светиться

     lightlevel: 11,

     lightopacity: 0

});


IDRegistry.genBlockID("testBlock"); // регистрациа id


Block.createBlock("testBlock", [

     {name: "test block", texture: [["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0], ["obsidian", 0]]}

], BLOCK_TYPE_LOW_LIGHT); // создаем блок на данном специальном типе

 

 

Функция дропа (ломания)

К конкретному блоку можно привязать функцию дропа, которая выполняется при ломании блока с данным id. Делается это с помощью функций Block.registerDropFunction("строковый id блока", функция дропа) и Block.registerDropFunctionForID(числовой id блока, функция дропа)

 

Функция дропа имеет такой формат:

function(coords, id, data, diggingLevel, toolLevel){

     // coords - объект, содержащий координаты разрушенного блока - {x: , y: , z: } - coords.x, coords.y, coords.z

     // id, data - id и data блока, id всегда совпадает с тем, на который была зарегистрирована функция и нужно, если одинаковая функция регистрируется на разные блоки

     // diggingLevel - уровень ломания блока, где рука или инструмент другого типа - 0. Если же инструмент совпадает с материалом блока, то уровень будет равен уровню инструмента

     // toolLevel -  уровень инструмента в руке, не зависит от самого блока

    

     // если блок что то дропает, эта функция должна вернуть массив из предметов, которые надо дропнуть, каждый предмет имеет формат [id, count, data]

}

 

Пример:

Block.registerDropFunction("testBlock", function(coords, id, data, diggingLevel, toolLevel){

     return [[id, 1, data], [264, 1, 0]]; // дропнуть сам блок и алмаз

});


// Полный аналог предыдущей функции, но с числовым id

Block.registerDropFunctionForID(BlockID.testBlock, function(coords, id, data, diggingLevel, toolLevel){

     return [[id, 1, data], [264, 1, 0]]; // дропнуть сам блок и алмаз

});

 

 

Функция установки

К конкретному блоку можно привязать функцию установки, которая выполняется при установке блока с данным id. Если функция зарегистрирована, то вместо стандартной установки блока на потенциальные координаты вызовется она, а из руки отнимется 1 блок. Делается это с помощью функций Block.registerPlaceFunction("строковый id блока", функция установки) и Block.registerPlaceFunctionForID(числовой id блока, функция установки).

 

Функция установки имеет такой формат:

function(coords, item, block){

     // coords - объект, содержащий координаты блока, на который было произведено нажатие - {x: , y: , z: } - coords.x, coords.y, coords.z

     // coords.relative - объект, содержащий потенциальные координаты установки - {x: , y: , z: } - coords.relative.x, coords.relative.y, coords.relative.z

     // item - объект, содержащий предмет в руке игрока - {id: , count: , data: } - item.id, item.count, item.data

     // block - блок, на который было произведено нажатие.

   

     // если функция произвела установку основного блока на координаты, отличающиеся от coords.relative, то она должна вернуть их в формате {x: , y: , z: }

}
Пример:
Block.registerPlaceFunction("testBlock", function(coords, item, block){

     World.setBlock(coords.relative.x, coords.relative.y, coords.relative.z, item.id, item.data); // установим наш блок

     World.setBlock(coords.relative.x, coords.relative.y + 1, coords.relative.z, item.id, item.data); // над ним установим алмазный блок

});

// Полный аналог предыдущей функции, но с числовым id

Block.registerPlaceFunctionForID(BlockID.testBlock, function(coords, item, block){

     World.setBlock(coords.relative.x, coords.relative.y, coords.relative.z, item.id, item.data); // установим наш блок

     World.setBlock(coords.relative.x, coords.relative.y + 1, coords.relative.z, item.id, item.data); // над ним установим алмазный блок

});

 

Установка формы

Блоку с конкретным id и data можно установить форму, отличную от кубической. Для этого используется функция Block.setBlockShape(числовой id, {x: , y: , z: }, {x: , y: , z: }, data) - принимает id блока, координаты начала и координаты конца, а так же, если вы хотите сделать это для конкретной вариации блока, то определите последний параметр. Координаты в блоке могут быть от 0 до 1, стандартный блок имеет форму (0, 0, 0) - (1, 1, 1)

 

Block.setBlockShape(BlockID.testBlock, {x: 0.2, y: 0, z: 0.2}, {x: 0.8, y: 1, z: 0.8}) // установить всем вариациям форму столба

 

Установка свойств предмета

Для установки свойств предметов используется функция Item.describeItem("строковый id", объект описания).

 

Все параметры в объекте описания, их стандартные значения и описание:

{

     category: 0, // категория в креативе

     enchant: {value: 0, type: 0}, // тип зачарования

     toolRender: false, // рендер в руке, как инструмент

     maxDamage: 0, // максимальный дамаг предмета (шкала прочности)

     stackByData: false, // стакается по data

     properties: {}, // родной объект параметров MCPE

     useAnimation: 0 // анимация использозвания

}

 

Функции - аналоги параметров:

  • Item.setCategory(id, category) - аналог параметра category
  • Item.setEnchantType(id, enchant, value) - аналог параметра enchant
  • Item.setToolRender(id, enabled) - аналог параметра toolRender
  • Item.setMaxDamage(id, maxdamage) - аналог параметра maxDamage
  • Item.setStackedByData(id, enabled) - аналог параметра stackByData
  • Item.setProperties(id, props) - аналог параметра properties
  • Item.setUseAnimation(id, animType) - аналог параметра useAnimation

 

Функции - получение параметров:

  • Item.getName(id, data, encode) - отдает имя предмета или блока с данным id и data, если encode true, то возвращает его в формате item.имя.name или block.имя.name
  • Item.getMaxDamage(id) - отдает максимальный дамаг предмета
  • Item.getMaxStack(id) - отдает размер стака
  • Item.getUseAnimation(id) - отдает анимацию использования
  • Item.isValid(id, data) - возвращает, существует ли данный предмет
  • Item.isNativeItem(id) - возвращает, является ли этот предмет предметом из MCPE, а не из модов

 

 

Функция использования предмета

К конкретному предмету можно привязать функцию использования, которая выполняется при использовании предмета с данным id. Делается это с помощью функций Item.registerPlaceFunction("строковый id предмета", функция использования) и Item.registerPlaceFunctionForID(числовой id предмета, функция использования).

 

Функция использования имеет такой формат:

function(coords, item, block){

     // coords - объект, содержащий координаты блока, на который было произведено нажатие - {x: , y: , z: } - coords.x, coords.y, coords.z

     // coords.relative - объект, содержащий потенциальные координаты установки блока - {x: , y: , z: } - coords.relative.x, coords.relative.y, coords.relative.z

     // item - объект, содержащий предмет в руке игрока - {id: , count: , data: } - item.id, item.count, item.data

     // block - блок, на который было произведено нажатие.

}

Функция броска предмета

К конкретному предмету можно привязать функцию, которая выполняется при разбивании брошенного предмета с данным id. Делается это с помощью функций Item.registerThrowableFunction("строковый id предмета", функция разбивания) и Item.registerThrowableFunctionForID(числовой id предмета, функция разбивания).

 

Функция разбивания имеет такой формат:

function(projectile, item, target){

     // projectile - entity кинутого предмета

     // target - объект, содержащий координаты цели, а так же entity цели, если она является мобом - {x: , y: , z: } - target.x, target.y, target.z и target.entity

     // item - объект, содержащий предмет, который был брошен - {id: , count: , data: } - item.id, item.count, item.data

}