TileEntity — различия между версиями

(Created page with "<div class="b-pageLayout b-pageLayout__xs" data-layout="xs" id="pageLayout"><div class="b-pageContent m-pageContent__withoutLeft m-pageContent__withoutRight" i...")
(нет различий)

Версия 21:50, 7 июля 2017

Tile entity - технология, добавляемая Core Engine для быстрого создания интерактивных блоков, таких как сундук или печь, модами. Для регистрации tile entity используется модуль TileEntity. Регистрация производится с помощью привязки к какому то ID блока объекта-прототипа, который будет дополнен и клонирован для каждого tile entity в мире.
 
Регистрация прототипа происходит с помощью метода TileEntity.registerPrototype(id блока, прототип);
 
Объект прототипа обладает набором событий, областью для сохраняемых данных и контейнером, если какие то события не нужны данному типу tile entity, то их просто можно не писать. Внутри событий и методов обращения, обращаться к текущему объекту tile entity нужно через ключевое слово this.
 
Разъяснение всех элементов прототипа:
 
<span class="code">{</span>

<span class="code">     defaultValues: {</span>

<span class="code">          // здесь прописаны все сохраняемые поля и их значения по умолчанию, далее они будут скопированы в поле data</span>

<span class="code">     },</span>

<span class="code">     container: ..., // стандартное для всех tile entity поле, содержит объект контейнера для данного tile entity, подробнее в главе про контейнеры </span>

<span class="code">     liquidStorage: ..., // стандартное для всех tile entity поле, содержит объект хранилища жидкости для данного tile entity, подробнее в главе про жидкости</span>


<span class="code">     created: function(){</span>

<span class="code">          // событие, вызывается при создании tile entity</span>

<span class="code">     },</span>

<span class="code">     </span>

<span class="code">     init: function(){</span>

<span class="code">          // событие, вызывается при инициализации (загрузке в мир) tile entity</span>

<span class="code">     },</span>

<span class="code">     </span>

<span class="code">     tick: function(){</span>

<span class="code">          // событие, вызывается каждый тик</span>

<span class="code">     },</span>


<span class="code">     click: function(id, count, data, coords){</span>

<span class="code">          // событие, вызывается при нажатии на блок tile entity, если возвращает истинное значение, то предотвращает открытие интерфейса</span>

<span class="code">          return false;</span>

<span class="code">     },</span>


<span class="code">     destroyBlock: function(coords, player){</span>

<span class="code">          // событие, вызывается, когда tile entity уничтожается игроком</span>

<span class="code">     },</span>


<span class="code">     redstone: function(params){</span>

<span class="code">          // событие, вызывается, когда на tile entity подается сигнал redstone, или же он прекращает подачу, params.power содержит новую мощность сигнала</span>

<span class="code">     },</span>


<span class="code">     projectileHit: function(coords, projectile){</span>

<span class="code">          // событие, вызывается, когда кидаемый предмет разбивается о данный tile entity, coords.x, coords.y, coords.z - координаты, coords.side - сторона</span>

<span class="code">     },</span>


<span class="code">     destroy: function(){</span>

<span class="code">          // вызывается при попытке уничтожить объект tile entity, если возврращает истинное значение, то предотвращает уничтожение объекта (но не блока, если оно было вызвано уничтожением блока)</span>

<span class="code">     },</span>


<span class="code">     getGuiScreen: function(){</span>

<span class="code">          // событие, вызывается при попытке открыть интерфейс, если возвращает объект интерфейса, то он открывается для данного tile entity, подробнее в разделе про интерфейс</span>

<span class="code">     }, </span>

<span class="code">     </span>

<span class="code">     requireMoreLiquid: function(liquid, amount){</span>

<span class="code">          // событие, вызывается, когда из внутреннего хранилища жидкости пытаются выкачать больше жидкости типа liquid, чем там есть, на amount ведер, подробнее в главе про жидкости</span>

<span class="code">     },</span>

<span class="code">     </span>

<span class="code">     selfDestroy: function(), // стандартный метод, уничтожает объект tile entity, учтите, что будет вызвано событие destroy</span>

<span class="code">}</span>
 
Пример регистрации прототипа:
 
<span class="code">IDRegistry.genBlockID("testBlock");</span>

<span class="code">// ...</span>

<span class="code">// создаем блок</span>


<span class="code">TileEntity.registerPrototype(BlockID.testBlock, {</span>

<span class="code">     defaultValues: {</span>

<span class="code">          someValue: 0 // сохраняемое значение someValue, по умолчанию 0</span>

<span class="code">     },</span>


<span class="code">     tick: function(){</span>

<span class="code">          // что то сделать каждый тик, к примеру выводим someValue</span>

<span class="code">          Debug.message(this.data.someValue);</span>

<span class="code">     },</span>

<span class="code">     </span>

<span class="code">     click: function(id, count, data, coords){</span>

<span class="code">          this.data.someValue = 1; // установить значение someValue на 1</span>

<span class="code">     }</span>

<span class="code">     </span>

<span class="code">     // остальные события не трогаем</span>

<span class="code">});</span>