<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.mineprogramming.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=195.211.163.58&amp;*</id>
		<title>mineprogramming wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.mineprogramming.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=195.211.163.58&amp;*"/>
		<link rel="alternate" type="text/html" href="https://wiki.mineprogramming.org/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/195.211.163.58"/>
		<updated>2026-09-11T17:30:22Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_Entity&amp;diff=1666</id>
		<title>InnerCore/Модуль Entity</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_Entity&amp;diff=1666"/>
				<updated>2018-07-16T10:22:38Z</updated>
		
		<summary type="html">&lt;p&gt;195.211.163.58: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
Вся работа с мобами осуществляется через модуль Entity.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
*Entity.getAll() - возвращает Java-массив всех мобов в мире. &lt;br /&gt;
*Entity.getAllJS() - возвращает JavaScript-массив всех мобов в мире. &lt;br /&gt;
*Entity.getExtra(mob, propetry) - возвращает значение свойства propetry сущности mob в виде строки. &lt;br /&gt;
*Entity.putExtra(mob, propetry, value) - записывает свойство propetry со значением value в виде строки сущности mob. &lt;br /&gt;
*Entity.getExtraJson(mob, propetry) - возвращает свойство propetry сущности mob в виде JS-обьекта. &lt;br /&gt;
*Entity.putExtraJson(mob, propetry, value) - записывает свойство propetry со значением value в виде JS-обьекта сущности mob. &lt;br /&gt;
*Entity.addEffect(mob, id, duration, level, [boolean], [boolean]) - ставит сущности mob эффект id продолжительностью duration, уровня level. &lt;br /&gt;
*Entity.clearEffect(mob, id) - удаляет у сущности mob эффект id. &lt;br /&gt;
*Entity.clearEffects(mob) - удаляет у сущности mob все эффекты. &lt;br /&gt;
*Entity.damageEntity(mob, hp) -&amp;amp;nbsp; наносит сущности mob урон в hp единиц. &lt;br /&gt;
*Entity.healEntity(mob, hp) - лечит сущность mob на hp единиц. &lt;br /&gt;
*Entity.getType(a) - возвращает числовой тип сущности mob. &lt;br /&gt;
*Entity.setHitbox(mob, width, height) - устанавливает сущности mob хитбокс высотой width и шириной height. &lt;br /&gt;
*Entity.isExist(mob) - проверяет, существует ли сущность mob. &lt;br /&gt;
*Entity.spawn(x, y, z, id, [extra]) - спавнит существо с типом id, координатами x, y, z и назначает ему extra-свойства. &lt;br /&gt;
*Entity.spawnCustom(name, x, y, z, [extra]) - то же, что и Entity.spawn, но спавнит сущностей со строковым ид name, созданных через MobRegistry. &lt;br /&gt;
*Entity.remove(mob) - удаляет сущность mob из мира. &lt;br /&gt;
*Entity.getCustom(mob) - возвращает прототип сущности mob, если она создана через MobRegistry. &lt;br /&gt;
*Entity.getAge(mob) - возвращает возраст сущности mob.Entity.setAge(mob, age) - устанавливает возраст age сущности mob. &lt;br /&gt;
*Entity.getSkin(mob) - возвращает путь в текстурпаке текстуры сущности mob. &lt;br /&gt;
*Entity.setSkin(mob, texture) - ставит текстуру по пути texture сущности mob. &lt;br /&gt;
*Entity.getRender(mob) - возвращает id рендера сущности mob. &lt;br /&gt;
*Entity.setRender(mob, render) - устанавливает рендером с id render сущности mob. &lt;br /&gt;
*Entity.rideAnimal(rider, riding) - сажает сущность rider на сущность riding. &lt;br /&gt;
*Entity.getNameTag(mob) - возвращает имя сущности mob. &lt;br /&gt;
*Entity.setNameTag(mob, name) - устанавливает сущности mob имя name. &lt;br /&gt;
*Entity.getTarget(mob) - возвращает цель сущности mob. &lt;br /&gt;
*Entity.setTarget(attaker, victim) - ставит сущности attacker цель victim. &lt;br /&gt;
*Entity.setMobile(mob, mobile?) - в зависимости от значения mobile? управляет возможностью сущности mob двигаться. &lt;br /&gt;
*Entity.getSneaking(mob) - проверяет, ползет ли сущность mob. &lt;br /&gt;
*Entity.setSneaking(mob, sneak?) - разрешает или запрещает сущности mob ползти. &lt;br /&gt;
*Entity.getRider(mob) - проверяет, всадник ли сущность mob. &lt;br /&gt;
*Entity.getRiding(mob) - проверяет, сидят ли на сущности mob. &lt;br /&gt;
*Entity.setFire(mob, tick) - заставляет сущность mob гореть в течении tick тиков. &lt;br /&gt;
*Entity.getHealth(mob) - возвращает здоровье сущности mob. &lt;br /&gt;
*Entity.setHealth(mob, hp) - устанавливает здоровье в hp единиц сущности mob. &lt;br /&gt;
*Entity.getMaxHealth(mob) - возвращает максимальное количество здоровья сущности mob. &lt;br /&gt;
*Entity.setMaxHealth(mob, maxhp) - устанавливает максимальное здоровье maxhp сущности mob. &lt;br /&gt;
*Entity.setPosition(mob, x, y, z) - устанавливает сущность mob на координаты x, y, z. &lt;br /&gt;
*Entity.getPosition(mob) - возвращает координаты сущности mob.Entity.addPosition(mob, x, y, z) - относительно перемещает сущность mob на координаты x, y, z. &lt;br /&gt;
*Entity.setVelocity(mob, velx, vely, velz) - устанавливает трехмерное ускорение velx, vely, velz сущности mob. &lt;br /&gt;
*Entity.getVelocity(mob) - возвращает трехмерное ускорение сущности mob. &lt;br /&gt;
*Entity.addVelocity(mob, velx, vely, velz) - добавляет трехмерное ускорение velx, vely, velz сущности mob. &lt;br /&gt;
*Entity.getDistanceBetweenCoords(coords1, coords2) - возвращает расстояние между координатами в обьектах coords1 и coords2. &lt;br /&gt;
*Entity.getDistanceToCoords(mob, coords) - возвращает расстояние от сущности mob до координат в обьекте coords. &lt;br /&gt;
*Entity.getDistanceToEntity(a, b) - возвращает расстояние между сущностями mob1 и mob2. &lt;br /&gt;
*Entity.getLookAngle(mob) - возвращает угол обзора сущности mob. &lt;br /&gt;
*Entity.setLookAngle(mob, jaw, pitch) - устанавливает сущности углы обзора jaw и pitch. &lt;br /&gt;
*Entity.getLookVector(mob) - возвращает вектор взгляда сущности mob. &lt;br /&gt;
*Entity.getLookAt(mob, x, y, z) - возвращает угол обзора сущности mob на координаты x, y, z. &lt;br /&gt;
*Entity.lookAt(a, b, c, d) - устанавливает обзор сущности mob на координаты x, y, z. &lt;br /&gt;
*Entity.moveToTarget(mob1, mob2, params) - передвигает сущность mob1 к сущности mob2 с настройками params. &lt;br /&gt;
*Entity.moveToAngle(mob, angle, params) - передвигает сущность mob на угол angle с настройками params. &lt;br /&gt;
*Entity.moveToLook(mob, params) - перемещает сущность mob в направлении взгляда с настройками params. &lt;br /&gt;
*Entity.getMovingVector(mob) - возвращает вектор движения сущности mob. &lt;br /&gt;
*Entity.getMovingAngle(mob) - возвращает угол передвижения сущности mob. &lt;br /&gt;
*Entity.findNearest(x, y, z) - возвращает ближайшую к координатам x, y, z сущность. &lt;br /&gt;
*Entity.getAllInRange(coords, type, maxRange) - возвращает JS-массив сущностей с типом type в сфере с центром coords и радиусом maxRange. &lt;br /&gt;
*Entity.getInventory(mob, [object], [object]) - возвращает инвентарь сущности mob. &lt;br /&gt;
*Entity.getProjectileItem(mob) - проверяет, является ли сущность mob снарядом, если это так, возвращает ее данные как предмета. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>195.211.163.58</name></author>	</entry>

	<entry>
		<id>https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_ICRender&amp;diff=1546</id>
		<title>InnerCore/Визуальная составляющая ICRender</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_ICRender&amp;diff=1546"/>
				<updated>2018-05-27T07:50:35Z</updated>
		
		<summary type="html">&lt;p&gt;195.211.163.58: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-size:18.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:107%&amp;quot;&amp;gt;Визуальная составляющая ICRender&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Отрисовывать блоки с кастомыми моделями через каллбек крайне неэффективно и в большинстве случаев вызывает сильные лаги. Потому, хоть такая возможность и существует, она крайне ситуативна и будет рассмотрена в другой раз.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;ICRender представляет из себя систему, позволяющую заранее задать то, как будет выглядеть модель при разных условиях. Поскольку модель описывается заранее, а дальше все расчёты происходят в нативном коде, модели ICRender дают крайне малую нагрузку.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Используя модели ICRender для обработки простых условий и их маппинг на координаты, который был рассмотрен ранее, можно создать любой внешний вид блока и в абсолютном большинстве случаев заменить прямой каллбек рендера.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
== Модель ICRender ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Модель ICRender является набором статических моделей, рассмотренных ранее, и условий, при которых они видимы. Чтобы создать пустую модель используется конструктор:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var icRender = new ICRender.Model();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Для добавления статичной модели (они были рассмотрены ранее) в модель ICRender используется метод ''addEntry(model)'', отдающий объект, позволяющий установить условия отрисовки:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var model = new BlockRender.BlockModel(); … modify model ... var entry = icRender.addEntry(model);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Для установки условий отрисовки используется метод полученного объекта ''setCondition(condition)'', где condition - объект условия, которые будут рассмотрены далее:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var entry = icRender.addEntry(model); &lt;br /&gt;
entry.setCondition(…); &lt;br /&gt;
&lt;br /&gt;
// короткая запись&lt;br /&gt;
icRender.addEntry(model).setCondition(…); &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Если условие не было установлено, то данная статичная модель будет всегда видима.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Группы блоков ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Группы блоков в ICRender нужны для создания условий, с ними будут сверяться блоки на каких-либо координатах при проверке условий.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u style=&amp;quot;text-underline:black&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:107%&amp;quot;&amp;gt;Для создания группы используются методы:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.getGroup(&amp;quot;name&amp;quot;) - возвращает группу, зарегистрированную под данным именем, если такой нет, создает новую и регистрирует. Имя нужно для удобства доступа и совместимости между модами (К примеру, все блоки, к которым подключаются провода в Industrial Craft зарегистрированы в группе с именем&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#032f62&amp;quot;&amp;gt;&amp;quot;icwire&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;ICRender.getUnnamedGroup() - создает и возвращает новую группу без имени, используется для создания локальных групп&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;u style=&amp;quot;text-underline:black&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;Методы группы блоков:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;group.add(id, data) - добавляет блок с данным id и data в группу, если вместо data передано число -1, в группу будут добавлены все блоки с этим id group.getName() - возвращает имя группы&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
= Условия =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Любое из перечисленных условий может быть передано как параметр condition в описанных ранее и далее функциях. Каждое условие может быть истринным или ложным, при отрисовке модели ICRender, для того, чтобы какая то статичная модель была видима, у нее не должно быть условий, или условие, переданное в setCondition должно выполняться.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.BLOCK(x, y, z, group, exclude) - условие проверки одного блока на координатах (координаты задаются относительно позиции блока, к примеру, позиция на 1 блок&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;выше будет задаваться как 0, 1, 0). Если параметр exclude false, условие выполнится, если данная группа содержит блок на данных координатах, а если exclude true, то если группа его не содержит.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.NOT(condition) - логический оператор НЕТ от данного условия, выполняется, если данное условие не выполняется.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.AND(condition1, condition2, …) - логический оператор И, принимает 2 или больше условий на вход, выполняется, если все эти условия тоже выполняются.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.OR(condition1, condition2, …) - логический оператор ИЛИ, принимает 2 или больше условий на вход, выполняется, если хотя бы одно из условий тоже выполняется.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
== Пример'' ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Будет рассмотрено достаточно простое и распространенное применение ICRender - создание блока наподобие провода или трубы, который может соединяться с соседними такими же со всех сторон.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var id = … // id блока провода &lt;br /&gt;
var width = 0.5 // толщина провода&lt;br /&gt;
var group = ICRender.getGroup(&amp;quot;testWire&amp;quot;); // группа блоков &lt;br /&gt;
group.add(id, -1); // добавим сам провод в группу&lt;br /&gt;
&lt;br /&gt;
/* Данные про то, какие боксы должны быть видны в зависимости от того, есть на относительных координатах блок из группы или нет. Каждый объект в массиве — это данные для модели и условия: side - относительные координаты, box - координаты бокса. Можно без проблем реализовать модель без этого массива, но так меньше кода и есть разделение между данными модели и ее созданием.*/&lt;br /&gt;
&lt;br /&gt;
var boxes = [&lt;br /&gt;
    {side: [1, 0, 0], box: [0.5 + width / 2, 0.5 - width / 2, 0.5 - width / 2, 1, 0.5 + width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [-1, 0, 0], box: [0, 0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, 1, 0], box: [0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2, 1, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, -1, 0], box: [0.5 - width / 2, 0, 0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, 0, 1], box: [0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, 1]},&lt;br /&gt;
    {side: [0, 0, -1], box: [0.5 - width / 2, 0.5 - width / 2, 0, 0.5 + width / 2, 0.5 + width / 2, 0.5 - width / 2]}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
var model = new ICRender.Model(); // создаем новую модель&lt;br /&gt;
&lt;br /&gt;
model.addEntry(new BlockRenderer.Model(0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, id, 0)); &lt;br /&gt;
// добавляем центральный бокс, который виден всегда&lt;br /&gt;
&lt;br /&gt;
for(var i in boxes){&lt;br /&gt;
    // Получаем относительные координаты и координаты бокса из данных выше &lt;br /&gt;
    var box = boxes[i].box; &lt;br /&gt;
    var side = boxes[i].side;&lt;br /&gt;
&lt;br /&gt;
    /* одним выражением создаем статичную модель из одного бокса (используем текстуру блока с нашим id), добавляем ее в модель ICRender и устанавливаем условие отрисовки    - должен быть блок из созданной ранее группы на данных относительных координатах.*/&lt;br /&gt;
    model.addEntry(new BlockRenderer.Model(box[0], box[1], box[2], box[3], box[4], box[5], id, 0))&lt;br /&gt;
        .setCondition(new ICRender.BLOCK(side[0], side[1], side[2], group, false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// устанавливаем созданную модель блоку&lt;br /&gt;
BlockRenderer.setStaticICRender(id, -1, model);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>195.211.163.58</name></author>	</entry>

	<entry>
		<id>https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_ICRender&amp;diff=1545</id>
		<title>InnerCore/Визуальная составляющая ICRender</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_ICRender&amp;diff=1545"/>
				<updated>2018-05-27T07:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;195.211.163.58: Отмена правки 1544, сделанной 195.211.163.58 (обсуждение)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-size:18.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:107%&amp;quot;&amp;gt;Визуальная составляющая ICRender&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Отрисовывать блоки с кастомыми моделями через каллбек крайне неэффективно и в большинстве случаев вызывает сильные лаги. Потому, хоть такая возможность и существует, она крайне ситуативна и будет рассмотрена в другой раз.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;ICRender представляет из себя систему, позволяющую заранее задать то, как будет выглядеть модель при разных условиях. Поскольку модель описывается заранее, а дальше все расчёты происходят в нативном коде, модели ICRender дают крайне малую нагрузку.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Используя модели ICRender для обработки простых условий и их маппинг на координаты, который был рассмотрен ранее, можно создать любой внешний вид блока и в абсолютном большинстве случаев заменить прямой каллбек рендера.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
== Модель ICRender ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Модель ICRender является набором статических моделей, рассмотренных ранее, и условий, при которых они видимы. Чтобы создать пустую модель используется конструктор:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var icRender = new ICRender.Model();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Для добавления статичной модели (они были рассмотрены ранее) в модель ICRender используется метод ''addEntry(model)'', отдающий объект, позволяющий установить условия отрисовки:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var model = new BlockRender.BlockModel(); … modify model ... var entry = icRender.addEntry(model);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Для установки условий отрисовки используется метод полученного объекта ''setCondition(condition)'', где condition - объект условия, которые будут рассмотрены далее:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var entry = icRender.addEntry(model); &lt;br /&gt;
entry.setCondition(…); &lt;br /&gt;
&lt;br /&gt;
// короткая запись&lt;br /&gt;
icRender.addEntry(model).setCondition(…); &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Если условие не было установлено, то данная статичная модель будет всегда видима.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
== Группы блоков ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Группы блоков в ICRender нужны для создания условий, с ними будут сверяться блоки на каких-либо координатах при проверке условий.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u style=&amp;quot;text-underline:black&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:107%&amp;quot;&amp;gt;Для создания группы используются методы:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.getGroup(&amp;quot;name&amp;quot;) - возвращает группу, зарегистрированную под данным именем, если такой нет, создает новую и регистрирует. Имя нужно для удобства доступа и совместимости между модами (К примеру, все блоки, к которым подключаются провода в Industrial Craft зарегистрированы в группе с именем&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#032f62&amp;quot;&amp;gt;&amp;quot;icwire&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;ICRender.getUnnamedGroup() - создает и возвращает новую группу без имени, используется для создания локальных групп&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;u style=&amp;quot;text-underline:black&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;Методы группы блоков:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;group.add(id, data) - добавляет блок с данным id и data в группу, если вместо data передано число -1, в группу будут добавлены все блоки с этим id group.getName() - возвращает имя группы&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
= Условия =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Любое из перечисленных условий может быть передано как параметр condition в описанных ранее и далее функциях. Каждое условие может быть истринным или ложным, при отрисовке модели ICRender, для того, чтобы какая то статичная модель была видима, у нее не должно быть условий, или условие, переданное в setCondition должно выполняться.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.BLOCK(x, y, z, group, exclude) - условие проверки одного блока на координатах (координаты задаются относительно позиции блока, к примеру, позиция на 1 блок&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;выше будет задаваться как 0, 1, 0). Если параметр exclude false, условие выполнится, если данная группа содержит блок на данных координатах, а если exclude true, то если группа его не содержит.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.NOT(condition) - логический оператор НЕТ от данного условия, выполняется, если данное условие не выполняется.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.AND(condition1, condition2, …) - логический оператор И, принимает 2 или больше условий на вход, выполняется, если все эти условия тоже выполняются.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.OR(condition1, condition2, …) - логический оператор ИЛИ, принимает 2 или больше условий на вход, выполняется, если хотя бы одно из условий тоже выполняется.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример'' ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Будет рассмотрено достаточно простое и распространенное применение ICRender - создание блока наподобие провода или трубы, который может соединяться с соседними такими же со всех сторон.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var id = … // id блока провода var width = 0.5 // толщина провода&lt;br /&gt;
var group = ICRender.getGroup(&amp;quot;testWire&amp;quot;); // группа блоков &lt;br /&gt;
group.add(id, -1); // добавим сам провод в группу&lt;br /&gt;
&lt;br /&gt;
/* Данные про то, какие боксы должны быть видны в зависимости от того, есть на относительных координатах блок из группы или нет. Каждый объект в массиве — это данные для модели и условия: side - относительные координаты, box - координаты бокса. Можно без проблем реализовать модель без этого массива, но так меньше кода и есть разделение между данными модели и ее созданием.*/&lt;br /&gt;
&lt;br /&gt;
var boxes = [&lt;br /&gt;
    {side: [1, 0, 0], box: [0.5 + width / 2, 0.5 - width / 2, 0.5 - width / 2, 1, 0.5 + width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [-1, 0, 0], box: [0, 0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, 1, 0], box: [0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2, 1, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, -1, 0], box: [0.5 - width / 2, 0, 0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, 0, 1], box: [0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, 1]},&lt;br /&gt;
    {side: [0, 0, -1], box: [0.5 - width / 2, 0.5 - width / 2, 0, 0.5 + width / 2, 0.5 + width / 2, 0.5 - width / 2]}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
var model = new ICRender.Model(); // создаем новую модель&lt;br /&gt;
&lt;br /&gt;
model.addEntry(new BlockRenderer.Model(0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, id, 0)); &lt;br /&gt;
// добавляем центральный бокс, который виден всегда&lt;br /&gt;
&lt;br /&gt;
for(var i in boxes){&lt;br /&gt;
    // Получаем относительные координаты и координаты бокса из данных выше &lt;br /&gt;
    var box = boxes[i].box; &lt;br /&gt;
    var side = boxes[i].side;&lt;br /&gt;
&lt;br /&gt;
    /* одним выражением создаем статичную модель из одного бокса (используем текстуру блока с нашим id), добавляем ее в модель ICRender и устанавливаем условие отрисовки    - должен быть блок из созданной ранее группы на данных относительных координатах.*/&lt;br /&gt;
    model.addEntry(new BlockRenderer.Model(box[0], box[1], box[2], box[3], box[4], box[5], id, 0))&lt;br /&gt;
        .setCondition(new ICRender.BLOCK(side[0], side[1], side[2], group, false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// устанавливаем созданную модель блоку&lt;br /&gt;
BlockRenderer.setStaticICRender(id, -1, model);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>195.211.163.58</name></author>	</entry>

	<entry>
		<id>https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_ICRender&amp;diff=1544</id>
		<title>InnerCore/Визуальная составляющая ICRender</title>
		<link rel="alternate" type="text/html" href="https://wiki.mineprogramming.org/index.php?title=InnerCore/%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D1%8E%D1%89%D0%B0%D1%8F_ICRender&amp;diff=1544"/>
				<updated>2018-05-27T07:49:44Z</updated>
		
		<summary type="html">&lt;p&gt;195.211.163.58: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
= &amp;lt;span style=&amp;quot;font-size:18.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:107%&amp;quot;&amp;gt;Визуальная составляющая ICRender&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Отрисовывать блоки с кастомыми моделями через каллбек крайне неэффективно и в большинстве случаев вызывает сильные лаги. Потому, хоть такая возможность и существует, она крайне ситуативна и будет рассмотрена в другой раз.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;ICRender представляет из себя систему, позволяющую заранее задать то, как будет выглядеть модель при разных условиях. Поскольку модель описывается заранее, а дальше все расчёты происходят в нативном коде, модели ICRender дают крайне малую нагрузку.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Используя модели ICRender для обработки простых условий и их маппинг на координаты, который был рассмотрен ранее, можно создать любой внешний вид блока и в абсолютном большинстве случаев заменить прямой каллбек рендера.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&lt;br /&gt;
== Модель ICRender ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Модель ICRender является набором статических моделей, рассмотренных ранее, и условий, при которых они видимы. Чтобы создать пустую модель используется конструктор:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var icRender = new ICRender.Model();&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Для добавления статичной модели (они были рассмотрены ранее) в модель ICRender используется метод ''addEntry(model)'', отдающий объект, позволяющий установить условия отрисовки:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var model = new BlockRender.BlockModel(); … modify model ... var entry = icRender.addEntry(model);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Для установки условий отрисовки используется метод полученного объекта ''setCondition(condition)'', где condition - объект условия, которые будут рассмотрены далее:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var entry = icRender.addEntry(model); &lt;br /&gt;
entry.setCondition(…); &lt;br /&gt;
&lt;br /&gt;
// короткая запись&lt;br /&gt;
icRender.addEntry(model).setCondition(…); &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Если условие не было установлено, то данная статичная модель будет всегда видима.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Группы блоков ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Группы блоков в ICRender нужны для создания условий, с ними будут сверяться блоки на каких-либо координатах при проверке условий.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u style=&amp;quot;text-underline:black&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:107%&amp;quot;&amp;gt;Для создания группы используются методы:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.getGroup(&amp;quot;name&amp;quot;) - возвращает группу, зарегистрированную под данным именем, если такой нет, создает новую и регистрирует. Имя нужно для удобства доступа и совместимости между модами (К примеру, все блоки, к которым подключаются провода в Industrial Craft зарегистрированы в группе с именем&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color:#032f62&amp;quot;&amp;gt;&amp;quot;icwire&amp;quot;)&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''''''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;ICRender.getUnnamedGroup() - создает и возвращает новую группу без имени, используется для создания локальных групп&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;u style=&amp;quot;text-underline:black&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;Методы группы блоков:&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/u&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:135%&amp;quot;&amp;gt;group.add(id, data) - добавляет блок с данным id и data в группу, если вместо data передано число -1, в группу будут добавлены все блоки с этим id group.getName() - возвращает имя группы&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
= Условия =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Любое из перечисленных условий может быть передано как параметр condition в описанных ранее и далее функциях. Каждое условие может быть истринным или ложным, при отрисовке модели ICRender, для того, чтобы какая то статичная модель была видима, у нее не должно быть условий, или условие, переданное в setCondition должно выполняться.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.BLOCK(x, y, z, group, exclude) - условие проверки одного блока на координатах (координаты задаются относительно позиции блока, к примеру, позиция на 1 блок&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;выше будет задаваться как 0, 1, 0). Если параметр exclude false, условие выполнится, если данная группа содержит блок на данных координатах, а если exclude true, то если группа его не содержит.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.NOT(condition) - логический оператор НЕТ от данного условия, выполняется, если данное условие не выполняется.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.AND(condition1, condition2, …) - логический оператор И, принимает 2 или больше условий на вход, выполняется, если все эти условия тоже выполняются.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;''&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:108%&amp;quot;&amp;gt;ICRender.OR(condition1, condition2, …) - логический оператор ИЛИ, принимает 2 или больше условий на вход, выполняется, если хотя бы одно из условий тоже выполняется.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-parser-output&amp;quot;&amp;gt;&amp;lt;h2&amp;gt; Пример&amp;lt;i&amp;gt; &amp;lt;/h2&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:12.0pt&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;line-height:104%&amp;quot;&amp;gt;Будет рассмотрено достаточно простое и распространенное применение ICRender - создание блока наподобие провода или трубы, который может соединяться с соседними такими же со всех сторон.&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;amp;#160;&lt;br /&gt;
&amp;lt;pre class=&amp;quot;fck_mw_syntaxhighlight&amp;quot;&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;Javascript&amp;quot;&amp;gt;var id = … // id блока провода &lt;br /&gt;
var width = 0.5 // толщина провода&lt;br /&gt;
var group = ICRender.getGroup(&amp;amp;quot;testWire&amp;amp;quot;); // группа блоков &lt;br /&gt;
group.add(id, -1); // добавим сам провод в группу&lt;br /&gt;
&lt;br /&gt;
/* Данные про то, какие боксы должны быть видны в зависимости от того, есть на относительных координатах блок из группы или нет. Каждый объект в массиве — это данные для модели и условия: side - относительные координаты, box - координаты бокса. Можно без проблем реализовать модель без этого массива, но так меньше кода и есть разделение между данными модели и ее созданием.*/&lt;br /&gt;
&lt;br /&gt;
var boxes = [&lt;br /&gt;
    {side: [1, 0, 0], box: [0.5 + width / 2, 0.5 - width / 2, 0.5 - width / 2, 1, 0.5 + width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [-1, 0, 0], box: [0, 0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, 1, 0], box: [0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2, 1, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, -1, 0], box: [0.5 - width / 2, 0, 0.5 - width / 2, 0.5 + width / 2, 0.5 - width / 2, 0.5 + width / 2]},&lt;br /&gt;
    {side: [0, 0, 1], box: [0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, 1]},&lt;br /&gt;
    {side: [0, 0, -1], box: [0.5 - width / 2, 0.5 - width / 2, 0, 0.5 + width / 2, 0.5 + width / 2, 0.5 - width / 2]}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
var model = new ICRender.Model(); // создаем новую модель&lt;br /&gt;
&lt;br /&gt;
model.addEntry(new BlockRenderer.Model(0.5 - width / 2, 0.5 - width / 2, 0.5 - width / 2, 0.5 + width / 2, 0.5 + width / 2, 0.5 + width / 2, id, 0)); &lt;br /&gt;
// добавляем центральный бокс, который виден всегда&lt;br /&gt;
&lt;br /&gt;
for(var i in boxes){&lt;br /&gt;
    // Получаем относительные координаты и координаты бокса из данных выше &lt;br /&gt;
    var box = boxes[i].box; &lt;br /&gt;
    var side = boxes[i].side;&lt;br /&gt;
&lt;br /&gt;
    /* одним выражением создаем статичную модель из одного бокса (используем текстуру блока с нашим id), добавляем ее в модель ICRender и устанавливаем условие отрисовки    - должен быть блок из созданной ранее группы на данных относительных координатах.*/&lt;br /&gt;
    model.addEntry(new BlockRenderer.Model(box[0], box[1], box[2], box[3], box[4], box[5], id, 0))&lt;br /&gt;
        .setCondition(new ICRender.BLOCK(side[0], side[1], side[2], group, false));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// устанавливаем созданную модель блоку&lt;br /&gt;
BlockRenderer.setStaticICRender(id, -1, model);&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;amp;#160;&lt;br /&gt;
&amp;amp;lt;/div&amp;amp;gt; &amp;amp;lt;/div&amp;amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>195.211.163.58</name></author>	</entry>

	</feed>