Случайные видео
#15+1/2: На ирландской волне... [Let's Play Minecraft]
Небольшой праздничный выпуск в приподнятом настроении и состоянии
Очень компактный сжигатель мусора [Уроки по Minecraft]
И еще одна версия механизма для уничтожения мусора
Ферма опыта: Скелеты за один удар 1.5+ [Уроки по Minecraft]
Обновленная и исправленная версия компактной фермы опыта скелетов
С Новым 2013 Годом! [Special]
Новогодний спецвыпуск с проводами 2012 года
Компактный рычажный портал в Ад в 1.9+ [Уроки по Minecraft]
Очередной вариант постройки автоматического портала в Ад с управлением ...
Блоковые сущности Tile Entity
Cтатья целиком
2
1
Давайте поговорим о блоковых сущностях (tile entity). Некоторые их путают с обычными сущностями (entity), но это в корне неправильно. Блоковые сущности это игровые блоки, несущие дополнительную информацию. Стандартные блоки хранят данные только о своем положении, ID использованного блока и дополнительные 4 бита метаданных (metadata), представляющие собой в общем случае подтип блока, например цвет шерсти. В отличие от них блоковые сущности хранят дополнительные объемы данных, различающихся в зависимости от их типа, а также способны выполнять определенные действия каждый игровой тик. Блоковые сущности не могут перемещаться при помощи поршней. Стандартный набор блоковых сущностей в ванильной (vanilla) версии Minecraft и список дополнительных данных таков:
Таблички - отображаемый на них текст.
Сундуки, раздатчики, печи, варочные стойки, хопперы, сбрасыватели и маяки - список размещенных в них предметов, а печи помимо этого хранят время окончания переплавки текущего предмета и время прогорания топлива.
Спаунеры мобов - данные о сущностях, которые создает данный спаунер, а также данные о времени, позиции и количестве создаваемых сущностей.
Нотные блоки - данные о проигрываемой ноте.
Светодатчик - информация о текущей мощности сигнала.
Поршни - направление и текущий статус.
Смещаемые поршнями блоки - виртуальные блоковые сущности, создаваемые во время перемещения обычных блоков. Хранят данные о смещаемом блоке, направление перемещения и текущую позицию блока.
Проигрыватели - наличие внутри пластинки и её тип.
Столы зачарования - данные о расположенной наверху книге.
Портал в Край и Сундук Края - испускаемые частицы.
Головы мобов - тип головы и опциональное имя.
Компараторы - сила испускаемого сигнала.
Командные блоки - команда и статус её выполнения.
Горшки - размещенный в горшке предмет.
Следует отметить еще одну распространенную ошибку. Некоторые относят динамические блоковые сущности (dynamic tile entity) типа падающего песка и активированного TNT к блоковым сущностям, однако на самом деле они являются обычными сущностями (entity).
Ну а теперь добавим немного конкретики и разберем как выглядит информация о блоковых сущностях с точки зрения её представления в NBT. Для всех блоковых сущностей будет единым наличие следующих параметров в структуре:
CompoundДанные о блоковой сущности (Tile Entity Data)
 └ Stringid: идентификатор блоковой сущности
 └ Intx: позиция по координате X
 └ Inty: позиция по координате Y
 └ Intz: позиция по координате Z
Перечисляемые ниже дополнительные параметры расширяют этот список и, чтобы не путаться, вместо tile entity data я буду указывать тип предмета, к которому относятся эти параметры. Список не полный и может расширяться в новых версиях Minecraft.
CompoundCундук
 └ StringCustomName: название сундука в GUI (опциональное).
 └ ListItems: список предметов в сундуке.
     └ CompoundПредмет включая тэг Slot (от 0 до 26 где ноль это верхний левый угол).
​         └ Подробнее смотрите формат данных NBT для предметов
Двойные сундуки это просто две блоковых сущности, расположенные рядом.
CompoundПечь
 └ StringCustomName: название печи в GUI (опциональное).
 └ ShortBurnTime: количество тиков до прогорания текущего топлива.
 └ ShortCookTime: количество тиков до готовности.
 └ ListItems: список предметов в печи.
     └ CompoundПредмет включая тэг Slot (0 - то, что жарим; 1 - топливо; 2 - слот готовых предметов)
         └ Подробнее смотрите формат данных NBT для предметов
Следует отметить, что готовность текущего перерабатываемого предмета считается тогда, когда значение CookTime достигнет 200 (10 секунд). Если до наступления этого момента переменная BurnTime станет равна нулю (все топливо прогорело), то переменная CookTime тоже приравнивается к нулю (готовка прекращена).
CompoundВарочная стойка
 └ StringCustomName: название стойки в GUI (опциональное).
 └ IntBrewTime: количество тиков, затраченное на текущую готовку.
 └ ListItems: список предметов в стойке.
     └ CompoundПредмет включая тэг Slot (от 0 до 3)
         └ Подробнее смотрите формат данных NBT для предметов
CompoundХоппер (воронка)
 └ StringCustomName: название хоппера в GUI (опциональное).
 └ IntTransferCooldown: задержка в тиках до следующей передачи.
 └ ListItems: список предметов в стойке.
     └ CompoundПредмет включая тэг Slot (от 0 до 4)
         └ Подробнее смотрите формат данных NBT для предметов
Задержка до следующей передачи варьируется в пределах от 1 до 8, а если задано 0, то передача из хоппера не идет.
CompoundРаздатчик (dispenser) или Сбрасыватель (dropper)
 └ StringCustomName: название контейнера в GUI (опциональное).
 └ ListItems: список предметов в раздатчике/сбрасывателе.
     └ CompoundПредмет включая тэг Slot (от 0 до 8)
         └ Подробнее смотрите формат данных NBT для предметов
CompoundЦветочный горшок
 └ IntItem: ID блока, помещенного в горшок.
 └ IntData: значение параметра metadata для блока в горшке.
Стандартными допустимыми значениями для параметра Item будут 6,31,32,40,37,38,39 и 81. В горшках могут размещаться и другие блоки, однако большинство из них просто не будут прорисовываться. Вместе со значением параметра Data, параметр Item определяет какой именно блок выпадет при разрушении горшка. В данном случае значение Data ведет себя аналогично metadata блока, то есть, например, определяет тип саженца, установленного в горшок.
CompoundМаяк
 └ IntLevels: количество доступных уровней пирамиды под маяком.
 └ IntPrimary: базовая аура, смотрите ID эффектов зелий, если 0 то не задано.
 └ IntSecondary: дополнительная аура, смотрите ID эффектов зелий, если 0 то не задано.
CompoundНотный блок
 └ Bytenote: тон/искажение (pitch), по сути количество правых кликов мышью по блоку.
CompoundПроигрыватель
 └ IntRecord: воспроизводимая запись, 0 означает отсутствие записи.
 └ CompoundRecordItem: предмет в проигрывателе, Slot не используется.
     └ Подробнее смотрите формат данных NBT для предметов
CompoundКомпаратор
 └ IntOutputSignal: сила сигнала на выходе компаратора.
CompoundКомандный блок
 └ StringCustomName: название контейнера в GUI (опциональное).
 └ StringCommand: записанная в КБ команда.
 └ StringLastOutput: результат выполнения последней команды с меткой времени.
 └ IntSuccessCount: мощность сигнала на выходе, меняется только при активации.
 └ ByteTrackOutput: значения 0 или 1, не используется в игре, только для отладки.
CompoundПоршень
 └ IntblockId: ID сдвигаемого блока.
 └ IntblockData: значение metadata сдвигаемого блока.
 └ Intfacing: направление в котором сдвигается блок.
 └ Floatprogress: расстояние на которое был сдвинут блок.
 └ Byteextending: значения 0 или 1, единица означает сдвигание блока.
CompoundТабличка
 └ StringText1: первая строка на табличке.
 └ StringText2: вторая строка на табличке.
 └ StringText3: третья строка на табличке.
 └ StringText4: четвертая строка на табличке.
Из каждой строки учитывается только 16 первых символов, остальные (если есть) отбрасываются.
CompoundГолова моба
 └ StringSkullType: тип отображаемой головы.
 └ StringRot: позиция поворота.
 └ StringExtraType: имя игрока, чья голова отображается вместо моба.
Для типов отображаемой головы SkullType доступны следующие значения: 0 - скелет, 1 - скелет-иссушитель, 2 - зомби, 3 - человек, 4 - крипер. Значение переменной Rot может быть следующим: 1 - на полу, 2 - на стене лицом на север, 3 - на стене лицом на юг, 4 - на стене лицом на восток, 5 - на стене лицом на запад.
CompoundСпаунер мобов
 └ StringEntiyId: ID создаваемой сущности, может быть не только мобом.
 └ ShortSpawnCount: количество мобов, которое пытаемся создавать каждый раз.
 └ ShortSpawnRange: радиус в котором создаются вокруг спаунера новые сущности.
 └ ShortDelay: количество тиков до следующего срабатывания спаунера.
 └ ShortMinSpawnDelay: минимальное значение произвольной задержки спауна.
 └ ShortMaxSpawnDelay: максимальное значение произвольной задержки, не меньше 1!
 └ ShortMaxNearbyEntities: максимальное количество сущностей в радиусе спауна.
 └ ShortRequiredPlayerRange: радиус, внутри которого игрок активирует спаунер.
 └ CompoundSpawnData: данные для копирования в следующую создаваемую сущность.
 └ ListSpawnPotentials: список возможных создаваемых сущностей (опциональное).
     └ CompoundПотенциальный следующий создаваемый объект.
         └ StringType: перезаписывает EntityId во время подготовки к следущему спауну.
         └ IntWeight: весовой шанс рождения указанного объекта, значения 1 и выше.
         └ CompoundProperties: потенциальный следующий создаваемый объект.
По умолчанию спаунер ориентируется на значение переменной SpawnData и её данных, однако если задан опциональный список SpawnPotentials, то уже начиная со второго срабатывания спаунера в значение SpawnData будет записываться произвольно выбранная (согласно весу Weight) запись из SpawnPotentials.
Вот приблизительно с таким списком блоковых сущностей мы можем иметь дело в игре. Практически все параметры здесь очевидны и в них легко разобраться. Единственное исключение, пожалуй, составляет создание спаунера мобов или прочих сущностей, но разбор этой темы заслуживает отдельной статьи. Примеров использования приведенных выше данных я показывать не буду, поскольку здесь все очевидно. Подробнее смотрите описание команд по призыву/созданию блоков и у вас все получится. Удачных экспериментов! =D
Наверх