From dc71a7f125a25ecd3abebf9dda33217c22e81ddf Mon Sep 17 00:00:00 2001 From: oO0oO0oO0o0o00 Date: Mon, 5 Jul 2021 13:51:56 +0800 Subject: [PATCH 01/20] added Russian translation by KiperKOMMAND Mailed by zaha******eniy@gmail.com: > Russian translation. If anything, it was KiperKOMMAND. Translated 1-2 months before the 1.17 release. Though the app is temporarily not updated, we're still publishing the person's translation. Thanks. If the folder with name `values-ru` does not work please let us know. --- app/src/main/res/values-ru/strings.xml | 490 +++++++++++++++++++++++++ 1 file changed, 490 insertions(+) create mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..73756e5e --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,490 @@ + + + Blocktopograph + + Приложение, созданное сообществом + + Выберите мир + Мир + Мир + + Открыть панель навигации + Закрыть панель навигации + + Настройки + О (Около) + Помощь + Журнал изменений + + Невозможно открыть миры, нет доступа для чтения/записи в хранилище! + Попробуйте перезапустить приложение и принять запрос разрешения на чтение/запись. + + Нет пользовательских маркеров! (Никаких пользовательских маркеров!) + Пользовательских маркеров пока нет! \n + Вы можете создать его, долго держа то место на карте, где вы хотите маркер, + затем нажмите \ "Создать пользовательский маркер \". + Затем выберите значок маркера и её координаты. + А затем проверьте, можете ли вы найти его здесь! + + + Это приложение создан Protol Lambda (ссылка удалена по его просьбе), + пополняемая + @MithrilMania, + @flagmaggot, + @MeowCat, + @MiemieMethod, + Manuel, + ScrapperBox25, Tcbdxh и многие другие.\n\n + Доступно в Google Play.\n\n + Текущий активный репозиторий github: + github.com/oO0oO0oO0o0o00/blocktopograph + Не стесняйтесь звездить или вилять, помогать с проектом или просто добавлять свою собственную языковую поддержку. + Ваш вклад на github приветствуется! + Более подробную информацию (включая дорожную карту, список изменений и справочную информацию) можно найти по адресу: + blocktopograph.protolambda.com. \n + \n + Пожалуйста, сделайте резервную копию всех ваших любимых миров MCPE на случай повреждения данных!\n + ПРИМЕЧАНИЕ: Minecraft может не загрузить весь мир из-за одного поврежденного фрагмента NBT!\n + \n + Это приложение создано и протестировано для MCPE 1.9.x (бета), 1.8.x, 1.7.x, 1.6.x, 1.5.x, 1.4.x, 1.2.x, 1.1.x, 1.0.x, 0.16.x, 0.15.x, и 0.14.x\n + Старые версии MCPE не поддерживаются.\n + \n + \n + Отказ от ответственности\n + Это приложение не связано с Minecraft, Mojang AB или Microsoft.\n + Это не официальное приложение, а созданное фанатами.\n + Minecraft является товарным знаком Mojang AB.\n + Пожалуйста, обратите внимание:\n + • НЕ ОФИЦИАЛЬНЫЙ ПРОДУКТ MINECRAFT. НЕ УТВЕРЖДЕНО ИЛИ НЕ СВЯЗАНО С MOJANG.\n + • ПРИЛОЖЕНИЕ ПРЕДОСТАВЛЯЕТСЯ \"КАК ЕСТЬ\", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.\n + \n + \n + Используемые библиотеки\n + • FloatingActionButton \n + • + Tileview, fork by mithrilmania \n + • leveldb-mcpe \n + с + android-leveldb, fork by mithrilmania \n + \n + Исходный код на GitHub:\n + github.com/mithrilmania/blocktopograph \n + \n + + + Документацию к приложению можно найти (возможно, устаревшую): + + blocktopograph.protolambda.com/help + . + + + + Версия: %1$s +
+ Полный список изменений можно найти по адресу (устарело): + + blocktopograph.protolambda.com/changelog + ]]> +
+ + + Сид мира + + Blocktopograph + + + Значки маркеров:\n + • default_marker (стандартный маркер), blue_marker (голубй маркер), green_marker (зелёный маркер), red_marker(красный маркер). \n + • Имена данных сущностей (с учетом регистра) \n + • Имена данных блока (с учетом регистра) \n + + + + Перезагруженный список миров. + Не удалось найти ни одного мира! + Нет доступа для чтения/записи к мирам. + Путь к хранилищу здесь… + Открыть мир с пользовательским путём + Открыть + + Ваш путь: %1$s\n + \n + Мир уже искали в папках %2$s + По пути не найдено ни одного файла/папки! + + Этот путь (необязательно с суффиксом /level.dat) не является каталогом! + Файл level.dat не найден! + Произошла ошибка при открытии мира. + Вы хотите закрыть этот мир? + Здесь ключ levelDB… + Открыть NBT из DB + Неверное имя ключа. + Не удается найти запись в БД (наверно БД - база данных) с таким именем! + + Не удалось прочитать \"%1$s\" + из базы данных мира. + Данных по многопользовательской игре не найдено. + Выбрать игрока + Открыть NBT + Не удалось открыть запись игрока в DB. ключ: + %1$s + + Текущий мир Minecraft не удалось открыть. + Попробуйте перезапустить это приложение и закрыть мир в MCPE, если он был открыт. + Вы хотите закрыть этот мир? + Вы действительно хотите закрыть этот редактор NBT? + Телепортировать местного игрока + Создать пользовательский маркер + Удалить маркер + Открыть NBT фрагмент сущности + Открыть NBT фрагмент плиты-сущности + Данные фрагмента сущности + Данные фрагмента плиты-сущности + Данные NBT фрагмента + + %1$s + (%2$d, + %3$d, + %4$d) + Телепортировал игрока в + (%1$.1f, + %2$.1f, + %3$.1f) + Не удалось телепортировать игрока. + + Не удалось найти/отредактировать данные локального игрока. + Мой пользовательский маркер + Неверное название маркера! + Неверное название значка! + Неверная X координата маркера! + Неверная Y координата маркера! + Неверная Z координата маркера! + Ошибка: не удалось создать маркер. + + Ошибка загрузки %1$s. + + Редактор NBT + + Этот тип данных ещё не существует для этого фрагмента. + Сначала он должен существовать, вы хотите его создать? + + Создание и сохранение новых данных чанка NBT… + + Созданы и сохранены новые данные чанка NBT! + + Ошибка: не удалось создать / сохранить новые данные чанка NBT. + дд/ММ/гггг чч:мм +а + + Ошибка: не удалось открыть сведения о мире; потерял след мира. + Ошибка: не удалось открыть мир. + + данные об уровне отсутствуют + Имя мира: + Размер мира: + Режим игры: + Последняя игра: + Сид мира: + Путь к файлу: + + Загрузка мира… + + \"%1$s\" является недействительным! + Отмена + Копировать + Вставить (перезаписать) + Вставить (как подтег) + Удалить + Переименовать + Добавить подтег + Добавить NBT тег + Вставить как подтег + Удалить все NBT теги + Не удается изменить корневой NBT тег. + Параметры корневого NBT + Имя тега здесь… + Создать NBT тег + Создать + Буфер обмена пуст! + Вы действительно хотите удалить все NBT теги? + УДАЛИТЬ! + Ошибка: не удалось изменить NBT. + Параметры NBT тегов + + Ошибка: ключ буфера обмена уже существует в составной части! + + Ошибка: не удается перезаписать тег: неизвестный родительский тип NBT. + + Ошибка: не удается перезаписать NBT в пустом родительском теге. + + Ошибка: не удается перезаписать NBT в пустом родительском теге. + + Ошибка: не удается удалить NBT из пустого списка. + Переименовать NBT тег + Переименовать + + Ошибка: родительский NBT-тег уже содержит этот ключ! + + Ошибка: этот ключ уже существует в соединении! + + Ошибка: подтеги можно добавлять только в составные теги и теги списка. + + Данные не изменились, нечего сохранять. + + Вы действительно хотите сохранить изменения? + Не удалось найти игрока. + Не удалось найти респаун. + Перейти к маркеру: + Перейти к локальному игроку + Перейти к другому игроку + Игрок + Спаун + + %1$s + (%2$.1f, + %3$.1f, + %4$.1f) + + %1$s at, + (%2$d, + %3$d, + %4$d) + Карта недоступна. + Поиск маркеров… + Не удалось получить данные игрока. + Перейти к игроку + Вперед! + Перейти к координатам + Телепортировал игрока в: + Этот маркер не предназначен для удаления! + Подфрагмент + Выберите подфрагмент (0…): + Фильтровать маркеры + Показать карту + Выбрать мир + Однопользовательский NBT + Нногопользовательский NBT + NBT мира + Надземный мир + Спутник + Пещера + Слайм-чанк + Карта высот + Биомы + Цвет листвы + X-Ray (Рентген) + Свет + Нижний мир + Карта + Край + Параметры карты + Переключить сетку + Переключить маркеры / мобы + Расширенные опции (их нельзя переводить) + + BiomeData NBT + Overworld NBT + Villages NBT + Portals NBT + dimension0 NBT + dimension1 NBT + dimension2 NBT + AutonomousEntities NBT + + Открыть NBT по имени + + Выживание + Творческий + Приключение + + (%1$.1f, + %2$.1f) + Чанк(%3$d, + %4$d) + Телепорт! + Иди на возрождение + Миров не найдено. + + Обратите внимание, что более новая версия Minecraft по умолчанию помещает ваши миры в свои личные данные. + По этой причине все инструменты не смогут получить доступ к мирам. + Вам нужно будет настроить Minecraft на использование \"внешнего\" хранилища, перейдя в Minecraft.-> + Настройки->Профиль->Расположение хранилища файлов, и измените параметр с + \"Приложение\" на \"Внешнее\". + После этого вновь созданные миры будут доступны для Blocktopograph, в то время как + существующие миры не могут быть открыты. Возможно, вам захочется погуглить о том,как переместить предыдущие миры во внешние. + + [NetEase] + Создать плоский мир + Имя: + Мой Мир + 1.2.13~последняя + Версия: + Слои: + Неизвестная ошибка. + Пожалуйста, подождите... + Количество: + Сумма из всех слоев должна быть не менее 0 и не более 127. + Добавить слой... + редактировать + Выберите блок + + "1. Перетащите значок блока для сортировки.\n" + "2. Нажмите любой элемент для редактирования.\n" + "3. Нажмите кнопку \"Добавить\", чтобы добавить слой.\n" + "4. Проведите пальцем влево, чтобы удалить." + "." + + Должен быть хотя бы один слой. + Готово. + Не удалось. + После создания, мир появится в Minecraft, после перезапуска игры. + Тестовая страница + Мяу~ + "\n§cДобро пожаловать~ мяу~""\n§rСоздано""\n§3Blocktopograph""\n""\n§1Получить из Play Store""\n§5и создайте свой""\n§5собственный индивидуальный мир!""\n""\n§rМир создан в""\n§d%1$s" + Рецепт мира:\n + §r%1$dx §b%2$s\n + " §r..И многое другое" + "by_Blocktopograph.txt" + "Welcome~ Мяу~""\nМир был создан Blocktopograph-ом,""\nредактором миров Minecraft и просмотровщиком ландшафта.""\nПолучите из Play Store и создайте свой собственный мир!" + Игроки + В (%1$d, %2$d, %3$d) из %4$s + Расширенный локатор... + Маркеры + Координаты + Получить полную картину\в мире + Сделать фотографию + Это создаст картину мира и может привести к сбою. + Есть повреждённые или неподдерживаемые данные, пропустить или отменить? + В мире есть данные из старой версии Майнкрафт. Возможно, вы захотите отменить сейчас и открыть мир в новой версии Minecraft, чтобы данные обновлялись автоматически. Вы также можете игнорировать эти данные. + Игнорировать + + Blocktopograph не может понять ваш мир, возможно, ваша версия игры слишком старая или слишком новая. + Этот мир слишком старой версии Minecraft, поэтому не может быть прочитан. + Рельеф не найден. + Анализируя + Содание + Предварительный просмотр: + Сохранить + Картинка будет сохранена в папке Загрузки (Download). + Картинка сохранена. + Поделиться + Поделиться с + Выберите масштаб: + Каждый блок будет размером в один пиксель. Если вы выберете меньшую область, то сможете масштабировать картинку больше. + Создавать + Начать выбор + Отменить выбор + Варианты выбора + Выбор + Из [ + , + ] + К [ %1$d, %2$d ] (в том числе от и до) + Диапазон + x + Применять + Ширина и высота должны быть не менее 1. + Операции + Абажуры факелов + Это добавило бы стеклянные плафоны к факелам в выбранной области. Поддерживаются миры Minecraft Bedrock 1.4.x и выше. Мы советуем вам сделать резервную копию вашего мира перед любыми изменениями в Blocktopograph. + Найти в + Задний план + Передний план + Либо + Оба + Найти для + Слот переднего плана: + Фоновый слот: + Затем поместите в + Передний план и фон + Находить & Заменить + Игнорировать подтипы + Простой поиск и замену можно выполнить без учета фонового слота. Начиная с Minecraft BE 1.4.x, фоновые слоты используются для хранения воды, сосуществующей с другими блоками, однако их можно использовать для размещения любого блока. Опытные составители карт могут действительно эффективно использовать эту функцию. + ВСЕГДА СОЗДАВАЙТЕ РЕЗЕРВНУЮ КОПИЮ ПЕРЕД ПРОДОЛЖЕНИЕМ! + Биом: + Числовой идентификатор биома, по умолчанию 21 + Примерно %1$dx%2$d. + Удалить чанк + Это УДАЛЯЕТ все чанки, задействованные в выбранной области. Позже Minecraft может снова создать эту область, но ваш прогресс в ней будет потерян. Если вы не знаете, что такое \"чанк\" в Minecraft, и не понимаете последствий, вы не должны продолжать. Не просто следите за случайными онлайн-статьями. + Выбранная область не была выровнена по границе фрагмента. Не волнуйтесь, Blocktopograph может подстроиться под вас. Фактическая удаленная область будет немного больше, чем выделенная область. Если быть точным, это будет на 0-15 блоков больше с каждой стороны. Это потому, что область может быть повторно сгенерирована только в том случае, если она была удалена вместе с содержащимися в ней фрагментами. Если вам не нравится автоматическая регулировка, вы можете отменить и изменить выбор самостоятельно. + Продолжить автонастройку + Приложение опасно, \nперед редактированием сделайте резервную копию! + Слишком много маркеров! + На экране слишком много маркеров, например мобы. Вы можете отключить их, нажав \"переключить маркеры\" на панели слайдов, или установить фильтр маркеров. + Открыть ящик + Понятно + Политика конфиденциальности + Привет, друг,\n\nДля лучшего опыта при использовании нашего Сервиса я могу потребовать, чтобы вы предоставили нам определённую информацию, включая, помимо прочего, общую информацию о ваших открытых Мирах Майнкрафт, включая версии, сиды; и собранная статистика, связанная с устройством/ОС от Firebase автоматически, что технически может быть (косвенно) идентифицируемым лично.\n\nСсылка на политику конфиденциальности сторонних поставщиков услуг, используемых приложением:\nGoogle Play Services\nFirebase Analytics\nCrashlytics\n\nВсе собранные данные будут обрабатываться только на защищённых услугах, предоставляемых публично доверенные провайдеры в сети.\n\nДоступна полная политика конфиденциальности в Политика конфиденциальности Blocktopograph + Accept> + Выйти + Выберите биом + Изменить биом + Для + Все + Конкретный биом + Изменить на + Вы можете долго щелкнуть по карте, выбрать \"Начать выбор\" и попробовать отредактировать. + Мир слишком велик + Мир слишком велик. Вы также можете:\n(1) Используйте аналогичный инструмент на ПК;\n(2) Или начните выделение части мира и выберите \"Создать картинку\" из меню выбора. + You can scale the picture larger. One pixel per block at least. + Слишком большой выбор + Выбранная вами область слишком велика. Ширина и высота должны быть в пределах %1$d блоки, и область должна быть в пределах %2$d блоках². + Создать картинку + Создание предварительного просмотра ... + Позиция неизвестна + Дважды коснитесь экрана, чтобы открыть ящик. + Что-то пошло не так... + Извините, что-то пошло не так, так что вы не сможете использовать это приложение. Короче говоря, волшебная часть приложения отсутствует. \\nВы получили приложение (файл apk) от кого-то, кто ранее установил приложение? Затем приложение было оптимизировано только для устройства этого человека, даже если у вас та же модель устройства, оно не будет работать. Попробуйте удалить и переустановить из Google Play Store, чтобы решить эту проблему. Вы также можете загрузить полную версию приложения с GitHub или других источников. В этом случае вам также может потребоваться удалить эту версию приложения. Приносим извинения за неудобства, но это определённо вызвано вашей дурной привычкой загружать файлы не из нужного места.\\nЕсли это не так, то мы понятия не имеем. + Закрыть + + Создать новую резервную копию + Существующие резервные копии + Автоматически удалять резервные копии старше 3 дней (не удалять, если существует не более 3 резервных копий) + Автоматически делать резервные копии при открытии мира + + Каждый раз, когда вы открываете мир, Blocktopograph будет делать новую резервную копию. Это может занять некоторое время и вызвать дополнительное использование хранилища. + Включить автозагрузку + Вы можете оставить это пустым + Отменено. + Восстановить + Восстановление предыдущей резервной копии + Это отменит все изменения в мире до создания резервной копии! Ты уверен? Будьте осторожны, это может разрушить вашу работу! + Удалить + Удаление резервной копии + Вы удаляете резервную копию. Убедитесь, что вы выбрали правильный вариант. + Выполняется автоматическое резервное копирование... + [Авто] + Сломанный Мир +
From 69a2f945ee40a1f43ffc6f37181665d2798fa3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=AB?= Date: Fri, 13 Aug 2021 20:47:19 +0800 Subject: [PATCH 02/20] * refactoring to better support Block States insead on numeric metadata * minor fix to support 1.16+ db key format --- .gitmodules | 2 +- TODO.md | 18 +- app/build.gradle | 74 +- app/src/main/assets/blocks/anvil_base.png | Bin 0 -> 379 bytes .../assets/blocks/anvil_top_damaged_0.png | Bin 0 -> 310 bytes .../assets/blocks/anvil_top_damaged_1.png | Bin 0 -> 367 bytes .../assets/blocks/anvil_top_damaged_2.png | Bin 0 -> 406 bytes app/src/main/assets/blocks/beacon.png | Bin 0 -> 208 bytes app/src/main/assets/blocks/bed_feet_end.png | Bin 0 -> 384 bytes app/src/main/assets/blocks/bed_feet_side.png | Bin 0 -> 349 bytes app/src/main/assets/blocks/bed_feet_top.png | Bin 0 -> 592 bytes app/src/main/assets/blocks/bed_head_end.png | Bin 0 -> 404 bytes app/src/main/assets/blocks/bed_head_side.png | Bin 0 -> 391 bytes app/src/main/assets/blocks/bed_head_top.png | Bin 0 -> 695 bytes app/src/main/assets/blocks/bedrock.png | Bin 0 -> 225 bytes .../main/assets/blocks/beetroots_stage_0.png | Bin 0 -> 108 bytes .../main/assets/blocks/beetroots_stage_1.png | Bin 0 -> 128 bytes .../main/assets/blocks/beetroots_stage_2.png | Bin 0 -> 187 bytes .../main/assets/blocks/beetroots_stage_3.png | Bin 0 -> 394 bytes app/src/main/assets/blocks/bookshelf.png | Bin 0 -> 374 bytes app/src/main/assets/blocks/border.png | Bin 0 -> 514 bytes app/src/main/assets/blocks/brewing_stand.png | Bin 0 -> 321 bytes .../main/assets/blocks/brewing_stand_base.png | Bin 0 -> 513 bytes app/src/main/assets/blocks/brick.png | Bin 0 -> 506 bytes app/src/main/assets/blocks/build_allow.png | Bin 0 -> 730 bytes app/src/main/assets/blocks/build_deny.png | Bin 0 -> 518 bytes app/src/main/assets/blocks/cactus_bottom.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/cactus_side.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/cactus_top.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/cake_bottom.png | Bin 0 -> 144 bytes app/src/main/assets/blocks/cake_inner.png | Bin 0 -> 165 bytes app/src/main/assets/blocks/cake_side.png | Bin 0 -> 154 bytes app/src/main/assets/blocks/cake_top.png | Bin 0 -> 199 bytes app/src/main/assets/blocks/camera_back.png | Bin 0 -> 241 bytes app/src/main/assets/blocks/camera_front.png | Bin 0 -> 221 bytes app/src/main/assets/blocks/camera_side.png | Bin 0 -> 224 bytes app/src/main/assets/blocks/camera_top.png | Bin 0 -> 210 bytes .../main/assets/blocks/carried_waterlily.png | Bin 0 -> 200 bytes .../main/assets/blocks/carrots_stage_0.png | Bin 0 -> 108 bytes .../main/assets/blocks/carrots_stage_1.png | Bin 0 -> 128 bytes .../main/assets/blocks/carrots_stage_2.png | Bin 0 -> 187 bytes .../main/assets/blocks/carrots_stage_3.png | Bin 0 -> 306 bytes .../main/assets/blocks/cauldron_bottom.png | Bin 0 -> 115 bytes app/src/main/assets/blocks/cauldron_inner.png | Bin 0 -> 362 bytes app/src/main/assets/blocks/cauldron_side.png | Bin 0 -> 446 bytes app/src/main/assets/blocks/cauldron_top.png | Bin 0 -> 344 bytes app/src/main/assets/blocks/cauldron_water.png | Bin 0 -> 6705 bytes app/src/main/assets/blocks/chest_front.png | Bin 0 -> 450 bytes app/src/main/assets/blocks/chest_side.png | Bin 0 -> 395 bytes app/src/main/assets/blocks/chest_top.png | Bin 0 -> 361 bytes app/src/main/assets/blocks/chorus_flower.png | Bin 0 -> 766 bytes .../main/assets/blocks/chorus_flower_dead.png | Bin 0 -> 750 bytes app/src/main/assets/blocks/chorus_plant.png | Bin 0 -> 692 bytes app/src/main/assets/blocks/clay.png | Bin 0 -> 584 bytes app/src/main/assets/blocks/coal_block.png | Bin 0 -> 239 bytes app/src/main/assets/blocks/coal_ore.png | Bin 0 -> 257 bytes app/src/main/assets/blocks/cobblestone.png | Bin 0 -> 568 bytes .../main/assets/blocks/cobblestone_mossy.png | Bin 0 -> 630 bytes app/src/main/assets/blocks/cocoa_stage_0.png | Bin 0 -> 248 bytes app/src/main/assets/blocks/cocoa_stage_1.png | Bin 0 -> 405 bytes app/src/main/assets/blocks/cocoa_stage_2.png | Bin 0 -> 543 bytes app/src/main/assets/blocks/command_block.png | Bin 0 -> 349 bytes app/src/main/assets/blocks/comparator_off.png | Bin 0 -> 410 bytes app/src/main/assets/blocks/comparator_on.png | Bin 0 -> 413 bytes .../assets/blocks/crafting_table_front.png | Bin 0 -> 407 bytes .../assets/blocks/crafting_table_side.png | Bin 0 -> 384 bytes .../main/assets/blocks/crafting_table_top.png | Bin 0 -> 548 bytes .../blocks/daylight_detector_inverted_top.png | Bin 0 -> 148 bytes .../assets/blocks/daylight_detector_side.png | Bin 0 -> 138 bytes .../assets/blocks/daylight_detector_top.png | Bin 0 -> 185 bytes app/src/main/assets/blocks/deadbush.png | Bin 0 -> 168 bytes app/src/main/assets/blocks/diamond_block.png | Bin 0 -> 468 bytes app/src/main/assets/blocks/diamond_ore.png | Bin 0 -> 262 bytes app/src/main/assets/blocks/dirt.png | Bin 0 -> 266 bytes .../main/assets/blocks/dirt_podzol_side.png | Bin 0 -> 429 bytes .../main/assets/blocks/dirt_podzol_top.png | Bin 0 -> 634 bytes .../blocks/dispenser_front_horizontal.png | Bin 0 -> 494 bytes .../blocks/dispenser_front_vertical.png | Bin 0 -> 535 bytes .../main/assets/blocks/door_acacia_lower.png | Bin 0 -> 574 bytes .../main/assets/blocks/door_acacia_upper.png | Bin 0 -> 546 bytes .../main/assets/blocks/door_birch_lower.png | Bin 0 -> 595 bytes .../main/assets/blocks/door_birch_upper.png | Bin 0 -> 636 bytes .../assets/blocks/door_dark_oak_lower.png | Bin 0 -> 560 bytes .../assets/blocks/door_dark_oak_upper.png | Bin 0 -> 554 bytes .../main/assets/blocks/door_iron_lower.png | Bin 0 -> 483 bytes .../main/assets/blocks/door_iron_upper.png | Bin 0 -> 449 bytes .../main/assets/blocks/door_jungle_lower.png | Bin 0 -> 394 bytes .../main/assets/blocks/door_jungle_upper.png | Bin 0 -> 379 bytes .../main/assets/blocks/door_spruce_lower.png | Bin 0 -> 421 bytes .../main/assets/blocks/door_spruce_upper.png | Bin 0 -> 395 bytes .../main/assets/blocks/door_wood_lower.png | Bin 0 -> 399 bytes .../main/assets/blocks/door_wood_upper.png | Bin 0 -> 401 bytes .../blocks/double_plant_fern_bottom.tga | Bin 0 -> 1068 bytes .../blocks/double_plant_fern_carried.png | Bin 0 -> 394 bytes .../assets/blocks/double_plant_fern_top.tga | Bin 0 -> 1068 bytes .../blocks/double_plant_grass_bottom.tga | Bin 0 -> 1068 bytes .../blocks/double_plant_grass_carried.png | Bin 0 -> 250 bytes .../assets/blocks/double_plant_grass_top.tga | Bin 0 -> 1068 bytes .../blocks/double_plant_paeonia_bottom.png | Bin 0 -> 497 bytes .../blocks/double_plant_paeonia_top.png | Bin 0 -> 530 bytes .../blocks/double_plant_rose_bottom.png | Bin 0 -> 649 bytes .../assets/blocks/double_plant_rose_top.png | Bin 0 -> 660 bytes .../blocks/double_plant_sunflower_back.png | Bin 0 -> 234 bytes .../blocks/double_plant_sunflower_bottom.png | Bin 0 -> 359 bytes .../blocks/double_plant_sunflower_front.png | Bin 0 -> 271 bytes .../blocks/double_plant_sunflower_top.png | Bin 0 -> 347 bytes .../blocks/double_plant_syringa_bottom.tga | Bin 0 -> 1068 bytes .../blocks/double_plant_syringa_top.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/dragon_egg.png | Bin 0 -> 193 bytes .../blocks/dropper_front_horizontal.png | Bin 0 -> 492 bytes .../assets/blocks/dropper_front_vertical.png | Bin 0 -> 501 bytes app/src/main/assets/blocks/emerald_block.png | Bin 0 -> 658 bytes app/src/main/assets/blocks/emerald_ore.png | Bin 0 -> 364 bytes .../assets/blocks/enchanting_table_bottom.png | Bin 0 -> 438 bytes .../assets/blocks/enchanting_table_side.png | Bin 0 -> 359 bytes .../assets/blocks/enchanting_table_top.png | Bin 0 -> 221 bytes app/src/main/assets/blocks/end_bricks.png | Bin 0 -> 632 bytes app/src/main/assets/blocks/end_rod.png | Bin 0 -> 324 bytes app/src/main/assets/blocks/end_stone.png | Bin 0 -> 404 bytes .../main/assets/blocks/ender_chest_front.png | Bin 0 -> 530 bytes .../main/assets/blocks/ender_chest_side.png | Bin 0 -> 427 bytes .../main/assets/blocks/ender_chest_top.png | Bin 0 -> 460 bytes app/src/main/assets/blocks/endframe_eye.png | Bin 0 -> 201 bytes app/src/main/assets/blocks/endframe_side.png | Bin 0 -> 424 bytes app/src/main/assets/blocks/endframe_top.png | Bin 0 -> 492 bytes app/src/main/assets/blocks/farmland_dry.png | Bin 0 -> 258 bytes app/src/main/assets/blocks/farmland_wet.png | Bin 0 -> 610 bytes app/src/main/assets/blocks/fern.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/fern_carried.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/fire_0.png | Bin 0 -> 12506 bytes app/src/main/assets/blocks/fire_1.png | Bin 0 -> 13282 bytes app/src/main/assets/blocks/flower_allium.png | Bin 0 -> 307 bytes .../main/assets/blocks/flower_blue_orchid.png | Bin 0 -> 348 bytes .../main/assets/blocks/flower_dandelion.png | Bin 0 -> 145 bytes .../main/assets/blocks/flower_houstonia.png | Bin 0 -> 334 bytes .../main/assets/blocks/flower_oxeye_daisy.png | Bin 0 -> 339 bytes app/src/main/assets/blocks/flower_paeonia.png | Bin 0 -> 320 bytes app/src/main/assets/blocks/flower_pot.png | Bin 0 -> 229 bytes app/src/main/assets/blocks/flower_rose.png | Bin 0 -> 190 bytes .../main/assets/blocks/flower_rose_blue.png | Bin 0 -> 170 bytes .../assets/blocks/flower_tulip_orange.png | Bin 0 -> 370 bytes .../main/assets/blocks/flower_tulip_pink.png | Bin 0 -> 360 bytes .../main/assets/blocks/flower_tulip_red.png | Bin 0 -> 357 bytes .../main/assets/blocks/flower_tulip_white.png | Bin 0 -> 360 bytes .../main/assets/blocks/furnace_front_off.png | Bin 0 -> 612 bytes .../main/assets/blocks/furnace_front_on.png | Bin 0 -> 658 bytes app/src/main/assets/blocks/furnace_side.png | Bin 0 -> 564 bytes app/src/main/assets/blocks/furnace_top.png | Bin 0 -> 550 bytes app/src/main/assets/blocks/glass.png | Bin 0 -> 184 bytes app/src/main/assets/blocks/glass_pane_top.png | Bin 0 -> 117 bytes .../main/assets/blocks/glowing_obsidian.png | Bin 0 -> 530 bytes app/src/main/assets/blocks/glowstone.png | Bin 0 -> 283 bytes app/src/main/assets/blocks/gold_block.png | Bin 0 -> 528 bytes app/src/main/assets/blocks/gold_ore.png | Bin 0 -> 263 bytes app/src/main/assets/blocks/grass_carried.png | Bin 0 -> 580 bytes .../main/assets/blocks/grass_path_side.png | Bin 0 -> 406 bytes app/src/main/assets/blocks/grass_path_top.png | Bin 0 -> 796 bytes app/src/main/assets/blocks/grass_side.tga | Bin 0 -> 1068 bytes .../main/assets/blocks/grass_side_carried.png | Bin 0 -> 408 bytes .../main/assets/blocks/grass_side_snowed.png | Bin 0 -> 268 bytes .../main/assets/blocks/grass_side_snowed.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/grass_top.png | Bin 0 -> 560 bytes app/src/main/assets/blocks/gravel.png | Bin 0 -> 470 bytes app/src/main/assets/blocks/hardened_clay.png | Bin 0 -> 551 bytes .../blocks/hardened_clay_stained_black.png | Bin 0 -> 362 bytes .../blocks/hardened_clay_stained_blue.png | Bin 0 -> 413 bytes .../blocks/hardened_clay_stained_brown.png | Bin 0 -> 400 bytes .../blocks/hardened_clay_stained_cyan.png | Bin 0 -> 444 bytes .../blocks/hardened_clay_stained_gray.png | Bin 0 -> 378 bytes .../blocks/hardened_clay_stained_green.png | Bin 0 -> 416 bytes .../hardened_clay_stained_light_blue.png | Bin 0 -> 408 bytes .../blocks/hardened_clay_stained_lime.png | Bin 0 -> 464 bytes .../blocks/hardened_clay_stained_magenta.png | Bin 0 -> 479 bytes .../blocks/hardened_clay_stained_orange.png | Bin 0 -> 484 bytes .../blocks/hardened_clay_stained_pink.png | Bin 0 -> 477 bytes .../blocks/hardened_clay_stained_purple.png | Bin 0 -> 487 bytes .../blocks/hardened_clay_stained_red.png | Bin 0 -> 481 bytes .../blocks/hardened_clay_stained_silver.png | Bin 0 -> 424 bytes .../blocks/hardened_clay_stained_white.png | Bin 0 -> 436 bytes .../blocks/hardened_clay_stained_yellow.png | Bin 0 -> 469 bytes app/src/main/assets/blocks/hay_block_side.png | Bin 0 -> 717 bytes app/src/main/assets/blocks/hay_block_top.png | Bin 0 -> 714 bytes app/src/main/assets/blocks/hopper_inside.png | Bin 0 -> 362 bytes app/src/main/assets/blocks/hopper_outside.png | Bin 0 -> 426 bytes app/src/main/assets/blocks/hopper_top.png | Bin 0 -> 291 bytes app/src/main/assets/blocks/ice.png | Bin 0 -> 145 bytes app/src/main/assets/blocks/ice_packed.png | Bin 0 -> 465 bytes app/src/main/assets/blocks/iron_bars.png | Bin 0 -> 490 bytes app/src/main/assets/blocks/iron_block.png | Bin 0 -> 333 bytes app/src/main/assets/blocks/iron_ore.png | Bin 0 -> 265 bytes app/src/main/assets/blocks/iron_trapdoor.png | Bin 0 -> 279 bytes .../assets/blocks/itemframe_background.png | Bin 0 -> 409 bytes app/src/main/assets/blocks/jukebox_side.png | Bin 0 -> 395 bytes app/src/main/assets/blocks/jukebox_top.png | Bin 0 -> 356 bytes app/src/main/assets/blocks/ladder.png | Bin 0 -> 280 bytes app/src/main/assets/blocks/lapis_block.png | Bin 0 -> 668 bytes app/src/main/assets/blocks/lapis_ore.png | Bin 0 -> 447 bytes app/src/main/assets/blocks/lava_flow.png | Bin 0 -> 21527 bytes app/src/main/assets/blocks/lava_still.png | Bin 0 -> 12514 bytes app/src/main/assets/blocks/leaves_acacia.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_acacia_carried.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_acacia_opaque.png | Bin 0 -> 506 bytes app/src/main/assets/blocks/leaves_big_oak.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_big_oak_carried.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_big_oak_opaque.png | Bin 0 -> 506 bytes app/src/main/assets/blocks/leaves_birch.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_birch_carried.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_birch_opaque.png | Bin 0 -> 506 bytes app/src/main/assets/blocks/leaves_jungle.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_jungle_carried.tga | Bin 0 -> 734 bytes .../assets/blocks/leaves_jungle_opaque.png | Bin 0 -> 349 bytes app/src/main/assets/blocks/leaves_oak.tga | Bin 0 -> 1068 bytes .../main/assets/blocks/leaves_oak_carried.tga | Bin 0 -> 1068 bytes .../main/assets/blocks/leaves_oak_opaque.png | Bin 0 -> 506 bytes app/src/main/assets/blocks/leaves_spruce.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_spruce_carried.tga | Bin 0 -> 1068 bytes .../assets/blocks/leaves_spruce_opaque.png | Bin 0 -> 237 bytes app/src/main/assets/blocks/lever.png | Bin 0 -> 136 bytes app/src/main/assets/blocks/log_acacia.png | Bin 0 -> 513 bytes app/src/main/assets/blocks/log_acacia_top.png | Bin 0 -> 449 bytes app/src/main/assets/blocks/log_big_oak.png | Bin 0 -> 464 bytes .../main/assets/blocks/log_big_oak_top.png | Bin 0 -> 435 bytes app/src/main/assets/blocks/log_birch.png | Bin 0 -> 742 bytes app/src/main/assets/blocks/log_birch_top.png | Bin 0 -> 619 bytes app/src/main/assets/blocks/log_jungle.png | Bin 0 -> 609 bytes app/src/main/assets/blocks/log_jungle_top.png | Bin 0 -> 556 bytes app/src/main/assets/blocks/log_oak.png | Bin 0 -> 528 bytes app/src/main/assets/blocks/log_oak_top.png | Bin 0 -> 478 bytes app/src/main/assets/blocks/log_spruce.png | Bin 0 -> 450 bytes app/src/main/assets/blocks/log_spruce_top.png | Bin 0 -> 448 bytes app/src/main/assets/blocks/melon_side.png | Bin 0 -> 448 bytes .../assets/blocks/melon_stem_connected.png | Bin 0 -> 165 bytes .../assets/blocks/melon_stem_disconnected.png | Bin 0 -> 189 bytes app/src/main/assets/blocks/melon_top.png | Bin 0 -> 323 bytes app/src/main/assets/blocks/missing_tile.png | Bin 0 -> 425 bytes app/src/main/assets/blocks/mob_spawner.png | Bin 0 -> 338 bytes .../assets/blocks/mushroom_block_inside.png | Bin 0 -> 315 bytes .../blocks/mushroom_block_skin_brown.png | Bin 0 -> 546 bytes .../assets/blocks/mushroom_block_skin_red.png | Bin 0 -> 428 bytes .../blocks/mushroom_block_skin_stem.png | Bin 0 -> 400 bytes app/src/main/assets/blocks/mushroom_brown.png | Bin 0 -> 120 bytes app/src/main/assets/blocks/mushroom_red.png | Bin 0 -> 143 bytes app/src/main/assets/blocks/mycelium_side.png | Bin 0 -> 441 bytes app/src/main/assets/blocks/mycelium_top.png | Bin 0 -> 493 bytes app/src/main/assets/blocks/nether_brick.png | Bin 0 -> 335 bytes .../assets/blocks/nether_wart_stage_0.png | Bin 0 -> 152 bytes .../assets/blocks/nether_wart_stage_1.png | Bin 0 -> 271 bytes .../assets/blocks/nether_wart_stage_2.png | Bin 0 -> 480 bytes app/src/main/assets/blocks/netherrack.png | Bin 0 -> 727 bytes app/src/main/assets/blocks/noteblock.png | Bin 0 -> 395 bytes app/src/main/assets/blocks/observer_back.png | Bin 0 -> 392 bytes app/src/main/assets/blocks/observer_front.png | Bin 0 -> 506 bytes app/src/main/assets/blocks/observer_side.png | Bin 0 -> 406 bytes app/src/main/assets/blocks/observer_top.png | Bin 0 -> 461 bytes app/src/main/assets/blocks/obsidian.png | Bin 0 -> 489 bytes app/src/main/assets/blocks/piston_bottom.png | Bin 0 -> 550 bytes app/src/main/assets/blocks/piston_inner.png | Bin 0 -> 508 bytes app/src/main/assets/blocks/piston_side.png | Bin 0 -> 604 bytes .../main/assets/blocks/piston_top_normal.png | Bin 0 -> 388 bytes .../main/assets/blocks/piston_top_sticky.png | Bin 0 -> 622 bytes app/src/main/assets/blocks/planks_acacia.png | Bin 0 -> 267 bytes app/src/main/assets/blocks/planks_big_oak.png | Bin 0 -> 240 bytes app/src/main/assets/blocks/planks_birch.png | Bin 0 -> 265 bytes app/src/main/assets/blocks/planks_jungle.png | Bin 0 -> 263 bytes app/src/main/assets/blocks/planks_oak.png | Bin 0 -> 247 bytes app/src/main/assets/blocks/planks_spruce.png | Bin 0 -> 254 bytes app/src/main/assets/blocks/portal.png | Bin 0 -> 13592 bytes .../main/assets/blocks/potatoes_stage_0.png | Bin 0 -> 108 bytes .../main/assets/blocks/potatoes_stage_1.png | Bin 0 -> 128 bytes .../main/assets/blocks/potatoes_stage_2.png | Bin 0 -> 187 bytes .../main/assets/blocks/potatoes_stage_3.png | Bin 0 -> 236 bytes .../main/assets/blocks/prismarine_bricks.png | Bin 0 -> 936 bytes .../main/assets/blocks/prismarine_dark.png | Bin 0 -> 864 bytes .../main/assets/blocks/prismarine_rough.png | Bin 0 -> 3308 bytes .../main/assets/blocks/pumpkin_face_off.png | Bin 0 -> 240 bytes .../main/assets/blocks/pumpkin_face_on.png | Bin 0 -> 422 bytes app/src/main/assets/blocks/pumpkin_side.png | Bin 0 -> 219 bytes .../assets/blocks/pumpkin_stem_connected.png | Bin 0 -> 165 bytes .../blocks/pumpkin_stem_disconnected.png | Bin 0 -> 189 bytes app/src/main/assets/blocks/pumpkin_top.png | Bin 0 -> 272 bytes app/src/main/assets/blocks/purpur_block.png | Bin 0 -> 638 bytes app/src/main/assets/blocks/purpur_pillar.png | Bin 0 -> 646 bytes .../main/assets/blocks/purpur_pillar_top.png | Bin 0 -> 702 bytes .../assets/blocks/quartz_block_bottom.png | Bin 0 -> 377 bytes .../assets/blocks/quartz_block_chiseled.png | Bin 0 -> 360 bytes .../blocks/quartz_block_chiseled_top.png | Bin 0 -> 356 bytes .../main/assets/blocks/quartz_block_lines.png | Bin 0 -> 266 bytes .../assets/blocks/quartz_block_lines_top.png | Bin 0 -> 358 bytes .../main/assets/blocks/quartz_block_side.png | Bin 0 -> 364 bytes .../main/assets/blocks/quartz_block_top.png | Bin 0 -> 364 bytes app/src/main/assets/blocks/quartz_ore.png | Bin 0 -> 899 bytes app/src/main/assets/blocks/rail_activator.png | Bin 0 -> 268 bytes .../assets/blocks/rail_activator_powered.png | Bin 0 -> 319 bytes app/src/main/assets/blocks/rail_detector.png | Bin 0 -> 309 bytes .../assets/blocks/rail_detector_powered.png | Bin 0 -> 351 bytes app/src/main/assets/blocks/rail_golden.png | Bin 0 -> 290 bytes .../assets/blocks/rail_golden_powered.png | Bin 0 -> 341 bytes app/src/main/assets/blocks/rail_normal.png | Bin 0 -> 232 bytes .../main/assets/blocks/rail_normal_turned.png | Bin 0 -> 247 bytes .../assets/blocks/reactor_core_stage_0.png | Bin 0 -> 155 bytes .../assets/blocks/reactor_core_stage_1.png | Bin 0 -> 179 bytes .../assets/blocks/reactor_core_stage_2.png | Bin 0 -> 259 bytes app/src/main/assets/blocks/red_sand.png | Bin 0 -> 738 bytes .../assets/blocks/red_sandstone_bottom.png | Bin 0 -> 506 bytes .../assets/blocks/red_sandstone_carved.png | Bin 0 -> 540 bytes .../assets/blocks/red_sandstone_normal.png | Bin 0 -> 629 bytes .../assets/blocks/red_sandstone_smooth.png | Bin 0 -> 469 bytes .../main/assets/blocks/red_sandstone_top.png | Bin 0 -> 517 bytes app/src/main/assets/blocks/redstone_block.png | Bin 0 -> 515 bytes .../assets/blocks/redstone_dust_cross.png | Bin 0 -> 162 bytes .../main/assets/blocks/redstone_dust_line.png | Bin 0 -> 117 bytes .../main/assets/blocks/redstone_lamp_off.png | Bin 0 -> 616 bytes .../main/assets/blocks/redstone_lamp_on.png | Bin 0 -> 682 bytes app/src/main/assets/blocks/redstone_ore.png | Bin 0 -> 264 bytes .../main/assets/blocks/redstone_torch_off.png | Bin 0 -> 155 bytes .../main/assets/blocks/redstone_torch_on.png | Bin 0 -> 160 bytes app/src/main/assets/blocks/reeds.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/repeater_off.png | Bin 0 -> 375 bytes app/src/main/assets/blocks/repeater_on.png | Bin 0 -> 371 bytes app/src/main/assets/blocks/sand.png | Bin 0 -> 720 bytes .../main/assets/blocks/sandstone_bottom.png | Bin 0 -> 638 bytes .../main/assets/blocks/sandstone_carved.png | Bin 0 -> 596 bytes .../main/assets/blocks/sandstone_normal.png | Bin 0 -> 777 bytes .../main/assets/blocks/sandstone_smooth.png | Bin 0 -> 544 bytes app/src/main/assets/blocks/sandstone_top.png | Bin 0 -> 641 bytes app/src/main/assets/blocks/sapling_acacia.png | Bin 0 -> 305 bytes app/src/main/assets/blocks/sapling_birch.png | Bin 0 -> 225 bytes app/src/main/assets/blocks/sapling_jungle.png | Bin 0 -> 239 bytes app/src/main/assets/blocks/sapling_oak.png | Bin 0 -> 278 bytes .../main/assets/blocks/sapling_roofed_oak.png | Bin 0 -> 310 bytes app/src/main/assets/blocks/sapling_spruce.png | Bin 0 -> 211 bytes app/src/main/assets/blocks/sea_lantern.png | Bin 0 -> 3031 bytes app/src/main/assets/blocks/slime.png | Bin 0 -> 716 bytes app/src/main/assets/blocks/snow.png | Bin 0 -> 207 bytes app/src/main/assets/blocks/soul_sand.png | Bin 0 -> 633 bytes app/src/main/assets/blocks/sponge.png | Bin 0 -> 908 bytes app/src/main/assets/blocks/sponge_wet.png | Bin 0 -> 947 bytes app/src/main/assets/blocks/stone.png | Bin 0 -> 223 bytes app/src/main/assets/blocks/stone_andesite.png | Bin 0 -> 792 bytes .../assets/blocks/stone_andesite_smooth.png | Bin 0 -> 730 bytes app/src/main/assets/blocks/stone_diorite.png | Bin 0 -> 613 bytes .../assets/blocks/stone_diorite_smooth.png | Bin 0 -> 560 bytes app/src/main/assets/blocks/stone_granite.png | Bin 0 -> 484 bytes .../assets/blocks/stone_granite_smooth.png | Bin 0 -> 435 bytes .../main/assets/blocks/stone_slab_side.png | Bin 0 -> 271 bytes app/src/main/assets/blocks/stone_slab_top.png | Bin 0 -> 252 bytes app/src/main/assets/blocks/stonebrick.png | Bin 0 -> 402 bytes .../main/assets/blocks/stonebrick_carved.png | Bin 0 -> 413 bytes .../main/assets/blocks/stonebrick_cracked.png | Bin 0 -> 469 bytes .../main/assets/blocks/stonebrick_mossy.png | Bin 0 -> 545 bytes .../main/assets/blocks/stonecutter_bottom.png | Bin 0 -> 566 bytes .../assets/blocks/stonecutter_other_side.png | Bin 0 -> 580 bytes .../main/assets/blocks/stonecutter_side.png | Bin 0 -> 583 bytes .../main/assets/blocks/stonecutter_top.png | Bin 0 -> 511 bytes app/src/main/assets/blocks/structure_air.png | Bin 0 -> 174 bytes .../main/assets/blocks/structure_block.png | Bin 0 -> 370 bytes .../assets/blocks/structure_block_corner.png | Bin 0 -> 494 bytes .../assets/blocks/structure_block_data.png | Bin 0 -> 509 bytes .../assets/blocks/structure_block_load.png | Bin 0 -> 561 bytes .../assets/blocks/structure_block_save.png | Bin 0 -> 542 bytes app/src/main/assets/blocks/structure_void.png | Bin 0 -> 176 bytes app/src/main/assets/blocks/tallgrass.png | Bin 0 -> 363 bytes app/src/main/assets/blocks/tallgrass.tga | Bin 0 -> 1068 bytes .../main/assets/blocks/tallgrass_carried.tga | Bin 0 -> 1068 bytes app/src/main/assets/blocks/tnt_bottom.png | Bin 0 -> 112 bytes app/src/main/assets/blocks/tnt_side.png | Bin 0 -> 212 bytes app/src/main/assets/blocks/tnt_top.png | Bin 0 -> 237 bytes app/src/main/assets/blocks/torch_on.png | Bin 0 -> 159 bytes app/src/main/assets/blocks/trapdoor.png | Bin 0 -> 357 bytes app/src/main/assets/blocks/trip_wire.png | Bin 0 -> 171 bytes .../main/assets/blocks/trip_wire_source.png | Bin 0 -> 233 bytes app/src/main/assets/blocks/vine.png | Bin 0 -> 235 bytes app/src/main/assets/blocks/vine_carried.png | Bin 0 -> 263 bytes app/src/main/assets/blocks/water_flow.png | Bin 0 -> 5801 bytes app/src/main/assets/blocks/water_still.png | Bin 0 -> 5451 bytes app/src/main/assets/blocks/waterlily.png | Bin 0 -> 185 bytes app/src/main/assets/blocks/web.png | Bin 0 -> 213 bytes app/src/main/assets/blocks/wheat_stage_0.png | Bin 0 -> 100 bytes app/src/main/assets/blocks/wheat_stage_1.png | Bin 0 -> 155 bytes app/src/main/assets/blocks/wheat_stage_2.png | Bin 0 -> 257 bytes app/src/main/assets/blocks/wheat_stage_3.png | Bin 0 -> 379 bytes app/src/main/assets/blocks/wheat_stage_4.png | Bin 0 -> 454 bytes app/src/main/assets/blocks/wheat_stage_5.png | Bin 0 -> 534 bytes app/src/main/assets/blocks/wheat_stage_6.png | Bin 0 -> 562 bytes app/src/main/assets/blocks/wheat_stage_7.png | Bin 0 -> 621 bytes .../main/assets/blocks/wool_colored_black.png | Bin 0 -> 380 bytes .../main/assets/blocks/wool_colored_blue.png | Bin 0 -> 482 bytes .../main/assets/blocks/wool_colored_brown.png | Bin 0 -> 405 bytes .../main/assets/blocks/wool_colored_cyan.png | Bin 0 -> 479 bytes .../main/assets/blocks/wool_colored_gray.png | Bin 0 -> 360 bytes .../main/assets/blocks/wool_colored_green.png | Bin 0 -> 403 bytes .../assets/blocks/wool_colored_light_blue.png | Bin 0 -> 509 bytes .../main/assets/blocks/wool_colored_lime.png | Bin 0 -> 491 bytes .../assets/blocks/wool_colored_magenta.png | Bin 0 -> 495 bytes .../assets/blocks/wool_colored_orange.png | Bin 0 -> 461 bytes .../main/assets/blocks/wool_colored_pink.png | Bin 0 -> 513 bytes .../assets/blocks/wool_colored_purple.png | Bin 0 -> 501 bytes .../main/assets/blocks/wool_colored_red.png | Bin 0 -> 462 bytes .../assets/blocks/wool_colored_silver.png | Bin 0 -> 489 bytes .../main/assets/blocks/wool_colored_white.png | Bin 0 -> 507 bytes .../assets/blocks/wool_colored_yellow.png | Bin 0 -> 475 bytes .../blocktopograph/CreateWorldActivity.java | 15 +- .../com/mithrilmania/blocktopograph/Log.java | 39 +- .../blocktopograph/WorldData.java | 25 +- .../blocktopograph/block/Block.java | 133 +- .../blocktopograph/block/BlockRegistry.java | 52 - .../blocktopograph/block/BlockTemplate.java | 48 + .../blocktopograph/block/BlockTemplates.java | 1704 +++++++++++++++++ .../blocktopograph/block/BlockType.java | 317 ++- .../BlockWithStatesToLegacyBlockMapper.java | 6 +- .../blocktopograph/block/OldBlock.java | 93 + .../block/OldBlockRegistry.java | 52 + .../blocktopograph/block/OldBlockType.java | 16 + .../block/blockproperty/BitValuesRange.java | 4 + .../block/blockproperty/BlockProperty.java | 134 ++ .../block/blockproperty/EnumValuesRange.java | 16 + .../block/blockproperty/ValuesRange.java | 4 + .../blocktopograph/block/icon/BlockIcon.java | 11 + .../block/icon/NoBlockIcon.java | 11 + .../block/icon/TexPathBlockIcon.java | 45 + .../blocktopograph/chunk/BedrockChunk.java | 54 +- .../blocktopograph/chunk/Chunk.java | 68 +- .../blocktopograph/chunk/ChunkTag.java | 3 +- .../blocktopograph/chunk/PocketChunk.java | 12 +- .../blocktopograph/chunk/TempChunk.java | 186 -- .../blocktopograph/chunk/Version.java | 5 +- .../blocktopograph/chunk/VoidChunk.java | 10 +- .../terrain/PreV1d2d13TerrainSubChunk.java | 14 +- .../chunk/terrain/TerrainSubChunk.java | 67 +- .../chunk/terrain/V0_9_TerrainChunkData.java | 8 +- .../chunk/terrain/V1_0_TerrainChunkData.java | 14 +- .../chunk/terrain/V1_1_TerrainChunkData.java | 14 +- .../terrain/V1_2_Plus_TerrainChunkData.java | 14 +- .../chunk/terrain/V1d2d13TerrainSubChunk.java | 549 +++--- .../blocktopograph/flat/EditFlatFragment.java | 13 +- .../blocktopograph/flat/EditLayerDialog.java | 7 +- .../blocktopograph/flat/FlatLayers.java | 2 +- .../blocktopograph/flat/Layer.java | 8 +- .../flat/PickBlockActivity.java | 47 +- .../blocktopograph/map/Biome.java | 12 +- .../blocktopograph/map/MapFragment.java | 12 +- .../map/edit/SearchAndReplaceFragment.java | 74 +- .../SelectionBasedContextFreeEditTask.java | 12 +- .../blocktopograph/map/edit/SnrConfig.java | 40 +- .../blocktopograph/map/edit/SnrEdit.java | 25 +- .../map/renderer/CaveRenderer.java | 64 +- .../blocktopograph/map/renderer/MapType.java | 2 +- .../map/renderer/NetherRenderer.java | 73 +- .../map/renderer/SatelliteRenderer.java | 13 +- .../map/renderer/XRayRenderer.java | 39 +- .../map/selection/SelectionMenuFragment.java | 6 +- .../map/selection/SelectionView.java | 8 +- .../blocktopograph/test/MainTestActivity.java | 24 +- .../blocktopograph/util/UiUtil.java | 11 + .../worldlist/WorldItemListActivity.java | 4 +- app/src/main/res/layout/dialog_edit_layer.xml | 4 +- app/src/main/res/layout/include_block.xml | 8 +- app/src/main/res/layout/item_pick_block.xml | 8 +- app/src/main/res/layout/item_world_layer.xml | 4 +- app/src/main/res/values-zh-rHK/strings.xml | 421 ++++ app/src/main/res/values-zh-rMO/strings.xml | 421 ++++ app/src/main/res/values-zh-rTW/strings.xml | 2 +- .../{values-zh-rCN => values-zh}/strings.xml | 0 build.gradle | 15 +- gradle/wrapper/gradle-wrapper.properties | 2 +- tileview/build.gradle | 2 - 466 files changed, 4179 insertions(+), 1041 deletions(-) create mode 100644 app/src/main/assets/blocks/anvil_base.png create mode 100644 app/src/main/assets/blocks/anvil_top_damaged_0.png create mode 100644 app/src/main/assets/blocks/anvil_top_damaged_1.png create mode 100644 app/src/main/assets/blocks/anvil_top_damaged_2.png create mode 100644 app/src/main/assets/blocks/beacon.png create mode 100644 app/src/main/assets/blocks/bed_feet_end.png create mode 100644 app/src/main/assets/blocks/bed_feet_side.png create mode 100644 app/src/main/assets/blocks/bed_feet_top.png create mode 100644 app/src/main/assets/blocks/bed_head_end.png create mode 100644 app/src/main/assets/blocks/bed_head_side.png create mode 100644 app/src/main/assets/blocks/bed_head_top.png create mode 100644 app/src/main/assets/blocks/bedrock.png create mode 100644 app/src/main/assets/blocks/beetroots_stage_0.png create mode 100644 app/src/main/assets/blocks/beetroots_stage_1.png create mode 100644 app/src/main/assets/blocks/beetroots_stage_2.png create mode 100644 app/src/main/assets/blocks/beetroots_stage_3.png create mode 100644 app/src/main/assets/blocks/bookshelf.png create mode 100644 app/src/main/assets/blocks/border.png create mode 100644 app/src/main/assets/blocks/brewing_stand.png create mode 100644 app/src/main/assets/blocks/brewing_stand_base.png create mode 100644 app/src/main/assets/blocks/brick.png create mode 100644 app/src/main/assets/blocks/build_allow.png create mode 100644 app/src/main/assets/blocks/build_deny.png create mode 100644 app/src/main/assets/blocks/cactus_bottom.tga create mode 100644 app/src/main/assets/blocks/cactus_side.tga create mode 100644 app/src/main/assets/blocks/cactus_top.tga create mode 100644 app/src/main/assets/blocks/cake_bottom.png create mode 100644 app/src/main/assets/blocks/cake_inner.png create mode 100644 app/src/main/assets/blocks/cake_side.png create mode 100644 app/src/main/assets/blocks/cake_top.png create mode 100644 app/src/main/assets/blocks/camera_back.png create mode 100644 app/src/main/assets/blocks/camera_front.png create mode 100644 app/src/main/assets/blocks/camera_side.png create mode 100644 app/src/main/assets/blocks/camera_top.png create mode 100644 app/src/main/assets/blocks/carried_waterlily.png create mode 100644 app/src/main/assets/blocks/carrots_stage_0.png create mode 100644 app/src/main/assets/blocks/carrots_stage_1.png create mode 100644 app/src/main/assets/blocks/carrots_stage_2.png create mode 100644 app/src/main/assets/blocks/carrots_stage_3.png create mode 100644 app/src/main/assets/blocks/cauldron_bottom.png create mode 100644 app/src/main/assets/blocks/cauldron_inner.png create mode 100644 app/src/main/assets/blocks/cauldron_side.png create mode 100644 app/src/main/assets/blocks/cauldron_top.png create mode 100644 app/src/main/assets/blocks/cauldron_water.png create mode 100644 app/src/main/assets/blocks/chest_front.png create mode 100644 app/src/main/assets/blocks/chest_side.png create mode 100644 app/src/main/assets/blocks/chest_top.png create mode 100644 app/src/main/assets/blocks/chorus_flower.png create mode 100644 app/src/main/assets/blocks/chorus_flower_dead.png create mode 100644 app/src/main/assets/blocks/chorus_plant.png create mode 100644 app/src/main/assets/blocks/clay.png create mode 100644 app/src/main/assets/blocks/coal_block.png create mode 100644 app/src/main/assets/blocks/coal_ore.png create mode 100644 app/src/main/assets/blocks/cobblestone.png create mode 100644 app/src/main/assets/blocks/cobblestone_mossy.png create mode 100644 app/src/main/assets/blocks/cocoa_stage_0.png create mode 100644 app/src/main/assets/blocks/cocoa_stage_1.png create mode 100644 app/src/main/assets/blocks/cocoa_stage_2.png create mode 100644 app/src/main/assets/blocks/command_block.png create mode 100644 app/src/main/assets/blocks/comparator_off.png create mode 100644 app/src/main/assets/blocks/comparator_on.png create mode 100644 app/src/main/assets/blocks/crafting_table_front.png create mode 100644 app/src/main/assets/blocks/crafting_table_side.png create mode 100644 app/src/main/assets/blocks/crafting_table_top.png create mode 100644 app/src/main/assets/blocks/daylight_detector_inverted_top.png create mode 100644 app/src/main/assets/blocks/daylight_detector_side.png create mode 100644 app/src/main/assets/blocks/daylight_detector_top.png create mode 100644 app/src/main/assets/blocks/deadbush.png create mode 100644 app/src/main/assets/blocks/diamond_block.png create mode 100644 app/src/main/assets/blocks/diamond_ore.png create mode 100644 app/src/main/assets/blocks/dirt.png create mode 100644 app/src/main/assets/blocks/dirt_podzol_side.png create mode 100644 app/src/main/assets/blocks/dirt_podzol_top.png create mode 100644 app/src/main/assets/blocks/dispenser_front_horizontal.png create mode 100644 app/src/main/assets/blocks/dispenser_front_vertical.png create mode 100644 app/src/main/assets/blocks/door_acacia_lower.png create mode 100644 app/src/main/assets/blocks/door_acacia_upper.png create mode 100644 app/src/main/assets/blocks/door_birch_lower.png create mode 100644 app/src/main/assets/blocks/door_birch_upper.png create mode 100644 app/src/main/assets/blocks/door_dark_oak_lower.png create mode 100644 app/src/main/assets/blocks/door_dark_oak_upper.png create mode 100644 app/src/main/assets/blocks/door_iron_lower.png create mode 100644 app/src/main/assets/blocks/door_iron_upper.png create mode 100644 app/src/main/assets/blocks/door_jungle_lower.png create mode 100644 app/src/main/assets/blocks/door_jungle_upper.png create mode 100644 app/src/main/assets/blocks/door_spruce_lower.png create mode 100644 app/src/main/assets/blocks/door_spruce_upper.png create mode 100644 app/src/main/assets/blocks/door_wood_lower.png create mode 100644 app/src/main/assets/blocks/door_wood_upper.png create mode 100644 app/src/main/assets/blocks/double_plant_fern_bottom.tga create mode 100644 app/src/main/assets/blocks/double_plant_fern_carried.png create mode 100644 app/src/main/assets/blocks/double_plant_fern_top.tga create mode 100644 app/src/main/assets/blocks/double_plant_grass_bottom.tga create mode 100644 app/src/main/assets/blocks/double_plant_grass_carried.png create mode 100644 app/src/main/assets/blocks/double_plant_grass_top.tga create mode 100644 app/src/main/assets/blocks/double_plant_paeonia_bottom.png create mode 100644 app/src/main/assets/blocks/double_plant_paeonia_top.png create mode 100644 app/src/main/assets/blocks/double_plant_rose_bottom.png create mode 100644 app/src/main/assets/blocks/double_plant_rose_top.png create mode 100644 app/src/main/assets/blocks/double_plant_sunflower_back.png create mode 100644 app/src/main/assets/blocks/double_plant_sunflower_bottom.png create mode 100644 app/src/main/assets/blocks/double_plant_sunflower_front.png create mode 100644 app/src/main/assets/blocks/double_plant_sunflower_top.png create mode 100644 app/src/main/assets/blocks/double_plant_syringa_bottom.tga create mode 100644 app/src/main/assets/blocks/double_plant_syringa_top.tga create mode 100644 app/src/main/assets/blocks/dragon_egg.png create mode 100644 app/src/main/assets/blocks/dropper_front_horizontal.png create mode 100644 app/src/main/assets/blocks/dropper_front_vertical.png create mode 100644 app/src/main/assets/blocks/emerald_block.png create mode 100644 app/src/main/assets/blocks/emerald_ore.png create mode 100644 app/src/main/assets/blocks/enchanting_table_bottom.png create mode 100644 app/src/main/assets/blocks/enchanting_table_side.png create mode 100644 app/src/main/assets/blocks/enchanting_table_top.png create mode 100644 app/src/main/assets/blocks/end_bricks.png create mode 100644 app/src/main/assets/blocks/end_rod.png create mode 100644 app/src/main/assets/blocks/end_stone.png create mode 100644 app/src/main/assets/blocks/ender_chest_front.png create mode 100644 app/src/main/assets/blocks/ender_chest_side.png create mode 100644 app/src/main/assets/blocks/ender_chest_top.png create mode 100644 app/src/main/assets/blocks/endframe_eye.png create mode 100644 app/src/main/assets/blocks/endframe_side.png create mode 100644 app/src/main/assets/blocks/endframe_top.png create mode 100644 app/src/main/assets/blocks/farmland_dry.png create mode 100644 app/src/main/assets/blocks/farmland_wet.png create mode 100644 app/src/main/assets/blocks/fern.tga create mode 100644 app/src/main/assets/blocks/fern_carried.tga create mode 100644 app/src/main/assets/blocks/fire_0.png create mode 100644 app/src/main/assets/blocks/fire_1.png create mode 100644 app/src/main/assets/blocks/flower_allium.png create mode 100644 app/src/main/assets/blocks/flower_blue_orchid.png create mode 100644 app/src/main/assets/blocks/flower_dandelion.png create mode 100644 app/src/main/assets/blocks/flower_houstonia.png create mode 100644 app/src/main/assets/blocks/flower_oxeye_daisy.png create mode 100644 app/src/main/assets/blocks/flower_paeonia.png create mode 100644 app/src/main/assets/blocks/flower_pot.png create mode 100644 app/src/main/assets/blocks/flower_rose.png create mode 100644 app/src/main/assets/blocks/flower_rose_blue.png create mode 100644 app/src/main/assets/blocks/flower_tulip_orange.png create mode 100644 app/src/main/assets/blocks/flower_tulip_pink.png create mode 100644 app/src/main/assets/blocks/flower_tulip_red.png create mode 100644 app/src/main/assets/blocks/flower_tulip_white.png create mode 100644 app/src/main/assets/blocks/furnace_front_off.png create mode 100644 app/src/main/assets/blocks/furnace_front_on.png create mode 100644 app/src/main/assets/blocks/furnace_side.png create mode 100644 app/src/main/assets/blocks/furnace_top.png create mode 100644 app/src/main/assets/blocks/glass.png create mode 100644 app/src/main/assets/blocks/glass_pane_top.png create mode 100644 app/src/main/assets/blocks/glowing_obsidian.png create mode 100644 app/src/main/assets/blocks/glowstone.png create mode 100644 app/src/main/assets/blocks/gold_block.png create mode 100644 app/src/main/assets/blocks/gold_ore.png create mode 100644 app/src/main/assets/blocks/grass_carried.png create mode 100644 app/src/main/assets/blocks/grass_path_side.png create mode 100644 app/src/main/assets/blocks/grass_path_top.png create mode 100644 app/src/main/assets/blocks/grass_side.tga create mode 100644 app/src/main/assets/blocks/grass_side_carried.png create mode 100644 app/src/main/assets/blocks/grass_side_snowed.png create mode 100644 app/src/main/assets/blocks/grass_side_snowed.tga create mode 100644 app/src/main/assets/blocks/grass_top.png create mode 100644 app/src/main/assets/blocks/gravel.png create mode 100644 app/src/main/assets/blocks/hardened_clay.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_black.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_blue.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_brown.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_cyan.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_gray.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_green.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_light_blue.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_lime.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_magenta.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_orange.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_pink.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_purple.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_red.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_silver.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_white.png create mode 100644 app/src/main/assets/blocks/hardened_clay_stained_yellow.png create mode 100644 app/src/main/assets/blocks/hay_block_side.png create mode 100644 app/src/main/assets/blocks/hay_block_top.png create mode 100644 app/src/main/assets/blocks/hopper_inside.png create mode 100644 app/src/main/assets/blocks/hopper_outside.png create mode 100644 app/src/main/assets/blocks/hopper_top.png create mode 100644 app/src/main/assets/blocks/ice.png create mode 100644 app/src/main/assets/blocks/ice_packed.png create mode 100644 app/src/main/assets/blocks/iron_bars.png create mode 100644 app/src/main/assets/blocks/iron_block.png create mode 100644 app/src/main/assets/blocks/iron_ore.png create mode 100644 app/src/main/assets/blocks/iron_trapdoor.png create mode 100644 app/src/main/assets/blocks/itemframe_background.png create mode 100644 app/src/main/assets/blocks/jukebox_side.png create mode 100644 app/src/main/assets/blocks/jukebox_top.png create mode 100644 app/src/main/assets/blocks/ladder.png create mode 100644 app/src/main/assets/blocks/lapis_block.png create mode 100644 app/src/main/assets/blocks/lapis_ore.png create mode 100644 app/src/main/assets/blocks/lava_flow.png create mode 100644 app/src/main/assets/blocks/lava_still.png create mode 100644 app/src/main/assets/blocks/leaves_acacia.tga create mode 100644 app/src/main/assets/blocks/leaves_acacia_carried.tga create mode 100644 app/src/main/assets/blocks/leaves_acacia_opaque.png create mode 100644 app/src/main/assets/blocks/leaves_big_oak.tga create mode 100644 app/src/main/assets/blocks/leaves_big_oak_carried.tga create mode 100644 app/src/main/assets/blocks/leaves_big_oak_opaque.png create mode 100644 app/src/main/assets/blocks/leaves_birch.tga create mode 100644 app/src/main/assets/blocks/leaves_birch_carried.tga create mode 100644 app/src/main/assets/blocks/leaves_birch_opaque.png create mode 100644 app/src/main/assets/blocks/leaves_jungle.tga create mode 100644 app/src/main/assets/blocks/leaves_jungle_carried.tga create mode 100644 app/src/main/assets/blocks/leaves_jungle_opaque.png create mode 100644 app/src/main/assets/blocks/leaves_oak.tga create mode 100644 app/src/main/assets/blocks/leaves_oak_carried.tga create mode 100644 app/src/main/assets/blocks/leaves_oak_opaque.png create mode 100644 app/src/main/assets/blocks/leaves_spruce.tga create mode 100644 app/src/main/assets/blocks/leaves_spruce_carried.tga create mode 100644 app/src/main/assets/blocks/leaves_spruce_opaque.png create mode 100644 app/src/main/assets/blocks/lever.png create mode 100644 app/src/main/assets/blocks/log_acacia.png create mode 100644 app/src/main/assets/blocks/log_acacia_top.png create mode 100644 app/src/main/assets/blocks/log_big_oak.png create mode 100644 app/src/main/assets/blocks/log_big_oak_top.png create mode 100644 app/src/main/assets/blocks/log_birch.png create mode 100644 app/src/main/assets/blocks/log_birch_top.png create mode 100644 app/src/main/assets/blocks/log_jungle.png create mode 100644 app/src/main/assets/blocks/log_jungle_top.png create mode 100644 app/src/main/assets/blocks/log_oak.png create mode 100644 app/src/main/assets/blocks/log_oak_top.png create mode 100644 app/src/main/assets/blocks/log_spruce.png create mode 100644 app/src/main/assets/blocks/log_spruce_top.png create mode 100644 app/src/main/assets/blocks/melon_side.png create mode 100644 app/src/main/assets/blocks/melon_stem_connected.png create mode 100644 app/src/main/assets/blocks/melon_stem_disconnected.png create mode 100644 app/src/main/assets/blocks/melon_top.png create mode 100644 app/src/main/assets/blocks/missing_tile.png create mode 100644 app/src/main/assets/blocks/mob_spawner.png create mode 100644 app/src/main/assets/blocks/mushroom_block_inside.png create mode 100644 app/src/main/assets/blocks/mushroom_block_skin_brown.png create mode 100644 app/src/main/assets/blocks/mushroom_block_skin_red.png create mode 100644 app/src/main/assets/blocks/mushroom_block_skin_stem.png create mode 100644 app/src/main/assets/blocks/mushroom_brown.png create mode 100644 app/src/main/assets/blocks/mushroom_red.png create mode 100644 app/src/main/assets/blocks/mycelium_side.png create mode 100644 app/src/main/assets/blocks/mycelium_top.png create mode 100644 app/src/main/assets/blocks/nether_brick.png create mode 100644 app/src/main/assets/blocks/nether_wart_stage_0.png create mode 100644 app/src/main/assets/blocks/nether_wart_stage_1.png create mode 100644 app/src/main/assets/blocks/nether_wart_stage_2.png create mode 100644 app/src/main/assets/blocks/netherrack.png create mode 100644 app/src/main/assets/blocks/noteblock.png create mode 100644 app/src/main/assets/blocks/observer_back.png create mode 100644 app/src/main/assets/blocks/observer_front.png create mode 100644 app/src/main/assets/blocks/observer_side.png create mode 100644 app/src/main/assets/blocks/observer_top.png create mode 100644 app/src/main/assets/blocks/obsidian.png create mode 100644 app/src/main/assets/blocks/piston_bottom.png create mode 100644 app/src/main/assets/blocks/piston_inner.png create mode 100644 app/src/main/assets/blocks/piston_side.png create mode 100644 app/src/main/assets/blocks/piston_top_normal.png create mode 100644 app/src/main/assets/blocks/piston_top_sticky.png create mode 100644 app/src/main/assets/blocks/planks_acacia.png create mode 100644 app/src/main/assets/blocks/planks_big_oak.png create mode 100644 app/src/main/assets/blocks/planks_birch.png create mode 100644 app/src/main/assets/blocks/planks_jungle.png create mode 100644 app/src/main/assets/blocks/planks_oak.png create mode 100644 app/src/main/assets/blocks/planks_spruce.png create mode 100644 app/src/main/assets/blocks/portal.png create mode 100644 app/src/main/assets/blocks/potatoes_stage_0.png create mode 100644 app/src/main/assets/blocks/potatoes_stage_1.png create mode 100644 app/src/main/assets/blocks/potatoes_stage_2.png create mode 100644 app/src/main/assets/blocks/potatoes_stage_3.png create mode 100644 app/src/main/assets/blocks/prismarine_bricks.png create mode 100644 app/src/main/assets/blocks/prismarine_dark.png create mode 100644 app/src/main/assets/blocks/prismarine_rough.png create mode 100644 app/src/main/assets/blocks/pumpkin_face_off.png create mode 100644 app/src/main/assets/blocks/pumpkin_face_on.png create mode 100644 app/src/main/assets/blocks/pumpkin_side.png create mode 100644 app/src/main/assets/blocks/pumpkin_stem_connected.png create mode 100644 app/src/main/assets/blocks/pumpkin_stem_disconnected.png create mode 100644 app/src/main/assets/blocks/pumpkin_top.png create mode 100644 app/src/main/assets/blocks/purpur_block.png create mode 100644 app/src/main/assets/blocks/purpur_pillar.png create mode 100644 app/src/main/assets/blocks/purpur_pillar_top.png create mode 100644 app/src/main/assets/blocks/quartz_block_bottom.png create mode 100644 app/src/main/assets/blocks/quartz_block_chiseled.png create mode 100644 app/src/main/assets/blocks/quartz_block_chiseled_top.png create mode 100644 app/src/main/assets/blocks/quartz_block_lines.png create mode 100644 app/src/main/assets/blocks/quartz_block_lines_top.png create mode 100644 app/src/main/assets/blocks/quartz_block_side.png create mode 100644 app/src/main/assets/blocks/quartz_block_top.png create mode 100644 app/src/main/assets/blocks/quartz_ore.png create mode 100644 app/src/main/assets/blocks/rail_activator.png create mode 100644 app/src/main/assets/blocks/rail_activator_powered.png create mode 100644 app/src/main/assets/blocks/rail_detector.png create mode 100644 app/src/main/assets/blocks/rail_detector_powered.png create mode 100644 app/src/main/assets/blocks/rail_golden.png create mode 100644 app/src/main/assets/blocks/rail_golden_powered.png create mode 100644 app/src/main/assets/blocks/rail_normal.png create mode 100644 app/src/main/assets/blocks/rail_normal_turned.png create mode 100644 app/src/main/assets/blocks/reactor_core_stage_0.png create mode 100644 app/src/main/assets/blocks/reactor_core_stage_1.png create mode 100644 app/src/main/assets/blocks/reactor_core_stage_2.png create mode 100644 app/src/main/assets/blocks/red_sand.png create mode 100644 app/src/main/assets/blocks/red_sandstone_bottom.png create mode 100644 app/src/main/assets/blocks/red_sandstone_carved.png create mode 100644 app/src/main/assets/blocks/red_sandstone_normal.png create mode 100644 app/src/main/assets/blocks/red_sandstone_smooth.png create mode 100644 app/src/main/assets/blocks/red_sandstone_top.png create mode 100644 app/src/main/assets/blocks/redstone_block.png create mode 100644 app/src/main/assets/blocks/redstone_dust_cross.png create mode 100644 app/src/main/assets/blocks/redstone_dust_line.png create mode 100644 app/src/main/assets/blocks/redstone_lamp_off.png create mode 100644 app/src/main/assets/blocks/redstone_lamp_on.png create mode 100644 app/src/main/assets/blocks/redstone_ore.png create mode 100644 app/src/main/assets/blocks/redstone_torch_off.png create mode 100644 app/src/main/assets/blocks/redstone_torch_on.png create mode 100644 app/src/main/assets/blocks/reeds.tga create mode 100644 app/src/main/assets/blocks/repeater_off.png create mode 100644 app/src/main/assets/blocks/repeater_on.png create mode 100644 app/src/main/assets/blocks/sand.png create mode 100644 app/src/main/assets/blocks/sandstone_bottom.png create mode 100644 app/src/main/assets/blocks/sandstone_carved.png create mode 100644 app/src/main/assets/blocks/sandstone_normal.png create mode 100644 app/src/main/assets/blocks/sandstone_smooth.png create mode 100644 app/src/main/assets/blocks/sandstone_top.png create mode 100644 app/src/main/assets/blocks/sapling_acacia.png create mode 100644 app/src/main/assets/blocks/sapling_birch.png create mode 100644 app/src/main/assets/blocks/sapling_jungle.png create mode 100644 app/src/main/assets/blocks/sapling_oak.png create mode 100644 app/src/main/assets/blocks/sapling_roofed_oak.png create mode 100644 app/src/main/assets/blocks/sapling_spruce.png create mode 100644 app/src/main/assets/blocks/sea_lantern.png create mode 100644 app/src/main/assets/blocks/slime.png create mode 100644 app/src/main/assets/blocks/snow.png create mode 100644 app/src/main/assets/blocks/soul_sand.png create mode 100644 app/src/main/assets/blocks/sponge.png create mode 100644 app/src/main/assets/blocks/sponge_wet.png create mode 100644 app/src/main/assets/blocks/stone.png create mode 100644 app/src/main/assets/blocks/stone_andesite.png create mode 100644 app/src/main/assets/blocks/stone_andesite_smooth.png create mode 100644 app/src/main/assets/blocks/stone_diorite.png create mode 100644 app/src/main/assets/blocks/stone_diorite_smooth.png create mode 100644 app/src/main/assets/blocks/stone_granite.png create mode 100644 app/src/main/assets/blocks/stone_granite_smooth.png create mode 100644 app/src/main/assets/blocks/stone_slab_side.png create mode 100644 app/src/main/assets/blocks/stone_slab_top.png create mode 100644 app/src/main/assets/blocks/stonebrick.png create mode 100644 app/src/main/assets/blocks/stonebrick_carved.png create mode 100644 app/src/main/assets/blocks/stonebrick_cracked.png create mode 100644 app/src/main/assets/blocks/stonebrick_mossy.png create mode 100644 app/src/main/assets/blocks/stonecutter_bottom.png create mode 100644 app/src/main/assets/blocks/stonecutter_other_side.png create mode 100644 app/src/main/assets/blocks/stonecutter_side.png create mode 100644 app/src/main/assets/blocks/stonecutter_top.png create mode 100644 app/src/main/assets/blocks/structure_air.png create mode 100644 app/src/main/assets/blocks/structure_block.png create mode 100644 app/src/main/assets/blocks/structure_block_corner.png create mode 100644 app/src/main/assets/blocks/structure_block_data.png create mode 100644 app/src/main/assets/blocks/structure_block_load.png create mode 100644 app/src/main/assets/blocks/structure_block_save.png create mode 100644 app/src/main/assets/blocks/structure_void.png create mode 100644 app/src/main/assets/blocks/tallgrass.png create mode 100644 app/src/main/assets/blocks/tallgrass.tga create mode 100644 app/src/main/assets/blocks/tallgrass_carried.tga create mode 100644 app/src/main/assets/blocks/tnt_bottom.png create mode 100644 app/src/main/assets/blocks/tnt_side.png create mode 100644 app/src/main/assets/blocks/tnt_top.png create mode 100644 app/src/main/assets/blocks/torch_on.png create mode 100644 app/src/main/assets/blocks/trapdoor.png create mode 100644 app/src/main/assets/blocks/trip_wire.png create mode 100644 app/src/main/assets/blocks/trip_wire_source.png create mode 100644 app/src/main/assets/blocks/vine.png create mode 100644 app/src/main/assets/blocks/vine_carried.png create mode 100644 app/src/main/assets/blocks/water_flow.png create mode 100644 app/src/main/assets/blocks/water_still.png create mode 100644 app/src/main/assets/blocks/waterlily.png create mode 100644 app/src/main/assets/blocks/web.png create mode 100644 app/src/main/assets/blocks/wheat_stage_0.png create mode 100644 app/src/main/assets/blocks/wheat_stage_1.png create mode 100644 app/src/main/assets/blocks/wheat_stage_2.png create mode 100644 app/src/main/assets/blocks/wheat_stage_3.png create mode 100644 app/src/main/assets/blocks/wheat_stage_4.png create mode 100644 app/src/main/assets/blocks/wheat_stage_5.png create mode 100644 app/src/main/assets/blocks/wheat_stage_6.png create mode 100644 app/src/main/assets/blocks/wheat_stage_7.png create mode 100644 app/src/main/assets/blocks/wool_colored_black.png create mode 100644 app/src/main/assets/blocks/wool_colored_blue.png create mode 100644 app/src/main/assets/blocks/wool_colored_brown.png create mode 100644 app/src/main/assets/blocks/wool_colored_cyan.png create mode 100644 app/src/main/assets/blocks/wool_colored_gray.png create mode 100644 app/src/main/assets/blocks/wool_colored_green.png create mode 100644 app/src/main/assets/blocks/wool_colored_light_blue.png create mode 100644 app/src/main/assets/blocks/wool_colored_lime.png create mode 100644 app/src/main/assets/blocks/wool_colored_magenta.png create mode 100644 app/src/main/assets/blocks/wool_colored_orange.png create mode 100644 app/src/main/assets/blocks/wool_colored_pink.png create mode 100644 app/src/main/assets/blocks/wool_colored_purple.png create mode 100644 app/src/main/assets/blocks/wool_colored_red.png create mode 100644 app/src/main/assets/blocks/wool_colored_silver.png create mode 100644 app/src/main/assets/blocks/wool_colored_white.png create mode 100644 app/src/main/assets/blocks/wool_colored_yellow.png delete mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java create mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java delete mode 100644 app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java create mode 100644 app/src/main/res/values-zh-rHK/strings.xml create mode 100644 app/src/main/res/values-zh-rMO/strings.xml rename app/src/main/res/{values-zh-rCN => values-zh}/strings.xml (100%) diff --git a/.gitmodules b/.gitmodules index fc46c2b9..9f1f6254 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "leveldb/src/main/cpp/leveldb-mcpe"] path = leveldb/src/main/cpp/leveldb-mcpe - url = https://github.com/Mojang/leveldb-mcpe.git + url = https://github.com/Mojang/leveldb-mcpe diff --git a/TODO.md b/TODO.md index 6cf97df9..5cbb713f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,19 +1,3 @@ #TODO -- Translations/Localization -- MCPE 0.16 blocks + 1.0 blocks!!! -- new entities, block entities -- new icons -- unit tests -- testing! - - -#extra: - -- multithreading of the individual chunks of each tile, with a thread-pool. -- optimizing the top down rendering with lazy chunk loading (from the right direction, stopping when opaque) - -#important - -- firebase cleanup (remove config, new key) -- google big query! +- new blocks \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 975d0999..7e5e02b1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,16 @@ apply plugin: 'com.android.application' -apply plugin: 'io.fabric' +//apply plugin: 'com.guardsquare.proguard' +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 29 + compileSdkVersion 30 defaultConfig { applicationId 'rbq2012.blocktopograph' - minSdkVersion 16 + minSdkVersion 26 targetSdkVersion 29 - versionCode 1090005 - versionName "1.9.3" + versionCode 1090007 + versionName "1.9.5" vectorDrawables.useSupportLibrary = true } dataBinding { @@ -20,51 +22,69 @@ android { buildTypes { debug { - minifyEnabled false + firebaseCrashlytics { + mappingFileUploadEnabled false + } + postprocessing { + removeUnusedCode true + obfuscate false + optimizeCode true + proguardFile 'proguard-rules.pro' + } //multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' ext.alwaysUpdateBuildId = false } release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + firebaseCrashlytics { + mappingFileUploadEnabled false + } + postprocessing { + removeUnusedCode true + obfuscate false + optimizeCode true + proguardFile 'proguard-rules.pro' + } +// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { - sourceCompatibility = '1.8' - targetCompatibility = '1.8' + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } } dependencies { implementation fileTree(include: ['*.jar', '*.so', '*.aar'], dir: 'libs') - testImplementation 'junit:junit:4.12' + implementation 'com.google.firebase:firebase-crashlytics:18.2.1' + implementation 'com.google.firebase:firebase-analytics:19.0.0' + testImplementation 'junit:junit:4.13.2' implementation project(':leveldb') implementation project(':tileview') implementation 'com.github.clans:fab:1.6.4' - implementation 'com.github.bmelnychuk:atv:1.2.8' - implementation 'com.github.woxthebox:draglistview:1.6.3' + implementation 'com.github.bmelnychuk:atv:1.2.9' + implementation 'com.github.woxthebox:draglistview:1.7.2' implementation 'com.andreabaccega:android-edittext-validator:1.3.5' //core is the new recommended alias for analytics - implementation 'com.google.firebase:firebase-core:17.2.2' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + implementation 'com.google.firebase:firebase-core:19.0.0' //implementation 'org.jetbrains:annotations-java5:15.0' - implementation 'com.tomergoldst.android:tooltips:1.0.10' - implementation 'androidx.annotation:annotation:1.1.0' - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'com.google.android.material:material:1.1.0' - implementation 'com.github.bumptech.glide:glide:4.9.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' + implementation 'com.tomergoldst.android:tooltips:1.1.0' + implementation 'androidx.annotation:annotation:1.2.0' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'com.google.android.material:material:1.4.0' + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' //implementation 'com.github.MikeOrtiz:TouchImageView:2.1.1' implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.florent37:expansionpanel:1.2.2' implementation 'com.jbvincey:nestedradiobutton:1.0' - implementation 'net.lingala.zip4j:zip4j:2.3.1' - implementation 'commons-io:commons-io:2.4' - implementation 'org.apache.commons:commons-lang3:3.9' + implementation 'net.lingala.zip4j:zip4j:2.9.0' + // do NOT accidentally "up"-grade to the 2003 version + //noinspection GradleDependency + implementation 'commons-io:commons-io:2.11.0' + implementation 'org.apache.commons:commons-lang3:3.12.0' //debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.1' + implementation 'com.google.guava:guava:30.1.1-jre' } -apply plugin: 'com.google.gms.google-services' diff --git a/app/src/main/assets/blocks/anvil_base.png b/app/src/main/assets/blocks/anvil_base.png new file mode 100644 index 0000000000000000000000000000000000000000..db5f9a9fcc5484a570ff2c9c897b37fa842f3224 GIT binary patch literal 379 zcmV->0fhdEP)_db=4Cy@2UxhTl0mV(zyaH0y4kRL1fDsr|?zqdc%)7EIO%3Z3(qbWz(^W-q zaZnV+$AOjzNv}bSb)d00pt$_dl002ovPDHLkV1mym>Y426BCwkn|F-EH^%pNI8J8z+CDv(B6W6V4?JRb{@h>rxCMt>c(p`<{M}Bl)J0 z{Su?}2Jcgq`<~k-hXG;=tR|BhiVxg*^L^`5*S6(5 zXzurPEQ^S!BOncRP)vXW&?Jx%o%&v&y{`i5#$g0(4P*t>#lAu%+1l3xAe@g0?DH(J zy{rIEO2A1(>bFpRyUF_R1o|?!X}W}q0$iG=Q1W~BaEV&ZA2zxZniY+ap#T5?07*qo IM6N<$f_eRpMgRZ+ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/anvil_top_damaged_1.png b/app/src/main/assets/blocks/anvil_top_damaged_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc6349c16e380d7bc3f1eea0043dcbd46e280e4 GIT binary patch literal 367 zcmV-#0g(QQP)tDlgbYm1V~SH~{;wjddIZ zwBGN3?4Op9$I+&2n+7f8$O*P-(xmL8grRB99f+D`7(C-!zg|gVH(fs`a4n0IVSiAH z*n6llun&AapT`7XpNBzNAJ{&KPy!sx{Xmnt*3%wzbxplOsydHuKbD16zm;nL8$0bm zqHF^o5R#9}g~~K#NbD^^zjFeD{T^^gAS#Z!Ho@n*a?<`~zIA|R$@2}>)9tE?BnBK3 zKnaHdD8=}Z+Ky+>wt4=S0|18sd6{ilZp5bqzT<2zB>7c)ypis6egNM?6K;Y+}rLo7}w|L|8#U=X}zZJzMx zGW&*P71Q*4H4a7$-AU(Hryr1*?s$WDM>+30LD}Xf8>AbSSw4Bz`u}JD`vnOTBz7rE zuqkBE`~33lf93!G8x1>plQ`NK1N0kICYr`KC#5(SNHKg?_Ym~?Y`s8+<1kO7B!e-_ zQEnCK23>)Z-pIHE%$l&Sf=d#Wz Gp$Py0+Dgs< literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/bed_feet_end.png b/app/src/main/assets/blocks/bed_feet_end.png new file mode 100644 index 0000000000000000000000000000000000000000..41838cf3fd1c167bc380d72c083b4d8e2da6cfde GIT binary patch literal 384 zcmV-`0e}99P)Ft11(R3$P|4+$V+e0{-(4 zpbyJAEjp_Y9C{;sg4l2k^m#@yS_IZ19b!*1cKozJ5so^C*Jl<%^uQZ5pD>AauT%m# z2%{;uJD;fCz?{uDJOo*dm#>aUMonW>A((hklc(DgiiXCK$9?5jUJ+un%E1@>QZ^oM zH|~FcfDR;vNE*o?qZ3%_&*B6P*FdP_?>@fg`_~87wsV>$`aa+mthIoGWuCBZTw5hu za-3&!X{b22R&igPtu?-V`3V-Jk`xe-Zd~?)`oNnd0q1hvxf^F<43xs#S|AFS-uU$S vUVnR|O^1a^N4o4;9at}gaS(6kc$VNdIqs4h@=fCa00000NkvXXu0mjf!4;A; literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/bed_feet_top.png b/app/src/main/assets/blocks/bed_feet_top.png new file mode 100644 index 0000000000000000000000000000000000000000..43ba6a364468e35b2b0edec26d2a8da20ce2b1a8 GIT binary patch literal 592 zcmV-W0(& z*{B1+!v-l%cj7IA37kVY$0X;C^%DRSqciYXtiAZ-<2#2NxL~W0bKpWV{NTrrKY4sR z*$EKXROD`UCeL-D4RcP8=LfC^r7*!2c#6V+plBBaCv#&mP!rDMq+%2IM!6^lwL!lM zPi-E4Vy)!5`26+eaX2;yR|M0FcP6=-h&T0Kh=9A1Vz@Esr||rK5c{Bie(~y?dVR51 zvbD%;a@~|Cdm6q#$K>e5RfF|=vorbk_2P<~&P}Is=cZQEy3y&}Wjx+RAC5$_3VbJo zZvOfEC!eohYHLiHc=HC;X?}SgiKIHrEy9bEfhD6V)eu-5p_ljOOuwSx=f9qF>0bHNFoTbZ`_phf->-l=V&g3 z`0s@e0clzbnFlIHlpr#(M{s}M?ArJ+q72s?Z&%2`r_lndHb+0u)zEKTjP8JU@aTc6 ekgcSEbn`zZ5@8mJ>8u6-0000s_RVkw z*NEQ%zUG7f{sHpx`HOn<-fhGorNqz6OM+x_Dj0!Dm6OvGN)@DxY%W&7j9f=hA*5*F zaQE~Ms>;FQfLav_R3@wnRG}NMP@HuC0bz7LEti~Md?lzmjX(}95vTvXC5vKW#7VHl zoPKwOYhl)2ql^P0LTv=`N+_lBWpz%@g((+mbk;xC062=NVJaLS9pibRsIggpr$_`1 zgns#yZ|}FfD~ZD<0)peD3|gJ`u)zo8?bu-vT8UJtsLgr(<^!P#EqxwXe%ugT>EncD zBiMwxu$l@HVbK~C_%&o6Jv^i9wpbNH>Ju>p)}!<6)o0mf-Qy=`wck}Hadg(s(bynb y_kQ2rxK2^yR%p>(-=Q{fq+#zs8vmdeRh7RhKBOPb_0LNH0000cV_mH9ZF5sEG@V|c`d2_#ZSrzWw*s7G>g9Cn!$9RTcO~=cRA9%R)2v3eTndy8% zQX}Vxbv-dv_Xyj{>gtlC!)Gj)D+cwDrW2%D6EGg{?;!#D64-xI5Qp)_In#?Nnp|0y zo;EwzH+PI?-zkz9h9QoUT{%0SK$A(iM+~~ACl){o@#}m>kbng^Is1YaP+ybXi2wqN z*_6q^Xm1@iXSVo*sG=zH_VsgDH&Uzt$6_G5U^!FVFe_B5G)1UWq!lA!m9N^pT-bj3M(@f2IH$PTi}y7%v1`R~!324fF6oAq1-m2>9o(01fAG{6<5t$GL+wEC;da3Plj{M%WR>-vC zxV?X%NM^cDEZ2p88u;zcKS;51^X87-s^imtPrSUopt-WY-{XIIcx0H)^v_q?rhyO` z`wLPF!3+0ykF0M3Uw!i}x808J!{4-jIp%4kAI|vQcMr779TWfX!`ojOhZC+E@7{l8 z%mzO4)Aw)Lt+(Ld$H$+sDf0fqJLH_v@p>i2iBJ^3_NXeU27Pql)^%rZo_+Opql>7BzrKOgWZ;3d#B zp2OjZr(q#gp}h#H2uj8Irk1Jwkp z1wz18upDtt@Kh8-EK@R2l`#Bez>z8rWxT_`o9#e0$%rcg`b_KQ8&R3SMU2Tl~r6;t6jOvGg&v%-l35wt__ z7Fe4@%(xCcNCusd0-N265Ioe0^Xrjgnpt;izP#VF-ZuDpnJHo{1}}$?jJYt63sp7* zuBcSbmou-g7l!c&u0!8c*4>8w1iEsp=9UTAw002ovPDHLkV1naCLR|m= literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/bedrock.png b/app/src/main/assets/blocks/bedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0792332c99918449a4523658f4ffb09a7df03e GIT binary patch literal 225 zcmV<703QE|P)F#%PL-74aEz1~lKyIiDiVXa7M##mtc# z%Zg3STy?z)`(m#A!{X~9<&Lv_W@UB83}8|6RqkoxpZOmj5{fI&u##0A$Ed6X1#0Hi bBT~ROrseuXA#iRz00000NkvXXu0mjf^D|({ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/beetroots_stage_0.png b/app/src/main/assets/blocks/beetroots_stage_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd85ee02dd2da286b06f7e5fe6cae728a0f1215 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#-1*YAr_~T6C_v{Cx~2Nd?WDR zf6pU#rWsw=lMEk7=sADy_?vz}Md=xy~0{%OFvQS*ozo7sZd z;-N|HKk9cZwD{YXW33@@@n~5`vQz=j$%K>xv(EmSpDD(_$~U{Q>tZaM3BwYx)!Y+Q k9g-64cD;3Ao*2u(5OOTJM9++8C(tzvp00i_>zopr04e%GzW@LL literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/beetroots_stage_3.png b/app/src/main/assets/blocks/beetroots_stage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a13a0ec934c5b13a459b3d730cb00d2d9b597a03 GIT binary patch literal 394 zcmV;50d@X~P)W--h>tD?*LOe~A_>yGPVzs)9IychLqH0V`5;XY zF{q&+0f+(rWxI|4Cr@(yFP?9X(6CA3KL~@xV79{ea2r6bfEqBlFXlggmnuX7&{g%l zv0wv0a$v(&$ovPYM{*_93m{D}17L=MXb|6OnJ2_RpvL))>0lZx5BCDl6(9o+_4PnZ zh8h6kgAD}Q3Uk5aDjxgUQDO$D;MnZh|NAT~fY<=!Y=$$-SNzZN(FAJ-@lP*W^uN|o=Rep& zSnMIkDagq)-95mzgEWBnAj4qM400WqkD?h0qGiRw&Y$Gu{2#;y;TirO{|i)PQ25zU oK89wH!bVL+Fa{|i#D^II06&!QB&R_5*#H0l07*qoM6N<$f?V&W_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/bookshelf.png b/app/src/main/assets/blocks/bookshelf.png new file mode 100644 index 0000000000000000000000000000000000000000..7ac3737ae8a859eb07fb9e14d6a07c116b5999d3 GIT binary patch literal 374 zcmV-+0g3*JP)tV7O=IoBQXS4+~=b|4!u@I_=)2*7Fz5W8cA{{aB_(-PQCNyEI>wglF>+ zlYq15(cZlVyR(>Dqi+f5w<=N`^Pj8q)~#IuACn#>NkUN+ksF710EVjo+$)A-QI?j0 z3J8LLeBYNIeq{iEh_?>X$O0f$_RS3LdSEL7Kc@ji2B-r00000 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/border.png b/app/src/main/assets/blocks/border.png new file mode 100644 index 0000000000000000000000000000000000000000..2bca675ade825ae00d9c6fb379e915d55666e461 GIT binary patch literal 514 zcmV+d0{#7oP)004R= z004l4008;_004mL004C`008P>0026e000+nl3&F}00009a7bBm000XU000XU0RWnu z7ytkPh)G02R5%d@!NF}1F%$*B`L+WRia1aVh0r@^kSKs$fb6dQA2ap++t>IFfQf-d zBLDyZ{Cc}Bzxn>>pI6iC8s;v~j8O=;*drS2aE~~lPyE=I1)oh{J}q-GQZ(JsgO8gl z&7?jsJDw-5#hhiqr!lNiW|2ZDWr$4HE@M$uO7v*eF|go_sDnWohwcbk>=8?;j+1~+ zG?qyh`z5AQO#s&&*KC@nBhXx$&C{_A#w42~uEYrcPD{}{cJXv*IIu(#go__a1uu(bjK3*6ECwwY;h9M#p&1`ok-E)?tn)OO(#x;Lea&>P6$V&fRji# z#pzf=tzrV2D!SufS5&iRnN^1NB)a2ZL4}#37_(G|CLJfCSjtkm${eK|#e$vK6{AR# zL&76=NAOYsFp4T_uwZxGcT^F)cY6}uJc$!dA0OAS#oyBchXq&SbgKZnV~Zn#Bksie z6DB7y(8c=ocKf+6v&yNcCIvi+r{ld_hbpF0gDooj2dUvyEJ^t+@Bjb+07*qoM6N<$ Ef^z}YZ~y=R literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/brewing_stand.png b/app/src/main/assets/blocks/brewing_stand.png new file mode 100644 index 0000000000000000000000000000000000000000..b7509d754ec380459f8438cf868db9cffc970b39 GIT binary patch literal 321 zcmV-H0lxl;P)zaUL}7YBh|0b+y1 z(AB}gm0ZvNdqNHWuXI=ak8A))^RYdFgbg^ee(C?|=3@UrG_nC8%`h*(48ZDzCr_UI z-z*{V|J=EA1YLjuK$`BFnEc=}pUxnoS6Fw0J)Rlw4b^JZve~Rt6ukcDsoh6rJX7x3ly4 zEC34n{k}aO4*^hvq`;vg(%FLq3Zc*4^ZB&v_4;GPJxu}{F=@G6>LQ=d>jM20a{u{! z?0&!N-Wj=9p;D=6gMMT{8~vNjM$A08FO^D~4u;|tQUyS)Rx5REwOR^aV=$l;L?RIt zAu*LoeHr)&(MXU?(d+fHZnvv7=X8(7Vgg`IF|`6zdkBYP3 zOQZ`kMjvdP6(hq7@916u&}cNiQ-BgdGPGR+M&SbtDDbf|V*H{zxdAsBm;WH;a#>#< z7c5}NmotBT6cQREUFql#%8|MJ|JUIQ9&zUX0w(?e>90RW#uiI900000NkvXXu0mjf D>Q&|x literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/brick.png b/app/src/main/assets/blocks/brick.png new file mode 100644 index 0000000000000000000000000000000000000000..3efcee4f3f47c3b451d3b5cb70db0869f1f77154 GIT binary patch literal 506 zcmVI zYfC~w5WRn=q9>G^nq`+tOt=A8S z*`3)tch1?fMsaGG&c_A_@hN}Fu{<51(=i|2%?5e@5DU}ssFz;LS>8(?Fg62y1f;_K z^mSLEdOXVeRc{w9y4rcY?(d;Q$fX)=k2pBLWq})Hq8?iIbT%DW^L3N_06={=$vlBzSu35a_=SRt2mo;kY8U@e!E4myXY#0;% zfY8w7F?YcqgRa#17O+6_vt}yM=6YK=!XLPM=4`1hbu{J%!Y7~HZt{U$pZ99vS0l?i zqKN_DgD3oM_rhcLf+>No004R= z004l4008;_004mL004C`008P>0026e000+nl3&F}00009a7bBm000XU000XU0RWnu z7ytkQU`a$lR5(v{Q`>G5Q52m&A>n~QpDQ*aW{_7)gTU}5WXrw{AxYM z@4W>Uf8R!M)LOuS@&q5n2Y9z0Ks9v(V`F3B2>r0Jh)VLh5v!3aC-Uu~n!XngoI|70 z07sI3HpAFlnnLTDk3}UljrQ|fEGS=%Uc-9AY1ApAcg~~LYJn@4%lJ_bjWFx$Eq=;S zFkFwR3i|!Nrr>xlVj#cYm@}A3mAvdmJ?CXLG3`d@MD?!()LP;Db>VrD2k$)_)RtOvuX{y`kA5~!H1gQ zXQ~!&pGB|N(@gxZH9NxgVsVm9gYs>fO7tq^oS)^pc^@9m*ddCd25__+W(K|*`rDc- z9w>sBvE{;-&{QX~$-CHP0;MU)vJ8%1<63NzA;tpZtT*~T^4VFgN62f((!B{J<|f#h z&O00qaP%w*M3N*H^gzhnYPE_=rNU&=UZ>MRyWM89r}5eCcJ`eA0nTtvz^ym-wg3PC M07*qoM6N<$f{Ex%y#N3J literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/build_deny.png b/app/src/main/assets/blocks/build_deny.png new file mode 100644 index 0000000000000000000000000000000000000000..db2300b2ad8835f629eaa8e38411136d442aec4e GIT binary patch literal 518 zcmV+h0{Q)kP)004R= z004l4008;_004mL004C`008P>0026e000+nl3&F}00009a7bBm000XU000XU0RWnu z7ytkPj7da6R5;6RlTXV5Q544SM_?vvC27dQ%9MpY#mcAfFBX`rY%NS85u&6N3m@@$ zd(PXLuG=h5=iHe)zj@9-69fVB`8=}OEVkP%cDr5Tuh%OMheL8^Okbx)ysD5 zTCdl`^ZAt87#4+>DbN193$oAMZdU+QZ&=wVihfeyCEF`NAxz0$k~79kJUe0Cs@@O(89J zR|RW8Kpe*~$Kx?k;L3Mr!5yT{W&=~N*JU|4o_s;Nnx4~qyWN)9a2s_wNTq!~AG}^K ze7|4ukH;f9kKb!2kdN07*qo IM6N<$f+^_SBLDyZ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cactus_bottom.tga b/app/src/main/assets/blocks/cactus_bottom.tga new file mode 100644 index 0000000000000000000000000000000000000000..583aef99ab8492cc741f3103058edd15c2d2e58d GIT binary patch literal 1068 zcmb_cNe;p=42(E&LE^}f55O-#s)Rsd6IcEPZQ)031xg7|2_7eg76KAWrO2-1@r<3c zN|ls6RaI5>a&1~se^`cUe6xhx%(GKrMd!@SPASJ`>9MefT*p_$Co2=}*Csw}*}@NL zNi05Yc`tl{N8aM1O{~ub{1Mq$YZr5I)XcIce$-?h%4eVO`JPY@wV=(bpLzuzdDv&) zX_q+bqL>#?m}QzUhv1P9&S<}34E!*$9KQKk{kC`H-SL)_XYz*MV)RXa{v22n^@bdu ze$1?ZmpSCD?ZuBrP3EI~o-<~R-rc*k)Y}XF*atsm#W_2Bmw5KMa{!0${J}qW_mzFT kKg2`>;*azH@%xeQ;A1O)gJFNv8V7@**KJJNL8sMJR}-#LQvd(} literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cactus_side.tga b/app/src/main/assets/blocks/cactus_side.tga new file mode 100644 index 0000000000000000000000000000000000000000..e6e50ebe39e6f8ea610f48edba72ce1154e75643 GIT binary patch literal 1068 zcmZvbNlODk5QQ7@Fk+IKtj6pS4_@@1s}La|3T8nM9$XMa6cx9F8wwuW{&L%2P1g{k zfu?7s`qf*yV$77$Ut}WF3Zm5+I+Q-8owRjKf(J{D-pZl)U}@U8W#`W`w)v2axtxyLT__wQjE0>PjbMed>YID1(gdgo_)LNq7af)`2uinIG@Q*Il&t5)A$JulO z*WP>dc(OucaX*#h2Y%r@Fa5z6M=8wJ-hhy`4#&qxi{{F`zsy(_Ky!R)Zry#e87)>YI5)Q z@m?Iv{_$TuiLu~xjpJno-*eLEKmB}@GvJ-ZN&md#iG?0|<3E`{myyoK_>AHWy=YRr z&IWkuEc7d0veOw+|6Z5m=l>hvbpF6LULv_`@P%QVQIenMANK~o;_;^*>BF4h5xnLJ ab`p;PeuJ%Hchu|mHaC{H*Lv&S74rjXeRYxm literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cactus_top.tga b/app/src/main/assets/blocks/cactus_top.tga new file mode 100644 index 0000000000000000000000000000000000000000..3a05eeeab27fbe570ad7c354cd0c1ad86dc0e7b3 GIT binary patch literal 1068 zcmZ{jK}!Qc421{rP!M%%_aI8O)*ig*zo@Vv3TnlxNB@8)5kUk&1QGx5m@l2Tqyr8N znPl?vUb3?(ttG7{HEA-~eb`KF*5G8_&+@Uv*sT9@EuQTncKxi zK71SIqt8*^d)#t=|7qKO-A&(jJdR)L^>}dL!NSLx{K>~Mrn}i!>+zz|QoS$Fi~Pc? zUbNi7VKtnebJTe7I&^-xIfEU)G;WE3uk|ZVF1l+z>L@OJ(T;|`PqainX#o>!k_Wyl z*DtNdKcjvgaek4XZ)jWZBlE4M-^*_RhTO$&O^4luPgeBsUd{K4oApqYO0d2f+lbE)z8@af;c;+H(P o@xH?A9rph)b75KD$|lC0;`prF>&5)8yXmejPw&sWi}_jl18SE>WB>pF literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cake_bottom.png b/app/src/main/assets/blocks/cake_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..6f88eccab5170c361bbfad865e68fa49d0ffc906 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`;hrvzAr_~T6Be*V$gTM>U#2JN zKwrey{{~X>ZeiVt47(I}+^FC^kg9A}IB9RgJEb{#3da;~RWRC4@%+SO80axg{6wEy sOx(fQ6Fht;vg~yT@>-%{9LU5_eRQ=-w9VG5Kr0wLUHx3vIVCg!08L6ThyVZp literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cake_inner.png b/app/src/main/assets/blocks/cake_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa0d1d45c0a720d44fc64d0b470b1c8eee7d725 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar_~T6C_v{GjQ?AT7CKd z@9%Gk9bTOe>vvhOEI!@%%+s86MAglJha+(YBg5<2=WG|RyXp$G Om%-E3&t;ucLK6V9S38yf literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cake_side.png b/app/src/main/assets/blocks/cake_side.png new file mode 100644 index 0000000000000000000000000000000000000000..9d51b842fcf322060a43e84526aa584d9a86f02b GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`iJmTwAr}702@c7&_W^wh71|W)O&zTf=bd$ft*FKHsM_d9UjaXxsepqhnP7 z4}<5Mj!^bwf!QEsGgOS&Znk*y9A+po@X%*iz18q#=GQ50K+70BUHx3vIVCg!0K@e& AkpKVy literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cake_top.png b/app/src/main/assets/blocks/cake_top.png new file mode 100644 index 0000000000000000000000000000000000000000..b08b5cb9bac43089c8f1e1e02b636fb3f12e8c35 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr`0CPQJ@|K!K+v_K4w~ z`YxN_x8^HGDY=~cvPDdrBo)az+x&($tIHDKGI_$q`s;@`}$YrGW;*6|9SQq~8$jKR~@&t;ucLK6UjcTQ3O literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/camera_back.png b/app/src/main/assets/blocks/camera_back.png new file mode 100644 index 0000000000000000000000000000000000000000..68524f8b4ba2f90fa1c3612f95561bf796903433 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{3dtTpz6=ai zY77hwEes65fIXSLE>^dBCE3uIot=F!!qt_vr*P%sI}9c22bs8+3AQCZ fVkuT$3G{&RgNr^jEukBMwla9S`njxgN@xNAX7EW| literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/camera_front.png b/app/src/main/assets/blocks/camera_front.png new file mode 100644 index 0000000000000000000000000000000000000000..3c80d8b98845b3538c0933b51bba02ab360efe6c GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{3dtTpz6=ai zY77hwEes65fIqh)oylj;FE*ZvJQfD$kFPrBOn$i!Xaj?% LtDnm{r-UW|YlTGG literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/camera_side.png b/app/src/main/assets/blocks/camera_side.png new file mode 100644 index 0000000000000000000000000000000000000000..949599e86623fdc8abdf1a7b97c854ba52924f3d GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jPK-BC>eK@{3dtTpz6=ai zY77hwEes65fIeK@{3dtTpz6=ai zY77hwEes65fIIXlA{>McvEh`th0gYwwboFyt=akR{0McGR AKL7v# literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/carried_waterlily.png b/app/src/main/assets/blocks/carried_waterlily.png new file mode 100644 index 0000000000000000000000000000000000000000..5f37997b5273580d4d86314ef72dd35986f0abcf GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar_~TfBgS%&#Wrp+z=i8 zz@8&HxW|{zxpBjG9*M=;M^xJr8ycEfWDbiQGHE_iAl0yjBUW+O!4qxC5(l!Cn2w!j zYq()x*u}Md=xy~0{%OFvQS*ozo7sZd z;-N|HKk9cZwD{YXW33@@@n~5`vQz=j$%K>xv(EmSpDD(_$~U{Q>tZaM3BwYx)!Y+Q k9g-64cD;3Ao*2u(5OOTJM9++8C(tzvp00i_>zopr04e%GzW@LL literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/carrots_stage_3.png b/app/src/main/assets/blocks/carrots_stage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc0b894105022e77e7dce7fd812f390ec4aa1ab GIT binary patch literal 306 zcmV-20nPr2P)6uGD;c#i)?{lkPuThnn6%Qz+yl) zLNn9=kOW9G?<$7>Ak7SoP{oZzhtLeCYmoT3fTJ(Zf5&*f|E$@pU|Y4U1;7|A3Dm3{Dg0l>nI9~V zp*h=5;Qylq0{<^f;`r~VDDfZ0KiJBE!ar0G;luO+0Ccdi@}ZgyzyJUM07*qoM6N<$ Ef~^sIL;wH) literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cauldron_bottom.png b/app/src/main/assets/blocks/cauldron_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ac2a110f05abd26b3b10f771636eb7d5a1c754 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar_~TFI>F%lmGCpUAz8E zaxn0GJs}gs)391SOxbF|JjTTdA`0rhMPC*^VeOi1w9!-8*>)+=h+DB9U$UQwTLDdB N@O1TaS?83{1OQiSBzXV; literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cauldron_inner.png b/app/src/main/assets/blocks/cauldron_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..9722b348f29bb3e3fa70ac2bf9ec4c4fea20ceba GIT binary patch literal 362 zcmV-w0hRuVP)$;|K922o=n!?W= zKXLOo3!KMsr1Lx@d0Cb)2#De5#77*UF)RpV7R;Sw{8ZMjqJ7^Z##!Kef`?%U>-#>c zbzPUMs>Gt9fL;Ux`g}g={eFivO_SQT4HAl}h!fHv&R@Zfqpvp(L%|iJ~ zrz)V=>y@o6%d7;Dj~y-W5K4l;>US`P4{~xWny2uKK;SO|OiU(lzC0j3KMC+T4O(z| z#T|^3Bzgt#d_*SXB;3rrNcVj}B1#;mV}!th|2C0T<^*VfBxmgktJHW9m?(*_YbEzX zgMi7o(y_{1SPol};J%?MqmbY6H}YY1rCrw*r=$|ye|bs%0J1rz!fW5D(*OVf07*qo IM6N<$f*}*5nE(I) literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cauldron_side.png b/app/src/main/assets/blocks/cauldron_side.png new file mode 100644 index 0000000000000000000000000000000000000000..59e83040936806c48d9da570b9e5d43ae52229bc GIT binary patch literal 446 zcmV;v0YUzWP))rr+-u$mMb=WT!|+&eQ2sa=LRopU>6?yE=jx!F#T9ej3^WFov&zu81Qroe9#7lh_#S7r^J| zXIX|Mi0HGw_2@eG#cN4+(QZkAe%xr zIW?L%xh@Wjz(IbNEFiLF;W;DUYfu~ju#*mIwc5v5{HgwP$>*|xe*he$&99=rzX3F{ o0~(DB01d#hegn8T08r1tKccFY<)@j8lK=n!07*qoM6N<$f(0-ene zcl~CDVUR4#ULd~!u9$8%h6yEB*zbQ(XvSUnPkN*IJMO1HQL@1E}00003gv literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cauldron_water.png b/app/src/main/assets/blocks/cauldron_water.png new file mode 100644 index 0000000000000000000000000000000000000000..765a9da7ce8dbfcadf4863abc7d75c21f847e076 GIT binary patch literal 6705 zcmV-18qVd3P)y8~omWAW}pJX)B=;%nTk!7{IH5!=)V`FnM_5kJ%0*rZv z@e0lte6cektNKT(s!pBEjEvZ^_S)BMFJHd==kw>!|2xN%Cr_^LzyJP!aeVmUhZjE2 zk>5Z2?6beWe*OAizyA8`|NZ{^@82}O{N8)-{b!Dx^wCEj{VgZF`+XezpYL*B%Rlqw z$B!Rhd?CJ+i{;Lre){RdPd@qNVSeT&`ThqVeDLQ5eAWE@`RAYiBVXj?k3atSK|bSg z^EpTJ^XBAy$Y^rpcW$EZ_W8&;O?U1?%FjGfCX2f>f?PcR_q?@t&-LK;4<_uw@A;ey zFtJ~L`Q@XpzyA9DZ@>NaaUQefgDlAxUwrYu3@azUc=6)z%z-{1kC_qWJMD)bet7o% z_uoIu1z6*se){Q?T$snmDEXNaxoFNg$ieEUYwvkztZ9`%R^YY@UAQs==I8cU*XFDH zF1t~2VQ$pC-agqE@yPN$U#wY3A_oll*|TSVW8JfSS+Y!EzK^{03#{(y3$bKbnRhGp zJWI|J=Q}OGM8+d5nV46vUj5IHKmPb}me%_r8|k(~FHB= zT}E}2%0KZS2Vc&SD`z8dH^7uh_FObjw@w<%1s;IRS+(rg@4ox)Nyh`0gylr?z&}f* z5o_SVyDL2ny5s`+Fu(u&^Up7Gm)wE9Uner7>UiKa<#_by(SNMgoags;Zxtjf9`JXD zox3tm6CQX36(3f=BXAR}uK=Zf=6y2opej^m+RIzk z{^mjrsY458IRhM7UiL#i=XU|@!+{6ZJh>}Nh9si7xLD2!LcM+a_S@!Jy{++8craky ztKd}`c)(_=v(26Jn32T%WZ(2jT;T!W;eDT>XYyDb9=Y-ZB&=$xX{i~}q*xgKO%6Ig z;O^NxtOAof;epANCvJrY+2#j4c(;8&6CU*EGu*TORyMg%M%l9e!v%6eKD)+JTDU_8bDcFluQ23qpbJ=G_Yk!q6eVytTXllCvNfJtFOL#ls|F;N~Pif@{pSt z5AJ0zFp1^`VB@6TJ(*QMFm&SqV!a)~iYKgYFyTRku8I*=we<^_SXPcu@xZp@0S{K} zBo{`k(FfrN=*NLbU;#@LZt%@F-#mslz)sjid^YgFVBwkPi(+S2_Cb(oi3c+8E|`6O z%*r7f0#Web>h*^w*$8K=A69|cuO!^h?a!;du;d5c!Wl6mSuSJc2Otu^AM6F0au;}y zaB|Qc^MmZ*?An0`(E*aOtMNe3e6fV)ynX@fg#5f2ozJtz!2|Qhi~=+Qr8+;j%T_QB zFb6l)ewk3Y?y`k`xOgK?c(CIIyU)DMk;I9q+MuW~?vZw;y21mCu)Q`$ZkD~Rkj6u` zFD)w*#GdfLnun!{qbbV;H#R##+z)ubKMiXT?3=}YwWf}&bbA3CfoI1$sT*pyLQQKr zsjrpY1U6d5w@4K`%xc~wf}0@PcHT8FoBann8s-OlMOw%a)TJ9Gs)~u`w&iDAZTbd zSZ4iz2i~Soc_2PA5~{~%EUE2>hCi95@(REWEo9)qeChB*sTD0cSPyg7u0)3Quag%>o{HQ!yum2{OXTyI;5K zimiFR`fmJp@u1#>&2%wO07R`Xw|Ic!tXCHXc2Q?j9q?f1aPg95#*_VOF^9#o}?Uv_kt{8&h2t2RP4!dIWM!G`&NpZ$L- ziLAYG!4S3!T1$&QpMgMrC)>dT z=)EI;`P<+El<_z>e(<{4xI&HNt+*FIU`RHms)k0{qMaQ5iYPxc1FwNwk?%{Y(jd$(d0;@q?l$ zF81K;_`&2)B%WOFDD#dDt-P`23+CGMjMl|9^|nijfB*5PP4aSx7HOC91U)c za+_FJ|B;CXE7C{6m1`Q6?FBy$@x~#E#=?pRH&y@8=@bV%D0a}G_Qr!cf_yjs@7ozb z!Dke?;Q8PNTr`dfxI_N#+ZlzycCNmI95y-;Bqp-$(uj6=V3F^;adpQPz1v2x z(&7A6@BklVgZtLpit1x!bl~OEA$cE1w1K75yp@$wFHk+X2hHScH?P1hRBWJWP`E0A zmO4PkX7auGf%6Yg`|2Nmb77x%yAhNY`^(P+i0RKRiD?-E8#Wi@q1NcF8yybuR5Ui2OUkh6`9`uQe^1vzK zEnRiuu$^p_iYpCJ@TDsND7W|0_4;Qy^8S;l}bDfHf5b%J<$}&eb;E>&mlP~SIvW3e` z7Q)faRQF1780o+R@9i9$(9m_4CDCeG0eFC^Z#$xja~}Z{b{9Xe0cMeJrf<7^By8)9 zG&|7lp@aVbJmAE@c<>;B30#9t=sDyc_+t4VIsjdm?~*~Cqt!Ih+|fZy&&QG<xGo4RDv=5cZZVhs&%g-<#YB4?C$x?ihiRy8X%v4O|!cu*aWHYk|sGp@A5gXMDD^B>z4=}V1xGO_s!h!;mneO0|8&SG9$x(FkRXC z%Xz#gkQf zr_+GITs)se>L}Zx%BJH%{(#!BDYxs60b+kz6%GmUuum9Nc$RZJf_AL_&3P z6SPz#HKuxYSH>8djU0?_JMW@dtbGL&7Zgtc%SvS(yx%#ZMp>HuiB)h|PUk1$sG0Df zYGEaMUCj|-bg0B;*C!DTpI9j_JdtEr5*Qv-FOKLl$hequJO(=vpboi%}6ZIwWKd){CfTb_vnd;spJG$1f?Xn&!KiEdPm<%)$_5z+OgvWZqu93F$YL}iM zmnuXPKUfXZOvQabT;9IL11}eDzd!!?<9ob(b{jW%pZMXxgJ@xxDSk)nhLM-XP;VbT zNEnQZ8fa^R&)~}V2r0+Og;uF_8BIp=+i$;pk#Grt%@({PHE5Tk=8_CT>?2gRiX{LZ z;DPwU5)UT#r#Fq&{7MQ3(eyHM$g4l)CxYT5!cj}GN>$zD8mfhY9S<^-wXS{9iQ(d1 zm=R6B{DDW0{(x)>gKXU0^0# zwS=wmgO$B7JQ?gjC%7E&z(kX{Be@6QLCs@p1RU}Ymz&`V$VOu)qEIK}+qJz2i1A?O zM`JY_)wS3F%(mA)pM?{^4+3$ZcB2nS?p_&4^(C3w41;5p@j}SZ-V6sN?DcGQr`Zs% znt6!_R^g_2jDV~kX9*H68hEfu@~+hr-mTz8cSvR;+$iP@5BN@GCM(kYiM7Yas#}rs z_)$OukQe{2er!HCYd0Vc ziUS_FaYRjKFmuO;&?+BBH&lAZN%$PGB^#xuJ2yZ{0G+yajHIsnmLb(t^wWB#vwY=A z5*_}lp6qNQ;_kJ4ciFyRp^dJ!ipJV}!h;&5aPqHL$y@$_2M$_+2iZ8;NbrN=Cg>>? z4+&Bm5At{BfM{TLA_UvLF`A1VaLDk}xfxqL$QNT|pyItE#)FszL8iDy!Gj)qkAo4% z8pOg}(4gyZ$#6i_7Ee1ofPgu(da5d`Nzcv(sF^U;5jDjY?dBj*VGp+>eti{Kz8Wrd z4-{8Y*G!18db#u8ZW{RYVB*o>^IWj3Ih+|2e4GU zU0t!P@BkvQ^5!1!z_RV+t!nlsOcG>zhX-F9ty^-f5NDIl$`#?p-0Wa4m~6|Rc&WW* z0bWr2;8%8$Xtmr|w&fBJT<6S?9bZso$-~CP`7s!xZD+T`bCkH*e{MWjbg!H60GVjO zRt+20%piB=al%8pD<84q!J&P@%73t{v|JSxw@TlUfhbZtsa!yZ_TE-luKXt^nV#t8 zFxV=A0e)b&fQ75=d`HC8;0JHtzWt6pW1TU=#tw(zR|$&`hy)8rF@m8I`Izv)0ZDAh z6<$tOn@NR}x7?xTh6gWhc<>tEW5MckZ+ z=nl^{WV)jM9S`tKGBJ$6^rj{{@pFt|RsX-k1ADP1ey}Tk*wy`wr0+Afeg-x}H?GQ1 zi0($I!l9VxY6`R(KU-mfZ6t63zk5R{YKtGMc)JLxK0Oc&^8>fGN^CxlLOxP84Vx|Y znk^rR!#=dUu!DOVi94KgVl}c>{^qHc$IYYsJ_dJr4r9yKPrT95pXQd}JI}V8N$@Dc zCAunhs@>mft=ke0YTAV3&EARCES&nKdABk9dBhbSkmKD*Q1QfB3vHT-TrmBndS`Io z(pO4$AJiV~O+-Kk&NnXh11wmSC0t`zyqUYOF#s@;gg)xBYAym9JAa)yO& z*)i{hoC7=WmoIcd8^woK?CR;2Bg5cWap3AdK?*_R$)8B0h*f~1 za%f~?nuBUH*tEM9!9B?)LS8t!D7*KO<4N@Y!Pxd|MKY>r=uyw)-r`P~a3FV^HSUs& zs-gKiqY2H4K8#<{2-OVRb~-p1Wp3;P6-VSggGKwI4vMnP9MX z^8+s*>?~5+`GH@FV6R2BAu2!MQAWQs+&}JvQ|lPqoDJWzn+sjfyg0RA#?)VVmukL> zC)C{DR-yZ@KFfzysIe5khs#AW3x04JX{I|=Vg+jDsa0XKl~SM6acD<(ru@X3s8#7+ z9^=+H<6}Fd#t3TLXLKY419DwoY?2Gd7-@zsp4HpC+6$}x%Gb&d>WeD!|InQ50cyH% zg*3`D9e=ksuPR=jJazKq1Y+;If*4>O3e;-T{+jSyb5Ckq()o$*nfbs~gyM!*J{x#I zX;Eoqadq#5g~xLMaYJC7Mq)$Eqr>QO6r`>0a)t-ho;o%ESCyv+Jg5Zwu5NubBciQN zUcJa-l?=MXgBou{v~k84d*QmxKQJ;`-P1d8nXimmCj>;lEZW(4-;AVhH%r=W9{1OE z-g+$h=65o=^Lu?8&?z1`VT&cI?*Mh}^r->}AT)tVWmdVD}cisZ*B? z&eh8=YofEG#N!nb-f`rf5xk{V0o*w71Kz(--@8*wS66t@=|0gK>Qm^UY$j$emYpy? z&Sc@)#hBp@^*s!S_pwwY-Z^UhX3bVh)6bf#REurf@!c=JE6aGT&G=ePE8N7JMyHx; zfV5Q?j%wcdl`2^wq8-y_a_@r(j~fK|^%?a|LCsBhorZ5+0A9FkFOnD|q}9w9NTe@V z>wypNZ>&W>&Jg3S_|#|>J-wf)gatZ)2U}I@6)K&(&->aAZ-iO-kv;qTJVZQKG`}|1qE)!xBs$p(yZ#5(6>MwN z{FE72+hM0IF0FB$m+KdPP5hub8I8g<`+?X(f|&92PyG{Xl&f;&6(wxdz+SztFB4Z2 zp(nCkUcGv)mYLt*Sk0eheBta(!^XzxHJmjYxc13|$yD)fRRhZj{m?-h_5o4g!4GH@ z+o)M|OVG=sfh+cv`H+%3ot?z1F#qotHXj|8JSFT(qwXNQex_Q~rb@_g#6`3&fRYQySy>DM`(smww+fr_>a;W&yB{8$b#Y^P+u6IEEpfG-$Mk}y zomw|Pa4qPR_7j`KKw3c%#e>C` zo&?b#2xB-K6Q^$Ii}dW@o>dq;_hnRNr(Xzy}&zE0KMiwQ_+{ zFn;^X^nL5l&yB?^c)K(v5IMqDR1M@A)5aNzph4J$(GR1)FDX%y9?+m@n_&gW7N11%={DXi`^UB$ sR)BX1C0y_f`z-PmZ8R6!3`L9jl6hzENR6@;RAP((Zl z;#o!T1*Fh}54rZAbvBdj?%`u+XJ;p~|4gEz{Y`zaTeW}>jP?ety~|eF)e(%}=f0la z=X!RR(h5E%@dE6}iaTqoag)Fo%z+Glg!h!-a9Hb~n~cC=2#%4lMfbmgm-Cet-?t^f zHv7M>GW~g7Sk_glBZveswyQa{vg{0U;}<>vACoS1Oa)J8HSus-S{qD`dzQzOUh51{ z1*2g_rM+LM1>k4gv)8d|G>}RI2!u{Z_1&&O8|nfya9b!ZNk6v`Hbk{^;QK;oE*Nxy z54)wWpKKq1c|8?V75Znd&4B^2K~y;OcB*XirlyjyN9GxuSTxYx3v)G_Mvz`-0b- zqaA3TFFlYO!TM>QKOX7=-_H}n@5`(MZ>;DdXx&+DQ4Ku>Q5@%*C_i2hGu^I&ujJc%dTmj^xc zc8|$F8rVUs@vSjEreHd*%?r5RfVTluYpvam&u6LohYPx#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2q` z3?ms+VQ94g00MqVL_t(IPgPS(OB+!Xp5M_$DNV!b-U)l19brqDeX<300hv$+vjekGtt!N35p%IQl6ae84`-_t(BND+lG6P z%RiUAk`WnM^+y%^Tl@TuFci8FX^XIV{Bx}?) zit^X80U`pOgn&BO)!@QV*AS+Ar?n&w+lR69eg~EBm0RFit;YW0w?p*5=x3uUkXl#0 zOH)9NL7QT}$iRay2e-nwnTzwvIV;Ew5Oi0N)|EGvslN~;2m wCUuq4s*%xjQi8}I@r)Sf1f;!glhP#q0YV~jnz)7rjsO4v07*qoM6N<$f>VZ94FCWD literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/chorus_flower_dead.png b/app/src/main/assets/blocks/chorus_flower_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..46d578f7fc02c7ef33d33e183b1ae7389b3b787b GIT binary patch literal 750 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2q` z3^Fi63e(8|00M4FL_t(IPd!sjPZLoTogX1aQH-DjBNPg)QCc7!y66{3X=ge!oj?)B zNQ?Osnn$2wzT z^c5Bo*@-zAyEz8+jw*~byC&>avx;PQ5_Z^@qKVrRLgE9kPi_+32{9(PvW4~HI!ez< za=YI7neM1NURhF3qAmaWFd7ZhKewr&Y%>tB~K8>c{}bIW9!OXcupJwQ4d+& z16Cx5=D}NhdS5~@n#bwkDYh54(O7QCWGZH*-2#K2Lu1m8W^s7%8kav$@b}j-PMYsv zJb5mH(nOp8AR;1z7snT}nnBZL)bRD=3jX~$!|$sf`1ZLBJv;?##F9LTyqhb07~JTC zy7afKE+g5Kloq~xc!{ga?sGTaN`=&)F3Y~qFZNG!u@0>E`PFbgYap}ts$A|rH} ziRz8X6O)>7Dqfx@6LPg^HCyc#yn<|h7U|x!%%4Vp^P_W^!zPSjLvA?L=L#9JP$^VU zU#N?aiaZ$i=go)b{hvmk4~lFA;w{V}Qv{@VBqjS=VXZv{eoYqgr?Hs7lLFD-d$Z@q gS;)O-tNJRg0W+-uF=e&IUH||907*qoM6N<$g1YHLJ^%m! literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/chorus_plant.png b/app/src/main/assets/blocks/chorus_plant.png new file mode 100644 index 0000000000000000000000000000000000000000..00ceb71cd5db6fa731dde418f744cbf0037c549c GIT binary patch literal 692 zcmV;l0!#ggP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2q? z3kD?odJ5qH00J~gL_t(IPgPTEPg+3`-5*g+YpbcWhDHTZNGgWWBMcT@#jwOncKZdKTLLKcF&oaGrQ{M#|^Bch3Z@t0hGn^l|b10)EyBw?J@anBfASFKD-91>9vS%V7)Uk{=dNc8mZgsaXKM%|J4 zJ-ZjSz@T<$JS33f{Z~Oi&KOOI|B;A@48Hz(mDNt!Fq0;jB1v zPC{L|;=|yEAokZax+uj;(gKxdHYPEq4D7^rL?;Se`%(+v!T$VyL_m>vkz=B$1nTw* z(*=oh%p5n9MK6&Tj1K{DB8Rn!HJQ7$WJ#Z*c+kSu^p+5C-AnAjNjVsHhEOuXATwF@ zn6#MepHtE2G!jya@%=b#K?7ngsHv5zOC7f#~1g aJi%YfYx^5nKwh^10000B-N4kL2B$>C+n!;-7=_nucG3en>ZgND@XB`1q0Tx3!J}c z(dCDj@h^)^zyQnIK~!QB%l0C>{>H<=E_}fT3rS!BkgOVI;TM)gO`vvv6SWF!@e?E( zQe8)_#Fo`2ZXa|ZYmx(b*yHQ1Qc-DrVgS&mFP1J`#mrWI3tdI9@Z(-y*BOf}{ZbSz zV^(gg&VLNd+Oxo$NCUi+%3LVr*CuzYEITj&keaO$iL*gg+m@QWm6oJDP?DqXJOLYX z`a>WvVP}$eQ9wcf4ynz8pn|s2y5rUP5;zb5f;u`jNm4wp42tGLz1UNRt%!Zy{TB0a zXFE|HhKK2aF({_yR>u#|m$W#O0am1s1Y=OS|0n;sgzkoO;W W)AHGT$(@n_0000|(n<*yM6rNX1fhaX0b<&x;L2_S z?1U==;ga1RaF4JPiBOWq<`xL}1RTl9JQ1G2@e4O6+*tk1t06V|uQyPTuIG6UEHt60l+tr}2kZoBNb+$UOZmeHE_a93cp?h#2CnPs?8KGm zF#(l9H!swT0`djklLBYn$@e8^#o?R9b5B6k&gS@H#s!d}M{P)N)G@VZQ44>2Kr1SYq5@WSmNv+pwt_HxbB@zh^G?`3fx7!)B*=%%2 zNRY{7NWI^0s#dF%&*$m&dNFCw=aT`F===TBe!u5H=?GlmpDL9~eDVAJwA<~d)oL*x zU|w2As zy3CzSCV5U_9{+;DpbiFK3bVqAFTeNzyLZLurvsovFYFH`|sW%Z4VIQzvE|-fJ z3hN5V?)N)alLR<-IvqAv0oCv@uJP)jXP#csFbZ0HLPoNKijn@P}{ zI!z`Ma#dZVd{U@TD9~oJVUEaTG7N?jU|Z5gtyaq@_q9asKW@5SuawK>$nn!b@pzmf zkqEboSqQU#d)jXF7B$L6>AZ=sO3q(Sn$PEqK|;o->=X)x{sq7cl+OxhL>mZ(a@BA5 z?+1nae!sN|p36P(<#Hi`(jT5ZFyVYY^9GPf`=N25)oR7r)X+W9dxhjTGI=~6ZVT@M z>oLUwaiCB1hI=xZ27WV$ zfb#PBJlURXtS~B1ryDRn$0F}Mr5;DzQ{qDX0sVpDixkbu~@XS zz(B%}1d&1JP$?=C03!$lqI^_HdUOV literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cocoa_stage_0.png b/app/src/main/assets/blocks/cocoa_stage_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5f764ee577bde178400eb4ff49ba0e331251d6b6 GIT binary patch literal 248 zcmVGc0AmIwW> zue6330Mgtw(eZz2z43oyH7}YU08tBbI*3kB(I#lXmhI7C&9&v0M0*zwigJzqw|3e5 zuP!(LpPj5vx&al{rvJC^jRt#p;xsqX4FGv{+n%WZ3zvKUZ|Sfh-GG`}^Z%Q+NB*BQ y)A@gSsVV6ORF;`TVynXBe_o~m=?08~!3qG-%5CIg;8KbJ0000|O literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cocoa_stage_1.png b/app/src/main/assets/blocks/cocoa_stage_1.png new file mode 100644 index 0000000000000000000000000000000000000000..eda5b57b6120d61e67acedea9ac2ee500eaa4603 GIT binary patch literal 405 zcmV;G0c!q`|IaQ7{l9Bk(Eo+?&i}K*W&RV=oF1Y9Q3J9K zWb4K*S1<;#LEgY+Kz4){ShK$))RGi0mH*4?ZT=sc2*I<;EHDfJg%ikC)d`0G3!_#4 z$J;7`G28_poa3kRKiokQOoKEa8vxRLc0us}Q;TB$PpxqLzq8Nzf4rwO!GMN?BpkswR!yC(d+cz$3%#D10pP? z{+GvV|4;By_@5J^_CM58@_&St4Dkkx0{j2~h%&!_PA9g500000NkvXXu0mjf1$4@V literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/cocoa_stage_2.png b/app/src/main/assets/blocks/cocoa_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..491ec26dfecb7b37ca8471ff4572576bdbd9766e GIT binary patch literal 543 zcmV+)0^t3LP){Q|+2u1Z=|NT_0H zrD>bA=_JlH)5&}Do{JzN#CGr9pToUe@wA$^rLv?l<6>P0cc?i$&FFLu8|_5!kGy`d zYPaeqxTUh>{>>?tDn$a{!={SuMw^;Qp*YGDzxo5eZ-l}XLg3_!R2OeC9Rx_n#e}<Q$&Ld0M}$1J?PP? z*GLww)874#&j2>b$h1MD?9D?EqbuSX+z0s9M8KR?apdn6%$eiRb&Mp_A4JuI#Qh^l? z$0vQHlyv)wG_sdZ2t!LhRP3}u;_#e&A;->s7co%CQGtsa9Je#RH2VA$hUV8FY#qg< hvE@xY!dU*7`~uqd$!3vgG#OLKM8U zDG{s)T^xi#>d#Co`Ok2&Hw|tBNaF7GOaE_OISC}EDcGLSo|+f@UvR2v~Am+ST2{rchfYM4?x5Ou!%&# zuSrHEiNz2{2izc7#qWDjA`oCDf;}L19S{8xoMUPcggnnJ0m!mUyRHkIz@<4r0z{?) z!28Ri0ffHqgJx4)cx80LHHh1fwQgRYM-jL{1Q9%Qz&pmDu;m55)=&Dg{j_ym*X9D% z{j3OxRQ6<4{@%PA3(c>r{MaFA{inqT&@?Na-As)>{4~ICH*l;k2`DO-##IfZlS5;-s9`61o^7h^; z`|GqOvIl-hc-L$cK-)gg988}mpYP4pwM`%~ea@VNU)`U`Mhw_1mjD0&07*qoM6N<$ Ef`rSo2mk;8 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/comparator_on.png b/app/src/main/assets/blocks/comparator_on.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9413c658bd0894495ff770d7fd0569eea72957 GIT binary patch literal 413 zcmV;O0b>4%P)Z)ay+mSvJ8i3jZEd9H}#SmS?r4nIxP$a1;din^}7@2aXaAApDoU=xXeU6YJR z5{n^@4!A+Eiru%OgeSmC1baYiJ0AMuaE_@(5a#o_CID%gO4oIs6S!0dNPx&x0C;}5 zRe;d0Km-vyb-+8upRi>G-X8Dd`*2^^Wm&2VRJXI@ zK%}xIqw?3mp2p9*R528Q2;BhQAW?uM#E*+JB?Gn>;~d~TY#hkqq5)1eK_IIku3RXa z$cco3yhb~t$asxVvG#x5OkRReZXyWGq;-L;!(C|yk#-QX&GZI|W6M!4ib9<&uKp(S z@>(m~>(nN)2X;t!*K8C(+cr-fOrI#9@5#}zP9QOT&YXi^`3262dXCKD00000NkvXX Hu0mjf+#k6J literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/crafting_table_front.png b/app/src/main/assets/blocks/crafting_table_front.png new file mode 100644 index 0000000000000000000000000000000000000000..e68673804d04a03412085c43b0eb7c2b96165d7c GIT binary patch literal 407 zcmV;I0cie-P)Aop!n zzQwcdG-`8h_;l)SHkMqsvEcXEzTf)>+|BXBVfc3K z2ECSFL4Bp*F9Y@vW7nD?Q1+MZRtQ?JmP}?P$y9KEx$SYXSMwkUEY41Ous_--Ur9StCm9w63$GoJ{K+tu+E;N*hl!Oz5RTl77)0)jEdPCcVqkWPHW7!AY@M8Jh| zDQ|`dD2aIm`qSGVHkUoH%}h@O4TQBy(Gw7p(co)v5T=qfu0Y^9`7#>7E`rfPQu!jG z|I8fxH;M9Vz|4Ok?(w<5A7+3(0kI$ZS*LF1wc0v#v?R)@Bt!#XR+|CENZ?p0Z zoMqO%DbAg}Gdn-$?9>+LCd2ppWr9v?A&g$m!`;?O=yjItjPLhzkbvA8AAUw3w_(^n zFbmqNvz81vQy9N&RzTg~dOPvb=6WOPtR~q6kJr0~v!j-QOJI3^%E0+_Z!O*f_+o+o z-PM87nLsg55hMi&ZZzu_z^VW=@O?cTMh%2S13=<)zZ)$DBp}qrz5?CFtt`uU_8Rc- zbx1T&MUv@^y}#Nv{JClWIasyc9?*{CN=!AF0000Q@L+58}mIA|jSHc<|?r`yHL> zZN$Tuv&@-q&NhmpqJ#jWp@=2JY+zeJA5&>5WgQYwV0@e|QRaAo8a)<&uXS7)Q|^EJL>*B(;9`gOKK^))8C-3Zg&W|%J5yI9`DyXkRvfOS1omzh3O%bW>k zfS2#L`zR8urKu(dMLRtbuqPVrtVcR(S%L(2@VH_!7SrqA5Zxwv`0#4UPwCZmnhUsP z+8}^GlN^%-@N))WfpL@Q=0oTR7*MU0ing#m*;YlzGfhl_EKu4X0t7}oJTw<{(?qM2 zbzr)=l8Hew-eBi4MFv~~6C8}NGZs?wWVvhr5T&0nSQNY}x-A+9iRSftEv#n` z|Cs{DDC)jiY@>IrCwL8h1VRU~Ab8m6W53))ECmSWJL@=r7Y9?wl>vw|_z~;#So2fB zUVE#{`2g&Y0@v{nr8j$7$F^d%RkxY4C$an{f&dVo2~EYw05OTDt>3f}BjV*0@GbRU mb*A1*W7;c_dWbKr|K>j@+T4ftB_Nvs00007i#}v1^sy!5@HzGkCiCxvX*u^Y3{YC+=OUnO8ToG#;IVLUe iRA@3d=&*!^nc>*6kXru0f7U>^FnGH9xvX3SvkQZwuo~u0n z3S5PSdPAZTk*q{7Z2QuJaW4X>h9p=6w3^zt(RZK%woRzp zBHkEe95}^KT?c3ZN$SE2BtulEfq4G4=pG_^_I-BbCstd)#%#I3Q-vJU#eoq>MMS{= z)fEB6dWaeWaH*3~w@wR20OY;zo&YgiVAU7^Sy!9`E*^yfM!;N8CEHK|tqvl3hyC$< zhAFt~3TP#-8|>9G=08(^Tb0|9??iPDWF5Ydx%KX zG3ng(=3$JJkGBrVOif-Y4sd_R2p|{)<4jhQES60nfeJ*AWsE;t+7Xb=Jf0W;0000< KMNUMnLSTZ_H_6ig literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/diamond_ore.png b/app/src/main/assets/blocks/diamond_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..5efca817fde56641129986a060eaca284af570ad GIT binary patch literal 262 zcmV+h0r~!kP)Gt^a80?@s4hj-{dA^qPhY_6a4y*ChD7+fb zqwe?>=sp3KK{Zd*i~{rp?1_PQ-qH6ZXU5^1MRN~;)lTL(>x>E@FLgR3?!Z-nzIXMp z!!HXqZhI1prX`-~ucVba(;@lHSry+wX7*Rc)hNR$uQXpRD>uOR13oyM5N)u)+yDRo M07*qoM6N<$f6RR910 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/dirt.png b/app/src/main/assets/blocks/dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6bc298e476f5ec8f0c0c4d2a3405c6f1533b14 GIT binary patch literal 266 zcmV+l0rmcgP)7w`V=NDEI+d2EruJ8Nt`?O29*Y((K z=DVK`tGLh7MTtz%ds&v@Ga&DZ$;xQ1!Z)iihj}Hm*4l8eo1~Im3;+ie&}VWdpbDk0 z+*Vd{tJH?~A!2frcub(;r0KIVImhR2X8sP4PM&T#KQlJngXEsPNu_c;# zj2A0tbfmyB_f1S^g6x^QT2YWaZ|9A0rZL;l$|NdG{#j@PkUL^d5f-%2La>z-Hrn_Xet=(hoVjsi za+4IZGtA@6Idj)^4lHWB7URct|3g(eQN=y3IV??X5YMrcX4wWIt~g7!W{xFTf2kdFd5#Oa3csI`GyX zfNbXcBS|$Ja5MY36yP$M4V@Qf4A_R{EqqK$$g<4!^59iD=VHSjZr~ve#yK(0NuR`Q z%-ZlrC#TctT!YkgtQQ%-Su@dWmgOCQpVVF``@_0s^cG$8^)8e3FG0|K%>pcWEk$l+ zmg&+P`02C+0g>4FNgrgD39C5?Y)^yQ!r?@Q+(o~Z@tgF8wSIrm0)YPy$dOjPzbyC# X3J(faAy9Do00000NkvXXu0mjfJz>F8 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/dirt_podzol_top.png b/app/src/main/assets/blocks/dirt_podzol_top.png new file mode 100644 index 0000000000000000000000000000000000000000..60d1361c662e1289be05e1e7c43c99f29194b056 GIT binary patch literal 634 zcmV-=0)_pFP)fgc5cOYZIPThs1V^BsY0@UO)WnTHn%J)6CIGR zyD{{zT6t&Qn>TO9PI;{5#hEMFsg|pGLoT{XE>4sLM_PiXT2kEK<}Gsy}$Ekw?i-=(!Q1-o4({A867Ga?J5KQvwkG=u9oGAmJsjEB}v>?k|XZC4?Xh{q3X-n zlK{!lfsz{#Qr-7wEt&VUEKn^i8j??UBsjFhEMOGmV7~=XaBRV>QUXv7UAYNdnfh9i zj*?5n!pBO+2loirCrS7a?e8>c;6N>1O!p;7}74m`gPed zplsHVs0RRA`1NjR2v{W860opSv~906iha`yPT{(GU`T?tHH;umf;lvl-)z$%kY{~v zy@*WZ9b@JPNTgvbP#@;KIrskgaeYw%|1$r^@}oN*_EM4EPs z0FyTeaw6P=7^LB@HH(K{ts+m#MMDPIg%sX6KR3S2Fs9FCQ&y11N*oXGWV?wxB;dB@ z$W65W?4qQ9JqyI+HxVsqJ2QU|nl?l$_6ID9gvb<+W79ijnzlIXZ zt<7R=vL&c1kDe&u7Mo2hU}Of8u&?Aft650&ql@x=hYg5)*&p80k+?ify%yB#b-ABRCbE)q90#uJ`UbIB4DEIs+wB&eP6y-h7=yt;u;1@7olene zwQxF}a6BF{91bP6*=$O+h9&Vp0m=9Kjo0fXqUCb=0q@8$=5o1UKA(fhr3IFHy(0*dIv^dORMo z+L^VI^Z6{Aa5xOZCu9E_XbWz)n}BA&90y-06nuknx%@?{m>EK$knC-a;7jm-m|Cs& z8K7pOfI?%8fP21xZ9q+_RPqhjw-Pi_gJ3X-Kp^mCpe<1&|9}P@pk}vQpaDU#&EM~L zY&IMJC#r!h)?f+=3Vu0i_z6w5S`|0jzz$Z>M2&b}tyX>ojYdP<*pq@J@q4!KJ{541 k90uL^w-vmz@gGOcAHe2ap4p^Dx&QzG07*qoM6N<$f+F4DDgXcg literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/dispenser_front_vertical.png b/app/src/main/assets/blocks/dispenser_front_vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..9913188741d9f4761344c83f982e6044acb1d480 GIT binary patch literal 535 zcmV+y0_gpTP)2$(ovq9lSqtQSznM9#b zfZy*&EEYqj(-8!NL9v%gB{_NL^Z5{sM!yM+MkB)EFb0DGB9RD+#Uf6plVCU;qFgTH zf6zp3i4o zE*H__Uo9|utyV+5UdQ9{cpqcG-Kup}k{iQdM@xigq!q9eZ<$jtnv zjoYYJ@;1i5!R28fHHpXL(xRG#cpD=#U$0l}_j@^+MJ0N@Ub0LKoX_WS{*3Y0kLkD1 Z`42cE0;^CV6%zme002ovPDHLkV1j^#`t|?- literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_acacia_lower.png b/app/src/main/assets/blocks/door_acacia_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5f7de9ba5fcd21bdfc1bf705a3af99a6ef10b9 GIT binary patch literal 574 zcmV-E0>S->P)*E6vofL;XxXg8YZe^ICv1WRL#xsU`E}UNJ^`t)4IeZ zB7)GAhzKu&xI}Ac#We(x{$Zc}?dcioJTS@0WbL)~Z{5CaM59q0wHD&=vk!NJbvW-2 zV9t|`zkPnhKY6j*QHA{vZu}dn$G!634g?Wzb|VxDVJYB*L5Bq}{{QH>_*$E^7ko~A z*|MkKJFpVW#k@*n+4CJ7iS&%kEGYcS5Z{uac68j37=>YYOm^C>{YOvQHC zm8jrU1(GHK!xb4g6@am~nYN1hOVe=PS(KOo1J~+bfvs2pGpaucV80T;76{O5-0SgR zE9BBUms9@J=X(;s4RCWBK=H&|3b6aplMMLj&B0c8jqQR2FahsqfN7d~jj{y-)+5z6 z0Ecba6O~zy0806?tH{i+oge6KNIU!ZV! z_N&RQUnl=HfSIUmmf2hKLTj8#w6byM;k*>BI<_|YCKH3|jDGqa07wFj-N**pegFUf M07*qoM6N<$g5(hgz5oCK literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_acacia_upper.png b/app/src/main/assets/blocks/door_acacia_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..bb4c255606099790367d144a49757afdbb1cde80 GIT binary patch literal 546 zcmV+-0^R+IP)|ZDO5ByYM))8if*`&~ z#3gB{xKt2SQ$fTJ8~YCDbWg)cHoLRC^UTgWbHvv|fH0CXe!83R(#v!sy~;KAFzaiK zkNGBJjl0J!MI;hoKP7|Z6zeLb6S)y-EvAR=GP>z3Vf(pPV;gtkeRiHPt~yF+&1oTl z2#-A)J%)VrFxf!2<6eqM=cg$jM?usx35`ozkB)Qr?0T&vB7-iD250g6t=C%^pxYa+ zJc^BZ413>aS!O9hriv5gO>AsetAyvq+o{)cW+)&LoU<#MZ1mG>SQZlkGNUHbb#78tF^gw zDeoEQ(h>gx`a^&W!24WEO(UosxLi*?axZTEBJK`#AXzv*pK3KsHvw zk~!RzlY>q9>n_PfW=BqslDe~YQ_E_z+MA2z>qM=z2A_)K{{AG3vq4#39+32Ppu4pw zsqMI)31aP~6SDhfMYXgWR{%*pz-**Wl50b9ezGk`|JLPre?!k2d>wdsmQtJSXU9qD zYJIMN&bQCRS^L$m$=CD h&7b(9G*{06t^n*H5Z~!ow_yMP002ovPDHLkV1f|k6J`Ja literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_birch_upper.png b/app/src/main/assets/blocks/door_birch_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b821b38bdb48630f322b99e264c923dd952d41 GIT binary patch literal 636 zcmV-?0)zdDP)*wThv4xgG%*nq!GdC=QR9V|7||eT z;)P92Fi22qrRNi+?cUuzP(=Lalm324Q ztWt`}c7B%S+uwEVpzqn^dzS@xc;}*pPMtU=1=Po*-R+?PsIJC+z}J6(n(cKRK?tNw zDL8xbcmQa)Dc{o8^3vMZt4VWxW53?WTHDKLPvFYpxJ}$VGc17vwW5G5on}r_5BhZ* z^ju|Km#?ljQ)A~8b9?l(g=iKEXc97c+-c>5V1W2res+A^-w&Tx52PURWm*7~H0x<= z`%+OrAhq|lD(Z>nB>nr0?&v}A3x&iB0r)EDzxF))-Yy8R^`oR_qJZAuL)DYWl_LPs z8I*itM!~-a4cq7xeOO(=C?KfqWwj1^jzz{t{vRX&nfP;cnOadmACT-h!yn+>qD23m z+JiX&z?cG{R^(DAYB-~S<^lM#-;^H!qaG-L#)uv^jf}|M-dI%`0Qg1#l*liTGyrg5 zb*n4>@FesTGzx}CGA5Xj)+jR+{6crLtc(B%A{Y>R`Z4?kN12&ml>7w- WFkaVxj%_9Y000042ACk6p+z4AR0k<@9{(oiGnf-4!?{Oiko1a?!uka ze!W~0e~?1kd(P=;ajVrzp3W;WjY~3#N^+<1zFn4S^BNBY!*Dg*CaLuA4~G6OrUpb zIRhYm=tFYUW=hsM%E+w}v=0?vG4cSg8bIpD=^SNEYVTyn*cpW}W=Tmdv<5(mf|uLK z8UZ2#K#?ZCBNgybvuGfA)2(GqQGBp1?sFU)@?z{|^8M;GZ}ZJDQ`I~VS{4C@gt6#r z?rn)f9!Wgl0b8IU)%j+L-v$8q0f1MKGqPxZ`#%5?CKLdGH#D*Z{9yzFC16>JM&?B_*B1;8<^d36B5On{06d@pd3X@k%6PWY z$osCDP+K0E?|afpr`Bb~;;2s)+(00_uaA2j?eT(6JK y@vj4wa literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_dark_oak_upper.png b/app/src/main/assets/blocks/door_dark_oak_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..054a0f2e87fbe442bf5fc5fe953d9e1471cd2b01 GIT binary patch literal 554 zcmV+_0@eMAP)jvNYcy(*c-aK2aS1NQ zUHIZU>U=#@(TB;LX**y4X?xt;pdzDgBzK*ny!0b^K8@tHUlHt2-j0uNv;AG|?XAQ(DMjHaZ%k(A@ztn|wZ3cTL?V}m0npf-*WmU}TH!qp>U!y@0R9UY_aYhiOQWEGtg(WW zo_W&P`+yOrfc2z4x4e>w0XPA0kxMwM`J{du+yLy+YC>bSa6BgO9OV=0QviRJ4v5droA!NyxXia*;HM&(XHgpfB;%~34B$+A sJRN1Lh1CI&d^`F2bn@};!nCI32cqGPaM`?>`~Uy|07*qoM6N<$f(iZn+yDRo literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_iron_lower.png b/app/src/main/assets/blocks/door_iron_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..5d401a5bc8a1bba71d35c2e82a3c4ec95bfe341d GIT binary patch literal 483 zcmV<90UZ8`P)}5Q1eg8N*7YlI?aoKVyvc`F#B3emAlf+6Nj z_s8SmCm1J~&1OzO0EQDoiSEzm)86m5f4AGs^7*{SJHco)ir4Gag8%{0m&@fmlL$l% z0Y-UYGMTsnNd-s{88{DzgO?^HfXn6be+lF9*cI?ltyaIvP?l^q`=yK~l5oG@|CVq( z9=$dKm6?CC5yW(89w&YjK(N_tEDVRk$VeoQTBQK#1Om`I#2AFj<j=yW=fN1BC0QjrM|g7hj=mi8n`5)0jK z*L#2hlwhhE(}H2?X42@zVqu}z>-nozRZWy+ZK3u?8Had_r zO?5zv#o`OLk|c=&n*lv>Is-D18A@#};M~*~MWLoWKgfYCfNf@B8AQkCA}7t`$_a6FZbi&ZeNw z<74eQL|VXr(*6sB%?6fiiK?^NOl8pT_y1>rll>_6Ca8)Y9cv?qLhK)OyWPL1%&OQs rMoy~4ajY_q$kXXmPxGOAuh)|gU{scUAExBJ00000NkvXXu0mjfrti^J literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_jungle_lower.png b/app/src/main/assets/blocks/door_jungle_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..73d98de61c11f499f702807039e4f622d6d2e87f GIT binary patch literal 394 zcmV;50d@X~P)0EA%%9G+GCp8*OY9Q08v02u~1;K1TexXCaBK=j@zWpD$0%#`6agJ=u`Kmss9 zm_eO6VJHS5dkL!x&<#L$0n7lH7vTmh?ybQHByLA0` zb);h$0CNGzAds3g4}FLi`cjp3)}#h z0+3>K13>aH!(j##23h}SFf}zri5gfSAsYaS1!N0gY_I{aqztnGmeP=8A;eY(ZY#_H z5Dhi}IVpoAu(<%1lwtC)@IpyQ=mu2Ad;bS%G*lG(k2f!%y8sr5*is%=13&}_gAxUZ o2BofO2Q4@T@j>Ds|6-E|0NkDwzQzp8(EtDd07*qoM6N<$f>)-JS^xk5 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_jungle_upper.png b/app/src/main/assets/blocks/door_jungle_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..80790c2dfece30e891419652126b8e511061bf7b GIT binary patch literal 379 zcmV->0fhdEP)SfsEB z2^QMf1jHh(O$x!%2e9#pM!u2R?42g3Sr~@dnfd02aqqJ``J7MXc0Wd#8d!A zC6IAk?H%oH`$DD_kR(Y3Kt;FY_1c>r;5#Ua!YAWc1vp8g3gG%UT`Un{X4mj+M?e(7 zybptYmDlO$Ux2c|D~_tx0o^nK`a3N@hVFo>BtzwBngH$AhToTtK#~FIh5(ku#?f^< zJfsR>?Mnpk+a-oT`(JvAt2!`%C7J!>4*oJip68NfnZ$9t*a4?(L`$%{KtceCq5m}9 Zk}p2X>>9`nOS=F7002ovPDHLkV1oB~rP}}i literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_spruce_lower.png b/app/src/main/assets/blocks/door_spruce_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..1224ac35b3e9d2ff0b55dc804078f31a0b91ddb7 GIT binary patch literal 421 zcmV;W0b2fvP)N2bZe?^J zG%heMHD!e|WdHyHBS}O-R5;6pQ!#48KoHbBLYhDV#x|%h5+)dAurV?Ygy6zy6jB9s zYOOAfIz2&^KDuVs%w?rJ$A!4j-t64&&RtYhmHd9Ca{f$ZzkF7V5BTRjR=iz2>Du?b zv~BA+uk%NVPWkl*WD+T61&~Y*MVtUOj_Zl500JOdfv)S616o P00000NkvXXu0mjfwIrxa literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_spruce_upper.png b/app/src/main/assets/blocks/door_spruce_upper.png new file mode 100644 index 0000000000000000000000000000000000000000..359ee028c1a6e937a0e9d8815e0294c03365e9a1 GIT binary patch literal 395 zcmV;60d)R}P)N2bZe?^J zG%heMHD!e|WdHyH2}wjjR5;6hQ#}j9Fc9tU5EsFrh|r-l6cJibN(I58gD!Pb3JwJ) zN5RcMee$kcxTc9i+LxDikK9M1b8YDRsOWR6NH7-gvn?4nyOjUfyP61}_tnt-l+Zq1 zFn(PO9r7h}*bA>USex~HFu*}m#vCLD5V{7?2oH^kXB4%^+zLYm;K6CWtyY6UmSt2F z1$AA=hdvAgA7+ET?`=+@YwMdyZAK|*16?eLfW<(k1D*}gB5XvcF@zH2^1!wW+TAtN zyrh5vP7LHw#BPvao#to`d_s*;OxM8HKo{#@kYJe!HmJABr1Cn*?T&P0bOYa8@Xdra pur~-9xLpW7COyibkqu!O`~dTL+l?M-agG20002ovPDHLkV1f(enXLc- literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/door_wood_lower.png b/app/src/main/assets/blocks/door_wood_lower.png new file mode 100644 index 0000000000000000000000000000000000000000..5b88a5009a819a36de97d59d473ede9b6dc9aac3 GIT binary patch literal 399 zcmV;A0dW3_P)di*3=u5U;*gXn6eS!eejpa2joL&ZU?XTFf{p%%E5AA3 zvb$>Wn4Ov3nKy6limIyo{lTKY*qt#8o(4;X_q(>msU_5Du6?{78}a9L;a0{6+4t%;h! ze;PpdW^WfU3YanmvxAQ!J_#aIUVb2dXZyq(RI=Td)Fr z%FM65a~7CgaY0&P6AhpicgMyI1UgeVY~gFP71qRhVo-pK`TwEs;J7{g_rH)c(K+9O tG0;9iuQlm+md6b`D+lnqZYH75VJ2thzRtZ9eLruw&wj@P9QYcnd;cNs_vc*1=Bd|m{lnB z>*bQw zg9ahs$xINBW~BzopsrRTHSuK^7!*>h6OnS7#Pu{l(I&B)9Aje+&_FdI5kJ!+5oZ$SsjNR!AOKFczfB#DdT*rHno vjI#QDwKHqA0ru1i&pE)bJ3nMRD;oR&qOrQ>G!tuc00000NkvXXu0mjf6_T`J literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_fern_bottom.tga b/app/src/main/assets/blocks/double_plant_fern_bottom.tga new file mode 100644 index 0000000000000000000000000000000000000000..bc678dd023edaf0c595fc28f9047c0587b27879c GIT binary patch literal 1068 zcmZvcS!#k&4246V`sfn6fp!-bgwjGMx&h|_+=2Kzy8|Co&}BGpEX^0p&jl@nzxO8R zBDHte5ccq`Ft)}meGT{oG&=2uU4zz)$nR(J)h57uh-S^YIrsLT|Ho_ z2a8^2SuU5l+wJ_0T&vYm_$_XF$NcD}7T@;!z4vQ08qNpzWHKRc@V#D7$iq+lX0ve~ z^l!IY_l3F80SEJjZm<^GZnqsne{jr8?df!KO)(eu{2v_C>D0CJg@Zop_1Zl=9*;gt zx7&?9IA`j=;j~hzC|`WPTrRGmTrRs0?0|dn*4uZK?(n*6$Iu(!*%N+*|9C)-+2H~c z`Z?nn{OF<|XX@Dln(zQGIP)Ito8#f(t#ZFwts?JS;Fxu>SU4wKVBrZ5c$4g%_l0(5 zp#QaxpUFoKEIi=>TG?yTTkwfDh5uJR!2|Teo9gGyz>jWf;irx_9J^s2;}?2RlX@7x W2H&4Q#oy9b>Er$R@3r(+e35^h8F;h+ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_fern_carried.png b/app/src/main/assets/blocks/double_plant_fern_carried.png new file mode 100644 index 0000000000000000000000000000000000000000..29f14d855aa47e2428fa29e290fd48c162ca399b GIT binary patch literal 394 zcmV;50d@X~P)rk@VEyG-|3_f3@{v5((Or5dD!zOR5I@yWNYGunn0uPLLT8~xOc6!GtG2v9^2Y2cF?=_#4%CW6e-PscywbEo#vk* zhIc*&E9L$k3jV=~jY5I;+=ZcFu@2M~cQz88;-zC0Y~@Z@3S6uMIqli51Y1g=1Je#H zWb&jsd#OufC)HtYPADV5U0|c&DiXdu{f^|$Fxk8rW-e8}lOm?LIjYD+cpu*T*gvXd z1?a}m=wg;eCZP`BPb!9K(77Wy0xl27)|&3f0@2Zom0uHX{8-BcX_@z(zc%Ej;3^T4 orC*WU877@&PgMQkWcxRZAL{36pjpA+_W%F@07*qoM6N<$f*TpE%K!iX literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_fern_top.tga b/app/src/main/assets/blocks/double_plant_fern_top.tga new file mode 100644 index 0000000000000000000000000000000000000000..2f393e08881ec83eaea309805641692b1305fe0e GIT binary patch literal 1068 zcmchXNlJr35Jn4EE^`Dgptn#6h=LOyAoH-uF3Zewj*tmLPLYx1US++)0wrc^py&== z@2je>n_uKg;+K$w++24$9nI(Sx>~I?m&<9fSk!*MukChQkH@3$>-DlIOGXA8tCGdJW?RR#k;M_KN#}KVRr6wG#V+r-~;Ep4~sJ%AEI_9lhMg!;+~_0 zZ}fowm)P(z-V$$(H)#C`J;81^8}Exb@H&`SBNrAAjQ5;)Q}o0P^n-Ss!^hp@8T!l; zx~yneeL`om*)KNo&@i4i@QaOeRy2&ic>Xi@zxMGpczb!j|46ro literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_grass_bottom.tga b/app/src/main/assets/blocks/double_plant_grass_bottom.tga new file mode 100644 index 0000000000000000000000000000000000000000..755534ff99a3bc3b1407a4c548ecd04d423abb59 GIT binary patch literal 1068 zcmZ{k%W1F;DGdwDLUSlhOo()WFNbpKN`u;Vy#0yocdAyy8b;%S;n*L5{V6TD+M(c88y zc$h_#bHpikuE1vx>$=`yz)K%)^u_5s74JQhHuHH-vAD>Y@l)}{XsgGp=DFnyT&{au zcd#r=#YPJh375QTqnK-xpPDfF7$b$^qHm3Ox_=SdoO+y=nlhx=g5VVSMa9N6E-kMKz4Q+VtIw`KL;qKnhTondg%Ls64p8_vzRa5G_@;7)t=1 zP&x&jI~!=S_bS|VjR~L!eyPF{s!TLe0YM5F0W4*ZNRue1ZU6uP07*qoM6N<$f}h-G A{{R30 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_grass_top.tga b/app/src/main/assets/blocks/double_plant_grass_top.tga new file mode 100644 index 0000000000000000000000000000000000000000..b2790f242608212e2ddfe948a7b23f5d4fc29c87 GIT binary patch literal 1068 zcma)+&#A&d5XJ{j?`R1&;OjymAPVoP*i5eJASI-R+)_Z!>1W;FuwNJ#1%+XEX6O4e zBgAZD`fY7%yPv-AEl29Qj^OTj+qP*ON6V48(^G0*PbnEO3tAul~QoM?WV%*qL~^ z!vR;Rc`h$#!dGy<7rnv98+dr=6gpISPCV!mZ#UDLTC)6u!RdbKh ukbhxgue7MudeVqJHAl?F5%oS{Yuq=vz6RI7+u`2)H<$DNacoY9UwZ<5=%FP5 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_paeonia_bottom.png b/app/src/main/assets/blocks/double_plant_paeonia_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..21868ee85066346df67e3590220f3023dcdcf961 GIT binary patch literal 497 zcmVMa1?-`;}Pg65fTLzEfNKSh5`xkaE4j5 z@i-K}XV$y(&FpU(Ns_=Hlwo&0=#dS(=OwdEGck`vCaRqFD|HLIOBSeBKIkP$+q6Ij zDOZQbqi7olY8D1TAqDUbDpy70c`;f*(DV`2ycD2^Hu9kg??ewSsmg4C0gfV15+Ih#RmI~g{?X0tTXpPMb&w> zYhbz~;MUC)z&ofZ#?8$4b&&Ykj0fB}eht2-_DQ0qr4uX<1I!|(0R8ALAJ@v7E_V~0 zaU#w;|Cag(x|6rP-{(6zF!4AEYa~d0y$>mS|AV^BAqL2qonb6K$79nP z5TBgFt=K&Tq820|a?<;%v(%7nyn}vR3tJk{J=}}dY3wZS`qi$U|8;J2lU9%d1R@q> zMG5m%d3AQ~EfwT0O98GA1>uVX&_3WtbM^DrX34{~hJ8H-LY;=L5Q^VMaOfudkq(&Q z%eWNv5=$ok9p>|mZUci>n+Dt&zpDVgfvYh3z3}v3L2KW(2SyVh-W4)2+@Ux418f^K UX8vlqvj6}907*qoM6N<$f~vp!y#N3J literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_rose_bottom.png b/app/src/main/assets/blocks/double_plant_rose_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..32a4e0f8f9bb16ba06fd4538f926a6582f65bf94 GIT binary patch literal 649 zcmV;40(Sk0P)YuW6g?4#nc>aQmapoxp=&m{SA>D&OcbM2}Q#zSFrZZXVxNK+S%uk^YH*{wb)3L>}!Jm>li` z_nT4FPkh)MYbbv5@|Y>x;M8l4YmFH&^o-e{Kb0!~V5Io>bl%QikA^_8zl`+}gJ32A z5oPk0Vp*CiQ%wLx{JgjX?2#?77|)s2ZE5a7?!9h%L_p!!@9AgYv=M^l&w_TN@n{7>K$+C0Ye_rkn`%Try%axsr+{-OVs?VX z&SGS$U-bdsva<<9K@dwFEKLy-&iQm-ru*UaNShqlaZ0+6XgId*;UdcnXV3Go0f7zLZazH_@0Eo zfsEuU&0dAxpFo0yYIG02t_!Pe7mSV!-0H1hz2`yvKtW`vBJ`Mnnh3xwVDyHIvzE+R zTjop0D)-!R^JVio{OxOqcicevVH~+(2&pq4Zl3$GcCmuMNVQ3{zQW~##I=1Z|2ym8 jz89fA4PjG-VF~{Q4Tn6>zq{Su00000NkvXXu0mjfW2-iq literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_rose_top.png b/app/src/main/assets/blocks/double_plant_rose_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bfca0ea0dc9d96e3619dca8679893e189e4d62f1 GIT binary patch literal 660 zcmV;F0&D$=P)75yE9Mh^v(u+(kwFi7lxew~zEf zm{40%0_`0IA3wLz{d$f2+j|}GWi5=;v=?u)F1$%k;&jP_-!o6hsI}G5G%BS9G)~Gm zyXoNW*R2jX%7w6(ccUoVur8aip0h%Z+hMD6WR}Ag#5XLE_C3gdSVimN0NtNAI$*CL zB3GI~tZYOqKCHT)KO*zWQw!vP4bn3ce62Bf+v8Yli>RFyao+u;1LQ&g^F<5%RSr`f zgUZAJ47MN{5LQNMoV^E{PGpZ0cz@B-0qKGl!2(aKP8@O&UUG1h`zgd6N2wS6@BD44r3DHOG#N!)QNJ%r8nT@?(bpDfS0JwS_paHFA zCYHq8JAFr!SLc*5WVWo>O*x_c8%zU$7E6O@047JBgR{{uFm^_ALZDQ|knms&(?L8m uOKJ0KpSTs$1b9%7(#}GVfn8lW?7Z85a})0000|_1>pc2voBG literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_sunflower_bottom.png b/app/src/main/assets/blocks/double_plant_sunflower_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1febe3a8d575175e8cd51be576a07b07720970 GIT binary patch literal 359 zcmV-t0hs=YP)d=N805TLT-mZw>0LwZtu;$SDh769~GVpW&G5{oJ zRKrkT^l`>C+sr0iZyG1t2U<{oEK;oUe_c`Sn>vFdJqFUISnn-(FMt|8S-}7{9xz1UHbN0We!Z z8XvSP{=Zfy31&kz|0mi7AWe6g<-mqKS|a}+$y^bg8NpuAvOCc+T7P@91y0MY<51Y`inAd(G$0hj^!008$* V6BRm{E(`zw002ovPDHLkV1k;zVkiIr literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_sunflower_top.png b/app/src/main/assets/blocks/double_plant_sunflower_top.png new file mode 100644 index 0000000000000000000000000000000000000000..6ab2f15c0ef7b621bb2df3ed7cb92b8801a365e8 GIT binary patch literal 347 zcmV-h0i^zkP)<{oEn5_b%8_f(C$G0J05)FCCYI z8vxU6c<(P^7ig{f4Ym>F0_QxP|JKRs|3R8HH~eK#Tk;#fW{_>500j9LWJqYIHP`@f z7%bEVV}b@C$AV{>0oVW#A0+PFu87|N%Q`Uz=Qd?{EFc>I!bVkm_zigS>J!)ym^WZy z05S*^4zL7<6MXtK2W$XHAYybNA^xegUMWozz!@wGN zeC1EAJL@+Z>fy7zbM!3l^Um&s=9W literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/double_plant_syringa_top.tga b/app/src/main/assets/blocks/double_plant_syringa_top.tga new file mode 100644 index 0000000000000000000000000000000000000000..0fb0cefb848e8b1a665f1a3c73793f15f0383040 GIT binary patch literal 1068 zcmaKsJ!%3$6vrP{DJ?ue$}|cJ9zkJ2492e%IfaFIhg4!6(s+s#At$l$B9r+I^IzU9 zlPo;m?tA~QorN{)nXbO|?eQUmVBa5KRJfi#DPu-Gy*E^tT=y0$b?s^$of;pVx66SF z)cxm1wLUei!EtJ_@C@+LC7*KA@vCu_cYIzYKF{E~8szBm#mzmvH#x{7EIK(yF(Y4o zM|l4H3chrFe$InD@X^6T=TDD%#ZDUP;Ng)Aoi3jp+BtXeoyoymJD$m-v%p^%bfhnD zuz4npHaoc~^1#g=Nnd<*bim=|Im*pkdvVl#KK~8mi#HkZ5J#OEJ1{!`*jt>}27{)! zei!ePM%HREV1=vgv}Xqn{diySz29FuF#qkO;k*6@o0siu*Q}f8i_@% literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/dragon_egg.png b/app/src/main/assets/blocks/dragon_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..548f466bfafd0e8654ee3361368871def8d9628d GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr_~5gAIiaC~$b2xAWC4 z3I6}zteWReAkV}`;cO`(m!87)erGISmLFk0ZM!Qa;6cr|nD^@xn3YxpeGXp0q4j>E z1dqsf^&o?l^KPH23Fa1cyqco!w*2=gAuHx7oZGTff@CYCw4S8>~_S r%8MS$U7>3k4l6P}&R%1a-o$^fN#&5Q^2;con;1M@{an^LB{Ts53e`pa literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/dropper_front_horizontal.png b/app/src/main/assets/blocks/dropper_front_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..a2848daf928fcb4de4a5fcb2b8026ff3797e6809 GIT binary patch literal 492 zcmV2w-~#A304>$(_? zMyOOO==FNoY&L>=y)OHc$wa>7%H=Y;-L4l9i^b4xx3Syp(CKtA9*;2?3siNoe zDPOy?c5=B~#1jsOVR&UczY1-GA2!Fq=ks|lpj0aTkgQJJ?{|T&?J(X1--oHyYTp5> zFcb>G81n<}@fI|Io?@}+1@PQh6}BYNZ=Fn|N}w@4ua2%2sF@pxdn z-Fh!k18lR3X(VXybM){LnrgKwX?B1uRxm_^xL&We0%Ls?V zST2{CPN&G_auOQ~g```BE%A`aWYBK6@pwE?sZ_ApY_MLhC85=7A(>1folc`xt6{g> ziDhvafvu92PF5a`MglcqyWQe;yWx7hqSxzTwOXOm>BxQ*lgT9PlgUIn7>~zt{)EM1 zA;i^cRhB9QTm+ZH`AEP(tycRHhrzt8y#8D_fP-`Z}OJkN!Bq|XypyL56r$&ge=4c-Oc>^L`d5&P|DMrgrpxx@`cM9}- zsr*W1T6)IJ{91#CHrVo0u;wSw{xbkw+|8j#`2~6lcU4Go{rDa(=R>%Zn}V}2hvt|7 z4V_GalVPgFRS2`RD>u%xr~ND;S=Z4xEQe!gcxQ!%O8!4QR$7Ip5Mgo0QIOZqrw4ft zNl4In5UdH5Fa=34P+Vq#(v~7Pm+;DaT`W-r%7syQq_hG-T7XZAatmC#9HuHrprDHj zEMWnKozfh<#i)uXE%H=|JLOf}DlMTca~l^jewflXp-c8LbpnEJ*;WWK)LMV>0Yhu% z%rJ+EGf9C3+P9YK6ljA>3ZqAw73&%5V9f_D@1HcIW2NeK-wkb^_MD04#eW(C>P2 z`g0HTF%Jxz9-P{+bJ(=$tqP)*mn^aF2N;qm0&{AJPo|)5<0=|IT;y=H@>&)-p_weN z@%a43M|Bbsa9Hm5?2d?**fsU!WjRdiEb!(QV9(9KmYqcBk047d`=eaCIW>URgoxH{ z0S%w7aClMvn5@|l3`rlF)*Uqgg^3P%TqJ4xJ`7{(23ivG$aVw{(+9?_$ryM0(D>e7 s6*PZwb2&uQM+ZZJlhB3L?OCt#7oDV@np1VI-T(jq07*qoM6N<$f=691qW}N^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/emerald_ore.png b/app/src/main/assets/blocks/emerald_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..3653cf43e7e0a938791db0cc16c81d5848d7ae00 GIT binary patch literal 364 zcmV-y0h9iTP)*~`q zU7{!oZ<@yEdG@aB{5TH3!y#w*K>#$4qnBmrd7k@^|M|yn?NwF99Rq}X1Ck&>lC1cT zM|f;spP_=)5PjcAj%QE0t5+&RoR6A@eDvv8SdeWDuY^6Lr|3f5+Mg*+qQur zF}*NW$6*+Tc%UBO%r;al4K=;ow#}DiIjd;3yAi&403iAVfGuQM7X2d6-B1li2yrpKz(>kbg<;HCt%#F}di}3-Qly^mK6q`=^Tn6pYa|FmQm5l52Z1;)G;$`y zep}tEBxzL?<^D2a6M~on*X@xn3n5v>+v$hn08wET#d=-ZwI^6}k`T2<#)zVflZeQ! zTb-9!vW9a#f$;{(DU(4FyyK5EV~1>B?PHT7N{x;WT^$^VGJQF+waG0pIzV#;K@fP^ zZGK>>rQEAD?Yu?g4*U1ZMRY+FNXka-w~xLqrhq-a?#K~4s{ydJ9!-^Rx(A(Du`*a$ zE+t=vm01_C!K--PwF{Ld>Ua%>roB76PtM!uCa_|Hk)-hUOz&&9@%r>VuK^M;i5MiK zf|QJV+rE&`Og$<;D@6I+f}1!YuC&*+zW@chewdttpka#>g3^;nX$EDpNm&gBsL5_U g!PuE{B=`@00oD&Z=}qu0UjP6A07*qoM6N<$f`&=KNB{r; literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/enchanting_table_side.png b/app/src/main/assets/blocks/enchanting_table_side.png new file mode 100644 index 0000000000000000000000000000000000000000..dc678ce1010a01b5a95035ee45551b1af51f97f0 GIT binary patch literal 359 zcmV-t0hs=YP)TA zvJAk30LJ5JF9dI>2>@aMTEe4*({%O&B4LsEkv09oVs=5!mE?V;5DBMg6ZV+u{Cog2 z@@uO_&^)NrPM|o>0yv}5$nz&jl51T7_!Yl9SMc3A+>iKdZ4yFwUv~HD5CFqu;<{kb zgA`o5THi4o-C>OD%{_Ob02sEbTRN>*T^Ejg(r~NRTCO3`j)@U5Qa&63hSqc(WPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^Ra0vZk?4Y@`4RsaA33Q0skR5;6B zQ}0g`K@i=49}S3@Dk)Gg#6(kwd?3UGs*U~K6R&#L_P`RUc!(bKpzZaxpT>Q2oy*~e z*S(#6`*!BdRDHId(QMvg^!f#I-A#&h&7e+NTa0jeOg*nacTt(*d7C2Lq;_MKsvjSb zn#K(p>kVGdJ0zpRg_hg@dDLFcPR;&%quJgq3mVJ2qmEb>csqDbE^-T zh?FuF)r82j~O_?inIEsWnP=r6>@tU%)>eM zmC{mTBFX?9cY_fxVpeO7Dj$}(UDH{E`+prA(r9u_VN~MTQIek9%hUPg4%Z0dP&<4< z1`xZS9i^sT8jkp)VAROe?~jTp0R}=CB1ktf!E7^7OUyg8!c1ob|;ltZ@41HL{T2g9G3jcmDzE@p9n1 S24boJ0000g+`e7p`3RUcjQW+oD7MfNm38VVS0nik`6P*Ouw;Cr)}$5bIq3qgY|j z{lX&lpFbNauYBM8t6F|VvEW7q!OoY*jd(ZgVO36ApKBm?%;o~Wu+hoSg^34lSH8%* zyK%v+WgQ#WuCuxF{@m8EX;u!0b1%PQ4)S7~(|fo%q&RaGbL@3R#l!EM_p`k?Umy0D zBlH-<3%4+)*G7K@HH2y#-Z{=~{pC>0|5NQ1^P?8mqAToe?kxXLao=US%>4XPs29*b N44$rjF6*2UngDOpd#C^a literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/end_stone.png b/app/src/main/assets/blocks/end_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f9b678b4d029aae243483f870b6657a9ba2454 GIT binary patch literal 404 zcmV;F0c-w=P)cg^#@jkDQUEbrdS?Ck99 z#;ST;KAW@h(Oi`4$(~2`I4<@3@%H|QY1f z+ld<}9CufcN0`BU%O4-*-5}<_mt|tTa7$(~|cEwOX?9fPM+D*iS$!oX09G8%X#R!lWLo*#gWy0M=MJ)vgl&!qqHU yyMQ;$n^W6|nQE6wnEoVMC^2gTvw?XlHN9Vyvte5Q*1HP;0000AqRnd(bH-ezJ z5TptbaUsDH6Kmo)olM@FyqUb`;>9AwMZK$g@44J_?z!60Gv`^F;=oZd9oIhW-@1Kc zyZNzVnL)L>w%+*Je9SVT_;-bg_5CD8MGX5|CX#My!eXH;P#UP4& z#`i^<1L$^W)RyySj{u0;vfH6%ngf7cF>Qw?F~NUE3A!=kdgoS8ec$Z^(77mi3xadg zaWn2k&97>1Ec2oed74ZZ_E?<6k+Qr#>w+0zMt#;*h9+@zqQ0VjrNMNO(Su9+4IvZL U0UcADKL7v#07*qoM6N<$g0G7RrLs?DX(#@fA0P;VRSLn@CX%2gnvln4cQd>5 zuo&E^SQsx;oH^Wk?m07L@8~$4&*9Hia%d&o-fFfQ-OkW*ogfS^F3%sIdSH;#vy*OT z7=)o$^_#86=slZ`h6VtP-}{s2jVwt3poFA-e>;Bb1HkoFJ4+JH&-$C1L@5Lk^kjuI z#u;NtdUx}Hh=^FPh4@+J+(kqs6~c-|2n|*mSb0MU&~p7ia9*Yr({?lvoD+ij6g(lQ zq8S1}#@KSBVQS!b6b;kyXmS1Bl4aXp=e687Mco7di+H|>mtVe!=bD#1mpuO&I#~0I zKELW}16soIsN+!${_{%9&}f)C002ovPDHLkV1lEBx}pF8 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/ender_chest_top.png b/app/src/main/assets/blocks/ender_chest_top.png new file mode 100644 index 0000000000000000000000000000000000000000..316ac7b7a69992b52696e9b40372b2ac96424d50 GIT binary patch literal 460 zcmV;-0Wfgc5QZPeHfuXpOn@eYszT7JY7eNYgcJ!>soXfgf8q~vfhz?GNPv=l$ab>3StrZE zwVf!O3h!}t_L+HS#@Qdfu-W92+bE1<+&e-0UD$~^eRaa*`Wg|1#NE3b4G&0DNz&`_ z=Iv{~jmL;6L_{HbhmV=fG_x$n8SEa|?0epOaR#)}>5&}>dT~@xC%c?HVvj*V#Vx#@_eRuu}sR7$h zw$_4$DYsF9w9HF8H(N4F;ke}xJb=-c-#D&=%+ux$gh1vgVccQ4SZ-8a7Rv^pmBe*h zYb{q+WS$Zw$;Oe*vg|+J!B)S6=L@1FAxaV)*Qq`FLNvQyQGd{F0He=i9`@VJr;_

N$XYUcL%pq>O{2E;V;5htzM zguM+*Ph!mk8D_-;dW-+a-xNqWt6;f^r$Mr*C-ISsbOX1rNy8(922H*U{lD+$2y-1% zF!PzC!R)YYUS-MO`l{f2^{YL8|KI7&{XkDKgTZ5=v)hILGmoqNpMFh@;qkIq)da%{ zG8fqzOeUr>oZ(hTZ=U17NnC@^rE75^3loD@!eVCMHx98tw=sCS`njxgN@xNA^W#SO literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/endframe_side.png b/app/src/main/assets/blocks/endframe_side.png new file mode 100644 index 0000000000000000000000000000000000000000..ad054327d64bc6a457959f572cf8cb22e35c5788 GIT binary patch literal 424 zcmV;Z0ayNsP)Y5Z(V^<3A8Av=YI>KcGbl!O~LV7ot(b&PGt|5{qjzD)};(XvA1}2^@$43o(#{ z5Rhmkg4&4S-8JLA3A0?lB4FjgW9Qz!c{?+^O8x(DY<7nJ0yP*4kx_|K|HwG?4UP5$ zXeEaYBsp;y*2ra7=sdedr>RxVWfDu2K3>o!+5kj88=;%>4z(T+sMYS^&AHM5U%TI@ zdM!q&qj`O(k^pP*Vw3FBE?L$V+S! zLV0F-x#s~2GAE1NvU1&9`f|&ZjEC8%U~aH8koQqA*O?FQNiycb2B-q7#Ml%;`z1-P zSJA@+-)I>0a2M?u2wAcB7%;&NfWy?qENIYd8VqQa2q1>@>vxfbo>%1<6+kT4iWOIh z)7b!`dNtNnvb+V%=F=(h3JwO(A35FbyK_kjr{d?yPed%vFxC&thg1}73H%R*Z!REj S>gRj_0000(Q0qof>WC?o(NO8ZMx{7BQsXI52Y_j_3{ z&k2q{7GiXH9nk_nM?&XdzmR31PuLv}8>{%9=FT(#Sqd>7N!3mDRAX!qf)CmK9(sFC zsR1LKi@cDOyh?Ys2Yf1u46R10Yc~nOx6Mpa{{E0o6YE^#49=H3=$>(N2bdG>0-zKb znw!e7HWT$P%u=BsQSN$&JLsA7s+Xwh0EHFm3wSvvbG)G)As$_!LOx1nXOFf6QzO-u zZ2P>s)MbiqK{G<^aG5v!cLY|cbwi7hg%Q5K&nYQ|wIlq!MyqF>g{}Acr@7D(^s#VL zXX!2dhxGIiX9ylt@A~A1p)(LdwSk2z<<} imm>g`!glpydhuU8MJ`=6kVPN>0000anyr{S_(iw1=CeAu%HrJYllt*RIo1w{OAcRRtDN&0%$?f zsBxVIC4-$@za|q*S@H};b^yPHBoY6Hl;kKoq-%1TJ|mR`A4>9pv#59P{lma@DHC3u z0}ymt*#VOKobB|1n(4l+KYyqs58hD=oNn?3+^)$iX-4$V8=#u&H|^k^X#fBK07*qo IM6N<$f?tqr6aWAK literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/farmland_wet.png b/app/src/main/assets/blocks/farmland_wet.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3c1e1b8dadba5ac6f9ec775ff68c1e461526d0 GIT binary patch literal 610 zcmV-o0-gPdP)rWF=5XJ8o>9+LUZ7Yaxq!bp)_HDIp1ym3;NT`|;3=#1i6Ag)f{y4w8Ze96s+nsx7 z&Y3wgV}6gSvR}{0&tXM=JS@wzrL;WN^X0xPpZl(CFQ%n6m#{YXZ#VMR?|CgP7ePhL z3k~jFb7Z0qZyI?Suje#qR{X08`Oq!N=H2l7a4o!laxZO3y7P`DHNW%+^{lK_5?W>m z7J;@JYSt}X|= zFj^|vncq?nl#cHM!v=GEKHMGR%xR}!w~>Vck+xDB!lE*4{A0gX(c+8ruB8BH-J$@} wR{$0ZRM44Fz~~Y|*bwke*%v`o1`Ce-0ma0C)f_f4yZ`_I07*qoM6N<$f?$*vP5=M^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/fern.tga b/app/src/main/assets/blocks/fern.tga new file mode 100644 index 0000000000000000000000000000000000000000..e1f36b0794c5e237613a682d1690ba82f508d732 GIT binary patch literal 1068 zcmb7E!41MN477Oh>-Asn|L|js!hjy?n$LA)V%RghES}*zrL@-ImH3)h?ZJ5$ zEcoPMKkF>$LuX=ZeT}hdXcdj7e$7+fIoHR`^it*^rkQ*ChSqv_+LzYUwZ^pSmVOIw zdD5DyHfOf><+soKw=lgP_|PREXWznG{)q)2wT0>R$Y<_h`8SxZ_wnIw?sDEgkM1-c F&_kW_xsFT>dxn?6GkmWem$3#f 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 z

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 kyJyv7?EHtPh($07*qoM6N<$f?S&$Z2$lO literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/fire_1.png b/app/src/main/assets/blocks/fire_1.png new file mode 100644 index 0000000000000000000000000000000000000000..02ff73000c44acc9f99712de9cd69b06a3d2758a GIT binary patch literal 13282 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°HH z>eob^FijWz|BMaF7e3KgsUu)RPaq_)p2n8PwuofJ+2da>`-^xazQ?R%={Wgw^HC#( z2?FKVPg#55bVLxMV|U)Hn-s<=!0S#U&bpLk+v$8nc3{^k>7$`(Dp9UDb9@+)0uMUy zw9jUDPxtbmxj3A-dx^vCE9f{HabRI5sd~{9ASg-@v<8U{A-4=2lL{{)r@6Dz^@d`N z9uQX_u*B{kI?~8^jUSQ7$EZmjv~_Oy8)8^vv5PaEj0ar}U9etRUVhc^B~08~rvPI( zSt(PiB{SuIYpDDS*6M3NBc2%X!-MCKeO0E*2n^`_f-IDp_5wgA{C@x*q}t0fX8$Du z^kSqG)dGNFTly6dNGBuG?dz^zrXT-Hb6}azt(po$<##ZQAW-wuMh>B#{2WJPcIGe7 zJOJ(u zS}$kyS41ES>8JJTUoio#=dr>6ParKagVy~Q@E`&ZA1i)BobX)_@lEmn$1hi>1Dof~ zem--9f6@b5=)^S!MG7odw$s$hEINQzv+nc10((qR3n@8>ofIp zFnIX+hogowFGkn2p-_{UXKMW$@nDVVOXB~K9>hV6|5XC%bWl7geTWUi+duY`)-K=M zM&U*{u!hX1iwAjp2`fE$KaWMuOrfYas^8m}>TU#d<*_E|(jWi_xWrnHBgH#Fp?H}* zBf^1^a@@%~iHrkDw=AKr^r!vw91*t%r$-|Qzyk$>&yPPna&Y7vX;oLfOe?$7N%xh` zy}y7W;9&B{hqr7KVk-k>L^~58IUFY)^Y`n!r7yB%=HD zzK3iBiROE85WU=H#Q$YIs4{TZl!K)ddPu#q1!!6? zClSVkml1JnhjT&@k>uznB0YipUNW(q$f}e0P(`=0(|q{E`AP?#wh>1hN~FP=2p#A@GZ^A@Yd08c&?Jopk@$fG9`1pF07*qoM6N<$f|vAV;s5{u literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_allium.png b/app/src/main/assets/blocks/flower_allium.png new file mode 100644 index 0000000000000000000000000000000000000000..2068ace65e710207d90e50b5985620f2ae5a4150 GIT binary patch literal 307 zcmV-30nGl1P) zUxrhC5Y2n?fB(O?3&JMaB_JC?nqV|Y^Ooq}|Btm2VF<_tAjKejZ6(40kYz;M8;1_1w^!dt(X{#gJ3002ovPDHLk FV1oD0hAIF6 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_blue_orchid.png b/app/src/main/assets/blocks/flower_blue_orchid.png new file mode 100644 index 0000000000000000000000000000000000000000..7c00b5c38a246ae10dca3c30be0e95a402a2c071 GIT binary patch literal 348 zcmV-i0i*tjP)j+thN8|f6aBj{~I0q z%>bf7d}J5c_HcnUg5;b0ni&{CvSmd u2CyL%p|a9``*CK24L~~>JYD@<);T3K0RRYlFi-#h literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_houstonia.png b/app/src/main/assets/blocks/flower_houstonia.png new file mode 100644 index 0000000000000000000000000000000000000000..50151c86cdc4e45f9a51351dfd46ef9cdf4e1ef2 GIT binary patch literal 334 zcmV-U0kQsxP)c_a8^319w|^O|p8jR{ z^l1)A<9`qhGUQk*#9KtU0A_ROWTXF{EgJvt9d2TP8Ai|rNH)Wq55^$FKzxF>BPnLE zFP8^v0vQT&2~kl9vKgci=KTCEz6>BX%y5ulL>UBA3^D{}0MXun82}4N7$z%&!Ms9t g4h0zi3I}`u04NaWjPBjVQ2+n{07*qoM6N<$f-Vq?WB>pF literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_oxeye_daisy.png b/app/src/main/assets/blocks/flower_oxeye_daisy.png new file mode 100644 index 0000000000000000000000000000000000000000..03a11e52f6c09727b9c3d0f34dee856805cee37e GIT binary patch literal 339 zcmV-Z0j&OsP)-o5)DnI_sLTjRjC{eSgr?f*;1<-jz^5Q~q0iE{zSHV_7BhGCeP;XNV@(OUPL z0c0bx3qUT?-0+t{ZOL!^nmxNU7{ZqrVGV=8h1v`tOwa&OXgjwlGkA4qgAEFtX!svw zC|JB*5x)VJbz)%6q4NzH9J^&euK90TCIU79Bxh8`hu?rFuRehl2F%m|D+bvP;sa^0 zI6?5~(;ToukgXuiKrg{<2VsyrQ2=Bk$PkbLFm~uaIEko_NK5K#bR07x@PBg_z(K?F5}YysH@(*$%8+z_A_{u6WsNCC(ukVcROm_aZ$ zNX{tA47+BKgnF=I>9P2z3F;+_Ah!D?VvkfhNn*&a+=mY6W8MX3^R zJ4hok1{t6nqWm8e9?`C5aB+f$z@idifX07iKb8L~L285zKo0|u?I6wgYzF{VH|qb? Sa|C+;0000^P)7dsgJuXHx~58{^q*+d(VYN3sxxZ1^(cmwim^)VDzI++k}K#{#6 zhT>csec}zMa5BbFoMo-|pQJ#{vo-jiZmA0nz%nPJ|IMD3#2ZlWW)9X^4D<>(27q*# zqcLeNfN9PJ1}NASq!<8lKFG-+r^7UZXp&q2(gbpPo0rx9P9JMvf-)t|fOu0)u&vp^ f=xg${!07@2(n0BL~z00000NkvXXu0mjf8jfBI literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_rose.png b/app/src/main/assets/blocks/flower_rose.png new file mode 100644 index 0000000000000000000000000000000000000000..4a76098645c7c7853b808a0c8bc7c6be9766b316 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar_~T6C_x-u-?DDwpfDU(d6tC^^;7S|L|>=Ok?O!J87-pyeRgp n1j}d11C5?x76+0T=QA>7RyaP0TEQ*^bP$85tDnm{r-UW|?G{8; literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_rose_blue.png b/app/src/main/assets/blocks/flower_rose_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd1f412f8dadb00e1d71346587d8b3f00f2ccff GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;uo-U3d z7N?UFBv`kwZnK{MpFMGt>Fn$0|K)Ff@umK?Z_p+7JIS1-IR^0+&fXVd`2W_@t(bmr>GTTeyRiCYQ?$^A9JP8N&ZLom_oS Rs1axxgQu&X%Q~loCIA)HIl}+| literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_tulip_orange.png b/app/src/main/assets/blocks/flower_tulip_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..b8bac79875bcac08259b2cc8027b7e35b3bfb9b0 GIT binary patch literal 370 zcmV-&0ge8NP)X?uu$bch~AO< zo5A4jUk1Z_L>QvA?l;(w{iVMdE=Gy{fAZ=RgVv@$44NDMGN>*2jbF3l+rJE9%MAV} zZnk0oX*4bq{D0%#GX{?ywg0Khor!Y+NHNF|uMTa7fJyrQ?;UOe(;#tzF8K6m4ug5U z@c)p7`u`ofWx#9@4KfhKCTKgz*&v1fv(&&gg4iGoasg2Wz+B+et^n2m^A5}~kUUWU zWFyEBkVcs8p_7dmKmke=0NDyM0Oog4tdIm?2Ec45*#LNM1ZvLT;)_=e05q$?_>DN` Qng9R*07*qoM6N<$f>GY12><{9 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/flower_tulip_pink.png b/app/src/main/assets/blocks/flower_tulip_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..719457fe55997c4d0532c32d7aacab90aca0a1f1 GIT binary patch literal 360 zcmV-u0hj)XP)vcD8!$dgx}7_>J1VbI+0mqBgGZ~U4)yEXoYFERS>+^)y~(r8*H^8d!Y zXJGNbh1v`tOvnI+(D{b{o!gZEdv$0tfDF5LxCu;y3;`L87g*MbF@Q9K3~}t10c(WO zK)L@$Rebmj0680^Fkq$zSaIM)L$F2|O)vmIeVPL{0OVX44YM8OI*>e30AwS~-!R)l zCmS(<0+c8K(f|qznC%2ZAHxMe4aj~c*#KmhT>t>u~;m^6C?V)}}uUnj8Kys4e-8U$f)ezYJDS|1t#4 zFaT?eo^Sd8#=U0@iJPtdr!IFU&IKUNAdOxf+6<1}GXL)#ZUP$s5+~?_PoL(1HGwpM zXpli5m&C8L1oH{n4pNM60EmuSZa|y?AQ#w|%Y(fEb2dn$&ty%oOF;5O0hsL|13;QV z?9jvcL2J{?* zzj5ywhz}MA;{OC)0MZOn=+&Xk;N7eB|K8yyux9@`TK_?Ecr}0eG>5^ciVtjnW48>L z4WdDsZJVV3gZOw20680^2xK#i25MyRnyN@xGqMX{-T=`cKFoHIJW&8m9(gJ3&Bml z>GYi|`iZnST%J3e=iEVYyWKcCIuaZn9>VE#!r^ehZnq2e_V(cMc(BZ)&tx*e<#OTR z-~b8(g+c*WS68^dzlY!N$K~ZE%H^^k7z~O(o6U-4?EL&3$z*atV6j*bi^Wi@)sRRe zkjZ2)91aDIMgtEI4~Ryi=yW=0wOY8lyOZ2VBqC}RO5)@C`WnSz5l>G~*x%omcKE~Y z?k@Pr&dv_JUN3UF9QysfSo);}N+m1hvQI@({>1U|G2-z!y4^0GpPywuip^$2DwRUB z*<3LGQMiurc#Ox#M;WRRP$q}N{+0wPl?rOL8aka08jS{ey&hXzTM~PHeMPU=lNz?C zaAoX2olZ;drBVr>pP!gaCU}2;7t5lTmlx#odAz;7iDC}^2w9ogDWFWPfx|t$Jl5zk~UZ)cR&ILmrk;Zw2kSLh^SO5vI$zb#3cd2gw4WD zP|Z>$k5CB&0>UQ!{7cYkwJ;bAD;SMNY;SLiWsEr=A0M(UQ4k7+gpCADFq_S?POH@_ y;Cmgsjjyk-{|Z>hqaYg(=`WCQ{mq+L*8BqDGwHY>w9)TiebpE)5p@eEYHX+WTz9Znwi~wF)d23&zLCVK$p#GMNOUqoZ&* z98mM<8yg#g&1S>I!~_%ulF1|%78bC&x(ct?i%=+pt*tGA&*u|=G#VAln8)KmFc|C; z7z_sZ{eEP#Sr>Ccad_Ip@EQYzcIqdK6V`pavD=RCKJ3BioY86W2V{vg2 z8yg!)rBcxA^)e1SjEszcO@@bu;c~eUkH>L*d@PoJ8G%yCO1Yd ztrj|+PGYyWw>UgJlp2nw@RxD^NF*Y&r_*UvDiu6DJmCKRUM!1lZf=lBBye|kCyKfF zsi~S7dSsZ$JyDL__(7?CWED=CCTS~C^IuNI5{~% ztyV*`*%Z9Iyr9?X3Etn|#nPw7nadid)7dA;<#Kp>dP1w!!rR*$I-QREGGcmqS}c8x zJwHF=@$pe=rM?25CA$j&6Iq}_CHn8(?RLKv?C$Q$ sX36$XfofUw^ZP6I`ud8?%S);G3rsXOi9tS3z5oCK07*qoM6N<$f^M!N82|tP literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/furnace_side.png b/app/src/main/assets/blocks/furnace_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4948093f78ea21ff44581cbbb6d60896fbd0845a GIT binary patch literal 564 zcmV-40?Yl0P)okmxg_`GuG~eWC=(_ohW>(qGVz<9xAo|}oloyKSnadd ze%9LSdCnG0CKDM928Ld*C#_aX8jXh3YBfVHmy^X}A+ZjeLZKj|(MUR-jszT(N+pU$ zqm)Xe$l-8MC={Z4z0PpE-OOh)8D4Q_x7#Tg41NrhN+tRIermVd6bJ+;oletkw_|j> zUCL&&4#P@wgC%_}bF77!J#AaQfA*JFr+)oMk@oB#~vFQD+76E!~pu2X@SrEW3+00000@?kEP)#nY@ zno+&Kzr$j&NSMuL7>!043^8rbc2D0R$fwOUxMR+vmCsCZE>ml26XkV>WC za=8!+h0tg;Bs?CEgpPImUVohpc6{9NDts i&tl9@@&4(lX#7%=QiNZ^&I(C2BMVqvkz;RFN2)l1JV zKp_%urrD3im4z*Y0T2w9rFNH!>N^Ibeol)HDaSLhtlBCC-1aK$d7k9Lrw<( z#6%*&n_gGxXS4UCidR%th^>HD8wU_p8v?au#}5;O6()BC7w+-laLijQr zNHf+6uj?3CVZMw8>2#WJ#jjIL#kCCp-4X!YlZKc3tAV|7cXHQj()eT=F!4QfBf;WC z*29VlFi|LTOM(p=;Lp&bIV(;p8@vqys`AJ{fqQ-CKTp+P ULFknz>%07*qoM6N<$g29;MtN;K2 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/glowstone.png b/app/src/main/assets/blocks/glowstone.png new file mode 100644 index 0000000000000000000000000000000000000000..623e8426aadcc6cf36d761302b7be5a132df10eb GIT binary patch literal 283 zcmV+$0p$LPP)9jyh`*lke~QTKLZdW*|pr)|t351+rN9f>oG=xG^S; zN?R0VuEL%fXg$JI*`Jp7!l(s{*(XSg4CK`5;H2`IBJ!CW;NUeKm^A9Uc2&1@2=`)2 zT~+JA=gS23A5=4=j=|J`>e9i_)V0Mg9<@)l;cs5sBAYPiKTx$;n~|IaQ{s@2Zf%j4 h2{US-}xM7{m(muSZ1;c+;= zm@d}`V-_8CZ`CEQuQI3OxERMp)pWl9%Y5_Qx4!=I2j#Bjl2>5_O^T*6ID#fkFD&og zGwaIu>JdO;_n)Fjk)b-qSSqLN({_`-F`mpZ005}k#u)UFCKdXIQ&r5%fveQBDahZ{ zH#)!5r*RB=lc^LnBqWi9hM|sErfR7}@`v&118}{d&}dO|6dp(j)D`f=%W1%B02!s`Qj;>s)_oUk42RKW9It^de*yqd z9hdVkpAO@x^vmh~a>{u(KiekMI8+Kj(_7YQeg0S7o=uw(1J!MEQ~klnW;Ls* zqKlN#k>2`tdbM6HEB*(O)=8Wj S`=^rt0000ujP)mOc_0Fy$14?w2Vel*8K zXC8%`Ly)C$nl@rb1nDFAUKl9yj=qW<8Jj9g&%Np=tDVhug-jP1QPky-cn9hV=_{(P zZF*T`qi-+r;e`B(c;!EuGIy3k(w(C#szGG-*T!rWcgmUPnOG5kxeqK0mt9d0lj8sY N002ovPDHLkV1fdeZ;1c^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/grass_carried.png b/app/src/main/assets/blocks/grass_carried.png new file mode 100644 index 0000000000000000000000000000000000000000..619a1d6ec120026cc9078ad84b8f27034be91f70 GIT binary patch literal 580 zcmV-K0=xZ*P)Uxi2miwu; z-ou!+tw;5A?-g59Hf)_cMK*kyu)dQL>)0x?wv9sT*eta1hqTp9=2@4&cYVhtDjc~^ zTE8zGIE!0zE~4+2m52sSJf&^?J}nTysApK`wjVHho6@AlOxRjiqe5u+m)-ltdSEzw zm9&Y+v`xR3sj+UZKp=A;73OMZ3#@f5DvB`ZIfx0JfxN?@WhE*Q?vV#FGN^H*H%S#R zo$slaQk#A&6ARuKzACMDCSQm&O+A-d(^6RX@&L5{)40`pTIg(Ej>t5;89a}RGVe41 zK%JU*|KvHQ4V@=!>^>#U(54Vc(8m{spch8m!z7U7_@H3uA|Y)IY0QLd>@KBd3Ip?C zM?D)0w&R!vRS+h=p$f7Avxdcx(9ur@ zFxs(ailD;*YYntEEQEBXVOxJ`C6zFR6@89IVoD+@q)7hdYP%YIMON(u~@B`vb7j8t95)|v(AQX!cYYSo&-$9gu*(q-P06*o} zxjJQfo30E@W^!iknK^T#)PJ9k(;}YsY`g~rTyIX|Y;_#xl?mMMSO_;Vi1uxbk$>^C zcs`s#u#&>(RZ-^^9lEJZAy`Y{aw~(^S{8+&0Yt~PCZU6IBaesOX@q_b-*1bEd$+&Jr_m^np;a&a5}Y_4f3Q5_As1B`^uc$^=c4e#TRENg!L8 z9qm~h%iz7p+frtc+_2PdHtHcT{{dc7zx(F~Kf_BH-x|t#kN^Mx07*qoM6N<$f<%?F AqW}N^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/grass_path_top.png b/app/src/main/assets/blocks/grass_path_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f6e3a5b314feed89130c2f876a120c963ed37c GIT binary patch literal 796 zcmV+%1LOROP)~qTbB{@XOqe0( zo^QQUFKfr3=0?A=fZU!8Wn&1bts&$*BS?Ejp~jp@ZfQ^rSy5N)s0Xdc>>F^dIFRue zAe9bAQ1t4N+R>xnm2s1pK$C_pBM#&bO~?lz?x_XblcWbDf+K~5~P&_h0 z`j#C>D?HA~kx#>Dh6%~9dqJb88Mfp1^(t-?PW)C^Q9iMvOl&I0W9VciAqCf7@iwu& zlb<3sT2y>8BMT{ywM8gfIz|;z&J`oF2PX9MGbjg$L19OOpXv(QDJPnWl{E`lX^)KJ zz82lHY53NMkf1|CYMW4_Uu5#af=*!$(skU4=cXH%F$Yw|hMTkt1)mve)PYufoKUPd zkJymi)sja>M0Z9|@*AOs9ehSo;|`{NOAJ_Z$d0@8Ec_e8$nWcrBql=leawQV#tH`Y zW%ffX5%W@&v}U~qrk?mb%t+nrJTDZ+HjngZMeHaA%qSjP5uuqu#f{9K4wVBLQafs9 zs@>c)%3d8xM`IW?+~{N{Id2hdBOtS}g1%t$NDETiT7=0|>CB_y!G3OvT^DYP4m{PD zP$8N*pAiq`1&;GJO$Kg_kdbrfug|vQU5m!kUMQPxU1V3uficUc4 z=3G3G+BM)lGmR3VRsGa;k`Y>e%}azF@hc7rvmc5JXp>~o1xd89m$V{9B`F=6$ru@_ zuX@C`b^I-42^J!a=7|Np(mTY-ht{bTMLH`zHb7w99 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/grass_side.tga b/app/src/main/assets/blocks/grass_side.tga new file mode 100644 index 0000000000000000000000000000000000000000..384c9412a4e1b8821a44c9cae72d6559584fc0dd GIT binary patch literal 1068 zcmaJ>O-sX25PW#@*q`9lgZ==)n-wCWpjImQ6LQEw2%eIZ*z}V&q)o{sEfhj~=%u&* zy46`2dBkGiv9q%~v-=W=F(-yk!!*p<>7ARKtJbG^|2i08=1Gz$Z*%Cg^YiPs-+o|t zpa+-{9C>=zeQf@w{qbimz3E%u6+At-A7^6LvBSNnvv;BvHP?0jy)$))^dyF!yQ9WE z!Snr6&$}T9wsUYi_6+#outv;Ck9r?xP=`q0dM|SL9OJ=3XZzUqqNnW-44ob8{+tP( zcR;_5>1lgm9=%YfhCcX~;ONgfc=n`eD#VCE5NJLgk2O+*8t{6(R(`+VOB~12@AoyI zPNy1YvzaWHOWABTvfJ&H^L<~!FjPFB&t)_k$!fKd#bO~vQ7GT*^`z732#$MM0M~j%Tnuu!9bwFe(>--PjDyx4PKsF%~$8y Od3?BN-#YirOY;q%P-(QU7!qQ_q-1>VjC+_FRu#+3W?#m!Xqt%$ZX+rX%fq{;GrjaQmn1qTcpTHLHTj35q zC%E9`&tv8?!VGj@$#t=&4z~+&9DXN}{Y|lNI9r3nSsmMs4(~l*NLHV_Lz{#;AWiL( z-i$}W7}@UF$Jij9-y7$E_;j)mNp1)rN#xXEx=@3OO+ti@4($wrpeRA&+SWwQChJag zH|6{cV4Ye^%eGj@oL!3DvK2du(~Ndz0T#a=MRw)N&7~RW>GTNtnfW7Grv<4b(pAw2 zB-jBF34r|rvZPAyF9iQ-5Gte-Y;p+z00000pZ0MJ-^(J*l=ZM>h^*^g6SJD(jLTk>9( zA)K0luBXEW>;xR?HA}$OoyqQ#Ui!4whCvYBZ4&O6;~JA*&vqV)?$_fs0{9$EA+Rd} zAUU1P6P*lQqJl+LoW1uyfFyMLEpD*? SzD8*P0000} z&30CIg*QW=yLfl4%*}CDz4U$G|NCY=WSA*t=I-vJp6?f(y>Ej9=N`_J@6hXv9&9zE z>d-iIFLSGw9_=+A4xd@%`Yy1U72|`m)_iz44_Z#X$4oP*?jonh9DYkU^PR)1X{}8d z&c3zZ>3+5N<*DcM&)*q+qaHsq=Vs16=AKcf-@KZkp1F9|nJC=}8J zv-|z7b5;sF3}>C>1NIICKE7TrnZl0ogeHsw8QL_1h<1j;1Rw`G(-?#g41*1YAbr1I z3xz_`jW;x6;(rg&30)#gsQADch=huFo?#Y=M1+ohGJw&JJyQf74p=Lc(Hahib;dh) znn)!~VMU*#k(iQ5kSJmZ=j495TuKTx$Ylda;GMwfzd#XMJ&L4_kkE+J1c?hnG16N( yEF4rx9#hfG{@H>z05dwG5;T%S-EVtc?vQB0000Hp~f literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/gravel.png b/app/src/main/assets/blocks/gravel.png new file mode 100644 index 0000000000000000000000000000000000000000..b91768d9ccfab5864611e3e747ad6ea0d7bf0f8b GIT binary patch literal 470 zcmV;{0V)28P)2}QIjG~#3y_~f<{q%QUQP7+Sz8CEAe6av3D~& zJ9p~Zzo0|gqSyJH9>Nh_4F=R{xA^_?Jf|=W8AbDe*JTf28vCR`HjQi~Fr)D(ppu!V z({7tLHcuS#eV@sI5I>h6)Tr0^TZtmbfNXRlvJiAvAkU^#s#VL}M4_7qYg>zFi7^Q<KT0NDqi zx$1Xa7Lbm>@lhq^NQC8k9Nh3bo7p8LvwMzvC6S0D3b&{M@*a*(=i8UIp8_<%yE z&1y}n?;l=3fUqp0x@}zm;Wuh!QuujayhTJiWfM2fZ8|C2;t<~;bBG8~KUk literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hardened_clay.png b/app/src/main/assets/blocks/hardened_clay.png new file mode 100644 index 0000000000000000000000000000000000000000..b94728a241254f9b4c241fdf3089ef2f6a33ae55 GIT binary patch literal 551 zcmV+?0@(eDP)ZwF5Zv#|p?D!u<}HZ_6ySmRnw$!VfXSaurhCQmp=%x4>FMd2HCfP?{ld8-TlA%f zT&dHEoK|Dm2aeR+v79zz$(D|MzdjH@vq#1T1bNVtdNYw`>q`^+N-&i}*yDvPbfk#; zQf)mc*RK4`ySxvepvl6ad@Os{g#ElD-?I)+#HVB=d8D|UxPMGXa*TRfs3YbWk0`H* zhLSJ3O#XU(BzqkWBv(Ks5%n1pL01bX0TP>yC)L_xH4uKj*d7nS+)6!fCqxliGUU+% zBqJyjm+}s(0+)bmH3jZ~9AL7NAlINO%qe0^Kp(VXz8pvsdTfi+(S&0(V7t}Il`^)) zOqqCev`qvdz~AeU)a&uphg&sJ43GfxE|eAK9dsg?08W7YsyYx=8+&r(>6By!EcnqT z5?Y-xT0!;D#sJ5uIPWG(=!?NP=&bh7N40NJv0{4{cR@ zNtY%VQZkaEw4DN4LECHrb8dU3nJTw+9{-t5bUfwG z=ccvm48r%to%Q6hC)Jy4_kbp85pJg$!Px{tsUN(q6+!~B9Q*D1q`>`nEZ6y3ulij0cD@#VGk2RK za4#%C(sO0e`B)pky@kLmY5-cH8W(hXE0K@h!4uiJaSB_PIdljVroS@Yej2_@f78MJ+5i9m07*qo IM6N<$f;IY`>i_@% literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hardened_clay_stained_blue.png b/app/src/main/assets/blocks/hardened_clay_stained_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..18576085ca43a46205c38a7ca4c91927ce035d6c GIT binary patch literal 413 zcmV;O0b>4%P)89RLtHo~=+)2`2%(D6#Sn9HBDEN+3+4IXDx*(eAitLh{Psg#jv{ zXz5@2e+AeKrCW1rPYt$Miby`8nq-E(Hb&pEfL}9L$h{vptIrjGbuSQG^qJV4W_UN}K zsL@xzj~Bn00!#GLfuwylbsbR2U?_l`w4{UcB-mt)tU5H1 zjO1Q(pPQ`89rtr?^e;@zF{0V@HHC2qD}vW#;O<90QhE&o}y9BEU^P}L6f<9 zWOOpp*}uVOqDWam-k{1XQut<(O84FS+0w1~|k z?cZ|&k9Jw%$4p>GYxiQD9xSS=_Uu7ECIT`+nI^8o?N1H=96DXNP_fPMmo3?o%(;w<x>)(8 u37gK$sUf2L`A$v%6=K?VUO%?L9r*=&<)bbqA7sq{000011wgaGL?SB(K60u%&pZ?%DK?ng;QCnH`u_Cr=?@Q;kWQ>(neLt35V-??j zYo+~ZjpqaaZ1lR8&AF^k2e?-@<$dwBc3a{gZFCQmeXl!VD%RHrhX}}y{B_HbL7Yu_ zoBOxv)&bmBYJLfNpj|{5{H=}XYR(R(VLi^g0}}^8pg92QMK%C_qQ*?yRBc|g8h}g) z4J@*^pqHHmoT|ODnLR$R9c)aTn03UZ^+y~!*kD=b+#n{|ZXhIc4aQ%p0#Nv m%MtDTj~7FNI;-=Q@%94@dkfkPf4<)U0000`|osRUUW$%c6Ng=eLvs( z!f`BgcLMoQ9U;Rc+#T=1415v+|UH`F|Z*4TqZdkf-W7($&56pA%dL;Y5!m|OvDlGOP|CT9dH%_cPF6U}$en#m61v{m-1T44pDoKo YKDg+H)0Pe0vj6}907*qoM6N<$g4vv%)Bpeg literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hardened_clay_stained_green.png b/app/src/main/assets/blocks/hardened_clay_stained_green.png new file mode 100644 index 0000000000000000000000000000000000000000..1c50ec485efcece5a56ad46cde7a3dade8f2e86b GIT binary patch literal 416 zcmV;R0bl-!P)5;Q~vf!1<8iok#l+!z^7yd4 zQbWltB_`omN#XWz-UwDTDxO}YN_9Bztx^jG{Bo#DX|Le>9&owH{!!xr5I_Mz%!ujM9kqhP0P=d|zH8sUNR7$JBjrBE>byiW) zl|0uZ9&oVaEM(S|NZ}{fBywx#<2&U)HFdEHU7wk*Zc_{luauv4nkek3-J9~w!TT%9 z9HeWHhoixyiJDIZ`rn#J%??^}3{x2t1?MXrDvEfuS+QXYT9JRKAjq;=q7m=_0000< KMNUMnLSTZ)`MJ0N literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hardened_clay_stained_light_blue.png b/app/src/main/assets/blocks/hardened_clay_stained_light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..86598bb85acb6e6e17fcffadf5265106881a79f2 GIT binary patch literal 408 zcmV;J0cZY+P)=t4CA^x3i42Ak1#Xn?3LLjZ4p2E1e7#MW5{!D%k=4$r`k$9+P<7^O-EbikE{=_ zv#giLyBGEW07Ys~Cokby;=+{>4yqf`+5hs(;nEYNk>ZnXAn8t+B|Tw;tar90WbcEP)}VvC+Nd%KWMX+#{6-HSB-x z(&GRuQtFl31A>xeK{KoRNQR-jfj;7p9JB>N$uq<^mkd;4PEZ10(y-Km+xM($xm~0) zMiDcj+?0bL1o-!h+IzW!4|_EulQ6 z8_6vo=iIBHE{5X!b^A^?%^YJ4=kq{;%=kmL{9xcPl@Fpk&cJ0oX}nV5^l>r=Y*L=_ z`-zh{#_H7{iLTY&_jkgN$^UyW=vOAxsfqhr8S+zBpZ);Rb`c?Qr|uj80000+M}<-@{%baqw7|ohl9Eg&ml}7js87ocF0E+H8(JC zPagDU;DkL{&diEjJlWr~8lOYygN)Br9%PF|5U@nBFImk2^_J0bklXH1E)yVdWqEVa zN;VL_PFmw2P^oJuamU6Ni=zLr#^u{35Xch8ckcI0*X>px_ zzw{Qys|x3&A1~bcQ+*P3Psw zc??G(b6|<){Xb~;&AHc+&I5w4c?xZ2$r{N?6aN`%KJR7r2u=%h3Yh=8NGMoH9$oWw zX&@QJ$wr*SPN}wG;mK=jtGlr<53lr#5o5`g23@v>>2ysCfqXC?t6HxT$3_W1o1KkU z6;2S^RPe^&xSaZpZ aYyJSh_8LPiGX=Z%wgPjss`B_(|Q3*4lL|Y6~k$Rz}q&eS7jlyEpDe*MZ1T_ z@5zcOLFPn9A_*0IUy_^}Jm&DJ28sa^P=Nxy(-+)8xBzt^IFkCtjv6?jD1~z|Ovf8b6GL1RTbC@X>b$2*1MA9Ki195#LI%7laZlcIuz!j1K)QA_J+-QBQ@s_IqW_D T_2RUF00000NkvXXu0mjfrC`)? literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hardened_clay_stained_purple.png b/app/src/main/assets/blocks/hardened_clay_stained_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..1e977fc14f440d9a27af246a88f6728f9a95031a GIT binary patch literal 487 zcmV7t1aWMOZBsT~75i&xbxw z%`FdQko%4IDEH^?L>u;J`VIiGZ1ddoOqzW!0QWprEdyc|a`IiC1mx9RwMg00aCfn~ zN_wLNBPdmyYLzA=E1=083p-SWILQE1 zhoAw~jcqM{k`~BR;$L2ixtG70su~DD81Id?x9YHA1I91{P((q6cq7N7=Sbj=>}IQs zQ%8O$nA6_7HBl{?AFOKl0D2wi`-nyBu}HxLyJ+%W75^0*ixX!L;joRU%-DLfNJxN_ zRu%?GrBwqYgXuB_v@)4C4s%|5rI=M%mB;t@@t*(uXF5=x3`|THH}fSb#wz_SYt4<5 zq=&Slk4+g)-zuo1NZxk*OJ5q0&X^mD36bG-eJfaR deabEW{R3}b5$%LJoKXM(002ovPDHLkV1jgK+{yp| literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hardened_clay_stained_red.png b/app/src/main/assets/blocks/hardened_clay_stained_red.png new file mode 100644 index 0000000000000000000000000000000000000000..e14d9bab84bd4bdcc187721fc75ee15daf9b6e48 GIT binary patch literal 481 zcmV<70UrK|P)5X^a0gax-sR|t>Ot*cN3(CcQWdlKMdiUg*69^IIsJp2B>#UL@-%+GD^r{>G| z@_m*k&iMAc9T~5m6YmBD1Cw&UG=*PmAp{rSS4uWiAUq2}?p>1!F!2%7lb}ld1Jwhd zmxQMTp14nS<_GC$h)>CPZRVW?apH}WmuPRasQ?uGcRP`NmSg~8#lfES&UXp(4S-9N zvqe+`;p3_^_6%+HE#DDirDR%AMgSNWS8IE{up)_xv6=*PtQH_xNPso0+GN~3lUFsQ zvnpqsybHhyaH1j^&nRYGo$Gu72towUk_ZXcJ?y(dVF?m&iINym;n42AooDuT0%fbX!QQU`tKZoZSI@*~r0&LwG6zINp~o?7IwD|zb6b{opJ^yPUy z*}T_0+x+o+^cas?Cjf|T8Oqy|-t%Apm$FXm8{lLycLIDF$ODp^17XV3x!i3L32bsn zYG9wwg*!P$i`UJ9`v#s~b|85i)?_3Cu+@ZM%u0$qCy;{og5N=G0N$&|RpC-)?}ohq zbC5)`WX-N(MY@=FY$3f8ger2ASg}w6q7M0L%BDfKeBGIEw@Uy7nblyZ9{nPKgyzex zJ|VlQ0i<^TU7|(ieXZ?bB$PNi>o=&!ML?-}uZa<{cE%kbHL#$d040AcE-#Wf{8+5x zp%pI@T7fG;iUP6uWsNp@4M=v+4i;8qfj&2{0^&b>ZQ%8TZ2kdzdjbG7slJ2?3lFBX z(*gg?j@A``52km}02qG`>V%Y3716%-h_G2fX}1GJR3-S;3ysGWqb$T%cHn<#Pg271 SF+6Jk0000XB(sOnA0cLIrD)B`Ek#3bz!`=7lnd(3w2a6B@tR{GUn@1q1)VJ6J z8lkEY3&pAJxoV3~SQWtr6$xxt#fAQ!J+k8L5bYp*c zVesU@Onsa|_!K)-*IN9mfjU-=HsfC>yJh}E1^-!l>0L%RTg!Qwr~;m&Vz;(&xTx^B eE6J{Mv+xfaz9ci(O=~Lv0000M?_g`{=Y7EExmvO|cbwN=zIUv|9nAH5Z9qW8 z=Z+u=p;Pbov1Z0vF$IX3GV!vQYi4u`){e7culRhvPA&6XZ56Mx!1o!mIs15SwbgQ; z5>{fLC)$xL&$pzqme&qJkw}*B_i?Cut5ZAC4hg7QS=#IS4af?=`J66Kj!_ELET9lCWORimbS|+Dc;Y=)$cN z(Es6|6KIU&Ga@!VQJo8OO_`u+1O>f?Ilh*HiwGI5kbxxc?A zi>VX|iDvo97R=Plc>auiwo?Q`-){>$vDfy!RTWXyd$mC-_ zuALllb(d;;up!DWY8@>$jE0T#*RsR2%I12oHApUw`Yvg~PS-QsDE>I>ISoNoFXx^f zX5%--xe;%t)bk>&79Rh_vf<#*1vowpR?XC--7sh zM%#1+P=e(=S~XOO@a^4Ufzu`nD7e&5UM#W@D1{Ixg}wEpE5txo2&mrwW}Vn-+RCkW zcy>sP+*~9VE(DVay;$jDV{6EK9=&^ugM%cdR(1F0rdgSKTXW||_VSn;*P_L$bAD8L zJucSQqY#U$SCXgClI>AerQ*xaqZrn+DzUqpEHalb2VpIOt`x(~p1n(blS!2NMLi=# zc1L|DV`AzTdwW5>3?>Z<7j_ERy~3jF2n6Id*c_0%B5eidM#S-q5Q~@3TM8i+N%7As zN+G7;WEKbk%%({ZoQ-FodhvYW^rW*|^5|D)bubzhbsg+K=+v`DsyZci9{v)HPg_kc zCU5!qK_~q9)#Wl67H1OzU~rDEBSuPLJ`0p0Ce}8B<-Axm^b*w%Co}OCUEye%!A>ty z_%C-#;rd$gy2$`wyO;dE%Bt&Mui1)O#(Skw^@F0AodwkvtQI(_qM)u|` z`f#&T<@0N<50=I`*l3F<({=s4^u=e{Z^wPjX>kAk(rg?(p7srj5+MFjo_e`85=%}{vP00000NkvXXu0mjfZDv{H literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hay_block_top.png b/app/src/main/assets/blocks/hay_block_top.png new file mode 100644 index 0000000000000000000000000000000000000000..3c74f6f31ef7053c838cc9c4420a92e3b2664c44 GIT binary patch literal 714 zcmV;*0yX`KP)$?9}LzK{$z%xdT2w$T{QSlbmlmF(0%Qr4cf7L40p2q-HFRwyl6% zkmaON!6G%QQCT)fhb(UTinyQ-DhlaYznj3PvXv?v^!G>!Se>d|H#7!WS8OS4aoe9j zJ7G|Gt5>jvjdBcyU%KQaw29vEh) z@#j#Zx?*s(OC59-j*Ax8oe4CPjwsXhg2G9QD*mLHk literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hopper_inside.png b/app/src/main/assets/blocks/hopper_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..9722b348f29bb3e3fa70ac2bf9ec4c4fea20ceba GIT binary patch literal 362 zcmV-w0hRuVP)$;|K922o=n!?W= zKXLOo3!KMsr1Lx@d0Cb)2#De5#77*UF)RpV7R;Sw{8ZMjqJ7^Z##!Kef`?%U>-#>c zbzPUMs>Gt9fL;Ux`g}g={eFivO_SQT4HAl}h!fHv&R@Zfqpvp(L%|iJ~ zrz)V=>y@o6%d7;Dj~y-W5K4l;>US`P4{~xWny2uKK;SO|OiU(lzC0j3KMC+T4O(z| z#T|^3Bzgt#d_*SXB;3rrNcVj}B1#;mV}!th|2C0T<^*VfBxmgktJHW9m?(*_YbEzX zgMi7o(y_{1SPol};J%?MqmbY6H}YY1rCrw*r=$|ye|bs%0J1rz!fW5D(*OVf07*qo IM6N<$f*}*5nE(I) literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hopper_outside.png b/app/src/main/assets/blocks/hopper_outside.png new file mode 100644 index 0000000000000000000000000000000000000000..45d9e94d16c439b0d28285fc76e44c5095c95d99 GIT binary patch literal 426 zcmV;b0agBqP)2&)01M3X+#)CdDCDC6*c1T~fDwo_O=IWt+4lSWX9sLE z1W+Wv-yH}}4Ydx?7zB{c9KB1A@7` U_=Y_Wg8%>k07*qoM6N<$f)RAH9{>OV literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/hopper_top.png b/app/src/main/assets/blocks/hopper_top.png new file mode 100644 index 0000000000000000000000000000000000000000..da651deb6fee1d209ca6337b5c5b98bdf78ad86e GIT binary patch literal 291 zcmV+;0o?wHP)B+G>zW(t=Dzwx~@9U zv-?`io_*h4%ozb7NfIr~QqwfmJkMR6WtkR5p>5l`bz;`-zx|VCS+uGu70-u@j^j{) z8j}zJ4C9 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/ice.png b/app/src/main/assets/blocks/ice.png new file mode 100644 index 0000000000000000000000000000000000000000..767f1d68a550b17bb7b8172ef149f827b4702aa7 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|5uPrNAsXkCBT7Hndv-9cesS)# zO9lf|(<(u!2dh3RbU5-FVdQ&MBb@0R6HrW&i*H literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/ice_packed.png b/app/src/main/assets/blocks/ice_packed.png new file mode 100644 index 0000000000000000000000000000000000000000..3b06f3f18413f24ae8e592cf66a2736d081f7593 GIT binary patch literal 465 zcmV;?0WSWDP)N|!B!nP zK>&LI69AGnzXefd=Y@O0|#m1>}EkD<1ud0lJS*6Hqbe|=~|Lef?1xLl5PynS)3EFwQ?w=iBm^=v z$@QM3d#&!;wwx~jAj|TQWP#MRoUrdXJ=0y)1-V=RK$gcC9#a?z0BrmG3?$toKmc_2 zMxLAJ)sPW@CBOiZ00{|6=))U+{2kjihYbLCw?d4$%>+pxOJfYW_nn`A$2K?10^sAV zzWug`fhpTGzxMs3Wl0tQ z^ZAS=dBk>-gaiOd9EUtC0YU;MfFwyt(~=|+00an-1OUK)fxi(nDLC=u00000NkvXX Hu0mjf#&yb- literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/iron_bars.png b/app/src/main/assets/blocks/iron_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3057dc166136401872e94910774113702f1114 GIT binary patch literal 490 zcmVbELv@^_N!ul9NlYfx54LWUPLn_jXaTOu)#@uE#!q~?L5zd( z<@3IJWS?WkexH}Q0=I0izs_kI!Rk}C%%^Y%E@6x@#=h%4X6cLs2d$B2DPfCzf`0F* zDQNUJT)w@;a|v)@Ygrg;JzE&*pGl*AQ$j&hc)guvRBv7Pk@j5$gIggcy=?nT2rv z+4-lB6~qexF9^Xof5@tv3X|ZNK4E4);ijq(hM_rw(I`a!s6~SF%?5pL5f;S}y4|iR zP(^`b=ZWzX=d;Y1!8A=wL6PTh2aZv`dZTdhdXDR}68dn5`}?1ezBC2Pe1cxLM}jZ) zS4iK(a45hX4k3oPyWL_mivM#1Rlv4633lsO2&6~YYPE*+0#i_)mUJzQvB@|_t3?Mp g9>?f(9{*v#07_H_u}u_r+5i9m07*qoM6N<$f^+cPO#lD@ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/iron_block.png b/app/src/main/assets/blocks/iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..58fd399b59e6c62c21d1d52d1d77f07ed5d0c2f5 GIT binary patch literal 333 zcmV-T0kZyyP)_672L;Z&lJ86I6^CyY&piQEE1Tnt85cmm)Zvi019t`a z&gx@_UlwZo?L{aWmU!mBie~N%hvYN&uJ{gmWq)m)jnbU*%=6i@dIDlUt)hq$;{Rc^ P00000NkvXXu0mjfQDkz6 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/iron_trapdoor.png b/app/src/main/assets/blocks/iron_trapdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..c705ca1bb34d83d69a58606d6c53fbbc7f3ad393 GIT binary patch literal 279 zcmV+y0qFjTP)FQ7VmoScF2Gcagn-nL(@$VC7E002ovPDHLkV1oT%cOw7* literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/itemframe_background.png b/app/src/main/assets/blocks/itemframe_background.png new file mode 100644 index 0000000000000000000000000000000000000000..660bae6c505d926f8ac8c1ad07b77cddf9a15378 GIT binary patch literal 409 zcmV;K0cQS*P)6n_@D)H%&`#%{W!2Uqrg5+jGbkHz)m2p!)aT@_YivY8XQL&#!0;FT2IySRfOQhC?oh-Z%9Q4QVzit{00000NkvXXu0mjf D-4(V) literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/jukebox_side.png b/app/src/main/assets/blocks/jukebox_side.png new file mode 100644 index 0000000000000000000000000000000000000000..d67c3e5e8ec89fd35e8b25fa5c155414a01e6a6b GIT binary patch literal 395 zcmV;60d)R}P)rIhjEz167lhJcPa1F3;CD~6p80?eT6;uVg+b4-FdYxQeCqo%!d-C%zl15QXnUC|HUS{Ev#)LI@I!*w_R?6cOxv0vkI?Qlu4$xPknv76bnltN=QA2fF{P8H90iGG`!)p#;593SDpE^kLGjNix#jfEti{`Aq(& zp*jd{bZbwJF{nNiO$+Fsz~2C}6^sA&oyPSHL;MBeAnMEq!AP9|0000^Obny}hCzIgT&k}&m<=}| z#b4_`%mpAeHXQAy3dSHd$ORx8#T6h)kP8TT0i@2wSQ=9uv0(smI>-wcf*>b>B#`|K z3l9(m$-~4z7GZ<|ND^cK%&##2qK5%27O;i^R=*J&23X^llym^|8#e!=rwgoM01I7Q zVF1H0br@j)5}+s@5E}-tB#$*6fD8cn7dae|*~npqGcUmWpBt=?H7(#w2Ot3-O9g^n ea5R!e2?GF`-zN*d5Wph<00004X@b?ELg~RzX_$bcJXh|E7Y)lx%t9cf*1;b2nXn8lkTS{xZAGO=TT01FCPD?g> zDJ-25in`9G#{wecc4EwG4Wg{yjOIfp)-2VAxN+US5ps~6<-F+nI}l;oztH$Bp0lz} zn&+$j>ZsOLDXqGWj?+t<@X;m@j)zOTXa9hB`|2$bvNu81^Y2!x# zAp}jH?e2b;rzz{YKP+KuJ>Of7s~Cg2B((<1TBJN+xK?2|JuYy*LQzfw9@lS!->QGH7HAza&S1k7Jm5g z=lbTi8N`ck%?~@d{S`Ff3C#6cnjYj15IIg?f&T#k`%bP-ME6$!0000Uv+XMe4-L`@a5Oq2O4hxu}(ysIV zEBW+cx&S08>#*X#xaU@!&Ic*P=6`q?D0|QUFJZqE9_KIxqHc#EUJ73EU(3Jezr5FS zjBsGU6~Z7a;kN0&jO%)!{}=q1c3ulM1SBr)u;9OTcsFK30!d0*u0e?vNt-P|0~Y>Q z@tgz~mjxPVoX`p}02Z2Zo-_Xosm=Z`s5uQKMvwy;hLyY~{5Op6Mg$_d(?xX_!`T8l zz*uouiIO^1e0u&XId!8ZBv@h*)m!^tL~lJ@gQ(W_|DvXo{wulkpoBh3AR=cDRo`AX p#-;(;#b6g;i*s!LM)xXA3;=H6TwBU(Wqbet002ovPDHLkV1oW>z#9Mn literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/lava_flow.png b/app/src/main/assets/blocks/lava_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..288ff1530816e91c959f593e64f43292b5cd55d7 GIT binary patch literal 21527 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_acacia.tga b/app/src/main/assets/blocks/leaves_acacia.tga new file mode 100644 index 0000000000000000000000000000000000000000..28d891142108de2c0a1789c2a666676c632a124a GIT binary patch literal 1068 zcmYk6S&Cv&42CcL)Q`1<-az**sz7X*M3YKD}N~@cn+jtk-MV@Au;K`J_}TS>#r$ zRSAVc8qZ`hnoE8p5|LOeCi#5cj**{ArNra$NW0zE_~~?#Mx!C&a9EnnrpCY$qt0|X zm2$bPyuf?CUX8a}En>3U?UWa}Pfp5jjv>vTG`H*9ji(FZ;~8=k}}m5RUx zp6~DPf=`~=K`o5{+Jc``~5EL1H0ev3o{A?0@CSpq+YLUoEY}Arta_Yc*y7H zr%-D&8p-W;(>G?bnOv_|<<8E*z-6&m2pIGLPqaWhnM`Vo`o!5W{c%U#`FyT6emb32 z+u-RHt-$+mIH+c@pGRj9kH__nx6CZi9JQj+sD5*~oaPLNLm3PP_8!m=IO;KLW{M5g z%op7~x!C-;Gv}Ws^p4%}KD?NT(Iq*C7dUo6Z|H(N`sYpNyjrbPC&%Ma_d`BC8$E$z zzHoi&)?$B#FFP{&K+|ZHIfF5KX0P!1`uY-nNBH15*=*MC@&B4|;C=JoAmID+8g%#_ OZr9K7o8$NEFY7N^;4nD= literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_acacia_carried.tga b/app/src/main/assets/blocks/leaves_acacia_carried.tga new file mode 100644 index 0000000000000000000000000000000000000000..763687df58ffe9a224b136766812cdd9bd4ebc2d GIT binary patch literal 1068 zcmY*ZXG;S?6g))8p5*TK1dXwvAFRV@i8a6l?jL6;(O=2; zA}?Uxu8m{OC~y5#pzysr=6gFf27Ld(-jV35B-E~-3mk`c`0>kuHs@k+=?Cugwry?5 zNk4RwJ5>|kBb-EU1=q%W6C=4|kG_c>_TGLgAs0RyOB423ON<(+viqoa*rPt_Rru9I zmCcwpOk?S|hIfyO)BCEI}){&QbVj>(+O9?t#o!`1(Fi;J^=@ zXXFKU#>~}V&}ZEA1YFL==z@neo_{_ud}V5dS8x`-cEz5-e9;4U(w@P0aW5im;Uzbl z>|Iw`3d|#S!9U_xaHXd>mo;RQLv?4TjO6JH`m@?za+2J8#-y`Zna(PwDD zC+yLvSE%`~pU_{?!~7%{%t-tJPs5|~J;&2^a6=M&rLdF!2=bmw$tm UrPb-R;&O3uA-g_PoS)7)Kgx3o_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_acacia_opaque.png b/app/src/main/assets/blocks/leaves_acacia_opaque.png new file mode 100644 index 0000000000000000000000000000000000000000..45e5f0c9aa95876d41f5720ff2c4055f5a6a7b9d GIT binary patch literal 506 zcmVf)MpQ88oDn=+FV#y8=nk%K29(g)O)wvi76I~>b&1?>GgVQ2LgeQWS7gO_U(3)`~5B+kH_X2 zCe~^-y}e$qoK7d1PN(V*heO$Jw~|aI<#M@5yWQ6K`F#HE;JZDJQ!bZnoBe)Y+-|o5 zS1J{ogSY}rCKDNt#};6*ScuQ(QyXJdt5y3(yVYuG5yN&0g@Qhy5|R>$g!%wNCD@@* zNbguIrguJ{7vuN)?Oa$+I2=|RJ6Nq&wsIzuu{J;>k%+|OaWP1IKA-xqTrTDDcqj*M3YKD}N~@cn+jtk-MV@Au;K`J_}TS>#r$ zRSAVc8qZ`hnoE8p5|LOeCi#5cj**{ArNra$NW0zE_~~?#Mx!C&a9EnnrpCY$qt0|X zm2$bPyuf?CUX8a}En>3U?UWa}Pfp5jjv>vTG`H*9ji(FZ;~8=k}}m5RUx zp6~DPf=`~=K`o5{+Jc``~5EL1H0ev3o{A?0@CSpq+YLUoEY}Arta_Yc*y7H zr%-D&8p-W;(>G?bnOv_|<<8E*z-6&m2pIGLPqaWhnM`Vo`o!5W{c%U#`FyT6emb32 z+u-RHt-$+mIH+c@pGRj9kH__nx6CZi9JQj+sD5*~oaPLNLm3PP_8!m=IO;KLW{M5g z%op7~x!C-;Gv}Ws^p4%}KD?NT(Iq*C7dUo6Z|H(N`sYpNyjrbPC&%Ma_d`BC8$E$z zzHoi&)?$B#FFP{&K+|ZHIfF5KX0P!1`uY-nNBH15*=*MC@&B4|;C=JoAmID+8g%#_ OZr9K7o8$NEFY7N^;4nD= literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_big_oak_carried.tga b/app/src/main/assets/blocks/leaves_big_oak_carried.tga new file mode 100644 index 0000000000000000000000000000000000000000..763687df58ffe9a224b136766812cdd9bd4ebc2d GIT binary patch literal 1068 zcmY*ZXG;S?6g))8p5*TK1dXwvAFRV@i8a6l?jL6;(O=2; zA}?Uxu8m{OC~y5#pzysr=6gFf27Ld(-jV35B-E~-3mk`c`0>kuHs@k+=?Cugwry?5 zNk4RwJ5>|kBb-EU1=q%W6C=4|kG_c>_TGLgAs0RyOB423ON<(+viqoa*rPt_Rru9I zmCcwpOk?S|hIfyO)BCEI}){&QbVj>(+O9?t#o!`1(Fi;J^=@ zXXFKU#>~}V&}ZEA1YFL==z@neo_{_ud}V5dS8x`-cEz5-e9;4U(w@P0aW5im;Uzbl z>|Iw`3d|#S!9U_xaHXd>mo;RQLv?4TjO6JH`m@?za+2J8#-y`Zna(PwDD zC+yLvSE%`~pU_{?!~7%{%t-tJPs5|~J;&2^a6=M&rLdF!2=bmw$tm UrPb-R;&O3uA-g_PoS)7)Kgx3o_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_big_oak_opaque.png b/app/src/main/assets/blocks/leaves_big_oak_opaque.png new file mode 100644 index 0000000000000000000000000000000000000000..45e5f0c9aa95876d41f5720ff2c4055f5a6a7b9d GIT binary patch literal 506 zcmVf)MpQ88oDn=+FV#y8=nk%K29(g)O)wvi76I~>b&1?>GgVQ2LgeQWS7gO_U(3)`~5B+kH_X2 zCe~^-y}e$qoK7d1PN(V*heO$Jw~|aI<#M@5yWQ6K`F#HE;JZDJQ!bZnoBe)Y+-|o5 zS1J{ogSY}rCKDNt#};6*ScuQ(QyXJdt5y3(yVYuG5yN&0g@Qhy5|R>$g!%wNCD@@* zNbguIrguJ{7vuN)?Oa$+I2=|RJ6Nq&wsIzuu{J;>k%+|OaWP1IKA-xqTrTDDcqjS!!ZY5Qd9>>c=dhH_*L{1cHqkwVfppG~4h+3{irK1ENBl6XP7C63F7J>nqw8 zF8AI#r|SIERpgtTerIwfKfaI0V@)QL5|77aGMUKR+naQ|U5!SgVwWx!3*Brs8i_=- zQmL>ewOUORiG(|{h!(CboB1- zPL|81etdkeM|!=U+~42(9{L|2AJy&>3--{M-Cv#|QTKih5RKf!p4u?7z4BUJ8ksr=LKeR?uv}cWHv?h0Chs;}U zg$$#QWxzdW4X)M$M$a9ZkW2DPUZ|5n=HdZ$a=||M;|V&?=X1}AW!wEhJ2*3&JaIPq zf|V@dpJl?o9Xui*l8~@GxWr7zLMF*1p%4ffM7D$^0tKibi=v{SrGLJ?UuXJ) zshXPZ(|h-s1i^#Ae&fM-F#Rz4ydz`jN5TE4eEL?g$tWxJ?|q4X4kZ;m_kM-L*OIR1 z6rWu#dpy$!WvZE%aJcL-^3J?0NoxL?ls>#sym9+ZipL#E$2s?2Q;b+J{HtHOlHXtT zIZ~BT?c)12nQ(dH9|P?R-~3+N=PaL$`mSI1rFpyO4@y3Oj#iC;5SKQsk<|c3Ls;4-%*`+(45YMb|1zW?_GR|;c zb}-eN^R@gg9Ov-QByqX^lIqdLwp1>*RK^Z}tVecjJH=))yfa>a-+#Ed*|;6`m3OXB zzxt{Q(apQQO?24JmZG2+C#tZIe{ct1W2b_kZd`sBv&dBsr oIo}e#Ba7vo?JoYOgBho&Z~q3po!xf7)9q|-gu~U&dOIKd17B`3fdBvi literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_birch_opaque.png b/app/src/main/assets/blocks/leaves_birch_opaque.png new file mode 100644 index 0000000000000000000000000000000000000000..45e5f0c9aa95876d41f5720ff2c4055f5a6a7b9d GIT binary patch literal 506 zcmVf)MpQ88oDn=+FV#y8=nk%K29(g)O)wvi76I~>b&1?>GgVQ2LgeQWS7gO_U(3)`~5B+kH_X2 zCe~^-y}e$qoK7d1PN(V*heO$Jw~|aI<#M@5yWQ6K`F#HE;JZDJQ!bZnoBe)Y+-|o5 zS1J{ogSY}rCKDNt#};6*ScuQ(QyXJdt5y3(yVYuG5yN&0g@Qhy5|R>$g!%wNCD@@* zNbguIrguJ{7vuN)?Oa$+I2=|RJ6Nq&wsIzuu{J;>k%+|OaWP1IKA-xqTrTDDcqjbF5QhgV%X zN_b}n{NYm<9zMP`(19b0qUgQw9$#pU`@=te{y4AmF+crzBe!!-=p8-3h1aiN)qq2P zyxzO?;~mt{NM>a)0C>Jv^Hkt(SflX{NBxz z-WPj*Uv1k8vya&|nTdK!=j&(WzQ;UT@MT#B_IB~SH_v)c-XFcXuGPA8O+)IG@hM_LPTBdGZkk$BVH=T>bU6#omy#1OZP)94>ruuDauy{G{f6h=~&o&yjOgw0W!NTdf=LA5=pmP| z4yy&5_)-mY4~Iy)J3RnABdAJ{BF#0_pRIy&J)7CYyy6!dk6n zG?KNhu4_NfvoFiizO*dMd{Gn@UzWwr>$=)qp63<=)+vFK002WW{f`6+M0Hk%QHc`3 ze<5HHfMFQy+;v@u1@Lhblsdgs0{GK3`KD=}v47z0yf*`p5l~`GfPO(hg((79AV4Ba z3EQ^y<2b&xz#N#1hleVs@15`a-r^vDPXgu!1tdWA->*M3YKD}N~@cn+jtk-MV@Au;K`J_}TS>#r$ zRSAVc8qZ`hnoE8p5|LOeCi#5cj**{ArNra$NW0zE_~~?#Mx!C&a9EnnrpCY$qt0|X zm2$bPyuf?CUX8a}En>3U?UWa}Pfp5jjv>vTG`H*9ji(FZ;~8=k}}m5RUx zp6~DPf=`~=K`o5{+Jc``~5EL1H0ev3o{A?0@CSpq+YLUoEY}Arta_Yc*y7H zr%-D&8p-W;(>G?bnOv_|<<8E*z-6&m2pIGLPqaWhnM`Vo`o!5W{c%U#`FyT6emb32 z+u-RHt-$+mIH+c@pGRj9kH__nx6CZi9JQj+sD5*~oaPLNLm3PP_8!m=IO;KLW{M5g z%op7~x!C-;Gv}Ws^p4%}KD?NT(Iq*C7dUo6Z|H(N`sYpNyjrbPC&%Ma_d`BC8$E$z zzHoi&)?$B#FFP{&K+|ZHIfF5KX0P!1`uY-nNBH15*=*MC@&B4|;C=JoAmID+8g%#_ OZr9K7o8$NEFY7N^;4nD= literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_oak_carried.tga b/app/src/main/assets/blocks/leaves_oak_carried.tga new file mode 100644 index 0000000000000000000000000000000000000000..763687df58ffe9a224b136766812cdd9bd4ebc2d GIT binary patch literal 1068 zcmY*ZXG;S?6g))8p5*TK1dXwvAFRV@i8a6l?jL6;(O=2; zA}?Uxu8m{OC~y5#pzysr=6gFf27Ld(-jV35B-E~-3mk`c`0>kuHs@k+=?Cugwry?5 zNk4RwJ5>|kBb-EU1=q%W6C=4|kG_c>_TGLgAs0RyOB423ON<(+viqoa*rPt_Rru9I zmCcwpOk?S|hIfyO)BCEI}){&QbVj>(+O9?t#o!`1(Fi;J^=@ zXXFKU#>~}V&}ZEA1YFL==z@neo_{_ud}V5dS8x`-cEz5-e9;4U(w@P0aW5im;Uzbl z>|Iw`3d|#S!9U_xaHXd>mo;RQLv?4TjO6JH`m@?za+2J8#-y`Zna(PwDD zC+yLvSE%`~pU_{?!~7%{%t-tJPs5|~J;&2^a6=M&rLdF!2=bmw$tm UrPb-R;&O3uA-g_PoS)7)Kgx3o_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_oak_opaque.png b/app/src/main/assets/blocks/leaves_oak_opaque.png new file mode 100644 index 0000000000000000000000000000000000000000..45e5f0c9aa95876d41f5720ff2c4055f5a6a7b9d GIT binary patch literal 506 zcmVf)MpQ88oDn=+FV#y8=nk%K29(g)O)wvi76I~>b&1?>GgVQ2LgeQWS7gO_U(3)`~5B+kH_X2 zCe~^-y}e$qoK7d1PN(V*heO$Jw~|aI<#M@5yWQ6K`F#HE;JZDJQ!bZnoBe)Y+-|o5 zS1J{ogSY}rCKDNt#};6*ScuQ(QyXJdt5y3(yVYuG5yN&0g@Qhy5|R>$g!%wNCD@@* zNbguIrguJ{7vuN)?Oa$+I2=|RJ6Nq&wsIzuu{J;>k%+|OaWP1IKA-xqTrTDDcqjJDhU~Gdd8G+gJYbxb(o&CkHb%`s}SS@~aM(esF`2G=_b2?)>4RLk4S= zUiAG8$9~-*z2L~~yqTqycVOs;ufB6eUwP1>{@)qs+c)olG>1G@2iFJsr44`3h?edl zcsTeQn|#V-uAXzps5ebheCm81CtvXEx~lGT<=$^|6dvv${_?W!T{e6e_RzUF4>iui rI(fmk7ti?RyDfa~6%Bi69{6?k{2P3Itk>`Pb6(z`e_rRe>r49u;#DjV literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/leaves_spruce_carried.tga b/app/src/main/assets/blocks/leaves_spruce_carried.tga new file mode 100644 index 0000000000000000000000000000000000000000..4a7c3856464884d10c2329372e87315625c8e1e4 GIT binary patch literal 1068 zcmZ{k!D_-#5JewdxfEPi@&mOCUFkYPKq}N)3hn>@Mw;_@XP5*P9(UfIJ9lQ1U@0%f z-@2?zx7xgJ%JzLbg3}p~zsHd~XwLX>JHS=G#ZiNHS<hXL|kYkh0U~Ri`%^^YlOu*G}z~^5G3fs+eyLea5ku}c4Z1U>hh+ChE-bFQ_9?k`#!&gq7p4`oe za^1e0edl;hx!D{Gzt~le2N>UyJJ6RI-QOO~JM<}EcO?%8@*Kf7W4vcL_X5pl&VPfi T&wKwp+=lDN+s}Ep^tNQ*JHr1`k!AX0ldleuA{l=YkW9+O=f{1P(G#MVF#2=s3nuLLhJf!Y0V n;pGPX&x%>36qE4GBszZp`oa;?6U0md00000NkvXXu0mjfhEHQ! literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/lever.png b/app/src/main/assets/blocks/lever.png new file mode 100644 index 0000000000000000000000000000000000000000..a969fe02453993adf8bc73eb0fc7b095ac74b7d5 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{+=$5Ar_~T6C_xhWv*Pi_D^3! z!TJh#xXPGC~D~b58zk;G@8NF)z4*}Q$iB}_O&g? literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/log_acacia.png b/app/src/main/assets/blocks/log_acacia.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ee2f44067cb7e4cf432bd3bee0e5a2fc20eb85 GIT binary patch literal 513 zcmV+c0{;DpP)Brqqw~Qajp~yLLtISg9Eg9>k?$K}|ZZ7bUtB5YAt3 zH-7PV?^Zzp8TapGD-%}$R+_k2XjV%5IjJ6OXc37Ntwa~KD`1J`d7r^F0C^5d>#2xT ziaANgm-Lbk0Kg2u_OO9E&B$|&@~$4xz`F3+nFidG#|R4Gt$->3iHx8H-ppL8Xx^Tp z)5@L}AzH7~RAv;ymIjVwn+cH5*J~*kvI;_%LAT|1EAC_@8l3S*gq@=UT?w$arz8e- zghFU*0yFl!mI6SHBm%9I19^YCn9S_Op~=d5_}Eq^u%r?B6A}LnfuT$^AH>suFCGf` z#-iBv3cwSZC?o^&@p7fK@dl$I^6#kY=P>44GCVPosj80jigBdP&x$(%_!)Lo8xxvw z0CMs0oF+mOflO2i>1I~9B4WG}Y%rFi6LXsvrk|BKA1;NR`oRN0BXna-{TH~T1E?@C z0LH@yW@FgeGXkbYqO*0S0O5EUV)l$?YfQvS%z*v?#atxMn{DH?00000NkvXXu0mjf D)#~SL literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/log_acacia_top.png b/app/src/main/assets/blocks/log_acacia_top.png new file mode 100644 index 0000000000000000000000000000000000000000..534225699f5e4ca0c7ef13a2b8bf7c2908360c7f GIT binary patch literal 449 zcmV;y0Y3hTP)I zO;5r=5bdw>gI3X)c+i^%Dg9Kih7uxP{3S;DFmm%?B$|pq!RX2VweA~s+uiM9*qQC{ zX6C(Ft9Ko+UgELS<2s$NwB4jw8r}0e`294d_@)z)Zz1^fZT9ZjbecBx^l!_+W_h^r zJD2Co0_vCVuz_D=Lw-5p3HOaHItR@iHfbG_ui8_*&t^Oq#fuJ}`Q@B{T!&R#1P-03 z{vB>W@E;Vn+_Mvw@c9` zz+Z9ujclzdy3j_z&rAUPwGRp~*$oUp<7kh)c{eQL)GWwqLV@e zkR&+(p^xsiroxX>6)IrFf`hcxphZD~WZTqTnki%VN|2Z-bHfLbNXU$>T#6j1gBZm% z6~H(upp%ucOj30WbcEP)b~*4c^Smy z?PBPpkZcy2jnaw}up<)E+JW8VRl7e={*r!yBte8KWDux=G6A?iNyGMOB;bi69A+Ic6#O#HO?9?V9swv>Xng*C;|bndIC(D zccU{WA@P0IjcSuDv39Z-TckR#0969zrzD07gJRGUp|XDj{+_$37n8QFpL?FD*|0MM z;t(UkQY%4*z)%_*U=5CiKX`LuB+Fz@z!PdHfFW7W2VOQ$ixNZrejP;&Z9?WoQYkVH zj--D8?5IQVwaQ})@&iQfL;)F)hRQc;vbvIp@k&%fEO4Oj=!Md=5@*p0)ro)^F*n4$ z0(oAJ6anh^KsE-eXVm`@P?jnQsG&kkLzAsB5xd{-h<*T0SaToSl&}E+0000oXv#t(AnASRBunutaDP| zC!ki^;g#W*c`wj8r(TugR--~^UWFWN-ufXedLggdc)1M0z zfJ?yVeUK6S%vzRA)BuPl9p4z*v}7Q-2o7=+U;9~oT8$<^ha^V1t6`XT0VZh=(kr*n zg-x2+63_*dXg!FJ%RDGZ5Vy5)8oG@jNZh@miJ|~TihK<*7TsBzJuWX0z;WF0-#|$> zK!RKtZ@VCM<6yh@_&@1nF=hj!EeZ;gr~w7fCTWgDQ!6n0n|}@4g>%2kY2NN6!bp;YPtd9AE*>3ahKmkLfHsygTym0rCIF6TO9A#%gs{pK8#&bdZa7gILC9& znVF;Xhh6053Pm1bvq@0O0Jq~IWFEtIXIR??qCCRu$kG&rjL;i>f$~&FNQ)4r{Rn$* zz?m9Iwjq)tLcR`>ZbAsTLYgNin451sl>BcmRuC+z7^VraOOYlKIAOmi_=gSwoP}@hz2!9oVci zr4pt+$F>4Z0}KZPY}1fRL}3CS=)}Vl~rW+7$G|K7UTmJ&!&Kv6Bg8kRl{;ocM+_`Z|XXOXU=OiO1ArQ zINBj{;UfzDe|G_;s$6i^gv5kYBFh5&7!A<9>(xinb&~Vze%11(b1l0|g4IRFRx<6iw4`bJe5|D5JfcU_m0wCl8w<=0`RX zDe!IZ6-xqU+<_wUA))|RttPbQ6+XOg;Pm7Tl;g%3F54-e5#kut+#!qs+lI9#Gb{NdLA Y1p{1V23s`!+yDRo07*qoM6N<$f|JHng8%>k literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/log_birch_top.png b/app/src/main/assets/blocks/log_birch_top.png new file mode 100644 index 0000000000000000000000000000000000000000..afed5cba75f0b715fff74b58a8844c8ca8638f50 GIT binary patch literal 619 zcmV-x0+juUP)e5ga ztiaM;y41w@e%v$dF3`BiWM{u`cFvqRGb)jaqiZ*?+ihWQuLHZ+#BwHuUe`da{vF%3 z3fkQ^jvhG%pU)>|?d)K;*T%wP4C;^FMmik8YV0z;EKXwet>3d;;wrN7ATp7lclPzu zZ4^J;6yJ0}Ri#?R+MFM+?w`Wz2dDAo;V7QpIWF(n=@HC5y&(ReMIN0Muv)bY#gdpU z`uH5O^JB=zuMAn~<1Im?zn&bIH zQb_zvG$_g_!`wzLxsO^}xh^Q;FHdj19~t zLwy-d6UuU?$^D7h>9difHE29%*;I<^@Voj`hiX}-CtblCoExGDRd8wWPGok}kqR6T zy7l@OWb`~fd9+O4Or$X3pDst~# zN>Tx}bXRptD>}S1Z0VY}y6*jE*;(zn2EDQg_xby~g@0B9*NYwhN!b7Z002ovPDHLk FV1nemCeZ)@ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/log_jungle.png b/app/src/main/assets/blocks/log_jungle.png new file mode 100644 index 0000000000000000000000000000000000000000..613af389a35a818e59fe010c7ae63f998484d7b7 GIT binary patch literal 609 zcmV-n0-pVeP)DHV*6zur#I-eDfPX7~1X zrl)(>I?BgD3{K)$jT}5oviR%o;kX#XalxP_=iFB%)+M$}2J^2OSnJ8YE|zkMNr<46 zhTpU`@+`ti{#{RUn8`YV<+W`Lnp^NYDfn&*Be@i`QwZENF2h8ntYKLx7_=$|<<~J- zjcN>sZv{f_P!7v)gtEkX!B8gE^LhfmhPznI_pz8cn0gs3Zq3>nxHf*y9b9y6++90Z z&T?2^p1EwW5LLced3}W@B|?<-gFmIC^Jn>wS!? zPS?GR;(qGj{)dBeNow`n1V)mXRkY8~J4!K-csJd{@-~a#H;&py`-pxwiON9?{V$TB z%26#EMcJ2L4*MNBI z$4&!54BdYS0zwl)h>qZZ1caJMWJ50jQkH}+xN*z@LhqduqF0FnMWS~&^HpY^SF_3{ z2g{xr&l~$ak5W-+Ay{{9JWcqsXfl{XHUeI`#+C^>nq~ z#c`yaFSXJ0l160(7E}8CrAu(MhPX%ERYIN&;}Xb`d?5bZ z=%?SEVbiOqLdIcDwBWJFGa=agI~X&-WHm4Voh`P~?UdUD#xj=W>LlLm_)RTHsbJWL zLNZ3XsH9TNgyM50Gf9#I5V}9*GO6&hJ!HHJ70@E$Hisb5ttRlGAVIPnt-G{n89SQ< zfK7}lUX^_#29ZcW94RLNkOOtFF3%S&U>xPEU>q-?5)c>JhExOGAQ!|li9Tl%1ME$z zd=RZY_&8l?F=hj!jhu&hFNFg_Mt6-h<^!PuNQRFj_pZb3F?n7`q7D#fNaL?;%hSKE uy(EtOYBHPVN+nc@sngUH&P5)+Is88mA6WihrP@FM0000A0T`i~LNXvPX9Fsm-Jms0{<$6Za%eLhsry?ba}`Mxvyt=< z8z6i?OTI zw@yPr5PTm(O^Hb&NI-{324^`COt47;+)yGi7$cHN#x^;Kf*_GI)O^*VS+wVO&&B$7 z@2%%%XYPz)UpWnV%c#ayz$;?FUBa~l_RxoXELg?$h`)kH1C?Z;c-#ol-Kw8gYuqk- zwQp}bVS3-~<~-skA_J(;n;mp8+d_wPb~>7GrPM?{ui5D)x?J&bZjRHqlb(|8%tSFb zTXNCMRwsS#_2$Lvb{DTW{VUzaAovdsH|({A^spXe251tR<}m<_Re%J582|;v{!Ft1 zKm!<^C)^r!0mo>00BC?Xq6hMiR1f`RquQxpp^bna2!hSuiP2g>|MoOd40--Sg4xO@I+BV9MtmE&0&4!f19^t UfYF21%>V!Z07*qoM6N<$f>oo@v;Y7A literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/log_spruce.png b/app/src/main/assets/blocks/log_spruce.png new file mode 100644 index 0000000000000000000000000000000000000000..77a22a41436bab27d93091c8062e7c83934336f2 GIT binary patch literal 450 zcmV;z0X_bSP)Yu)!^nos)UGEDkKat2_Hr@s7#1J-fuyUmy6w(;)~zI7^m#vy#oPg< z;Ok*x(_X~^u#kj)HL=UQVe4_ti%3)vtmV53Wr+n^%GyO201)JewcLU3w65H+nYaCe z9f*aa@BOmtaq<`e09gkhkrA-WOb|Bi6ya9~$IUPn0t!JOpqWVixXW#w*Svt_<2H*$ ztE_6>w7BD=JMTa(m7fxyUW7%9gwE7~186xo4$Gds?N8%tlr4UdaN-gr2n5AUyox~B z0f!DGEQ)n^0G?1Skqih46rl}RS@Q4mJmx@{wbDXJ|F?=FH9r=00`T)RizBdT=^^xM z#lm1@L0T$>(g-3`5k6i?3-*73xuu2jv$ADk0MMNP*b(fI`oBOB1}#Yd6uj=TC}X+> sOgeBO!7NssEROH;GfLKo2#ZfZe^vuk@P;^_k^lez07*qoM6N<$f+E_;zW@LL literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/log_spruce_top.png b/app/src/main/assets/blocks/log_spruce_top.png new file mode 100644 index 0000000000000000000000000000000000000000..e68e518f0a9e75ab18f864fdcb385373abd78037 GIT binary patch literal 448 zcmV;x0YCnUP)| zYfC~w5Qfi>=v$xCE(Y3FJ;yRE=tGiJ<|Va@DN1HU7l?=`BBEc=|DAkRW<7iSFzn3k z>^n2>yX%#97UeL%Aj#N_S&ePSO{~TqdH5&02@@X|mgK0A5Rc&P+?SW8Z`Pk7hXQvf7D zj`D$z{dV1|05~HkiERE2Cmm=v7(lm;O?j+k9k9xNYC_^uJLim`Qeojs_>4;@Rs~2> z4j{BwS#eYdGmp=RmV@F}+&mN#lJT5~Vy+4> zP6axFgYX!t2K(ev#Hs*5_jJV^M74*H!P$m=8$4}t=+3^x=m(+$B;zCL-a|Drm1k8b q?=2fNzNq=SBXWrKtA{Q6&Hn-K8tGPY{e2Ap0000NoRH2CcTA92q0I`Irf7U z2Gr|1o1NMs^|}^I%+TfC#t0y0L;#R{?$~rxG$?U5u zswSnga|$38Z12x1z@TRh0Wfc+lQBR$SYrSrfK1+2fcMb+(fFJR$f;;l3ik!zyE^wqO=I+Q q=+-sVI9F@Kk}LNkbEjqSfc*fm%tC;Km_W4v0000Wj*Ks literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/melon_stem_disconnected.png b/app/src/main/assets/blocks/melon_stem_disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..1fab6fe52d549c940c80a9ea4cdcf71f66c971ac GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr_~PUfRgXswlzypx#Qo zfd61n&RZ5%!RI@iSfh1w*2t>ow*~i2XS5UIxEQ|i+9R%vwT;DfeKzNtr(BBd4mxG~ zU~hf@lR1tqSE}uqlX?oyC7$C{JaUugoaHfz3sKD-CnP@0-Kuu>>Wq3F*`1xRwpHNJ m-I-H@>RF1;CG^yC|6%CRO8gM7{^L8)Jq(_%elF{r5}E*pL`ca1 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/melon_top.png b/app/src/main/assets/blocks/melon_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f7b4603367fb32da8424589efd50af074aa081 GIT binary patch literal 323 zcmV-J0lfZ+P)g%=WgTd@?e^bR6yX)AUL;?-7OjcJl}dz^b_Ke_nA^KoBz- zF#^A}R!k1oDKNn{NCdLok7Lgm-qV@eA3#VQCT+16Y!z4nOn_?t_*RU_gR%kxHPMq? zSFycg0q_c2ki!#zfO%9v3=uIU3qb6(SrM&ZwRd6h4lGTvj|h?PgFW&DWDE6V?^l3p z_o=2rat8Imcuk5mt85_&AgTU1f=H^@=RjEpz*nWXmM7Sj1h@`>$*no0YE}Wz*cW!5 VRQ>l=`;`Cy002ovPDHLkV1fXDg}eX& literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/missing_tile.png b/app/src/main/assets/blocks/missing_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..6e47a344fe21658ff51b60fd49c515ebf9fddda5 GIT binary patch literal 425 zcmV;a0apHrP)1KMS2sV_v2gZO~!z8@4b<-9DO&5>ReEfJsd|94y&Q zcFC3e&6k<19BU$3VZ%u`XH}VJxK(9z5=o+5GhC)EgF;hR{~izXBLIo^R6Axj$m^KJ?_5E+PulC zozO(I1Hy3da~lCO7m%z{<5!$|%l}3;1=WXi0n1JF7~;0n#HwGICJ9tEe<}L|_aYz! Tp4F5u00000NkvXXu0mjfItjSY literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/mob_spawner.png b/app/src/main/assets/blocks/mob_spawner.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1b6d94ee468989d6d59b3145c37703db8ebd0e GIT binary patch literal 338 zcmV-Y0j>UtP)3_VQ#c3xW$m0E@M$Ha7kLpPKrn-E~1}Qo0G5mpypLjF_pIWVRzO)LchV zNlNDwZr*A5l+rxiHqQOxjneAH?g;>KTBf$~wLOEU`kBN?1`P%<>Y}#Hlhuanqo>GQ ze=|e%%_8Ym5LAZ?1@4}?tIGZVEZhe<2_qd90Re|;!PR_V!a0I3jy13`ee|l;93{B=Pk@{hGUNdd6@e)w5cEQL;~yGC->h3H;yaDQGMh$ z0vGW&bigpg+mF9nSmdw$GJu>}Qd@~`pWQi-%Y@+FjJ2Huo~Djbb(d=qIW!csS^ZUZ k#y`_}JCSy8xi0O!FI2(dh%){h1ONa407*qoM6N<$f|<#h;Q#;t literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/mushroom_block_inside.png b/app/src/main/assets/blocks/mushroom_block_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd549c6ed8dd172066e889f688eb037029c1ae6 GIT binary patch literal 315 zcmV-B0mS}^P)A<6(X9%6?H;dbY2m7u3?AwaIYn;E7vLAN0I zwg(?ao<%bwm>%~sn+xh9S_4I&CSR=oB+c)MHYQTiL-Bz znw0XpWl-QiCtxSu3OUf^S(K3uU`R$2CQut7nLgW4EUQ~&p@CjOuNFxe1aUuo_s=Si zP~w&%1lXHe(ECwDP$^g2TtOFUhPQqsjm8TJldYKWO&=9Ve(=_+`~hZP?aJunM@s+z N002ovPDHLkV1iItfcgLc literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/mushroom_block_skin_brown.png b/app/src/main/assets/blocks/mushroom_block_skin_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..d199a29cba5344be5428531a2f7b322e7a0483d2 GIT binary patch literal 546 zcmV+-0^R+IP)G6fd8kQ~i=ZP0?))6=3?TT|4g1dC15ECI_Z9!qO zuST9rQF&Pz(TpORIl7v&fK&ao>H#yO3UXrJ-=OiaF{MDfQ3AloBr_ufudAavABu3= znxNu78&pEh$j*wm0SG>~5-OSZfteOG!8kgb@npw!K?0cBFbVniz^g>|!eEoG%`f)x zMjsL^Hb1koiCh3&*-E@yzP6L9iak052B#j-oyD}Ls`3Kqf)@}J!yT&3-UB4-;pRUA zWesuzpZ<{9 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/mushroom_block_skin_red.png b/app/src/main/assets/blocks/mushroom_block_skin_red.png new file mode 100644 index 0000000000000000000000000000000000000000..5edc77c5800d917fbcf44355f36a996831d95965 GIT binary patch literal 428 zcmV;d0aN~oP)Kr0 zx^HjOvG1RTeY@{| z>r%o%42AdopG9R9xs{7_rYKrQlv~x8iTzT}8t_LayJ>QAlAKLdIkMA!ZQsW?`#EiF zUfk#Na^APo?#2IO@#!BvY+6ho?D+ZYm&x$fxW{CHDq&p}7d926p6%W%JAACVq;sGr zodIT(UOxW=fKs&_+J3vTr&-^f*Hs-L0AtJfV+YW*Kd20ls;JlQUVCtJ1psJfKnoE- zLnGUTEh-J5}`j3Iumsi;O zon~t_FqpuSLW<7-E~pk=ZD??O#qcis#8T`ME7VY$pg3rw4ccMIF~-3bgAPFbLMg6M zv{9!3qRjIer{nGbO#noZM5;xplY}pdE=fdL3m2NN-REmMb8*BeN z{Nc!*3;$Cx*)m%mE;2}e#OrvCOtM@9Wl z{4sIDh5AXR%?uvO9P$%Gf7^S#}2-%-?2_Fu9rcp)~oo%56*)?8yGxY{an^LB{Ts5CGs(< literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/mycelium_side.png b/app/src/main/assets/blocks/mycelium_side.png new file mode 100644 index 0000000000000000000000000000000000000000..92c20be6a6a9dc58d6f47dbd0a90737b02c8c869 GIT binary patch literal 441 zcmV;q0Y?6bP)f~HDn~lc0?Y0s}vDIP#_QBqc!Yrn1-=%%gQgw6+r(t2Uv8$5+-IGJ*7<8{}C9BkF zA=IO*YjL&|i1#i#a(1+@#mGIliA>VDPOSpm9VDotm<5QJ!$e1gUECDn>UUg=BLb`#3`PBsEn5j8IMXa(Ldw<--C>44^b7j4s*k8r9yGCK>FVlAalz;Ez22*p)45cW zsr(#1^d9clop0?6@ySHq=Z%naTx~VZo!Xr=(W_IesvO}!># zoB_n#c6I8i^lokyol4hiED^Ir{KPn_x4xBqQEMXT>F7>s-w5F2{y^KYx0iY;%VMLf z6~KCLX1P`;+31>|ikw3hq>kTt1kZ*ena4N>G65hG%pFkrHzT>818!hOp zDnVM&uevjBVQ8_)TS;S8YsJ0_z(pS;6Dq-kBvV{9nJpvzOQIz!fT3Z~D$`m4j?G$I z1H{^Ujc1Fsy>Ll?B-m3O_V0+KotWRo9%@y&ttWauP7>h z#KVWkhw%JAMjqHeqiP`Rz|3EI<;_;wM$h6o+pa2GXaK<^qWb7|(Cxpqp{+!rDT462 z2ewr(@sm{eKTw>7!H*`4ljWfZXJgxK;`M)^>MtKOQCaGG+1@*(AyCTh00000NkvXXu0mjfS{LSG literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/nether_brick.png b/app/src/main/assets/blocks/nether_brick.png new file mode 100644 index 0000000000000000000000000000000000000000..d001eb076739d89144c88da8e0ee5b5e3cf57bbe GIT binary patch literal 335 zcmV-V0kHmwP)U z>3T$fm<7bEVHy$WI&&dF6M>I@deeW5btKxgSM1ju##-8 hV#O literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/nether_wart_stage_1.png b/app/src/main/assets/blocks/nether_wart_stage_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3c669a1463a7cce5dcc1e9b4b0e289d8aacf9198 GIT binary patch literal 271 zcmV+q0r38bP)LKDv1O@VjwkG`?hvczS;k`Y2;|3PBNfePY- z#F5p&Z3Za_7ZU%Upsf5qR)81Gh8X}07Z5){M&^H}xGY=^+;)&62QiWV$w~_ULnTH2 zyYdNuB|$Vu4#o$m$rh7FQ3D393=IFx1bM+O2$mN6Z^Oj_mITot8)1Bq8W0~@4FKYq Vy|5iUd*T29002ovPDHLkV1k1{Xn+6! literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/nether_wart_stage_2.png b/app/src/main/assets/blocks/nether_wart_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..97c3f3285388240c33fb8a6ee32afd7d6d5e652a GIT binary patch literal 480 zcmV<60U!Q}P)iCgnX{nG}7+6N2P*`B0kXVSdFbyQgOj@*Q(V|V!BlHM8K$~_w zLQnH=&dodNOp6v>IGi)*f6nimdq)ud>)g9N;C5qkF#EGkA1|?lZl9$c=G%e*qs}#5 z=i+-dhbOO!yJ@R#RL~pgT#bcR3@j>sf{L5L059Hm~T=W0}NCJm&tka`uv~r6&s@MSHP8a#ri_f3?TB6 zXl1?=4WR0i@a$6b#@nEZUAu(=YRRzq3S~`fh;~+R7!Tn@}mZz9<7uz{hGBM=m4I8X$4@Y*Iin6I|UN@UcG3B|h=a*4Q$B+rDI^YX+ W6+$*Zxs?_G0000NklMQq!J`>VG$KN z6h@0^5d`jP+p0~_qQB$xoiBg0xZL0G-gC}(zQ;93^YeHY4C>nL@5j-`4CXx^1S%`h zT~VQHJu?#)?ru|)o*j&i>Y1@F{K?7K?CF6$ElmMDCz0RRl9I4JG^G1D)oE%(lXn;qAwgLf|1)mRX<>e?$ zP1TF{Vl65*UyY67a4raEQ4u;zOO<%uZdXTNVlh0<&PJ%N4(89>RgJdQdqD;G{d8bJ z*QsOC7kz!$?(W9ESoW2aARZgUin!#R>5<$CzTMcU2e;gAgpcdN=#2JjZ4Ij(9a@K- zt3HjKFKM00&4poJ1hWnl7^$v?O(K)bPTUZ|h~)b*5>ebuA#)E3&n4%^Dqxiqa6rf} z2M09`=6X@=PPkk+D?kcbo#3}uTt1h&7+R+tMt>rOVFy^ey@^h3@8@U~cLdWXZZ1i& zYYGaGCU~ax`}IQ@w#VxGBM}&tK`nkNUPPh!o4>B^a zAMH=nf-R+hl^*x|Ua!_>Qc@ykPFyTDH^W#%@nLET8`7%r+FAu##Jx~Rcg}%Ra9?L< zRe&7UA~DJekOS@%h)CYF=$FYnDgVUXOHWS-TXSQ6EG}Zbs|#Tn>F)~*Sdw(&GL5{n zgm$GvpJrxMkdC-7wY1nYPkv%`Uq;{=LCjG`pI5dz7VrIhjEz167lhJcPa1F3;CD~6p80?eT6;uVg+b4-FdYxQeCqo%!d-C%zle2G4(< zZws~EZnf6y^*RWGIF8daHOBb9AGip^aI@J&Q53tNs{k&SOI_E)Fx+mp`~6NnpU=N8 zSZv#tmFx97j-v&5srY7<9tx4d%sh+i$iD1u0U5_!rsF}(;0kZjkR=Hj0MY^`NsvlL@Or&g ztJQM3q_B+1WDZ>zMTJxzmQW!5@zkfMD46q=WhaYS;Ja-tU>Th-s;w#%=(>gXv3Q#S zCa^aE-jucBhRgs?-d#-7-8Sm;r$hO&8Vs@2)S%FsVIb6sd_w~ z=Und9v2}KEa4*Z39CydEU}RB*6#z&JP()FU$DsfOm+Nc2{#>oTHk-L&yl!m+xJV`e zzypTh308Xfe7;+^8`cjy-c0j)Z;xf!OHHG|m9ATW#RwuwF$|M9I$FQKQ{ZVZI3WZ8 zDj+ui^hR)_MF3#$k@ce!Sdspv(~deEKP`c=T2kYRmP!dcPfzJ~e;-+Ic6MUBy9tJA zI-NKrxHCx=ZjglLhEf25#(oZ$>bWe#O234JLZQF^I4ly32c~5>94;1%*=z>wcDuD& wt>5o2m&@sNiZL0F$57b(e*gc6@4w^y4P2VaO_KU(C;$Ke07*qoM6N<$f-%qI4*&oF literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/observer_side.png b/app/src/main/assets/blocks/observer_side.png new file mode 100644 index 0000000000000000000000000000000000000000..adaf4a8be900cdc385cd05eea7d4241dcacb6c64 GIT binary patch literal 406 zcmV;H0crk;P)XMKywOKA)#)x?C=|+wFe8<4>p4S6C$Hc_wqc zULTK#C-5U;PnH@8fx`LalcXbk>Fx<~9OrU68bl1L&}PE|hX>#ZrfJgk8jF`pd=|$9 z&v}l2N|HQHNfv3E2kV`Sj)y~Mt@xqq4!fOg8f>dE?To>+Qb0eB$8i`uffP`w3E^$K z1wHnC;OL!m5Wv8Rhy)5wJZK@j_dOY53gL5}J;8JIPkSzo34z9#1oVdRYD~nR9D+6o zMky{s%LbZrOxxIuLDjlP2g{$yf&a?5H|J$XhcSA7$U|%F_|pe^yK>-A(ZStt~K1X8IK zC(UM)mBU0LkBLHPYa|As0DEfB=X2O7*`m4M@3-4c z*Y*8=KN^iNruck5%B)r^IxH58<#K5YR8{4~Fbt}6Ivq+|0(@YLK@p6{V^hEoPzAW! zZnuZS0h-I@Qpgbl42sM1`78yxfZYT(Qy_>&qn02Zk24>(KH1mnl@%K#Tdh`6;**zo z#d^71VAulYkzQq!Ua$9fJRGr3CKIxkc4Y^)pMq|;>xflm52z%mo6UxyWw>Y%IAR5o zO$Xi!L0v!-peR)wvBI$J*4|Lxkb+mN|Ni;@`+NTZ_uC>1&5~Vh00000NkvXXu0mjf Dkju}a literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/obsidian.png b/app/src/main/assets/blocks/obsidian.png new file mode 100644 index 0000000000000000000000000000000000000000..36f830fa941d4155f1ad442773396f99596075de GIT binary patch literal 489 zcmVy;)E;*Dcy)NX>ovX_|Sj)A>v_e4wBNq&YiNHMwC3MKwH8Dq234k%i zMbDQ(hY&=iYgS&H$^&oQmzY)pRfSs`$L^{-9kC}*jn*e35HUt8< zd9 zZ~T8g2iVUXD0ZGeCVH~_hH1P#|9E=di70>*VI-M?tjPwyz9rv?Hgkwu(~h5}>6D4R{e)4)J&c^d(y&D5@DD-0@?kEP)#nY@ zno+&Kzr$j&NSMuL7>!043^8rbc2D0R$fwOUxMR+vmCsCZE>ml26XkV>WC za=8!+h0tg;Bs?CET3mwfA1@ zT+QWj!QpTS>~=e>Rx2zP3(RJ-K(E)s zM?4-!x7!s2gF)FZl}ZwM=JWXwi^X09MxzmtNCbny0MTd^#bObM!$B|_jZiL^5e|p3 zSS&D|PLa#yBsUZaNw*qX;v$pDpxticdcC4jsbIZcW3^hzg;uMDWHO0#I*nSbhV6DM zk;P>Mwn|oR4u``xSaHAKOH}J#uZQJwiB6{@`e-JTN!TZoiFClE=ktlj;~`Of-|u%J z8IQ-PR;wba5Kst;!;2(fMJ6j36iC9H`Ft*;@s3WXgGS3ZKj))htit3^0(QbPUS`J> z-tBh32)tge%tUdR#N_`7*g-a%MIaCm&G3Kghr!*%jNQIW53@Q z-xYxZ^-zMcI}+6E^=}*LI|(SFvP?m(8F@~EFB?C>$3wz=K958qAtS0H#FveHAm{TL yyWLJAt0{?32NWgqSeI^O@xc9l$G5}_zNZ}cn)-}R!YW?Hsu2h3c{4hhPw1sAa%P;k!q03r z!_Qp|zb-lPv>($~s2Klg&luxEK&E!P{Z|4_#h%IOi7`%G+3)vgG#b)Y&G!NAv<0P* zQT|n|^(L+K`Vo~cc9eq_bl&7KPFyjY&9K>Q&}y|X7!0slt+3nea5x;$XfzU|8I4Am zOeR~5~cor84PN!3bLg040$v-ch&u1JC2dPdul#xs( z;qiE+3(iQ<>-8dGx7$hbU@(wMJd@~jI$<;#VLTqATrQ(hsR%K<76ML~hfb#>nrR#m z2_}A64WZs#u@NpCX+!V z5|J2-sDvymuRs>QZ>!b9@p!~~y%x_ZDiJ$bE|+qVv!Lgl_gDDWB2m`=7D(+fC0E!B>~6FD{v2W8bMyvh zw8fJ>_Sny3dqP>3v1yw4yj#ZoZe_AqFAVqqIzIW|9;5jWfh?X~ zY+@$ZSLQ)40*#q+DhPrpJFp7WS@3jok$_##k>5{3lM0NYZClGo(+F0hJTr;BjVbhf ze@dV+l7Khor2-O&1le`nX%Aq;sq*q?NP3^nsfkmJ`2_MkNmEdl^*)UdeX1Yw152Pq zQpdF@RK}KKBaw8!OsN7f_$AU=&C934xwu{Yf2MpBk=Tb}ID5AU(r40lrkwZf+(5Y? iedj+WfKT`IoqqvBCv-|1i1ecX0000I zOHUI~7@c3F3oxckaD^l$kkp7^nsHKT109u?(n4uVRkRrC3@xw%wX!oIMpwG>kw%Tx zm>RonyXn4a;!_zal== z8GHY9e30f$jYTY}zK$ z%DCX&6uZ=u89Y{U`WlSF49xuMPX*Ox8TU@_Ab(d1u1gePIJ zF$_QfYa=}x(TM@7AD@a`J5fe^LKx`I68ED4!P>?Y(woy*SvH00ntBtfG4sDk85~8o z+m(ok{1leGpkzGwR`9dFZ64$0-#zSp$oW&^6#D)CD1aWL_q%}1mlZgwgkn97axE{l z=T%vEm5h^09xX_+UavRWgLv?QbbaU0lCC?7Cc(GHx^f_WYw5B;FO}cK!(Tg+g^fE8 zPmPqF*NxM1vLz${8^Rwh2A8D#Gly&~j%?MEhEm5R;=k5&#FR+@b~3qfRThYJ6A!K- z6bm4dm_*9DG+L^VS~l167mN1J+}IfdMyxg~*!}!SA`{Fk3uXu8%l#n8M6+_PkDnbA zYtsv&kB9QXU?95lj)Z?q`kYB8XO9VZV1$3pDicASw$tbQ4~JNTGlBo6dH?_b07*qo IM6N<$g2-1N-2eap literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/planks_acacia.png b/app/src/main/assets/blocks/planks_acacia.png new file mode 100644 index 0000000000000000000000000000000000000000..ef597514432d6cbd2657773fcc00f40a9ec7fc6b GIT binary patch literal 267 zcmV+m0rdWfP)Vzy(nHZ6kk!%AWEpdqG1OXprfRP0a$?Lf*k3>*>OT~`j6w-x${LnmnpsH zwSmSm&KtXSc%8;1ocuhF`HO>9VHDIHUm!{@MX5=3gWGPIfct)Eg7Y|6dKzd4-e-!q zjr2Bi0geUQh*37+Xc`2QkQPU;Nmm08?dJW!)XWsZdD9_|g9g?=9|Rp*zF_16;1_ZI z=ZB^Spn)ks6Si@g0(eGaf{|Jt&{+5ussgx`>u!9YcpO%RAO1c6>vmx@_yWJUH(SEI RuYv#o002ovPDHLkV1n$&Z`l9< literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/planks_big_oak.png b/app/src/main/assets/blocks/planks_big_oak.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9a3a4b31645536e40ea8e0e72f927fcbe596a8 GIT binary patch literal 240 zcmV&u*2A#dB%5R=seNAeeVc~>w>jR+7``*y zXB@mdFTWEHGhp|#NuYv}l#4VS%#ZU9cyI-d<5=ryfII9=5#3nN$y6$Bj5#TeTtH32 zDvnu`t_B(I$os(5!W7iJ`H`a0XrL-odyxe-@Kap>?L(=7nm>0Erhrz|n0k63nfw=W q0$!?e4;<@sJ^10C`A@e~(BKOLZ+0GTIBrJ(0000w4Ep5bQqf8JkFJ#2HJu5nIdi@ zz0F*JV}UkelnpqV2Einx#nEfh)xbl$c|R~UGlg*8bco}if%VS^L5G$v7`XuWMO^>+ zp{W6AU<%NLZCs`Rp3#_Kq?QLX7QTh50B+^F8y_gH$3@|Xf6sqE&Wr|Mm2mO0rU>RA P00000NkvXXu0mjf8=7ujP)T3Dox3KvB)duN`J}|W~1vPJeq-Zo6s0!6yWI+x56xVv&&z*!RpcOTy xo*qah|Am}@m#W+Y$74GF_~D-UpAJLNUJfw6Ds$j^(6bk*6h!*EKPIJWQ3mCt)v=czZ) zGsW^8%(sW$2?xJ!hu?~a9yr&vNDu`hDHka^xSn<^a39+g9LKRz(*S#%KQ8;NGjt=h zOQw=(Bg`q{$OR%NB;)8cscPV%)%-j#HRD3$H$RGK6dFVovbper3iw4_|II_Hf%jhn zxfA08T8V6`>49Y7zu*(_P^ELAn9kkC4|~slJT^vyFWiOWrxsIo=l}o!07*qoM6N<$ Ef}x^orT_o{ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/portal.png b/app/src/main/assets/blocks/portal.png new file mode 100644 index 0000000000000000000000000000000000000000..f93399b20723a3de23c18fcba517c449f675d9fe GIT binary patch literal 13592 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 eLBGz8$o~QIsUgkvd5Gfx00008 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/potatoes_stage_0.png b/app/src/main/assets/blocks/potatoes_stage_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd85ee02dd2da286b06f7e5fe6cae728a0f1215 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#-1*YAr_~T6C_v{Cx~2Nd?WDR zf6pU#rWsw=lMEk7=sADy_?vz}Md=xy~0{%OFvQS*ozo7sZd z;-N|HKk9cZwD{YXW33@@@n~5`vQz=j$%K>xv(EmSpDD(_$~U{Q>tZaM3BwYx)!Y+Q k9g-64cD;3Ao*2u(5OOTJM9++8C(tzvp00i_>zopr04e%GzW@LL literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/potatoes_stage_3.png b/app/src/main/assets/blocks/potatoes_stage_3.png new file mode 100644 index 0000000000000000000000000000000000000000..56057412c675cf399d5e91bb7a2e7c8a45d935f6 GIT binary patch literal 236 zcmVt^a`OT7cCbxe80000Px#24YJ`L;xiKIRKKy**AOu000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^q` z4gwp_)QNNe00SsVL_t(IPX)ora@%wOz~P_%lDBNm;@EK#*RkUy%{HVkOsCv|Qid|a z3|CIP3kP0+7vRQ$87>qKg(=$sCeWrNjd9|{t`l35wOE#HNtXCN>5He|#_q_2ctUk~ zg?i_jx$F|7aKaBiKH;-ZKE?1{T+gF8KS#UU10i!z+Th7=KcP&?A;-<5RnuKuGB8FkZIg>@LY?^`WoLn`;JlHL>Pw7=4zRisnO`%a!`8%{E$|+ zO*)gNrK%t&K~5k6$&^I<=7Q>a5lIq=2?NeF<31L~hbN@d5VSt!Pr+9vT z%F)gqvq8kf^Z4+i$BYpqtZJp22YTz-W}D2#?feBZ_Q$Gmy(2+wl(r~ZmswL%p7NM9fS8aK5b=baAS>kE$d z_BmG@Oi2-5s1QU7`;{6H(>y(A@8}5E_c?1_&}}pky64av4nUF^xh{!Jg4$}Ct@R3p z+%!|^6kXHC7(2Y~cM-9`4gyw}R{#*IX;43Z#ddLprG*?s5#51~9|g>2rm2 zZ4yNh5}*LQI6Gy3XPdsRQ7#k-iMVwvRKq5ULZbMV`Nc)z7}{nZ%g_PXSY1Q<{HrhH z7yq6h$pQ$O%`W2D4ss$v=m!AIX6LXpoz3zF0GI6+mGu(3>+nBIj-s6TkjIb!0000< KMNUMnLSTZil(3Zm literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/prismarine_dark.png b/app/src/main/assets/blocks/prismarine_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd44dd97888c32cc2b387a05f253f9890b5f5ad GIT binary patch literal 864 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 Q2LJ#707*qoM6N<$g8P)f;s5{u literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/pumpkin_side.png b/app/src/main/assets/blocks/pumpkin_side.png new file mode 100644 index 0000000000000000000000000000000000000000..76cc0094fb23b295189a061fd2963ba82bea3349 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`i#%N%Lo7~DoxD-7L4n8h^6gtz z6QwP>oh_QCe%`^{tniUX+>SG$(f!k5=6#Lla=UEa)%I2OZCox`e`xEm0-c==&ux|j zBwaCfnB+8->Euh^0Bwe<(_zURb)={?M0)8T|Db_TD=lm$9wrVPjN-Rj*y*`ge?>IU&d1 TedpEzx|YGy)z4*}Q$iB}0>xKf literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/pumpkin_stem_connected.png b/app/src/main/assets/blocks/pumpkin_stem_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..5722637da868fefe5f63bb3d0081622f3cfd9136 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar_~T6C_xh8D#8ge%N!g zx3v6GKix2I-n{=OBvK?c)nsSCuAjuqvXiaFah7M<%_}Q|AFfl3{CsU~^ut*RZ6czg zf7PuU*2nMno5`4de%@dE%1Wj*Ks literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/pumpkin_stem_disconnected.png b/app/src/main/assets/blocks/pumpkin_stem_disconnected.png new file mode 100644 index 0000000000000000000000000000000000000000..1fab6fe52d549c940c80a9ea4cdcf71f66c971ac GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr_~PUfRgXswlzypx#Qo zfd61n&RZ5%!RI@iSfh1w*2t>ow*~i2XS5UIxEQ|i+9R%vwT;DfeKzNtr(BBd4mxG~ zU~hf@lR1tqSE}uqlX?oyC7$C{JaUugoaHfz3sKD-CnP@0-Kuu>>Wq3F*`1xRwpHNJ m-I-H@>RF1;CG^yC|6%CRO8gM7{^L8)Jq(_%elF{r5}E*pL`ca1 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/pumpkin_top.png b/app/src/main/assets/blocks/pumpkin_top.png new file mode 100644 index 0000000000000000000000000000000000000000..91f23025e29f7337ad766af309f435b8b7d064c2 GIT binary patch literal 272 zcmV+r0q_2aP)M|?P>QftWkJ9n@DV`dO5`el zF?c}$c$qC?q$2k~EJWek+UNcw(PCC=+z^m>kryk8HnTTTZ9oM`M)LD9k`1<^yU5R7>0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2q; z4h1P7PjDju00I6YuQv22_IKIVd`_>B>C|2{3szNqCTx`c8 zHUuY%m6v?hmYI`7BlTeghcmk~yR%rQ-zV9B-^(#P%E3Fx>E2->qp5)xvcD!#C9yJ{z}w9iMmuW>&{p#`Vi^(7)d%z zi9xt$u2@xA5sZtay_9s6N@Pcp^b;0*-q5L`mHL|DH2Q2PtED(NvyfEt}hM z<=`C1hCnh}XlKyeTXk5I9hXMITR`PioX5gmFw{^hi7#WV09JTij|US-WOUv39rM7Q z*V9;&W4)*sfeM7#gX8>2`v89a^UU-9$DZv}e#IyD!09+m3-ekJ=2g1!`F48C0`<>Y zvSB8h$)>eC865*Qll6Gb z1iCTKTE$d=U8k(Z9ws-;0OpgN0L)g&p2H#TCJyHC5e z4P!afI%kgl7tBX24?ti-pRf^sAygUJW{7ADL$<>AAw4y|ns=UidMDoQ2$HZn!Fj;* YUxiu4-inqz82|tP07*qoM6N<$f;=!C!TPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2q; z3lfW2&s z^m$!|*(vJJRdR~##6 z+L_p=iZex2zg9*1oGyRdU)V=2T@z`u8hWK34p$H1=X~rf>_HI*g*OK8Gd~4SxUJvH znGWvUJNO&EFpvRc;H`Ngbwj-6Gq~2C*z3JFRu`X+VGzYC_?Q2 z?!#Sip)cuE3@B|*gVNjX$#h1bCB8h#fKPIujBf_QN+=8{fyhklpKaM~+yiF5v2G;7 zbL&~oSLT&O_|StvWsqcI4`K$)&0UiLS4wFqZK?+n;lj8`*7!dLjL36!zB`PLhQbK^X5KucucWF1ju zwjy_d@#4Ed1{_4OHy`f8sd_3OG}oJw`8|{9ZzMHNsvH(Wxs7oT%taFiO9vwMAnruW gggxNKIDn2{0N_v2tDP}0O#lD@07*qoM6N<$f`)k)cK`qY literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/purpur_pillar_top.png b/app/src/main/assets/blocks/purpur_pillar_top.png new file mode 100644 index 0000000000000000000000000000000000000000..12a3005c4447d85957bd905eb96a1e99380ed132 GIT binary patch literal 702 zcmV;v0zv(WP)Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2j2q; z4kR8FZNSd}00KTqL_t(IPhC@MPvTG%?2nb8p!3oIB# z9xX_1OoR{qrdj4RCF_2ew6{HX&dl670q-L^U56a>KucM0o*ee)+Y;I*+c83C8($B2(1vc zWDR;+j|ir$ zJ;uc`Mn6Z;Q+kAL2Nn`+KxhY=Z2A|<#@*oV`yECX(dOVfz~j}U_?(m{;@_)!m=>qd zQkrDaKkuVg=%I1gh%)Hry8>-r!%|;jP#B<_?TU?Vt_$bX5y_=QNiyI!f{GL-zayYT zbtc8kq?7GPr&hKFH|GigGqCfvpq{Qnu?taH=0{U}QabI#1XMw^j$0`0mB4z|5{>lM z0zD1C4khI{19l|=H&P8P@EaBI9i?X2-^KErEx@>EvFN;;b#OiW4>JX}3U;*$Ed zJ7uJ< koG-!Y`+rU8tYvrNFVC*kWkYvAt^fc407*qoM6N<$f@oVZ00000 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/quartz_block_bottom.png b/app/src/main/assets/blocks/quartz_block_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..0eaa57d7a584234c7013652511c3b4dc6f91d3aa GIT binary patch literal 377 zcmV-<0fzpGP)o7=Okb*-&mKoPaQ29^^|7pQ&q<0v5KO$gB}u}{l1B)sFTNw?vY9*bvT zJ-9mA=8(GjgEd^gcx?(T%go~jAl*ri*|GV)&BJhJlL%%gh9*rT0q|h+Y@d+@0J8>2 zRMxo4AZ4Vk&73|RNdTEqnc-zX@O5TJdScc9`HnGs41ie!q*#!ST4snf_>2s&DCaE! zrCCFaY$yx%9|VQZ0Ok1wuvf(A5$HNi^mL!0%OE9S_a=h6h0$MM0DF??=$T;8D`04- zyKK$9AemsSqvBZ6U;YA6>aII-ixc2GxxQkW?|;~U_I_7+?2|(Gm(OHeTQLAc*B*B( zj+9Y#j1iS@iOldaz#@w+CDcPhBF&MR{-Lms0|UT+mp#$su!=V8MsZ!0bteD-!VK>( X8k?s81R&^q00000NkvXXu0mjfA_S*b literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/quartz_block_chiseled.png b/app/src/main/assets/blocks/quartz_block_chiseled.png new file mode 100644 index 0000000000000000000000000000000000000000..7e436f999ca3ddef7a887c8c208863229f3293f9 GIT binary patch literal 360 zcmV-u0hj)XP)5MfHhPnpd=A! zFj=>P%1Fv%+p6$p50#gxlSC~a$pBQ40QUZU2xi-g&m7x$nt{ERsRENooXB zHS~%K4A5#gAI|1Ppg{tv;Vg0_g8!zU6L15F<7UiX%$fjw^E z;&a`z0`^X9zgy7n+{!f8kpMx{*obqsO$uZ+D$_@%FVpB704tA04;E*hU#VPTSwsRi zT%x3*ew=N%b7CHwQ)R?Kbt2HvJ>z%AcU!(@C*-K>4{BeO=%GvA3|V zLwNX6WZ;MkYWGg;w%)}qt`j@n8nMmCi%8yoz9j$-zV|6Zus;K=F*@Gmw*YK09c*xj z=oA0|5kN2?T-&A!rc7On065W+?`CHcVE02JFMc3Ea5#l{9YhlWWbk+cV76ExL zMU1V$2B|_Q7IX$Vbl^9j;X-Eu5COUd8V1{?8n{1cmVmO5hZ^YU8bFY)KT1CF(=U*jY$X=JD2Dk^)n82upjh$w>^PyQK40Q(ok&P8CU%+V17wOu($L{iRh)w+_aa+C~;%iz90MspvqII#+kA^h$6=|7! z5j^k~XakkBIR|JX6q4YfBjAI!*vReuCgcEO>eCL`!XO(AkjkzT@t)2Dq`)+J111Jc zeJ$;4lU~aVFnO-Z0B0M5@VRrqVFm!?M}S#(!INj00CMs(07DqS>$XZW!2Mfu{sDL< zDMTJM16<>ho+^|75&(WOR9$9(U>@6~3qe+IrK4Ov<>6K0SrY)sAiJR<>1z|Emhm#N z-fyScXHcFV03Hf{5RP#>I!0B9W0`?>CXQVxzw3YEZ&!D#lwSNX8-^I literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/quartz_block_side.png b/app/src/main/assets/blocks/quartz_block_side.png new file mode 100644 index 0000000000000000000000000000000000000000..d49a864d9d20b46d752cd9afe725f3a3747b9dd5 GIT binary patch literal 364 zcmV-y0h9iTP)>2=fvL93gR0AUcHt?GjwZ%NklQI23k^Roj$6|(?f&H;|Hi%>}fpk&Z; za|y_eVurd~#Q>C)n*kJa4%qLH0fY>24^o`L$vPy)^%PPTykJ2QL$&Xf{ibGl~$_K5>Z-^=4RWZ&^F zOM-Yax1p=Q8DQpn-0Pz55whCp&&gYglR>2=fvL93gR0AUcHt?GjwZ%NklQI23k^Roj$6|(?f&H;|Hi%>}fpk&Z; za|y_eVurd~#Q>C)n*kJa4%qLH0fY>24^o`L$vPy)^%PPTykJ2QL$&Xf{ibGl~$_K5>Z-^=4RWZ&^F zOM-Yax1p=Q8DQpn-0Pz55whCp&&gYglRR3kpo3LMwsFB^EmF8K{{PXJu<0V4QBOaV(o`qshR;HFFJ4FeG@v zP0dn_>zIwMVHRf{FoPiKHeIcdu}MPYzxeDuXJJ2_oNvD8JkR?+&-)zX>DUlzRi>oS z=W;P}!b@vuDSNF}c4uen@=V8+b7MBj29=io*5lHGyr-8tPM1i3Y#MWinxGS-FzhtSrn+mvUg+Hb#3+GC%u_ z>B&1xO$-sbaGF;w7G4rkYf_T#?q*91P4eAXRD|)o|F~|qxx~&JB@X8Qj%!bTk6mYz zkd|d+;7m^^(&^`y-fl8huO`$|&oLoX1&un<-o0-hxBL4jw^?}<3!!}RR##wIyOuv9 zA^y4_VUNaY&Q+@zc=rG={)sdD>>(Y8-FT|X`AF`(m7hYtm{Y z*dwl+>63`x@OruXLy*UJ2C+!>_NprKRR{M^e6Ew1B~`=C%`}NI?-v)dU3S&xLc8Ik z9{rHE3MjB+2X=|FmY|ZiKu{r(ZA>?jBHv1i0tVe~4c;m5;q=~0ip7Icc}&G(?hXH^ Z{0ngRAmbm=gFpZP002ovPDHLkV1hw6v|s=L literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/rail_activator.png b/app/src/main/assets/blocks/rail_activator.png new file mode 100644 index 0000000000000000000000000000000000000000..5736a142e1cbef5f1d66caf71f8329cc72ed059c GIT binary patch literal 268 zcmV+n0rUQeP)Q1$f#JV55EsUp{$JAI^?yxA(Es*a zSFjjJ4rTyI58QwtXAQUkVn9V2KnxN~@z(-lA6r$hm>7})AbAv5zzn#%LkBLV0d)Kc;6 zAcP4L1|a`~Fep7x6b2wnRyrWs3;5CjvH>LJ1z0+Or3JFWAU9Z_^e`YbI|BeXOjKR* S9V@B;00000stu@Xo@a7 RhDrbc002ovPDHLkV1i%~c-#O0 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/rail_detector.png b/app/src/main/assets/blocks/rail_detector.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfc8fe7367f1b74989ae620cdc255774277eb9e GIT binary patch literal 309 zcmV-50m}Y~P)Jb>3DR(4)29EMmM!~#V(;Gn{S_5p1Bng;kgXt%D^{!k%; zuuF&z1CR?qw!;jlEi44Pis&!^ITz$?kVcU0ZK)|>1BgloAb&`K5(tU2Q{{Ltx27cemWU(L)2#vnFG4rTz>FaSw{{0UNgHZJ1-o}#?}XOm+7@A2~h8wiqv z8GtnmT8xarf*>0~8dt1X0mfUi(!hq|^a8p8AjQX`L*WMO@O6V508&F#7=WC;IV1W1 zo&c}^yF8u227uB5(P4m&L570T2+Rdo!+@A*#Oei75)$5Y0Lu%YbPr1ZeZ@BLyZ~Yo x3pfCWX``lpt|Iu!$DEWb4Iv^)6005_%SiG`u#WCLJgAWa~fVSHo* zF#Jc60mxwhQUuZj@;Au;eZ@9lZ+N450cRL|J);ZuFUa4~ZmM9-AQ~hFk|P)fAVs*m zfNTKHFhDi{q*;U1FaQ}4!UPEekpDp#lpeg%yg*VIfG}CV1% oh)xF}17Km08>~-y7?7Hs0k+qDqB~=-^#A|>07*qoM6N<$f{74r2LJ#7 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/rail_golden_powered.png b/app/src/main/assets/blocks/rail_golden_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..91a5ef4fdf9c48c66a606cf9314ecaad95fa7f3b GIT binary patch literal 341 zcmV-b0jmCqP)F4X|3V|V|0(`jVC-Y73Kj#&!3+TDL2(7L0WdL; ztqT~K;Cy5QF#Lzj0FY*o%>)fV4g-)Pkj?G6uK(9`1pV(Tw)tOgqW~5|HUMWBd_JfJ zwiV>>3R4+y7=UPy7)Xv_7=RSP#3nJIh5@nxIKu$h0J6dWWB|y&ptuM5AB5K@T7bon zT|h7la`j~XN4u$l!vGYBWTgX;7eF?Xoen^@PC^PqlJWv53_$4sgy)Cr5}yu02Ef7~ nH&~zaFaQ~VGdlybI=UACC((&L3*PEO00000NkvXXu0mjfDoBUo literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/rail_normal.png b/app/src/main/assets/blocks/rail_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..68921201356896926426b4fee4a1119b1687817d GIT binary patch literal 232 zcmVP)C`>|0000wDH8tZ%AowG_XrCLbMo=wZVe$ymLk z@vrSqFg2ZH%Ve_@ot>-TT(FDjX4-^9-(tdfj#k7rzAKrLl)`JltMDX0WxC7ml})kj zrdKxZO(<-Px)t{PZ&I1{an^LB{Ts5o;zL0 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/reactor_core_stage_0.png b/app/src/main/assets/blocks/reactor_core_stage_0.png new file mode 100644 index 0000000000000000000000000000000000000000..50ad37e99696fe306da34775cb6725e3ebef2d67 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|NuDl_AsXkCXRxyEbYbZ5V%w2* zUi0%ug&lHiJ6_%L{tsoD_B(I{YsSbdVs~ZMd%Q7Qp`#$nqO6CpujA^6XRQafW-rNL xSf%F6oav`@?Xn8HHm9I_)FlPWj}vF@VLb1DkD;XgVHeOg22WQ%mvv4FO#nc*HGKd8 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/reactor_core_stage_1.png b/app/src/main/assets/blocks/reactor_core_stage_1.png new file mode 100644 index 0000000000000000000000000000000000000000..09432590629a9f5a792d4dd48d6315ed626d1133 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Rh}-6AsXkCKYaUER#Gx$`c&19 zhEok)k~z7#ihpc8HElQ+v8|ZFxbD{!0XvrKhZ(~E-ajDJVKCL{h(DKy)0YJq2U2ZZ zxMGT3$iYmOn9b}Wb0eB;ZeVZ2=5YA-bupp cD^E%@JW@KIDSt}x6VMe5p00i_>zopr0M3L!jQ{`u literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/reactor_core_stage_2.png b/app/src/main/assets/blocks/reactor_core_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..cb381b1ba9d29d0231588b222c6c1611ccf88937 GIT binary patch literal 259 zcmV+e0sQ`nP)ZY70GUAp!Af0bT56#pb`;0-G8r+40C#+bbje}y*Z z+;F}y+HJmjPr)`Q*;1~026AFApnAPsudVW0hI&q zAOi03kqGFd67+q7h#5BIeZ)AZLOtve*s(!OvCtA4fFs2002ov JPDHLkV1gX9X%GMa literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/red_sand.png b/app/src/main/assets/blocks/red_sand.png new file mode 100644 index 0000000000000000000000000000000000000000..096ed0ee3bc233361a01b197ec8c46ffad689ffa GIT binary patch literal 738 zcmV<80v-K{P)brDtg$9#W@WM99pGiZ{QTv- zZVF}~ra)mGL!5{yp#_WDiK?(1x{(=>OFxpKm^?f_|HGy8T>V50i7-ttCq5s0N~QVfn=M6QSXU*= z2(`e~!g)0oxRXC0#e||b3^UO6&EUP6=Wf7|sxyf-( zQyW7TGv+y=X5sl|Wb6aqeZQvdBd*Ydn3#aRYw5y>e%W7GRXH*!hAA)uxw5>q1DOJ+ zHIGkwR<)&eicaPB-G-!+6O@$mFanuXndMBc9( zt|@S81NZMM5Fw?664;-5PM3g6GjmM*@vtXXhJ|sY3D&C;X+xkemN+MVdpI$S5sYRS zJwJTduylrH;c(VamKI}YT7PA;Dv?5%17(qcKpzu#U*AyF|EINe)V1ZNbTo?`gE07svesy=*_}H61M4MS Uv4L4L+yDRo07*qoM6N<$f?Wnku>b%7 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/red_sandstone_bottom.png b/app/src/main/assets/blocks/red_sandstone_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..864370fd6f8fc3279cf4a0b00d57a77c0641541f GIT binary patch literal 506 zcmVrImNk+VX8TrU48-!YwnxVf-U9#v0M(Jc+<3{RV`X zmx*j5*F@%oWv$G+vUTs|cY0kr;+h7#LEQ>q1mvJBZ=DD80V9z$Quy(BZ@H|ITI+xV zk`RTJx>`nb?+1#kfTcAAL3vV0W91fVD{%2GjnoqXAdjiAL`=>Vg@gIra2mGKwW zRcxJNMqOzv8%ABo3wAM-(OFEa{`G28K;l+?Vr+vrTeFJ%K=hxzcMCh2s#Qc3q%i(*Vx zrMO~Vh|44wRs7y27dk8j{40rTWZOGRFgZ>OFPoL z*pupM5Nlhk-@8L0W|03~cJYHXL79u9E7xF(yv4e$3P_b;oQr6Glt^??v2nU9b)c5q zg&*+tm`jpTHnJuFQ#I)((vpaN4=oJP))Q6|;N;4>eS7G^{Of;Z(6aD#_vn@DC0R6yu(5o1+9KCUC$q7uy6Kd)&GQ|10> zOD9itRA#_-XqA96cy*6RqEAb7P@R^0567Dr!5FO)tZow84^>c>d5Lu#s6)l$@wT^b z;N_SWx)>Ct)4t%P88Q;QWy9((%L!ba`{24z@LfLG5cGB0woaVMB&eV=QG*i3M%k#| zjM<;zfq4X+I+@$BOwa>R3a6|90000ss1S5IirzT|!9kU918{K)?X{NJ^#9QfNOUfQS%K{HlGq?aaosKPK68+1cIMJ!bFa z<T1b zKi96V$CV=uLg&|RK@2|&WU&Q1(_@XpQbL{fZ5OSxah^p9w*0E5|Mj08Qv&vRjl&2e zValwZbw+8=AlelYL9h<%h0*N72j7?d%3&8S2GBK}oil(1^%aWAeQq50i) zCBhS!zvI#^dOoCZ0G<2z6E7WC9XG8UW~QJp&njN%JcjzLon(=CbUbvARbc8tad)r- z_^{oE3lcDOmcRj-V>YzkOYX~z4gLJx4^!c;K8sx>;mV2bHQkjsI_+**Jz`1 zQXSX{-n}`A>9qE!!OjcQo#^mbcsMCVAAKe%Cz07OGQ}l1-^`#G(^CHe)GQZLFrI1H P00000NkvXXu0mjfeUU8q literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/red_sandstone_smooth.png b/app/src/main/assets/blocks/red_sandstone_smooth.png new file mode 100644 index 0000000000000000000000000000000000000000..79585312993d8478f37ef72c13645348a446b572 GIT binary patch literal 469 zcmV;`0V@89P)03(Y61Af;5 zNQjoT1btOvqU~dnzUv8*@#EsJ8zzR}JAO4rUf!iq(WP<8Sg#PJKCiv!!Za*KXi$jI z$1dMzf5ET?!xptTIh|~X23*w7hpCeZQujVcSnKAlsGSLk|CSBXYwD6(sQ~qIA?iI` zQ!9PNagdzt(=9Cm z4e$=|-~@oHs!0{zgB=5aUH_|d@Pmf}i;DrPve%#Q0{c8HcE{Qu{c;;qSD0+@00000 LNkvXXu0mjfL37T5 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/red_sandstone_top.png b/app/src/main/assets/blocks/red_sandstone_top.png new file mode 100644 index 0000000000000000000000000000000000000000..bf231481f13675395d878ba4ccdd57124bd8daec GIT binary patch literal 517 zcmV+g0{Z=lP)os%CZr<~5rT2(zU?P_;hY zGnmc)w+O_z+H4VEQ#SK5dj`i4A0x2MYnr^*cu#19<@G^GL;wVP!j=p5^D0IxFB$ML z#H$wmNP$5Tv89-80yEpVMJkwWetlh}mJ0-NV*_L?qETKk5y5i=HXK9jPTHnzjOl_s z1^2qXSB|TU1z)q6HW4eHviW-zBi9(?=jT-zILo}Jd1TOSe!nMw&*HHKv2a%{n?D8ng6Se#RIVzhUy%Rf^uB)1 zG$yoZ@jBn-oacP!qUUS4O>Di71f8{8Pf=4!QD4hB<>60t$dreePu}poj2cpb@qWKv z*G``<3js}z2Mj5~<`JSTeH;J}cv+2^avSls{z5Y)GzK zulqQFG9sQw3^{=#)5yVjv|W=qI41m>tc4V)(5uTe0^C6NgD$`=HkmF>@-VmrBop+? zOot}ZE^(g@YI1^9UQiPTs>K_C8vvMV5)reAJ^|x(zxvvmg0^5&3j5^LQuU|}{Q}Tv z+~q_u6?@H>lmR$v0Gt#m034v=sX!~h{TjZ2h2#s^4F|vt0cqqu`75ehENU{KI&#&R z3kSfSvt48DKZRpN!tDK@fCLOER@=^(Vzq7OS!fmQJP7N~)YbvnkjkGIOMcZtM&EEoeI4+Oo)#@NiHDdnUY4=H!?3VmOlt$JWn|lV5wIq}E9RPM@PZ&d z@4`|rx0p9Yo2F5wgAMtNoALqCh$58d6zw>|Eq|u}=o=!6&y8k|6Vm_y002ovPDHLk FV1kt-=jQ+b literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/redstone_dust_cross.png b/app/src/main/assets/blocks/redstone_dust_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..e26ce5194052bf0e3c57d67af565855124f61e01 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar_~P1|8&NFytuy&pY>^ z?3;=13L;CwYeNKTZ)jo*FNFn3{M-Fj{1fovw$E&VHXW7|!wo*EvM|G<8m`7) literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/redstone_dust_line.png b/app/src/main/assets/blocks/redstone_dust_line.png new file mode 100644 index 0000000000000000000000000000000000000000..27bbfad8c29254f73584a5ec3c61f17218f7b132 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr_~T6C_xh1@7#r{A|x7 zy!7GM*VhwT|Nr~ze33h@Z`ua0R4 P&>RL&S3j3^P62Wf1 z#DtWi5)&2_0rjkmH~JOUW_NdW03h?bY6M3a5qVQcW^GNv$t@YDrA5{P=^}G>2B7#+ z*9HI*G;%V0Q)A4mXA@|uA$)sWz{f{u8xtCyO zicb%-IKH_EuP`>E<$&SPqHgqFsQCOKg%9_xqj#*EQ9`#G#-?ZTubp6kaxMn-s>jT3 z=b!Co!@%3SaeUvu!2p(-W<>8P5eKA{S+q+593@4p^dVcyd1j(^(#jlrw!c1)gXCqr zDk$je1coZ`UV!0uqJ1ZZu9=mlP0yEvGst=z{V#A1t&$(ThROi7#83q!>g#$n3M0KXa)wAA3}Dih=|?Pg{Q&0HY9%DFgt&vew1ZnVomUKL+u zOGqz@0T-$<8O8oWSwn4A!pKMy$S(<_KhyvI&c6Y32aAnQEqU<(00007=PjV+3j403MF{S#s8#){@PCm)M?P?oHR20f(Ps4aE!xim`1VOfZ4 z8U#_0glHDcg|G(^7sL#8^mvYL#N$4_HCnw9{S*Z|L!^Gp5M8@%R5?m0A!p# z&PVS3U!xGqBe!Oyh<+Gq_8=K(!Or{;d{!9;9CWth=d>NRrgCfr^eE);av+uw;+;p1 z&CnRqn^D{_2{;fD*c#U(bW;KL{4p@KrJNJ$z$n^_#XcqGoMK9j^s8VNmvIhsr*>m~ zM2qPzG05dL3*l)M&a+l&UcjcW!ne^gn0H9gCeH4$%XkRmm#Y!Z1Zme-(|^yd z)?n5tp@Jk#PQYuf#1JFEOGhmgA!(EUja4PMqRCpd)a}Q{hz7AcYQ*j~Va6fJ3t(lG zT3zUqQ|sxEc*s0;N6vF_L5_4PWWBZELPiuiqfaVsMh#GG4-&;C|walk6)TG`i? z$z*McuKG1YB=beBoCDgm<>+CKVA!Ujty*}P;u8kgH5G836BHk&|2@us0DfWyw|$n| Q&;S4c07*qoM6N<$f;HtjKL7v# literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/redstone_ore.png b/app/src/main/assets/blocks/redstone_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..92282176e49f0b285c1f29036d26e943f7d4aeca GIT binary patch literal 264 zcmV+j0r&oiP)^x3t(_s}?qQ{r_^$E{j}~M@ zqWS=24gLiHf<*mnTi1mkEV|7ihrY2p0|aEUKgpSXH-ge#*=#&CGDTCG=f3~qNYogN zERASzuH%R#%m{OtmHxm$JFn>Lk~3q|%~JEcb+B5=Y;T>Tkklvg4u`}$P*q4@yXx4c zmqj+}YZ32aSmK-h7=wFIb%sMiKrc^$JryalzcS87=}vj3`D|Ia0b^f_#agHdT98oy O0000+tSf52bs^Dc{n82?rG=1Btbf9evp00i_>zopr E0RL<|`Tzg` literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/redstone_torch_on.png b/app/src/main/assets/blocks/redstone_torch_on.png new file mode 100644 index 0000000000000000000000000000000000000000..ae93814bf3a1088c662940002ee0623cf5f51090 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar_~T6C_x-u+~dT{A)J2 zIqUy@hDUWqyo}Nx>VMS>EI1+h`s7s}rpev0|8BoHJt6kv7fL5C*ZS$_JSVGTXg96NE`N|JM7b3_$!p?clWk z8V5@mfcQVX+)Ju`F!eC^8oi&$0K_QnMGp^x zUeNuEY#uahQ1qj#NB1wXevn#pKC*gZ+=r|mT|GAUA*)BXpOAWJT%+U%bpPTrAEXx9 if1vnA=M&P8E)OdWLV`kF!#smM{rz+!+&q0;^%wv+6;1#E literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/repeater_off.png b/app/src/main/assets/blocks/repeater_off.png new file mode 100644 index 0000000000000000000000000000000000000000..34966cbb2776035007d00b687503036487cb408b GIT binary patch literal 375 zcmV--0f_#IP)a#U1!i;-}jEHs(k&=&h(k4Da`YH7UMW(=i~9{_JT;9K$kKU(ml>vaUz)3sDKMV zl=MC&1sMU605t&T(o=m*dF&<1p>10?5Spe5%d%ujq|z10KqPwt;pNi8tC>ez*EK6P z*&8$-5n*0*Xg1;v6U+3P*GZ9yjM3D>DU<#5Rg0m5-6m55*sW57+5CD`qxG zj4cGiFogS}3|CtkK9QTVBB$;2B2t5NNa!_%5|EwRxq|%@<@tVneEI}}{c~mxegG3s VyipRN6HfpD002ovPDHLkV1m-YqTT=i literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/repeater_on.png b/app/src/main/assets/blocks/repeater_on.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d57354c954b4b53f2e15a355504516c6e60e1 GIT binary patch literal 371 zcmV-(0gV2MP)&KQ3}R!VRWL9bS?g8py0x$iEP)l(uy5Oqc1D7D{Qfh6F_=@$-IX z(1)Apbk6yr&HcQL6tZg8={X&|vC!;8&#?f*j=v3DMIH;Fr(J1(&o?ut)_fW0! zGWxABe)Z!hXC^e$B+A(dt!73Jo2Y^y-TDS9nOS6x-w4UiFEOZ;@fzh*HhM*BHsOI& zSwQZ@1H0(MhvkPF_^rq#P}f<*Wn)!rMt7b-oi~C~K=gl4o=#;=o>^lYX~Sit3Ntx} z`2HaJ=V2t`FQL*}fn&{US)eqsViq%OyRcfIwX4Y>LV#40|9Tk2a@=Y zEB8LoZrk?XPi-Bg#H@Q4EIm(C%g$)jMj@y_xOd=8@56EIm0q+(>}?PHZ%jr#QcG|} z8ErctA2|^qC!1-++%OpwgQPOvM5pMN@v;814*V}y%1wr3@I-$A0000HPW4i)$%#M-aNrExkTzr@p$+och4N4j0|Mn6nlRrw#21#pwr!ea!Rko zm^w2QWRRfM1^msRw)-Pw{uIu-2ajy-wl8*G55;>Zj9gH*WH)Xfc9dYdJcqq{DR=9( zgYEY-9P=9B@$?Qwq{&$lWL_QoGyf=y&yhXE-qT^NUclX`2&{hV^CO=lv_=Hfg~E=_ zLueTY%-0gc95g&I2ru@jVuLu*31CdzO`vc9JNeWbC*Z{ins$!aoE#~@s;l(Y1M(Td z{HDTL^`NkkTL|ruAozbPV0)FkZQEf~d#(Ogjc{;G=WPrBA~SK;?YW$bP)8nU#L0}7 zhKGD1_S1d=#kp5u-_?!@>0gEhs_2cN1m+NlJ#CXlRQj*uhgx3h-`%QExa8RFOMrFP zp(GPzu7)o+&!~b|LYlkj!Xz0vaQXSE_!iNe+U-*X>yA9IRJ;2ga$lD!*cKB?=1tHL z&8lQHY@DEs=X4&{BsP+j(To@#OM*jObK_FdMo!*&?4<=toVX+-BR2n_jIUajWg@9` zXMNTNC+>j8Sw$XB+xbu`>ZJ^f7DdQ%XtbSCt^2ksj*&A&Oe7bf)~Y6hR3*C1bwGqP zNiu&4K&8ywNx@b6Trcp(qXe_+`T(E_nmSHSwSyrFp^_mGB)iA;Tsrt}hj Y00`SPPCLc#7ytkO07*qoM6N<$f*IZ~IsgCw literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sandstone_carved.png b/app/src/main/assets/blocks/sandstone_carved.png new file mode 100644 index 0000000000000000000000000000000000000000..85d8f310cacdac7426eddcb4a5721b50015e0cfc GIT binary patch literal 596 zcmV-a0;~OrP)mGxmS&o*J$%R=gR z-lM&}h=b-LI@TMOEprK0Ero64Irevwu+1c#-87%?HIfLtRRmx2IO?uIGL!^t5oFb$ zVYBoQ)p87*>Lb*Q$Iwf07)l%!WeR2aE;RWD%*r&(>MXS43{-g%()pZ@!iX^uE@7X1dg>N=KF-!&MQV$iD64r^_^unqC0)#9%@=boF&n< z7ZA82wvqZnKuJWfxO+d*Mbb6Hi zKLNE-(;uMp`8u~ml28|GBuQt*+_lI@ARkF4pmqHm6fPlLV`$Ub{^pNH2wUfw8*@Ao z-2vgin&WnDa~4%K&M}qJ6wdm^%LEim$?BI0@hV^N?B(@45s^}uz~SCICZqGdcwiBM zQn+<-DfgobqJ5i{rz2e?R@H>q$ZNJWaaW#LClk<9rOM-=OB%O{;A%`5C((y~6q4aa iLX7*vErm8!C*N z zG8<5GW`37a7UUAENJc)Rcxgl-WrUPn=ly)z2u-y^t9#I{?n8)(vnbF{xr^-8v86+YL2%k}p$?_6&IFCh9&K7lG$+*ZCc^%4BG`kJS%sWkL#<#X zqFspI7ZBv!52VkR7>UR{6I{^zs^mhe>cr`xfeE6dRa4nVP1->zvyNKnoNS0k zb33TyR?t$mkx4Ax`|n01Ff}A7((DbH1gi`oli%T!G4xd@szuwd?XnHU^cuvY5fax9 zRo+I(_Y!p)hejA9w#i2n)5}OkXZTbdow}3W%TP*Y#6vTr!2zOyafW#K48rg35gyQ# zcX3W3I&nWm#Q&V37l(Wkj6wUD3tRFQZaaR4&~G{@7{^?kj4t51?PRhC@$|x*ZkPp@ z^EMK99$i{@C}53>9YU8{)Cr2I6&|6KHk04hq2DySPEgKnQBIcmAMt3E?tz1BCULVC z2&vc?%Kj`g5=+m&lDFWB0#ujm2pmp8KOi2`)45Hp+t^B<^9coP0|C!d>VR6gZXePm zq41PVhy_0|g5#-|zD1?DfNE(0N2Pfj=uc7BAHz6$1LJrJ<-JAh>(8Lw-IPHDVi&i5 z$lq~=p)s$#pV7#K-z(s^n`ghIKM4i;c3Pfq2ko}={{m7;SgTyrHB)Q}VTGcu{RNk9jzuW$G(SR^X(^Pw7vO~EGI#Ur^{~*%W7yk? zCKz3_!t4fE20sOZLBl>?us=www^IOqGqSD=y+5wdDVvjR$MPOZXu8eg9ul-zI+a!K6p8^_t1 z=4@Mm0M&xjTA0I-6wGNX%M`85>HPfp1I?LjE2Narq^JlWXjUSeY^&pL5S8cs&RUCo zZ`4*L@p_JckFf;o+D z3zdwx8Le)VDu@VUbRrbhjo0hJd7iYrkn6_B$A8$IydDp3d*L`v^7HYcl}e96O3>Xo zkAuB6et&*(YmMu4rcG}96Q7-5zdPoW+kHnw6!S!cu%c2*W!rZwE=tLKy}wu(3E{jh zzTXEV=XR?sOXRw3%xO$B_S=SypdXI=q!gvxpR5J9+r}J_RUj#5lYMW9#Y8qxU8J<| zwP-gbsc>D6O~{&=)6k+w4sLrvMRA`lq b!UO&XAeL}M`ryf+00000NkvXXu0mjf(6KOI literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sapling_acacia.png b/app/src/main/assets/blocks/sapling_acacia.png new file mode 100644 index 0000000000000000000000000000000000000000..840196dd7667c3b061caba8f4eeaf134e2e806ce GIT binary patch literal 305 zcmV-10nYx3P))7v)n?5?TTOmFA= zc{9zd5FysPRm9(hxIeJtLl#a>IG8DCpppBw|i&l~Eu7!~g*qjRXXj zsV$cyOSU_f0s!UPeV&%VJR^ieAP9Glg7VzymW<+H8wk#mPbCPp7dlCc zfiVeyz(XfMsrzS9iM0m?fS5-jK}bG&B4Pme$UC85zs^#A|FO2x-IN6Y$_DUr{-zZM z5}Zct{{VolfcP%}3#B2Eg^giS9X&e4#1(I~x&O8|tCp+80}nR{00000NkvXXu0mjf DMvQ&X literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sapling_birch.png b/app/src/main/assets/blocks/sapling_birch.png new file mode 100644 index 0000000000000000000000000000000000000000..8731a4a51982582e7c92ea29b3f9a1685b1f2587 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?D8sLo7~jo#e>dU?9L!*u?bj z1OvavgGNpt1!nd=0*w%hrZdZMaa30`%na(|gm{%SC(W$Ta% z`LX|W#~lZSy65v$p6+((DLE-ok*VnVwdQ9 zZpT%Ya?W6zpzYx`^+Y54qRzhhFGpCoeJ1fXsH#OMOqx1z%if9uaSW0SNt2fdE{pW+ meY?NKMq5Ig;pYt=CI+iVohr%F6F7lBVDNPHb6Mw<&;$Ue5>Z|N literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sapling_oak.png b/app/src/main/assets/blocks/sapling_oak.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4fd1f7b8727cfac9761842023153eab4f1edf2 GIT binary patch literal 278 zcmV+x0qOpUP)0p z{PR@L!hHnl1CrZ4RxUlHagxO~GoVkVZ{q#DaZz;u*=5=)Np-)TxKlB=JJPx# literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sapling_roofed_oak.png b/app/src/main/assets/blocks/sapling_roofed_oak.png new file mode 100644 index 0000000000000000000000000000000000000000..b7f5f3d52d7e8f2d119866df145d718f4c28bc49 GIT binary patch literal 310 zcmV-60m=S}P)kYBc2IbLFxduxY$wZrf?z#x7!czH0IZeA3tG9o=Kufz07*qo IM6N<$f?yeN$^ZZW literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sapling_spruce.png b/app/src/main/assets/blocks/sapling_spruce.png new file mode 100644 index 0000000000000000000000000000000000000000..a69cf1abcec7f0adc279e63095dd6f40ec9be1fc GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vpiiKLo808owSjw!GOnwRlKlN zIOb179#>t{?9KoG%THC0;arqix=A1?>Rr*!C9CRck7f3p-go5ugAHvSYIYNIisg4N z(_>ejzUrmjmd*qJb|!3k*Py7$bXk28=RF1nwKeSh%RVtiaOpgZWxQ^&N~=4fZbx!x zDYxD6%FM+XQj_#d*Nb^cXZY6aoob|eyF8EEU-TYd1$)ySE%_VeO$&S`-u(!4C4;A{ KpUXO@geCwfU{Nvv literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/sea_lantern.png b/app/src/main/assets/blocks/sea_lantern.png new file mode 100644 index 0000000000000000000000000000000000000000..0f664846725e6a47d9e73e1ec00b721df660232b GIT binary patch literal 3031 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 Z^ZzbqiER4dz2N`=002ovPDHLkV1o8mtW^L2 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/slime.png b/app/src/main/assets/blocks/slime.png new file mode 100644 index 0000000000000000000000000000000000000000..c577a5a9e26eaf2f34187d30ec75003c6eb01242 GIT binary patch literal 716 zcmV;-0yF)IP)F zfB>p3gwq0|v0|~#qBV%sLaKp>n+L>e*0+UYK2WIqe*Kx3_|DDU2NYno4woIl20{pk zQRq1ju!7xKf{k>KTg<3vjAvLTHnKsB0`H*93^MTYyyx`mh}8z&b`2?2PV)&@h3S3a z@?ppB<_hOFEK8uN9`&}6CQVmcl0?SyN-iK$J*Atl*^!5W?KOF{ly`+(CfsT{4>K>r zE4^<~yOx{lJLIyWE$F~6V#@sY^vv_{jT8f=&giZ(zAbodQO*$S%D7ClcnFmkAiRTA zWiU~JGgQ&UbEWAn@FE=36Yu8(cekJTkm<5=`aN(JfJvbdRx&4!Ds9m_Nm z(n^krQXnlAQx&KAgw>WBGsZej&m+YIBva5@aoJv>7Qt$dG@!EP{`!$gMzmvl550TOVk1Cis~y$6v0$F<%nrwl!c-qW@8YGC8!zi zJ>$IKJ)|{Ym8D2wdV6CIGyQdgQ66O!=4|&IJ%`~>d+m>?~Y3ZS_Xeq3>mEJbQsqp&!fN~&l4wz0TQ4w_F y@!=zRgrdM<$vIHhN^A>Vuo$h$6qEtw75@W+r(Z%KOD4Af0000z@qLo81B1{?A*D0001zyIaA zLlw^XhYEZz8XE?-IB_@S9xYf`Jt1ah%*@+-&!5cMz4qEEl|`)K4OY7!Y--dExET9$ zN=w1h&*|TM71@q66@9T2)oA5=a?eU(8K1>bSq_UW>%KX^%XJO;m{+`T%LA6(7bRV7 z0wrBbCPyTA9dC5nyld0?#WI()WV7Y!)coSF1-_c>IZ0o)=xP3qJy~8r7czLd`njxg HN@xNATo+UY literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/soul_sand.png b/app/src/main/assets/blocks/soul_sand.png new file mode 100644 index 0000000000000000000000000000000000000000..14432801a259fb2d9c8e7ef286e77c61ea8e8660 GIT binary patch literal 633 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 M07*qoM6N<$g3|0;$p8QV literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stone_diorite.png b/app/src/main/assets/blocks/stone_diorite.png new file mode 100644 index 0000000000000000000000000000000000000000..3d752ddc10f0e931d28827521c1db1892e1aa471 GIT binary patch literal 613 zcmV-r0-F7aP)BM7 zR@dNWeIEB5oP9XC_wIb1IWudPmtV-iL0Q`Ej#MfZ(bsoJZ2P0!-29Q1m9%6suViNC ziDa{H10Mi3Gd?~gdwU=FA(2=h8jUj=kz{MDB=!1No&y8-WNz-c%+5ZO!NDQM7|jG6 z9v%~@1gx#SmRznV(P%92!8gzQE6rx>HUTOk$n(5_nkKls{4S}~s&qPCVt4nwoSf7M z^)bW4_ocu8E(6Qus%&q+V+)|4Or}^JIsu@Mb^!##W_rD!a&^@sJp_lt5lN>r{(VQr z#vaj8=|gBFf^K+&wb5#7h{vDG(NRSrk*G{gK4vn|cO1vRzhq#yd%>dApin5u=xB(v z>h*?fZsw>s=rx;X;<}z#)@=a$*YP zM(3T+=h=c~)%?nB&KWi^8yR`Px8wXKz(#k6Ex=L5R85rC;$qTgaLm4Sgqi@SLH|eq z^+8hu)d>k9q)r0FE~=1wCNH6tHYK_1pFJ59;IZ!7m!7 zr^B+o{zfJyrsVv*E3sIdiO`nPRiHZl2Z+rnz@bnmGC(!K9ZLi~TCHzVt9@o5-uOG` z=M(%Nf-&lDqer}TWW{2M$&dgxy!ZFZ!8ZN_yeS=N(Jx;@00000NkvXXu0mjfs7xI; literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stone_diorite_smooth.png b/app/src/main/assets/blocks/stone_diorite_smooth.png new file mode 100644 index 0000000000000000000000000000000000000000..daebca4b4921ca110a09b26c3b105d78c444e556 GIT binary patch literal 560 zcmV-00?+-4P)?uHEi12@|}%wK%BNYAcWsptQ%wf>MU;@L_mgT3RLz(i{#a2d2|mX148T zmhbn67%0j>AY_UF&63Pg8-nBU8*(~VC*;4pG!z+puXmp`bQ%Hj07dur848C@3WbjN z4H?Vj%I|lH1EpNXuBftNLLfppGc&W3Q%I%KOeDR4 zWPrs72FY-*6o3FSyWK8lIXyk&`q2y7jlDfD`xqe%INYleWNC291VmLbnWkWHJZ2f8 z5X{ZZlZLeg5E(?KEEPci2~mP<>e|{mY4``mBfOz(HqXt0%;V#ei4_+@x$E^l$S}6Y zdw@&Sj%<+IY_=v=SP1^^0MzRG=D3Lfcs#otAo66LA-`UKr9z>sdQ~b_X<=cJ7fr)2 yiEg4c*woZC`!IYv94kz27(2?}*wDFw!2AFoP$wRMRNAQk0000Nb8x=d> zUt5arl5_kJ* z8k6Qt*cL{N05D4cl*%tK)`HyR5JptcpL&#Z`LvLlh+6{d1k&pMeH&I_oYS_dWm_be zUA! a5q|@(6l|WCQDC+J0000I zJxc>Y5WOE|At;FW0V;}LL=htq5<`$HG+a=S13gjUln{a9>DRpWRDB?5lG@KiMPu5dXM~TyCefO#uQ~ zvqGoqb7bPsS?_q)nfQ?NRNdnI?D~wtrD+NV59jQZWZ9cEc9*g8C2R1t!wQ|O&E^Q; zNDntCZIttb(Pcq}6|r92bWPs7H@p@KNXOSCD!>;sZoJVx+Fam$eSVSxkl{nrU2t}D z+Zc+##|Vbzg{wIt)$HOI^ND5zcq&~T_LkUr?c6@Gf^5uzoe{7#>q4ULid;d`DlO*- zr0Q*XwLqTCk4yX#o;F$sr5pi*T0HHe9d~x{ZFk`XcX$LyRlhw@_@dEdY9g6LAkfe? zQM$9QjekOdG)3>yQL8W6TPf%TMVUnTO!yqW`mp*hp$jvD>f#jtD%k$a1kZ)aFeHe9 damm3d{y(9AbG)FxQfmMJ002ovPDHLkV1nmP#h3s9 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stone_slab_side.png b/app/src/main/assets/blocks/stone_slab_side.png new file mode 100644 index 0000000000000000000000000000000000000000..76bfc80a09d593654b97231c699ce46729a2fbfb GIT binary patch literal 271 zcmV+q0r38bP)Ja8)FFW`BZH=DSg z3+$VAXsM5{q}9X+^6z&-0(bZd^SpivoPuH%DiHZ|%(qxgR+S V^apRCBb)#L002ovPDHLkV1i(Daee>* literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stone_slab_top.png b/app/src/main/assets/blocks/stone_slab_top.png new file mode 100644 index 0000000000000000000000000000000000000000..2306090fec95f83e38fe7b113d8f40c5a064231b GIT binary patch literal 252 zcmVO}OlM>)nY}zfV&-}Tu(twP=S)8(zAln?Tht$HZ^P7)d!8_z~s!a)cFrlz|U|{@sT{Ma-Q50000}#7ZZ{4ZhJl{XC*ALN_5eJi{bK&>eY@Rq1|;~Uj?o4Jfhe%w@3~Y|r9B`j zj0DpQ$tF6BQ$emPlxobJ_E`JAKenJv^wq-L1u}sElZQ`qW%_?XoI#)fWy2uQ8NPsQ wMNzQ!X_~V3;tzRaw5}T33(Mtl^uYA)4{lX$H!WXVa{vGU07*qoM6N<$f^Vg@n*aa+ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stonebrick_carved.png b/app/src/main/assets/blocks/stonebrick_carved.png new file mode 100644 index 0000000000000000000000000000000000000000..506a22062669d9ea62b133fe6b5e34cc4394bdfd GIT binary patch literal 413 zcmV;O0b>4%P)Bl9oKc8-EKE~ zKA+aMt({IMzh19bYntW_kH^FI`@J2HM>`x2HX4o0@p!k}_1J7SHk-|Cxm@<(47S^C zkFqRnJRX}PBOeV0gMR^{EXypM^ww>i-GLc)W;fC44;bD;k~6Bte&*%Z@#RaLJ! zsO#Df3ZAGe(tv!2P#nd)olGX?kTDz%{ehyW_X07+L+Jho<3wYFNeq+800000NkvXX Hu0mjfbTqEk literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stonebrick_cracked.png b/app/src/main/assets/blocks/stonebrick_cracked.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6745577b13cd76752c08d762a9d6ba3e38b71d GIT binary patch literal 469 zcmV;`0V@89P)!C6vXU* zJRWP@(UE|Ghs9!1yX^OSnayVEE0s#$$Av;ca=Dx&lSy%Ou%IP^-EQ|&7~ro|Dl(tX zWwBUDI-M4WHoDOj@DTX23^aok|Gi%C!vF`>?J-Qc-R_TWfDZ;{!$fB=olYf{N~tcG zG#U-H4a?oC2>1P(c_GYuG9UhN|4h{X}{BOtEgek(5aboxTeeDh_TdfthgVO@$ zq&jy%5Sw8l0ao}Kuz!_63;1-b0RQE3StT$dTQ7j=j|9J(1?frwCU1vh%uFuL$a5q@ z4cMBXI~)$x4#QAtwVDhD1KmB+fUVQ{drc$~3fr-P1G3_Nj2n3aYBFO!3>^x~W(31wNvNYhmRcH#r71_e@+$%OwvBfe-d3*)T9cX9^4#UH8S?a`T= zBQ>AT`IW}qsV+oQ>*=!w2Fg&>dCf9;?GI$#o{$1JDFCF&q+!x=8YLdk>-EUCZBoq3dXm%1(~&p?JMsXX~oL3G=sZ^ZzvP?%$Dn_m;i?+Bjs?dq?EDE^W74 z3X&^YtyY|Y^q0kXx&L`Zh=3A~7dP+Op2qNqmF{#p{4ySZfVcxp!2u-->)iYW9|KatVPG)Z00000NkvXXu0mjf{L%ka literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/stonecutter_bottom.png b/app/src/main/assets/blocks/stonecutter_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6c852c3667541f4b063c8fe383bf6c28e8abf8 GIT binary patch literal 566 zcmV-60?GY}P)#nY@no+&Kzr$j&NSMuL7>!043^8rbc2D0R$fwOUxM zR+vmCsCZE>ml26XkV>WCa=8!+h0tg;Bs?CEokmxg_`GuG~eWC=(_ohW>(q zGVz<9xAo|}oloyKSnadde%9LSdCnG0CKDM928Ld*C#_aX8jXh3YBfVHmy^X}A+Zje zLZKj|(MUR-jszT(N+pU$qm)Xe$l-8MC={Z4z0PpE-OOh)8D4Q_x7#Tg41NrhN+tRI zermVd6bJ+;oletkw_|j>UCL&&4#P@wgC%_}bF77!J#AaQfA*JFr+)oMk@oB#~vFQD+76E!~pu2X@S SrEW3+0000X*BFQC}gnXoNHw;mxjG2wwhHR8l zvST$VeM?KT{QjM1I!Es>W4^`Hdppl_p7)$1+3j{%EEa~@Y=+Tjgu!5dUaw~;l}b3B zPKY?VQ>j$2TCFgdOpxfIQmG)BOd^-d!Rz%R9*?8dYB7SrApU%OAeBn-dn6Kp$KydP z7JCS&)oO&pVf1=EM59sU^LZ>53r49_LOPvhf#2`%D3{B;FBXdkg+lCBB1?3jzITCFA%U)M&XflMX?O3q&(tK=XM2%u0XU@#ak$hIH}&{=@$BWbl-xZQ59!TQHn z%m!bONF?~L&&1(y_|KUVvw%*g!{u_3alKw~I-RiF?c_|a4(NMSP=!JPNu$v)@o+dW zX}w;{@cDe7)__(jyu;yuL_N3JY}}UbwG4yy)R9i7!@=2XRwh#MsLfO}nh(kE_hUYv zV=|dw^RtU@Z&7r+UEJ??#&kO6b-7%!0L9*JH(p&X*F&J+@3W#1pf;V)XU2ZNm-plG z7~Aa@$K#PXJO?B&8ja9yxACj<#sbx9m4k>xD}jWbK`wa`g}`dH;>?8EZ1x{PxDX%? z4WUGpCN+`iH5;9U?dP{2F%19!002ovPDHLkV1i7+Z{{z& zp}(_UYwPH~cY7m))xKw+eb?S+t#dS=&j*jkBXGOja5|lEI2^Fs?EUq1XimR@pv4K zMgz%Y68U@{qtQsvY&KCS6p%%b|2%$nfqDhWCI?TsG50i^NNxN%{fU7C{}DwoHs@0e46aq8SBod~Z2%g> N;OXk;vd$@?2>?>;Gspk{ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/structure_block.png b/app/src/main/assets/blocks/structure_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c4202b0e16e0bd16202585c030af387e07a120 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~OcMMo(yA@V^MOJVC9V-A!TD(= z<%vb93~dIoxCe|nPd1Jzvcba4!^@LxOmG;gzkfQ#lq-Y2u1*NLsv zaNW`GG3T=LiUYnoWZJiXQsI6kbTIKof4Y3PYMVr|?EB=sae4Kfk|rNG6ia4Z3VHrK zN9q1&2?nWFrL-kc>94BwKXN-reA1r%M_}i#rV<9;=`mTA;;VJzQ+{4j{yw4B!C2|s zgsgKc9{pdKFHDHczdTE*VQqf~L*A`?$9(Pu&#$LHvuU^%cy3p8gWk2@9nWJPab4)S zBDG~tVKZz#{B#nW7WAJqK Kb6Mw<&;$V6-Hqh{ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/structure_block_corner.png b/app/src/main/assets/blocks/structure_block_corner.png new file mode 100644 index 0000000000000000000000000000000000000000..50fa2ba9ef07bbba72619b60765fc7286901b6d0 GIT binary patch literal 494 zcmV8ha6}LjW)jj~2 zd6S?&2tcRX!6+F!`N0fA;Sj2*?DhB<%zBu46M#ac$Y9o!IT1HXhQv<#3kV0Iwx(&e zrfIhIU`c;FF8the?f~No2cov9EZCEJ0)VrVa{!jgHvpsInEBU~jGmELb$|Axo*;4+ zA)C&wx3$SxWs9d;jf|cl6-)8aYOe^)yh))_#Ov_^kWFVv+$MI2n~zPok3yx${mtEm zAm|Uug^9MEOj)WDClpegMRtfyoJm!ovuIx|%*p1TQ;F+zI~xL{WJneEXBL&K&(-w- ztrV-j)i(s&HX4qx%9fm2R0eo?ZAx6@y|L=%m_u^H$PT<7pBzP;^8Rn^pE7_euE*`a kJQJ**$@QOiUj8ik1#_0lF%FiDKmY&$07*qoM6N<$g5X}zy8r+H literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/structure_block_data.png b/app/src/main/assets/blocks/structure_block_data.png new file mode 100644 index 0000000000000000000000000000000000000000..228e20ef3d8134ca519607186189ede708159670 GIT binary patch literal 509 zcmVzGiNE^&&^AiWZ z;gh?{0r39uj@R{$-lG_DU`5H2itV06iSG!K;(snoB*`efCcV@t4;2M3)b#! zr&_g^e4@(U?sovF6iPbyuvEE_1igUKbPPcA{)zEyo&a)JIqf`}!sBz}D7fCNW1G$q zR87d>Ol8!ZRffYB>diU;gZ2Pm*8+MsG{Eb6`zd4vSV_+c3Lx@=mfJ$EB;h1v_&WTh zh23uly+E6SUZAI=^z!y{4Dh-h;Uq*ZByuGgO~*v>k|nvRhxiCiSv57$})Y}3(@ za1x#rrtE5!l~T8Nx7+_56C}r!I_I1>-y41asv5l?+T?&e00000NkvXXu0mjfMG)S+ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/structure_block_load.png b/app/src/main/assets/blocks/structure_block_load.png new file mode 100644 index 0000000000000000000000000000000000000000..c44009cf80cc90c8d634ba23f7f0ab783befd522 GIT binary patch literal 561 zcmV-10?z%3P)X89mF-kjS81~0TW!fG`cmBoBzkUIr zs-0=1KhqO{7zpYYbpW<6Tl|@S6weE2*bS;>W>dGwiwrRk08Hjn@*-2Q^4_2M3j6l@ zPQ|XZWC;`lLAVTwRuQIdG4h5-WZkPScQ<#c8dJB>4oeP~AxXLcVB`&PdJay{QAA0) zAzX&48emTV5UnEBhSPI!y*{qj$LTqUfgmq3qE!UIZRd9P$gZ_yFbT^o3BdD@XH4Bf5%@Fz&wNAjRmNmKRm7#=Y+N1*3D_&~ zZ&EJBbSPz0x2Rm-T+9DiCfF@gOV0jo(w zK~y-)rIWEs>rfQNe@z7k2_2+CBd-)eDUz-D*7p~@DK64IWa!ZOPH)PbAw$TX&4NQF z!O2ypSJ3xdO27!WI+RNn;n_Eo+*mS*dd73k_nq(KoYUy{`%9x~Fn?U|k!bC10kB~- z4etNm*BSypptIKjAb-dau~@511qX)*Y?PBN(?+U-zz+Zj(+H^wT`Th<7P@!-xWK3w zSK#Svs;32hum+sYrUZVViGhls1fO4I0E`AhoSuWza~KVV0GwZBnxsYmkc<k!rcIbeOztL?>^U&6Td+)<{2{LhL@cy45eu@bOp}!0 z>?%XVLR-zB^121j^{`BvWSnRv<>X|XV3{_a>j4m-#Q-$7TkT(q7sciECGHQGon4EY z+Z%rWxnyd&=c8y**{iv}qiFKVE+3nPBxy gjjz1(>%Uk21A2PtAxs)sga7~l07*qoM6N<$g1$TJO8@`> literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/structure_void.png b/app/src/main/assets/blocks/structure_void.png new file mode 100644 index 0000000000000000000000000000000000000000..6b73c3ffe42afeb0aaf8a7701fd9c9a5913f43d1 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPgflb|Fzwo^5`XO+X=APZ!4!i_^&|2?+*i3m6Ox1321N zGya#9IQJ(#!J@g_e+svRq=e6gjT=`;_gw5ayI-Z9u}Xn&qk%*e(Edv&_$$k{zYGN$ O#Ng@b=d#Wzp$Pzn2s4rZ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/tallgrass.png b/app/src/main/assets/blocks/tallgrass.png new file mode 100644 index 0000000000000000000000000000000000000000..57b5a5368e72e96dc56af9edc51ef866325d1e36 GIT binary patch literal 363 zcmV-x0hIoUP)p*^U}PS@VjW}KzOmN`f5ll>t&7OD6Idi`@UZR zP1A@!1?d&g{ub;w&SUHQUeEwQUDrZ~@gG3|OB*u)fXyHsMu1*LRaL)9=zLw5=(+4Mb<3KL=XgqT~A^RkO1@q zMPN}B@{D$dVG!%O%0vL59phFQ$aV;0E4rQ4lx6t<*yDMghH{uF9h&F4ng?1m9>lUN zVwxr+qdq)nk|e6NuNQ?)Kpe+XajnpO-wnIE0WLTm$04?DGfMw_K5`ZWpaRap_x%Ur zx~}j%Pdyl(5p3JGx*eRU@R7kN3r`pj{Di^*TeorJ8^QRG_#X^3rjOI$Eq$yAt#ebw%hG&v)Kf#Rx4w?&ta~` z2L}gIzrMbvX0u7iBM1KZ`T5)Y`1n}X0a1gdhFA~&>+35e5(zGs%Y1oxDfM75D45A) z7~Ep9C~+VV5RAv;>~_2P>gtLbjRrvzdg?|%+AgZpPrt|yi_U?V%!J%l}@M0=kqZJ?pD1$Ld|G2 za-~ucPdI;}P>?wg9+d||9{l_Jdo~yh48JcgFQnds)Z6X0^Z{=RTJVQHV=wS~y&ifl zsMqTmbBxhwgztcG*U&;gpo=%D?w4Avmh?sKOE)(+G@s9fr_M_14ye=VNL;Jc2;UF1 lFy8B8ANU2Lx2m7op8@^;`DgpD?w9Vz_s{>n>b`A%q5s#$gGK-V literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/tallgrass_carried.tga b/app/src/main/assets/blocks/tallgrass_carried.tga new file mode 100644 index 0000000000000000000000000000000000000000..a3df3d2dc180ed4d5eda89e43d09eac661cce4d2 GIT binary patch literal 1068 zcmY+ESucZ85Qa}&xpYs^jS_^m8pKvz_^h#}Xtio5){sbCxDpXdEFoNof8p;PeWsl+ z)#PN(nVI*UnfII2m@1>c8dGB$t37LjHn5wp^@}~WZaOTsb}DQ+l|JtJZb{+!>6bp~8!ZESNgF(NEP2e%H$ubkb55`>zRc~(3|RVu zhg#%{j>Yc<9^H6@kG$q3*8NeC7`kfTnx`}KCLaq=?Dx{`9WD7@U3V+eGyL7}1w${~ z>6t#kvonh4jRx#6hnaOA>Tp;6n4|rA!H`2w=tT@4Sn6;Gqp?anI5>0;)u8uh&z+0@ z6$6*sZyCpK!J|6{7YF^Y=m!RE;f;Q6i635SvtwY{F~vqdH^rxT>T9f$7azP>#p}Pp V!rWqV$(eU%rrXmgXENDg{s3+|f4Beu literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/tnt_bottom.png b/app/src/main/assets/blocks/tnt_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..19382389dd684700fa017714993358fbc092af18 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`=AJH&Ar_~Tcf3{lD&H19qvMbI z)bk8UU%q~A{OA&U@c)uen&u2ocm$Z+Jf9l(v>nWl=xJk=U}n$_){@`HrKSQjg2B_( K&t;ucLK6Tx7bD#O literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/tnt_side.png b/app/src/main/assets/blocks/tnt_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa1ec323df0abceee83e3e8a3bbdb0b107264b3 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLo7}w?|7^9_5YH&KmNZJ zTl9bWY>xlxQ_nL9S!5{xt8eW*@xOCd(|^yW{M^iW_y6%9etvH5@BTCH;>;T_{^T)W zWMgBqVDom!oFU`G(-z3nkT}CB<>-wgfnOdNGu%~}!?q@Vzg$n^q!T$gY=^Hj|2!d+ zljBsxbGyN_sBz(k|9QEM|3z2TfQ)aSQo(ZKW(wa&agT-&I|ixaK5HJ~Y;lfl!~ K&t;ucLK6ULrC6Q- literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/tnt_top.png b/app/src/main/assets/blocks/tnt_top.png new file mode 100644 index 0000000000000000000000000000000000000000..e8023a73f542e69ba20d7fde3927482d74a75e08 GIT binary patch literal 237 zcmV_W0AOpJ2?#INIr5F`3>=*p%==vy_R_0FAaO%&TSWmoLXzQ z$Mw{9@gOLrd;|zbL^t_P;5bx<9GNb_5JKcJ_@e^vNdaVW?A83#fM7Dx64fj647e){9XJ@6U(9=I0E nJ;uu1M*M+_00000NkvXXu0mjf DU9p>E literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/trip_wire.png b/app/src/main/assets/blocks/trip_wire.png new file mode 100644 index 0000000000000000000000000000000000000000..f2139e471d6d0db4e579275aab4d3a2e3741e2d9 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-@o-U3d z7N_6#Zsa?lz~S<==5AI(ym?JpbY_4>B_q~JG89j~*qgH>vCo3oUZ>?$g z)t4K+l_o8S;3{Yh6j(oVX(UrPL!{=@Y0ieT+h)o>l-?k}WckzeR;=p@Q(xCLAE32H*L9zPzVDMwHb4mR1z45^<2dF6>bk}- z4B(uDF@~mT(6((pfVR)`jA@#Zx-lkYvilkjcgE{}L-9Gq^@OLtlmlp(EQ$f7PZq_1 j!x_*Q4rM^we`W9nVD)lmxy^e}00000NkvXXu0mjf3+{Ewh-iB$@SKvEU1Cqll zyfN@IL=Ef<6cMeN9SUv)P;@0gBLg&C&EVKD&Ot#M>`SUs0hktQv^gcsig>X=Jla4r ltKkjA{k8e_2kL<$kUX@BKV#?icW?jz002ovPDHLkV1hbgV157q literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/vine_carried.png b/app/src/main/assets/blocks/vine_carried.png new file mode 100644 index 0000000000000000000000000000000000000000..e691cd187b4f3f506d73c0a0b37d24b27ac466a0 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6=0JY5_^ zEKavhHWWJKz{4DC)Y3GmYvID@j5dvJ>>mW;>U)fD_AL6`n$2P7IZaeO$@2R3jj{9E zkL8Ozzh7&!@3|<$4c2$_gS}%kC$Q|@vv+xKhuMvit9gTe~DWM4fX=-Md literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/water_flow.png b/app/src/main/assets/blocks/water_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0985e46ed34479223140defd0e7ce2e22f2c448 GIT binary patch literal 5801 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/water_still.png b/app/src/main/assets/blocks/water_still.png new file mode 100644 index 0000000000000000000000000000000000000000..2effdf68c8fa0922e8f0b306dde84a636770748f GIT binary patch literal 5451 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 BYeN74 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/waterlily.png b/app/src/main/assets/blocks/waterlily.png new file mode 100644 index 0000000000000000000000000000000000000000..ec95d64f932b49e86a53520fef919ff148e7dacb GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr_~%PG;mfpuodin|l9& z{-4(ScLO?7W@d-qXlb}s5w&({&D}F^Bu<^vb$(y#)qC&G(JN8WO@iI-Zv+phnQF~= zXzsAKv`cYue*{N@aD#;Q57Pwk^56?K!3?o;>>8&xRkQzz$+;qO$jNEzOU^@gx87rX jw2R~aA-*G8^;?8*JVA4Ti=vt~i&pUW~#*EpCNptSZdaJqmW!lGp z@8uom!ugD}FI3(LeWvhj<c3}xqI|yd{QsVsyms1GHr3<$0lsJd#3jl?}~1gUmJIv z`6hF?{^3mr=VeMU$$RI#x6d|vUEg+Bz;JbBlY|r_lZ%SbT2AR=pluAEu6{1-oD!M< Dv^P09 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wheat_stage_2.png b/app/src/main/assets/blocks/wheat_stage_2.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2aac536b914bf51798493b475b463da6e2776f GIT binary patch literal 257 zcmV+c0sj7pP)0fhdEP)%YVV0U{09$c0_uF?LMxec044<@wK-&xVjV$^mA3 zZsz_k*2(uD-B96rY~iyT$>f>5|3%w*|9kD>{Lh`uiV$B1(THIv2)N7@{4Z1uG~^t_ z*=#`!|2?;I{}(6)x~7d6;-Z~gxWmNj5ZiyYK!*Qr%lQ9GP8I|!tUJK)pC^y)zw2WD z|14Gv|J~Oh*}MtnjU5n%=SH6YLN#3f?I#KTXN!hJU&VTc|7JD({~e|X{b!40_z$uK ztY-=jnC348y4G_G_kY0(&i`o>dH!=}vHs7U$^D-p8OIiQ3xFK9% z+XXbx8=6L}n+5-K=dgke5CLjTo51^D))yiP5)-mx_#fBA|6eJR`G0gRBwfTdK)eKE Z0|233hM(b#f@1&x002ovPDHLkV1f|4u@nFR literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wheat_stage_4.png b/app/src/main/assets/blocks/wheat_stage_4.png new file mode 100644 index 0000000000000000000000000000000000000000..adf3d430aa01c43148848d775c5cd915c1609c0b GIT binary patch literal 454 zcmV;%0XhDOP)!i91{ zaY2ztiCe$GKY3Ye?QsYt?yQ?{^{#h4-}|ja^naIfPxu?*ARC1n?Dr7mf#8iPKLaRt z-^4x4`lLG_zw%xa0_$G9kIzde?E~v~e7tZ=2&QtrfShN)i5FQSe)L9#tKnV8eW%zL zta?5JBG)Rc869*aL3s%m!Y2lJ&1m6M_xEoSIdj39)zNgwU=GSoBijbdxD(M!U1;2s z@vBdnWJzg`UTMf3RZ+FC0DCXA;H;R)^fgw8=~jh%qgdGv|2j<{9 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wheat_stage_5.png b/app/src/main/assets/blocks/wheat_stage_5.png new file mode 100644 index 0000000000000000000000000000000000000000..ada20a3919bd04764b09ddc18315bcaf01e714a2 GIT binary patch literal 534 zcmV+x0_pvUP)6urB%&br&oeAAksOFuRv$j8+OAzx%Aq`;zSbJJ00g9p`?Zjzud(;k=x==brC;_uLtxqk7!War~FT@a8eJ&FKGb z;{6Pxwbb-?2Dy)BL*eCG;tziGTLV+?hlUfAk)YwcJTBjJ>jLqM^xFY%Tf^yl4ff;K zWBAq3x=zTx6-Z2k13tH59v*4vy@mFQE&MR9kbo~24{^3tbL+%%qhw;>64Bk#C$hf*iIC+UM^iIHX2>T1< znz41-uQ^xyY!uZOafwgrgpQge1&=ogeRl=e$aV?)mvJPngHc)v8XkSnaQ-UcR!N|@ zYz7f}ZpX3k)Raa`&($vOzm6UJBP`-k7M>YMPv~-zNQ-hW`iD3IV=_ZvE%UXF5IVDa zU#GO9M5TuolKq52)s~ZRFJBSRI|*LdmRMOc0=~NtRR-Q20W(dwmKP9RguyWj`UPd+ z6nuko1c@oa)UsOM*t{)yX^@@tn`eDd(QoR6D5T{{R3007*qoM6N<$g15E!Jpcdz literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wheat_stage_6.png b/app/src/main/assets/blocks/wheat_stage_6.png new file mode 100644 index 0000000000000000000000000000000000000000..6913898f9115dfbcba7d431bfe7e8af26a72c1f6 GIT binary patch literal 562 zcmV-20?qx2P)^QvsQi(%A>C9L*~{T zcrfPtH$cx9{nCs5yPh2Xz~LpTfp^uib4t!-z{heyG&nvTe*5B>nDW!&k7Lx zYQvo+S(RU+s!tJ0*teL@$KP#d8L4AJ%Z!Hk&ko${mJ(S3zeIe?DwHI5^Mt=6?iKs3 zunn}lPhcbRUPEKVjl?$v{>QRX^pjgCU_hk-T}(@GaxV{_`pnR|uexD77B(CxtRc*% zT&U_*OhDN~!t0N!0K_)s^m$%&Lv{&ZS(QB&%&ofMf0B>MxQdE4NuT(jnt zv*39Nz`LXywLu#uVk&O8O9j4+yrC&ws2X{r3qWvEH~rOt%wOQ%OIrv7uQU|a5<+iv zQvoO1%Lz>#9@r}k(DVg>{qh@+$SS>~8k7>k^Kl)HyE54JR27LFGmhvU*0R9z2fj2C zy;7cX(@+vI_97V!ghfR(cX~wZPYYdxngFx?8>-g$!=;cn#277%MWf6Vy+s9 ziA9nT6+|EU68&jU_q=Dj3ue&y@}Bd&&-=X3d(I*H$C{0|gZ_6dB%8^r*&q&eP!pcB z_7N`5w4uAZnY{8exG&b*+svhxdEEgERx9r}KB%}f&>&ZelJhs_tnKfFk?V>qEa>R# zBW&z?5V@lCJ^YNNz%%WjpA9$d9rusk2)^XLr)Ne>gsn=R>!Igy9aZvrN;CN5X&F*i)fL*Zl)rDxwYQ4$ZZ zgSX$LXs)a~&ITW-Qefq^AEP-PA`T@FV*3Z-#F$hsRsBrNuj-r=h5T=x8SG3x-+M25 zMhV$vgQKuHJgaf?`FeoGL}BvJ8kR}1cWH#^SO9K6Au%T%+#1(eSnU4*eNZNn-3-8)00000NkvXX Hu0mjfMc*tE literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_black.png b/app/src/main/assets/blocks/wool_colored_black.png new file mode 100644 index 0000000000000000000000000000000000000000..8b44b8fed86c8db77ac8609ac739687b7ef8be68 GIT binary patch literal 380 zcmV-?0fYXDP)+SKU+<4;s{6XO_cRQ3 zTb3sM>(ye`d2Zr8bX_eH1biPy{W<0HOr|fV9WWq)!02y}N7KE<6bZ++U52lHZ@MaM z!02JZuUPcPKp@%yBJ6Yw0DF_fhiwVnd;dhw=%S8|FY57|ftbSBJ)aFA6(wf4(Zfs< zu=tC92s)6lAXur)o}SrICv^T2Ab_FH9v$oJ4#I@-KdK4h~?QI|x-t_kSU50H<&5c;_pPIq-x^-O9Nx6vLw zM144q=I|yu<8=&<-h%(F-TUYtzC?fW8ui{RnmhC89Xu&mHwIUcx}!%W?VSF^-t;$y zlXn$##!CgDBm%~Mt9urW;#y5R<5eUIhQ}XO!77UBxAt`5A7JeH5}eaa``lOzK!dh{ z+M|V}uty62SQE|{+q_Sp(3wOI0V2>`>z#`_Z201n&+&kqgq~V|mJ{wa9aUJF>wT$t z8TG-X!0-m92|WZ}fDH9AR_e@uX%^F^s1ta=c>ccK1T&XoUOE0s_#~kw!z-uuh_y>6nT9@Z3!`0|SWW z(u=jGz|;~8b;;d`(vyWW10oOpU27&rkfV#lf+AC=JGTvejL&aF-7D%cI~U_gGF6Iv zyF4Oj18m*pO6i5Q%33R({lJjmTL~DTkm$Q%Py7h~ Y0CGC>yCFW)k^lez07*qoM6N<$g3Nc~8UO$Q literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_brown.png b/app/src/main/assets/blocks/wool_colored_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4748d1f3b4c7764a04d62dc7736fdba6ee4250 GIT binary patch literal 405 zcmV;G0c!qry1Kz#0{ex+z{xN#7yRAqr#?>`1I1FX5C=lcX#!(7oV8$6nq+5(v2XN@S;zH_%ZtkPdYTlpx9H=~K~IL!9}bfWTWQ znL>gn4eg+R*1i}C!V-RgZlY_$k1w}jdJyKTv^xk?MSb`=Wlh3cj85on2MRx@en=l45QX>4ph~M%@h%cVT;mdTSJhNQgdjvhgosz&=3D2i6Mjt2o;|bItTi(y)i;KD zdiy%p*9WrZ{(WwrzGmHTjdJVgIk!(i=3L>2PMr9zw`X)C(oY0 z=|N-nR^~*&@W&Rqg&##5dv`hUpwoLV9>hiG@>4!lxC0EIFE%&$QZddH76Z_rT>0k2#8R{6UsLVZaF%1CD7(F1KK$fNw$jz~4DpAorBBpr%qv(OV>rpvL z%?pYiA7AK;T{&KQlAJ&?bm<4p;jVS~Bp~fcNgZhvlpm~g81EiJFL`75zis ztE_6JZf$CuweoQ;dcf|7p~ow0tyK1oAi-M+7|fBUO+=#~dc*KxMKvUPH{28dgul9j VCC#!$?y&#>002ovPDHLkV1ki9)=&Td literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_gray.png b/app/src/main/assets/blocks/wool_colored_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f3b818ec873f56d9241abed49276e060cade8a GIT binary patch literal 360 zcmV-u0hj)XP)@{T-Q}jJ^;c7m_NXCP~{FI1l~N4i9n4u#ype zm;!)~Fa!Jn3L=ohv1cneBYdqtoUW@e$V930Lf`EWk3<_l75XKRKY@6qPHPlIhjmCr zCa$M#1z-R@Ixn$i;0fECw7p1t?ODUnt<)izAayE2&GotoUKzTTx&x`Y1?f91KzU;M literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_green.png b/app/src/main/assets/blocks/wool_colored_green.png new file mode 100644 index 0000000000000000000000000000000000000000..a25c57de0bf79e7550e01e4db89a016be2eefd5e GIT binary patch literal 403 zcmV;E0c`$>P)h|pjLoDu>ZY;9>1KY2=QShp02MQCzem6a``+i7muTq zo86?`zMmHDtG8)Nw>?S!YClckjx9(aVEa8U_djRl?qinv_3NZuy^M!Iz|a@#qjLVx z>%;^J>(5y_F>Jo(sZ#|TV5wIo_$j8I3_ydnKnQkpS^=0lV!Uiax&+!k0_|>d+|S{_ zh7;=ghZ$g890CEbVpnyN)SZFz002GO;eiYb1XfhWj$fwS)$s>th(HbpHY8K2ozY)^ zXz*!#MyNwk>YUJ*9l+#-?@18J^h=;E00f}a(_VF04|^aJ9RE?xo!Iv_Sh%&pC9BjG zl`=gOtlzcf#SoV)hW;vbs1I55y&D%te#GUm)wuKWR}8+|iIX=M;@r@3 z3_RaXb3S!M15O62pAIS>pdoQBWa9 zb7$Yzq>hd6nZc#wxE{!9^qd&@9+w{dJVx}enp?gzc3rm?vY6gr+UR-l=`fq8GU^N~ z$nM24B?Wb+2jWd-R#T|vlx9c}t4CsN?A`BwJ*e)IBC(QCN3q7|i#~Rk*c&}*0xl$@ z+j-+#HpkuVx$P{ZU{N<}fX-Mqi0Bj(dTZ`QRbeb>c87&2m|Amy0*&bhHZ&`u2mi0N zi7`33NDdwqb?CN{KI5x@1A0+s9_vXfs#dhNt44&j!lhfxc=^uR185WT`>Cf^wzNX7 zAB=?BO2sfIuldtxtcSH>e5@dnSi4a@sh{vKRHeOtOY$k#00000NkvXXu0mjfud?wv literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_lime.png b/app/src/main/assets/blocks/wool_colored_lime.png new file mode 100644 index 0000000000000000000000000000000000000000..b37bb16c62d2bb937ee46ee05beba56de986ca4e GIT binary patch literal 491 zcmVq-Mb429=~ti5cz+iiENb#3b}3qF@3D2k#eqEHk?K@jnV^}*tNX-|KInapHP&Pg(% zcb!;q*S7qkX~k8`ww^Mp-h0M*|2DDVYi`wB&(h<%<(Dn1Ub=4Vv(tu!&F9R6rt`}7 z{>C=?DEz_TzT*Zcfq>yB`)ih+H9YC?A+^ARov*?#Hy%@){0`hF3ul12A6JZflCdYT zGXM?R0xD-6mx7NJ&e&s$hb?{p1u6t`2@rwMVI9Z_9Wg<# z`Yx&f`%Fa5oWX)F(6zuuSuhyE#@iJ^sDV1dJstC|%@z!Ubc#CJnKty%KK%{<154@{ zkEuxzRUT=&)FSVD1eR_uaBMF=d#?cxCqDz%qmh+XGV6o+@GPeiFlQd+1%4VD^-vQg hDP)v>%?0uLg#QCQC(|S>dOiRE002ovPDHLkV1m|Z++_d& literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_magenta.png b/app/src/main/assets/blocks/wool_colored_magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4263daf77731ae4d38c33a0114a6455f5a7d43 GIT binary patch literal 495 zcmVqJ$`7?iQ#VjxCXpaO7&YIlK14EVC;{n;(*tr0=Uu8C z0Al1vHCK1eD7jy+1Q@+RsZr1Pa_;X3AAyW?3{^1GBjP9p0O=S#AZ{RI04YE+YN!z= z7}X041H$Amq&M7>vtv zre59ur6#}tQZqhOFa@S&9D*fb!$MJ_CdQS3&;#Q5`I(7fe0%oR+#m`n1Z%49$S9#(2SQxjW83` lh5>{s*i^svBJ%$p;V(tdz_*X0v8Dh3002ovPDHLkV1lsU-qQd8 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_orange.png b/app/src/main/assets/blocks/wool_colored_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bc8477666ccc1e06d08f30b07d9c5468f47fdb GIT binary patch literal 461 zcmV;;0W$uHP)j%;xB^UO%Oq6#y5JCn6F+}GmFrjmrkWp z$t$Cal^74#V|2b8+$T4i(LLk9s-8{eln+IisBa%x~Kh?Fnu}feJZ677(ORPoMQT(g~b3gXd6iA zFiW3S_{QD9#KkuK0*a{eu=bD9^T+9YPo1PZq3$?$-V`o==!*DF-0HjMufakOR^x?! zFlmv1hFV4i}-anGs*yQ-05Y18L}UIVME(bP70pgjP*j*k=i zW~aSLEA0W3NV@ckIBMZ`OF#gcx<|_$)`g1DF%$J$=iaC$aMJ`W>LyA9QDKBx4YMZn ztkzP4*|mnDr=mr2f~kv9ZkxyJ-QYBJEm0<;NoiCw$=l@-L0cd*EA5r%E)7V;oZxlU zxU#Z;Fk0|d0;VO)_6mQRl&*>1Ft^esRCmLg_$T}ay&9G=GaLA>00000NkvXXu0mjf DFUZz< literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_pink.png b/app/src/main/assets/blocks/wool_colored_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..9e175135cc28ac5b11582f81228c6a80909dbd2d GIT binary patch literal 513 zcmV+c0{;DpP)?VkUC?bfUAX^kfLTN(-$&3n0q5=uJ=(;S)$`nP)7WymGdEOkMi{YEI zeD5+dCp;}|S~HQi$JvZE=Cjt$ltE0N)@fORuCu`0b_kTvS{_`v`E|Oq6L2FmoIh5#^+I0YgpI= zj5S~4>-b7!Fkg zaoFqT4h00DOUD|7(}+LX=WhdcSLj`#CMqHeM%1UvTZC+Y-8a_A33Al{HUd9BvhJ1E z`Hav7pGv?`j=jK3!z0Xkrg4))fKUaS`}euvzCXfW@Yw9k>_ut400000NkvXXu0mjf DU>5ET literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_purple.png b/app/src/main/assets/blocks/wool_colored_purple.png new file mode 100644 index 0000000000000000000000000000000000000000..23e1f92bc678944a9b807809844a24d89bd274c6 GIT binary patch literal 501 zcmVq?eE5C`zRq&&WsuO&ng7!+NElvrV=mQi689WW{oq(BlQQ9>yp3KYx^-qyr#WW*1{ zGrP0%^+-*;x^z@;)m>KjtwW@fXb&?G@~N{nH+s_QfWze8=y{*b zv9~a?n?L|dI%^2!W~X5!re>Xf?d#e_3C zND`MyI(E~@pXaN81A8f~SJ9JJQjO?I`8CRb%eR_b$h};{Citn5Ew7mC2lEOwmB1)x ruldt>tcx{a)>L6*v1X%sQa|B;<2Z3-5E!o=00000NkvXXu0mjfa{=oD literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_red.png b/app/src/main/assets/blocks/wool_colored_red.png new file mode 100644 index 0000000000000000000000000000000000000000..e445d06a23ee7a62fcad2ca8097a20518a683d96 GIT binary patch literal 462 zcmV;<0WtoGP)q=Zf5Cq_PoOQ2fZ|rFSVm))RVjfeHeysM7~i~6M-)vuFL{k5Fc-|Kn(JnXml{bJgTe>U#d@^e0INpHui z`tQTKKChSU!M9mg@1~RYL}1P*{a!sE4O-Ffo1Ego-@|1Kx_CL-Z)a890dw|cuZOEv zjIVHG0PWBIHqoQojgjI^3O0O}{ID%hRF)`6KQNj<4tp&b8xk%igBE9`$tm=F+UNq1 ziXNu9IrFhgKL9wFH1BD(t&BRuN@X;~F(rl1^gz5oW&uibu<=+W71JZJ-FQiNGa8o? zP}j^*2ZBC!nAjUVX$&%Rk531CtvT)<7F!^Ip-!5De5~L1AWQ^u-leJl&F-)u&D07< z71bC+mp+FD`1)-rZdk50=l*HP|1IW4+y0Uln)2_`YoO9pApc*R#Tv0kqk2 zxdZCl-c~7mQm}DmnUC#avxx!)6^VlM1EYDb(TK}_zp^2r*>2Z3BTY`BXTRBuKi%%G zqKDbs^qsM5oS#=P0N3Asq38AEBj)RMt&BRuN@YC~$CMP*nI4E2$P7>hBx6IPN-AcL z#MtWP<);VPT~g?EDFJoObcZ?+^s&Rl-snk@;DR1>_m7ThbKH#|9x4#Pq;Av-I@_J1 zB09;0-kf_<1&jsF?yw-u)QW>DsxkdQ-Kct?eV>Fet&w%ctypU*JP=X1U= zo6X|$^D~1=1ZH2URHD^tWzzY49?6Bv<&uMo#Uk$ad)}|t>wE^xe!t)6`FK3y_xCrS zBhCt-9S(;-pvh#Ct=O|djkQ_wjh~;NNKi=$$4keMUn9fKCLOykrcsFX2Bsk!Q+_$&4TpVYc%_ak3 zEJLdi8s1LANDd_?zoZr`Vt}bo6JS*6g03YCEZ9u-AYH34sew49F6&sWR?CX>Lz3)L zkxr4<$e;F=zk$6-H(XYezFE^=duyFb*lxF5_EVm0@v3!(8t4KW xdJl|p_L85*BW6K|f`F*P$Rd^HUC1w=@E>WZnEpcW?5qF)002ovPDHLkV1m=5@|yqv literal 0 HcmV?d00001 diff --git a/app/src/main/assets/blocks/wool_colored_yellow.png b/app/src/main/assets/blocks/wool_colored_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..9839e0007ee01b1b1ee53e11c4259c7a988d5b3f GIT binary patch literal 475 zcmV<10VMv3P)i#jkGiPR=d1iUb-g<8w zZ8u_TsV8<;d*kx38BbRuvA@w5hg*GdcQzD{m&36#*A?5#J#ll=tU}+I?~ZbP+^j)g z&lB5ka^OIGxJe;|s4_xsW6yf_$)&&TmJ+o-Luwc?FVG9KHv+tDacP!Y%pi0HXB)lsQq;_4%TY9oyZ=DH$Lb-G!OXIvj5at_W?w*|&DA zmrb|1BJty4toD;9o4u->H=>2SN?@34ulUpSs4{0>7$D#(Y7t=Gh4}mle*qG?ed6t8 R#XbN4002ovPDHLkV1kep-y;A3 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java index 83dc0312..2a8cb728 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java @@ -20,6 +20,7 @@ import androidx.fragment.app.Fragment; import com.litl.leveldb.DB; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.ActivityCreateWorldBinding; import com.mithrilmania.blocktopograph.flat.EditFlatFragment; @@ -217,10 +218,14 @@ protected Boolean doInBackground(Void... voids) { if (lsize != 4) mIsVanillaFlat = false; else { Layer ltest = layers.get(0); - mIsVanillaFlat = ltest.block == ListingBlock.B_31_TALLGRASS && ltest.amount == 1 - && (ltest = layers.get(1)).block == ListingBlock.B_2_GRASS && ltest.amount == 1 - && (ltest = layers.get(2)).block == ListingBlock.B_3_DIRT && ltest.amount == 29 - && (ltest = layers.get(3)).block == ListingBlock.B_7_BEDROCK && ltest.amount == 1; + mIsVanillaFlat = ltest.block == BlockTemplates.getOfType("minecraft:tallgrass")[0] + && ltest.amount == 1 + && (ltest = layers.get(1)).block == BlockTemplates.getOfType("minecraft:grass")[0] + && ltest.amount == 1 + && (ltest = layers.get(2)).block == BlockTemplates.getOfType("minecraft:dirt")[0] + && ltest.amount == 29 + && (ltest = layers.get(3)).block == BlockTemplates.getOfType("minecraft:bedrock")[0] + && ltest.amount == 1; } Layer[] alayers = new Layer[lsize < 3 ? 3 : lsize]; for (int i = 0; i < lsize; i++) { @@ -314,7 +319,7 @@ protected Boolean doInBackground(Void... voids) { String nam; if (maxlen <= 0) nam = ""; else { - String namo = layer.block.getName(); + String namo = layer.block.getBlock().getName(); if (namo.length() >= maxlen) nam = namo.substring(0, maxlen); else nam = namo; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/Log.java b/app/src/main/java/com/mithrilmania/blocktopograph/Log.java index 29732ff9..d32a3000 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/Log.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/Log.java @@ -5,14 +5,12 @@ import androidx.annotation.NonNull; -import com.crashlytics.android.Crashlytics; +import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.google.firebase.analytics.FirebaseAnalytics; import java.io.PrintWriter; import java.io.StringWriter; -import io.fabric.sdk.android.Fabric; - public class Log { public static final String ANA_PARAM_CREATE_WORLD_TYPE = "cw_type"; @@ -25,15 +23,13 @@ public class Log { private static FirebaseAnalytics mFirebaseAnalytics; - private static PrintWriter mFileLogger; +// private static PrintWriter mFileLogger; private static boolean mIsFirebaseAnalyticsEnabled = false; private static boolean mIsCrashlyticsEnabled = false; - private static String concat(@NonNull Object caller, @NonNull String msg) { - Class clazz; - if (caller instanceof Class) clazz = (Class) caller; - else clazz = caller.getClass(); + private static String prependClassName(@NonNull Object caller, @NonNull String msg) { + Class clazz = caller instanceof Class ? (Class) caller : caller.getClass(); return clazz.getSimpleName() + ": " + msg; } @@ -42,45 +38,38 @@ public static void enableFirebaseAnalytics(@NonNull Context context) { mIsFirebaseAnalyticsEnabled = true; } - public static void enableCrashlytics(@NonNull Context context) { + public static void enableCrashlytics() { if (!BuildConfig.DEBUG) { - Fabric.with(context, new Crashlytics()); + FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true); mIsCrashlyticsEnabled = true; } } public static void d(@NonNull Object caller, @NonNull String msg) { - android.util.Log.d(LOG_TAG, concat(caller, msg)); + android.util.Log.d(LOG_TAG, prependClassName(caller, msg)); } public static void d(@NonNull Object caller, @NonNull Throwable throwable) { StringWriter sw = new StringWriter(4096); PrintWriter pw = new PrintWriter(sw); throwable.printStackTrace(pw); - android.util.Log.e(LOG_TAG, concat(caller, sw.toString())); + android.util.Log.e(LOG_TAG, prependClassName(caller, sw.toString())); + pw.close(); } public static void e(@NonNull Object caller, @NonNull String msg) { + d(caller, msg); if (mIsCrashlyticsEnabled) - Crashlytics.log(android.util.Log.DEBUG, LOG_TAG, concat(caller, msg)); + FirebaseCrashlytics.getInstance().log(prependClassName(caller, msg)); } public static void e(@NonNull Object caller, @NonNull Throwable throwable) { - StringWriter sw = new StringWriter(4096); - PrintWriter pw = new PrintWriter(sw); - throwable.printStackTrace(pw); - android.util.Log.e(LOG_TAG, concat(caller, sw.toString())); - if (mIsCrashlyticsEnabled) Crashlytics.logException(throwable); + d(caller, throwable); + if (mIsCrashlyticsEnabled) FirebaseCrashlytics.getInstance().recordException(throwable); } private synchronized static FirebaseAnalytics getFirebaseAnalytics(@NonNull Context context) { - if (mFirebaseAnalytics == null) { - mFirebaseAnalytics = FirebaseAnalytics.getInstance(context); - - //don't measure the test devices in analytics ...Meow but why? - //How would a single test device influences data from all over the world... - //mFirebaseAnalytics.setAnalyticsCollectionEnabled(true); - } + if (mFirebaseAnalytics == null) mFirebaseAnalytics = FirebaseAnalytics.getInstance(context); return mFirebaseAnalytics; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java b/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java index 96f8e77d..eefd25d0 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java @@ -7,7 +7,7 @@ import com.litl.leveldb.DB; import com.litl.leveldb.Iterator; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.ChunkTag; import com.mithrilmania.blocktopograph.chunk.Version; @@ -17,6 +17,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; /** * Wrapper around level.dat world spec en levelDB database. @@ -30,11 +31,11 @@ public class WorldData { private WeakReference world; private LruCache chunks = new ChunkCache(this, 256); - public final BlockRegistry mBlockRegistry; + public final OldBlockRegistry mOldBlockRegistry; public WorldData(World world) { this.world = new WeakReference<>(world); - this.mBlockRegistry = new BlockRegistry(2048); + this.mOldBlockRegistry = new OldBlockRegistry(2048); } static String bytesToHex(byte[] bytes, int start, int end) { @@ -146,6 +147,10 @@ public byte[] getChunkData(int x, int z, ChunkTag type, Dimension dimension, byt return db.get(chunkKey); } + public byte[] getChunkData(int x, int z, ChunkTag type, Dimension dimension) throws WorldDBException, WorldDBLoadException { + return getChunkData(x, z, type, dimension, (byte) 0, false); + } + public void writeChunkData(int x, int z, ChunkTag type, Dimension dimension, byte subChunk, boolean asSubChunk, byte[] chunkData) throws WorldDBException { //ensure that the db is opened this.openDB(); @@ -160,6 +165,20 @@ public void removeChunkData(int x, int z, ChunkTag type, Dimension dimension, by db.delete(getChunkDataKey(x, z, type, dimension, subChunk, asSubChunk)); } + public void removeFullChunk(int x, int z, Dimension dimension) { + var iterator = db.iterator(); + int count = 0; + var compareKey = getChunkDataKey(x, z, ChunkTag.DATA_2D, dimension, (byte) 0, false); + int baseKeyLength = dimension == Dimension.OVERWORLD ? 8 : 12; + for (iterator.seekToFirst(); iterator.isValid() && count < 800; iterator.next(), count++) { + byte[] key = iterator.getKey(); + if (key.length > baseKeyLength && key.length <= baseKeyLength + 3 && + IntStream.range(0, baseKeyLength).allMatch(i -> key[i] == compareKey[i])) + db.delete(key); + } + iterator.close(); + } + public Chunk getChunk(int cX, int cZ, Dimension dimension, boolean createIfMissing, Version createOfVersion) { Key key = new Key(cX, cZ, dimension); key.createIfMissng = createIfMissing; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java index ee70fb0f..6c4bb856 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java @@ -3,91 +3,106 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; +import com.mithrilmania.blocktopograph.block.blockproperty.BlockProperty; import com.mithrilmania.blocktopograph.nbt.tags.Tag; import java.io.Serializable; -import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class Block implements Serializable { - @NonNull - private BlockType blockType; + private final String name; - @NonNull - private KnownBlockRepr legacyBlock; + private final BlockType type; - private ListingBlock listingBlock; + private final Object[] knownProperties; - @NonNull - private CompoundTag states; + private final Map customProperties; - private int version; - - Block(@NonNull BlockType blockType, @NonNull CompoundTag states, int version) { - this.blockType = blockType; - this.states = states; - this.version = version; - KnownBlockRepr legacyBlock = BlockWithStatesToLegacyBlockMapper.getBestRepr(this); - if (legacyBlock == null) { - for (ListingBlock lb : ListingBlock.values()) { - if (lb.getIdentifier().equals(blockType.getName())) { - listingBlock = lb; - break; - } - } - legacyBlock = KnownBlockRepr.guessBlockNew(blockType.getName()); - } - this.legacyBlock = legacyBlock; + Block(String name, Map customProperties) { + this.name = name; + this.type = null; + this.knownProperties = null; + this.customProperties = customProperties; } - Block(@NonNull BlockType blockType, @NonNull KnownBlockRepr legacyBlock, int version) { - this.blockType = blockType; - this.states = new CompoundTag("states", new ArrayList<>()); - this.version = version; - this.legacyBlock = legacyBlock; + Block(BlockType type, Object[] knownProperties, Map customProperties) { + this.name = type.getName(); + this.type = type; + this.knownProperties = knownProperties; + this.customProperties = customProperties; } - @NonNull - public String getBlockType() { - return blockType.getName(); + public String getName() { + return name; } - public int getVersion() { - return version; + public BlockType getType() { + return type; } - public boolean isOfSameType(Block block) { - return blockType == block.blockType; + public Object getProperty(String name) { + int index = getKnownPropertyIndex(name, type); + if (index >= 0) return knownProperties[index]; + else return customProperties.get(name); } - public Tag getState(String key) { - return states.getChildTagByKey(key); + public Object[] getKnownProperties() { + return knownProperties; } - @NonNull - public KnownBlockRepr getLegacyBlock() { - return legacyBlock; + public Map getCustomProperties() { + return customProperties; } - public int getColor() { - if (listingBlock != null) - return listingBlock.getColor(); - return legacyBlock.color; + private static int getKnownPropertyIndex(@NonNull String name, @Nullable BlockType type) { + if (type != null) { + BlockProperty[] properties = type.getKnownProperties(); + for (int i = 0, propertiesLength = properties.length; i < propertiesLength; i++) { + BlockProperty prop = properties[i]; + if (name.equals(prop.getName())) return i; + } + } + return -1; } - @NonNull - public CompoundTag getStates() { - return states; - } + public static class Builder { - @Override - public boolean equals(@Nullable Object obj) { - if (!(obj instanceof Block)) return false; - Block another = (Block) obj; - // Ref compare. - if (blockType != another.blockType) return false; - return states.equals(another.states); - } + private final String name; + + private final BlockType type; + + private final Object[] knownProperties; + + private final Map customProperties = new HashMap<>(); + public Builder(@NonNull String name) { + this.name = name; + this.type = null; + this.knownProperties = null; + } + + public Builder(@NonNull BlockType type) { + this.name = null; + this.type = type; + this.knownProperties = new Object[type.getKnownProperties().length]; + } + + public Builder setProperty(@NonNull String name, Object val) { + int index = getKnownPropertyIndex(name, type); + if (index >= 0) knownProperties[index] = val; + else customProperties.put(name, val); + return this; + } + + public Builder setProperty(@NonNull Tag tag) { + return setProperty(tag.getName(), tag.getValue()); + } + + public Block build() { + if (type == null) return new Block(name, customProperties); + return new Block(type, knownProperties, customProperties); + } + } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java deleted file mode 100644 index df9008eb..00000000 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mithrilmania.blocktopograph.block; - -import androidx.annotation.NonNull; - -import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; - -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Map; - -public class BlockRegistry { - - private int limitedTypes; - private Map blockTypes; - - public BlockRegistry() { - blockTypes = new Hashtable<>(1024); - } - - public BlockRegistry(int limitedTypes) { - this(); - this.limitedTypes = limitedTypes; - } - - @NonNull - private BlockType getBlockType(String name) { - BlockType ret = blockTypes.get(name); - if (ret == null) { - ret = new BlockType(name); - if (limitedTypes > 0 && blockTypes.size() >= limitedTypes) - throw new RuntimeException("Block types exceeds your set limit."); - blockTypes.put(name, ret); - } - return ret; - } - - @NonNull - public Block createBlock(@NonNull String name, @NonNull CompoundTag states, int version) { - return new Block(getBlockType(name), states, version); - } - - @NonNull - public Block createBlock(@NonNull String name) { - return new Block(getBlockType(name), new CompoundTag("states", new ArrayList<>()), 3841); - } - - @NonNull - public Block createBlock(@NonNull KnownBlockRepr legacyBlock) { - return new Block(getBlockType(legacyBlock.identifier), legacyBlock, 1); - } - -} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java new file mode 100644 index 00000000..d7e882db --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java @@ -0,0 +1,48 @@ +package com.mithrilmania.blocktopograph.block; + +import com.mithrilmania.blocktopograph.block.icon.BlockIcon; +import com.mithrilmania.blocktopograph.block.icon.NoBlockIcon; +import com.mithrilmania.blocktopograph.block.icon.TexPathBlockIcon; + +import java.io.Serializable; + +public class BlockTemplate implements Serializable { + + private final String subName; + + private final Block block; + + private final BlockIcon icon; + + private final int color; + + private final boolean hasBiomeShading; + + public BlockTemplate(String subName, Block block, BlockIcon icon, int color, boolean hasBiomeShading) { + this.subName = subName; + this.block = block; + this.icon = icon; + this.color = color; + this.hasBiomeShading = hasBiomeShading; + } + + public String getSubName() { + return subName; + } + + public Block getBlock() { + return block; + } + + public BlockIcon getIcon() { + return icon; + } + + public int getColor() { + return color; + } + + public boolean isHasBiomeShading() { + return hasBiomeShading; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java new file mode 100644 index 00000000..79e1b6ba --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java @@ -0,0 +1,1704 @@ +package com.mithrilmania.blocktopograph.block; + +import androidx.annotation.NonNull; + +import com.google.common.collect.Streams; +import com.mithrilmania.blocktopograph.block.icon.NoBlockIcon; +import com.mithrilmania.blocktopograph.block.icon.TexPathBlockIcon; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Stream; + +public class BlockTemplates { + + private static final Map allTemplates = new HashMap<>(); + + private static final BlockTemplate unknownBlockTemplate = new BlockTemplate( + null, new Block.Builder(BlockType.UNKNOWN).build(), + new NoBlockIcon(), 0xff0000, false); + + static { + init(); + } + + private static void init() { + allTemplates.put("minecraft:air", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.AIR).build(), new TexPathBlockIcon(null), 0x00000000, false) + }); + allTemplates.put("minecraft:stone", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.STONE).setProperty("stone_type", "stone").build(), new TexPathBlockIcon("blocks/stone.png"), 0xff464646, false), + new BlockTemplate("granite", new Block.Builder(BlockType.STONE).setProperty("stone_type", "granite").build(), new TexPathBlockIcon("blocks/stone_granite.png"), 0xff8c7167, false), + new BlockTemplate("granite_smooth", new Block.Builder(BlockType.STONE).setProperty("stone_type", "granite_smooth").build(), new TexPathBlockIcon("blocks/stone_granite_smooth.png"), 0xff946251, false), + new BlockTemplate("diorite", new Block.Builder(BlockType.STONE).setProperty("stone_type", "diorite").build(), new TexPathBlockIcon("blocks/stone_diorite.png"), 0xffc6c6c6, false), + new BlockTemplate("diorite_smooth", new Block.Builder(BlockType.STONE).setProperty("stone_type", "diorite_smooth").build(), new TexPathBlockIcon("blocks/stone_diorite_smooth.png"), 0xffbebec1, false), + new BlockTemplate("andesite", new Block.Builder(BlockType.STONE).setProperty("stone_type", "andesite").build(), new TexPathBlockIcon("blocks/stone_andesite.png"), 0xff797777, false), + new BlockTemplate("andesite_smooth", new Block.Builder(BlockType.STONE).setProperty("stone_type", "andesite_smooth").build(), new TexPathBlockIcon("blocks/stone_andesite_smooth.png"), 0xff828382, false) + }); + allTemplates.put("minecraft:grass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GRASS).build(), new TexPathBlockIcon("blocks/grass_side_carried.png"), 0xff939393, true) + }); + allTemplates.put("minecraft:dirt", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DIRT).setProperty("dirt_type", "normal").build(), new TexPathBlockIcon("blocks/dirt.png"), 0xff866043, true) + }); + allTemplates.put("minecraft:cobblestone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.COBBLESTONE).build(), new TexPathBlockIcon("blocks/cobblestone.png"), 0xff7a7a7a, false) + }); + allTemplates.put("minecraft:planks", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "oak").build(), new TexPathBlockIcon("blocks/planks_oak.png"), 0xff9c7f4e, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "spruce").build(), new TexPathBlockIcon("blocks/planks_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "birch").build(), new TexPathBlockIcon("blocks/planks_birch.png"), 0xffdabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "jungle").build(), new TexPathBlockIcon("blocks/planks_jungle.png"), 0xffBa7d5d, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "acacia").build(), new TexPathBlockIcon("blocks/planks_acacia.png"), 0xff934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "dark_oak").build(), new TexPathBlockIcon("blocks/planks_big_oak.png"), 0xff3b260f, false) + }); + allTemplates.put("minecraft:sapling", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "oak").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_oak.png"), 0x6b476625, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "spruce").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_spruce.png"), 0x53333a21, false), + new BlockTemplate("birch", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "birch").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_birch.png"), 0x6b769654, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "jungle").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_jungle.png"), 0x55305612, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "acacia").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_acacia.png"), 0xff718919, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "dark_oak").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_roofed_oak.png"), 0xff6f522d, false) + }); + allTemplates.put("minecraft:bedrock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BEDROCK).setProperty("infiniburn_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/bedrock.png"), 0xff535353, false) + }); + allTemplates.put("minecraft:flowing_water", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FLOWING_WATER).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/water_flow.png"), 0x802e43f4, false) + }); + allTemplates.put("minecraft:water", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WATER).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/water_still.png"), 0x802e43f4, false) + }); + allTemplates.put("minecraft:flowing_lava", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FLOWING_LAVA).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/lava_flow.png"), 0xf0d45a12, false) + }); + allTemplates.put("minecraft:lava", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LAVA).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/lava_still.png"), 0xf0d45a12, false) + }); + allTemplates.put("minecraft:sand", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.SAND).setProperty("sand_type", "normal").build(), new TexPathBlockIcon("blocks/sand.png"), 0xffdbd3a0, false), + new BlockTemplate("red", new Block.Builder(BlockType.SAND).setProperty("sand_type", "red").build(), new TexPathBlockIcon("blocks/red_sand.png"), 0xffa7531f, false) + }); + allTemplates.put("minecraft:gravel", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GRAVEL).build(), new TexPathBlockIcon("blocks/gravel.png"), 0xff7e7c7a, false) + }); + allTemplates.put("minecraft:gold_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GOLD_ORE).build(), new TexPathBlockIcon("blocks/gold_ore.png"), 0xff8f8b7c, false) + }); + allTemplates.put("minecraft:iron_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_ORE).build(), new TexPathBlockIcon("blocks/iron_ore.png"), 0xff87827e, false) + }); + allTemplates.put("minecraft:coal_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.COAL_ORE).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff737373, false) + }); + allTemplates.put("minecraft:log", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "oak").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_oak.png"), 0xff9a7d4d, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "spruce").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "birch").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_birch.png"), 0xffdabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "jungle").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_jungle.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:leaves", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "oak").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_oak.png"), 0xff878787, true), + new BlockTemplate("spruce", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "spruce").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_spruce.png"), 0xff132613, true), + new BlockTemplate("birch", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "birch").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_birch.png"), 0xff283816, true), + new BlockTemplate("jungle", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "jungle").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_jungle.png"), 0xff918e86, true) + }); + allTemplates.put("minecraft:sponge", new BlockTemplate[]{ + new BlockTemplate("dry", new Block.Builder(BlockType.SPONGE).setProperty("sponge_type", "dry").build(), new TexPathBlockIcon("blocks/sponge_dry.png"), 0xffb6b639, false), + new BlockTemplate("wet", new Block.Builder(BlockType.SPONGE).setProperty("sponge_type", "wet").build(), new TexPathBlockIcon("blocks/sponge_wet.png"), 0xff9b9a33, false) + }); + allTemplates.put("minecraft:glass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLASS).build(), new TexPathBlockIcon("blocks/glass.png"), 0x46daf0f4, false) + }); + allTemplates.put("minecraft:lapis_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LAPIS_ORE).build(), new TexPathBlockIcon("blocks/lapis_ore.png"), 0xff667086, false) + }); + allTemplates.put("minecraft:lapis_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LAPIS_BLOCK).build(), new TexPathBlockIcon("blocks/lapis_block.png"), 0xff1d47a5, false) + }); + allTemplates.put("minecraft:dispenser", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DISPENSER).setProperty("facing_direction", 0).setProperty("triggered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dispenser.png"), 0xff606060, false) + }); + allTemplates.put("minecraft:sandstone", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.SANDSTONE).setProperty("sand_stone_type", "default").build(), new TexPathBlockIcon("blocks/sandstone_default.png"), 0xffdad29e, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.SANDSTONE).setProperty("sand_stone_type", "heiroglyphs").build(), new TexPathBlockIcon("blocks/sandstone_chiseled.png"), 0xffdad1a2, false), + new BlockTemplate("smooth", new Block.Builder(BlockType.SANDSTONE).setProperty("sand_stone_type", "cut").build(), new TexPathBlockIcon("blocks/sandstone_smooth.png"), 0xffdad1a2, false) + }); + allTemplates.put("minecraft:noteblock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NOTEBLOCK).build(), new TexPathBlockIcon("blocks/noteblock.png"), 0xff644332, false) + }); + allTemplates.put("minecraft:bed", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BED).setProperty("direction", 0).setProperty("head_piece_bit", (byte) 0).setProperty("occupied_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/bed.png"), 0xff8e1616, false) + }); + allTemplates.put("minecraft:golden_rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GOLDEN_RAIL).setProperty("rail_direction", 0).setProperty("rail_data_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/golden_rail.png"), 0xab9a6846, false) + }); + allTemplates.put("minecraft:detector_rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DETECTOR_RAIL).setProperty("rail_direction", 0).setProperty("rail_data_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/detector_rail.png"), 0x9b786559, false) + }); + allTemplates.put("minecraft:sticky_piston", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STICKY_PISTON).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/sticky_piston.png"), 0xff8d9263, false) + }); + allTemplates.put("minecraft:web", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WEB).build(), new TexPathBlockIcon("blocks/web.png"), 0x68dcdcdc, false) + }); + allTemplates.put("minecraft:tallgrass", new BlockTemplate[]{ + new BlockTemplate("fern", new Block.Builder(BlockType.TALLGRASS).setProperty("tall_grass_type", "tall").build(), new TexPathBlockIcon("blocks/tallgrass_fern.png"), 0xff747474, true), + new BlockTemplate("grass", new Block.Builder(BlockType.TALLGRASS).setProperty("tall_grass_type", "fern").build(), new TexPathBlockIcon("blocks/tallgrass_grass.png"), 0x4e787878, true) + }); + allTemplates.put("minecraft:deadbush", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DEADBUSH).build(), new TexPathBlockIcon("blocks/deadbush.png"), 0x517b4f19, false) + }); + allTemplates.put("minecraft:piston", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PISTON).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/piston.png"), 0xff998159, false) + }); + allTemplates.put("minecraft:pistonArmCollision", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PISTONARMCOLLISION).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/pistonArmCollision.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:wool", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.WOOL).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/wool_colored_white.png"), 0xffdddddd, false), + new BlockTemplate("orange", new Block.Builder(BlockType.WOOL).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/wool_colored_orange.png"), 0xffdb7d3e, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.WOOL).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/wool_colored_magenta.png"), 0xffb350bc, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.WOOL).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/wool_colored_light_blue.png"), 0xff6a8ac9, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.WOOL).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/wool_colored_yellow.png"), 0xffb1a627, false), + new BlockTemplate("lime", new Block.Builder(BlockType.WOOL).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/wool_colored_lime.png"), 0xff41ae38, false), + new BlockTemplate("pink", new Block.Builder(BlockType.WOOL).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/wool_colored_pink.png"), 0xffd08499, false), + new BlockTemplate("gray", new Block.Builder(BlockType.WOOL).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/wool_colored_gray.png"), 0xff404040, false), + new BlockTemplate("silver", new Block.Builder(BlockType.WOOL).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/wool_colored_silver.png"), 0xff9aa1a1, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.WOOL).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/wool_colored_cyan.png"), 0xff2e6e89, false), + new BlockTemplate("purple", new Block.Builder(BlockType.WOOL).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/wool_colored_purple.png"), 0xff7e3db5, false), + new BlockTemplate("blue", new Block.Builder(BlockType.WOOL).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/wool_colored_blue.png"), 0xff2e388d, false), + new BlockTemplate("brown", new Block.Builder(BlockType.WOOL).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/wool_colored_brown.png"), 0xff4f321f, false), + new BlockTemplate("green", new Block.Builder(BlockType.WOOL).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/wool_colored_green.png"), 0xff35461b, false), + new BlockTemplate("red", new Block.Builder(BlockType.WOOL).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/wool_colored_red.png"), 0xff963430, false), + new BlockTemplate("black", new Block.Builder(BlockType.WOOL).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/wool_colored_black.png"), 0xff191616, false) + }); + allTemplates.put("minecraft:element_0", new BlockTemplate[]{ + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false) + }); + allTemplates.put("minecraft:yellow_flower", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.YELLOW_FLOWER).build(), new TexPathBlockIcon("blocks/yellow_flower.png"), 0x1e6ca200, false) + }); + allTemplates.put("minecraft:red_flower", new BlockTemplate[]{ + new BlockTemplate("poppy", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "poppy").build(), new TexPathBlockIcon("blocks/flower_poppy.png"), 0x1d8a2b0d, false), + new BlockTemplate("blue_orchid", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "orchid").build(), new TexPathBlockIcon("blocks/flower_blue_orchid.png"), 0x1d188fd3, false), + new BlockTemplate("allium", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "allium").build(), new TexPathBlockIcon("blocks/flower_allium.png"), 0x1ddbb7f8, false), + new BlockTemplate("houstonia", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "houstonia").build(), new TexPathBlockIcon("blocks/flower_houstonia.png"), 0x1defef99, false), + new BlockTemplate("tulip_red", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_red").build(), new TexPathBlockIcon("blocks/flower_tulip_red.png"), 0x1dbd2604, false), + new BlockTemplate("tulip_orange", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_orange").build(), new TexPathBlockIcon("blocks/flower_tulip_orange.png"), 0x1dd06713, false), + new BlockTemplate("tulip_white", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_white").build(), new TexPathBlockIcon("blocks/flower_tulip_white.png"), 0x1df9f9f9, false), + new BlockTemplate("tulip_pink", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_pink").build(), new TexPathBlockIcon("blocks/flower_tulip_pink.png"), 0x1dbeb3be, false), + new BlockTemplate("oxeye_daisy", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "oxeye").build(), new TexPathBlockIcon("blocks/flower_oxeye_daisy.png"), 0x1ddadada, false) + }); + allTemplates.put("minecraft:brown_mushroom", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BROWN_MUSHROOM).build(), new TexPathBlockIcon("blocks/brown_mushroom.png"), 0x198a6953, false) + }); + allTemplates.put("minecraft:red_mushroom", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RED_MUSHROOM).build(), new TexPathBlockIcon("blocks/red_mushroom.png"), 0x21c33538, false) + }); + allTemplates.put("minecraft:gold_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GOLD_BLOCK).build(), new TexPathBlockIcon("blocks/gold_block.png"), 0xfff9ec4e, false) + }); + allTemplates.put("minecraft:iron_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_BLOCK).build(), new TexPathBlockIcon("blocks/iron_block.png"), 0xffdbdbdb, false) + }); + allTemplates.put("minecraft:double_stone_slab", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "smooth_stone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_stone.png"), 0xff9f9f9f, false), + new BlockTemplate("sand", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_sand.png"), 0xffdad29e, false), + new BlockTemplate("wood", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "wood").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_wood.png"), 0xff9c7f4e, false), + new BlockTemplate("cobble", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "cobblestone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_cobble.png"), 0xff7a7a7a, false), + new BlockTemplate("brick", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_brick.png"), 0xff926356, false), + new BlockTemplate("smooth_stone_brick", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "stone_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_smooth_stone_brick.png"), 0xff7d7d7d, false), + new BlockTemplate("quartz", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "quartz").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_quartz.png"), 0xff2c161a, false), + new BlockTemplate("nether_brick", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "nether_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_nether_brick.png"), 0xffece9e2, false), + new BlockTemplate("red_sandstone", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "smooth_stone").setProperty("top_slot_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/double_stone_slab_red_sandstone.png"), 0xff9f9f9f, false) + }); + allTemplates.put("minecraft:stone_slab", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "smooth_stone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff9f9f9f, false), + new BlockTemplate("sand", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xffdad29e, false), + new BlockTemplate("wood", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "wood").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff9c7f4e, false), + new BlockTemplate("cobble", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "cobblestone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff7a7a7a, false), + new BlockTemplate("brick", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff926356, false), + new BlockTemplate("smooth_stone_brick", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "stone_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff7d7d7d, false), + new BlockTemplate("quartz", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "quartz").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff2c161a, false), + new BlockTemplate("nether_brick", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "nether_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xffece9e2, false) + }); + allTemplates.put("minecraft:brick_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BRICK_BLOCK).build(), new TexPathBlockIcon("blocks/brick_block.png"), 0xff926356, false) + }); + allTemplates.put("minecraft:tnt", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TNT).setProperty("allow_underwater_bit", (byte) 0).setProperty("explode_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/tnt.png"), 0xff82412f, false) + }); + allTemplates.put("minecraft:bookshelf", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BOOKSHELF).build(), new TexPathBlockIcon("blocks/bookshelf.png"), 0xff6b5839, false) + }); + allTemplates.put("minecraft:mossy_cobblestone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MOSSY_COBBLESTONE).build(), new TexPathBlockIcon("blocks/mossy_cobblestone.png"), 0xff677967, false) + }); + allTemplates.put("minecraft:obsidian", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.OBSIDIAN).build(), new TexPathBlockIcon("blocks/obsidian.png"), 0xff14121d, false) + }); + allTemplates.put("minecraft:torch", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/torch.png"), 0x13826a3a, false) + }); + allTemplates.put("minecraft:fire", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FIRE).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/fire.png"), 0x8bd38c35, false) + }); + allTemplates.put("minecraft:mob_spawner", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MOB_SPAWNER).build(), new TexPathBlockIcon("blocks/mob_spawner.png"), 0x9b1a2731, false) + }); + allTemplates.put("minecraft:oak_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.OAK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/oak_stairs.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:chest", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHEST).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/chest_front.png"), 0xc86f5739, false) + }); + allTemplates.put("minecraft:redstone_wire", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_WIRE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/redstone_wire.png"), 0x80fa1010, false) + }); + allTemplates.put("minecraft:diamond_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DIAMOND_ORE).build(), new TexPathBlockIcon("blocks/diamond_ore.png"), 0xff818c8f, false) + }); + allTemplates.put("minecraft:diamond_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DIAMOND_BLOCK).build(), new TexPathBlockIcon("blocks/diamond_block.png"), 0xff61dbd5, false) + }); + allTemplates.put("minecraft:crafting_table", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CRAFTING_TABLE).build(), new TexPathBlockIcon("blocks/crafting_table.png"), 0xff6b472a, false) + }); + allTemplates.put("minecraft:wheat", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WHEAT).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/wheat.png"), 0x0500b312, false) + }); + allTemplates.put("minecraft:farmland", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FARMLAND).setProperty("moisturized_amount", 0).build(), new TexPathBlockIcon("blocks/farmland.png"), 0xff734b2d, false) + }); + allTemplates.put("minecraft:furnace", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FURNACE).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/furnace.png"), 0xff606060, false) + }); + allTemplates.put("minecraft:lit_furnace", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIT_FURNACE).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/lit_furnace.png"), 0xff606060, false) + }); + allTemplates.put("minecraft:standing_sign", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STANDING_SIGN).setProperty("ground_sign_direction", 0).build(), new TexPathBlockIcon("blocks/standing_sign.png"), 0x566f5739, false) + }); + allTemplates.put("minecraft:wooden_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WOODEN_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_door.png"), 0xcf866733, false) + }); + allTemplates.put("minecraft:ladder", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LADDER).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/ladder.png"), 0x8f795f34, false) + }); + allTemplates.put("minecraft:rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RAIL).setProperty("rail_direction", 0).build(), new TexPathBlockIcon("blocks/rail.png"), 0x8f796c58, false) + }); + allTemplates.put("minecraft:stone_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_stairs.png"), 0xff7a7a7a, false) + }); + allTemplates.put("minecraft:wall_sign", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WALL_SIGN).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/wall_sign.png"), 0x206f5739, false) + }); + allTemplates.put("minecraft:lever", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LEVER).setProperty("lever_direction", "down_east_west").setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/lever.png"), 0x136a5940, false) + }); + allTemplates.put("minecraft:stone_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/stone_pressure_plate.png"), 0xff7d7d7d, false) + }); + allTemplates.put("minecraft:iron_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/iron_door.png"), 0xcfbababa, false) + }); + allTemplates.put("minecraft:wooden_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WOODEN_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/wooden_pressure_plate.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:redstone_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_ORE).build(), new TexPathBlockIcon("blocks/redstone_ore.png"), 0xff846b6b, false) + }); + allTemplates.put("minecraft:lit_redstone_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIT_REDSTONE_ORE).build(), new TexPathBlockIcon("blocks/lit_redstone_ore.png"), 0xff846b6b, false) + }); + allTemplates.put("minecraft:unlit_redstone_torch", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:redstone_torch", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/redstone_torch.png"), 0x46a74b29, false) + }); + allTemplates.put("minecraft:stone_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_button.png"), 0x28565656, false) + }); + allTemplates.put("minecraft:snow_layer", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SNOW_LAYER).setProperty("covered_bit", (byte) 0).setProperty("height", 0).build(), new TexPathBlockIcon("blocks/snow_layer.png"), 0xffeffbfb, false) + }); + allTemplates.put("minecraft:ice", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ICE).build(), new TexPathBlockIcon("blocks/ice.png"), 0x9f7dadff, false) + }); + allTemplates.put("minecraft:snow", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SNOW).build(), new TexPathBlockIcon("blocks/snow.png"), 0xffeffbfb, false) + }); + allTemplates.put("minecraft:cactus", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CACTUS).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/cactus.png"), 0xc30d6318, false) + }); + allTemplates.put("minecraft:clay", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CLAY).build(), new TexPathBlockIcon("blocks/clay.png"), 0xff9ea4b0, false) + }); + allTemplates.put("minecraft:reeds", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REEDS).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/reeds.png"), 0x8c94c065, false) + }); + allTemplates.put("minecraft:jukebox", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUKEBOX).build(), new TexPathBlockIcon("blocks/fence_birch_fence.png"), 0x8f463822, false) + }); + allTemplates.put("minecraft:fence", new BlockTemplate[]{ + new BlockTemplate("fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "oak").build(), new TexPathBlockIcon("blocks/fence_fence.png"), 0x8f463822, false), + new BlockTemplate("spruce_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "spruce").build(), new TexPathBlockIcon("blocks/fence_spruce_fence.png"), 0x8f5a3d0d, false), + new BlockTemplate("birch_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "birch").build(), new TexPathBlockIcon("blocks/fence_birch_fence.png"), 0x8fdabd8d, false), + new BlockTemplate("jungle_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "jungle").build(), new TexPathBlockIcon("blocks/fence_jungle_fence.png"), 0x8fBa7d5d, false), + new BlockTemplate("acacia_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "acacia").build(), new TexPathBlockIcon("blocks/fence_acacia_fence.png"), 0x8f934f39, false), + new BlockTemplate("dark_oak_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "dark_oak").build(), new TexPathBlockIcon("blocks/fence_dark_oak_fence.png"), 0x8f2d2213, false) + }); + allTemplates.put("minecraft:pumpkin", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PUMPKIN).setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/pumpkin.png"), 0xffc07615, false) + }); + allTemplates.put("minecraft:netherrack", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHERRACK).build(), new TexPathBlockIcon("blocks/netherrack.png"), 0xff6f3634, false) + }); + allTemplates.put("minecraft:soul_sand", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SOUL_SAND).build(), new TexPathBlockIcon("blocks/soul_sand.png"), 0xff544033, false) + }); + allTemplates.put("minecraft:glowstone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLOWSTONE).build(), new TexPathBlockIcon("blocks/glowstone.png"), 0xff8f7645, false) + }); + allTemplates.put("minecraft:portal", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PORTAL).setProperty("portal_axis", "unknown").build(), new TexPathBlockIcon("blocks/portal.png"), 0xc8410491, false) + }); + allTemplates.put("minecraft:lit_pumpkin", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIT_PUMPKIN).setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/lit_pumpkin.png"), 0xffc07615, false) + }); + allTemplates.put("minecraft:cake", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CAKE).setProperty("bite_counter", 0).build(), new TexPathBlockIcon("blocks/cake.png"), 0xc3e4cdce, false) + }); + allTemplates.put("minecraft:unpowered_repeater", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.UNPOWERED_REPEATER).setProperty("direction", 0).setProperty("repeater_delay", 0).build(), new TexPathBlockIcon("blocks/unpowered_repeater.png"), 0xff979393, false) + }); + allTemplates.put("minecraft:powered_repeater", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:invisibleBedrock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.INVISIBLEBEDROCK).build(), new TexPathBlockIcon("blocks/invisibleBedrock.png"), 0x3c282828, false) + }); + allTemplates.put("minecraft:trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/trapdoor.png"), 0xdb7e5d2d, false) + }); + allTemplates.put("minecraft:monster_egg", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "stone").build(), new TexPathBlockIcon("blocks/monster_egg_stone.png"), 0xff7d7d7d, false), + new BlockTemplate("cobble", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "cobblestone").build(), new TexPathBlockIcon("blocks/monster_egg_cobble.png"), 0xff7a7a7a, false), + new BlockTemplate("brick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_brick.png"), 0xff7a7a7a, false), + new BlockTemplate("mossybrick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "mossy_stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_mossybrick.png"), 0xff7b6651, false), + new BlockTemplate("crackedbrick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "cracked_stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_crackedbrick.png"), 0xff7b6651, false), + new BlockTemplate("chiseledbrick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "chiseled_stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_chiseledbrick.png"), 0xff7b6651, false) + }); + allTemplates.put("minecraft:stonebrick", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "default").build(), new TexPathBlockIcon("blocks/stonebrick_default.png"), 0xff7a7a7a, false), + new BlockTemplate("mossy", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "mossy").build(), new TexPathBlockIcon("blocks/stonebrick_mossy.png"), 0xff72776a, false), + new BlockTemplate("cracked", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "cracked").build(), new TexPathBlockIcon("blocks/stonebrick_cracked.png"), 0xff767676, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "chiseled").build(), new TexPathBlockIcon("blocks/stonebrick_chiseled.png"), 0xff767676, false), + new BlockTemplate("smooth", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "smooth").build(), new TexPathBlockIcon("blocks/stonebrick_smooth.png"), 0xff767676, false) + }); + allTemplates.put("minecraft:brown_mushroom_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BROWN_MUSHROOM_BLOCK).setProperty("huge_mushroom_bits", 0).build(), new TexPathBlockIcon("blocks/brown_mushroom_block.png"), 0xff8d6a53, false) + }); + allTemplates.put("minecraft:red_mushroom_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RED_MUSHROOM_BLOCK).setProperty("huge_mushroom_bits", 0).build(), new TexPathBlockIcon("blocks/red_mushroom_block.png"), 0xffb62524, false) + }); + allTemplates.put("minecraft:iron_bars", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_BARS).build(), new TexPathBlockIcon("blocks/iron_bars.png"), 0x736d6c6a, false) + }); + allTemplates.put("minecraft:glass_pane", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLASS_PANE).build(), new TexPathBlockIcon("blocks/glass_pane.png"), 0x1fd3eff4, false) + }); + allTemplates.put("minecraft:melon_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MELON_BLOCK).build(), new TexPathBlockIcon("blocks/melon_block.png"), 0xff979924, false) + }); + allTemplates.put("minecraft:pumpkin_stem", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PUMPKIN_STEM).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/pumpkin_stem.png"), 0x1e87b759, false) + }); + allTemplates.put("minecraft:melon_stem", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MELON_STEM).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/melon_stem.png"), 0x1e87b759, false) + }); + allTemplates.put("minecraft:vine", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.VINE).setProperty("vine_direction_bits", 0).build(), new TexPathBlockIcon("blocks/vine.png"), 0x8a6f6f6f, false) + }); + allTemplates.put("minecraft:fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/fence_gate.png"), 0x7b463822, false) + }); + allTemplates.put("minecraft:brick_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BRICK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/brick_stairs.png"), 0xff926356, false) + }); + allTemplates.put("minecraft:stone_brick_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_BRICK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_brick_stairs.png"), 0xff7a7a7a, false) + }); + allTemplates.put("minecraft:mycelium", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MYCELIUM).build(), new TexPathBlockIcon("blocks/mycelium.png"), 0xff6f6369, false) + }); + allTemplates.put("minecraft:waterlily", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WATERLILY).build(), new TexPathBlockIcon("blocks/waterlily.png"), 0x93335a21, false) + }); + allTemplates.put("minecraft:nether_brick", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_BRICK).build(), new TexPathBlockIcon("blocks/nether_brick.png"), 0xff2c161a, false) + }); + allTemplates.put("minecraft:nether_brick_fence", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_BRICK_FENCE).build(), new TexPathBlockIcon("blocks/nether_brick_fence.png"), 0xff2c161a, false) + }); + allTemplates.put("minecraft:nether_brick_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_BRICK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/nether_brick_stairs.png"), 0xff2c161a, false) + }); + allTemplates.put("minecraft:nether_wart", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_WART).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/nether_wart.png"), 0x2a6a0e1e, false) + }); + allTemplates.put("minecraft:enchanting_table", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ENCHANTING_TABLE).build(), new TexPathBlockIcon("blocks/enchanting_table.png"), 0xff67403b, false) + }); + allTemplates.put("minecraft:brewing_stand", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BREWING_STAND).setProperty("brewing_stand_slot_a_bit", (byte) 0).setProperty("brewing_stand_slot_b_bit", (byte) 0).setProperty("brewing_stand_slot_c_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/brewing_stand.png"), 0x767c6751, false) + }); + allTemplates.put("minecraft:cauldron", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CAULDRON).setProperty("cauldron_liquid", "water").setProperty("fill_level", 0).build(), new TexPathBlockIcon("blocks/cauldron.png"), 0xff373737, false) + }); + allTemplates.put("minecraft:end_portal", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_PORTAL).build(), new TexPathBlockIcon("blocks/endframe_top.png"), 0xff101010, false) + }); + allTemplates.put("minecraft:end_portal_frame", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_PORTAL_FRAME).setProperty("direction", 0).setProperty("end_portal_eye_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/endframe_side.png"), 0xff597560, false) + }); + allTemplates.put("minecraft:end_stone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_STONE).build(), new TexPathBlockIcon("blocks/end_stone.png"), 0xffdddfa5, false) + }); + allTemplates.put("minecraft:dragon_egg", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DRAGON_EGG).build(), new TexPathBlockIcon("blocks/dragon_egg.png"), 0xff0c090f, false) + }); + allTemplates.put("minecraft:redstone_lamp", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_LAMP).build(), new TexPathBlockIcon("blocks/redstone_lamp.png"), 0xff462b1a, false) + }); + allTemplates.put("minecraft:lit_redstone_lamp", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:dropper", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DROPPER).setProperty("facing_direction", 0).setProperty("triggered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dropper.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:activator_rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACTIVATOR_RAIL).setProperty("rail_direction", 0).setProperty("rail_data_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/activator_rail.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:cocoa", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:sandstone_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SANDSTONE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sandstone_stairs.png"), 0xffdad29e, false) + }); + allTemplates.put("minecraft:emerald_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.EMERALD_ORE).build(), new TexPathBlockIcon("blocks/emerald_ore.png"), 0xff6d8074, false) + }); + allTemplates.put("minecraft:ender_chest", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ENDER_CHEST).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/ender_chest_front.png"), 0xc82c3e40, false) + }); + allTemplates.put("minecraft:tripwire_hook", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRIPWIRE_HOOK).setProperty("direction", 0).setProperty("attached_bit", (byte) 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/tripwire_hook.png"), 0x2d8a8171, false) + }); + allTemplates.put("minecraft:tripWire", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRIPWIRE).setProperty("attached_bit", (byte) 0).setProperty("disarmed_bit", (byte) 0).setProperty("powered_bit", (byte) 0).setProperty("suspended_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/tripWire.png"), 0x2d818181, false) + }); + allTemplates.put("minecraft:emerald_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.EMERALD_BLOCK).build(), new TexPathBlockIcon("blocks/emerald_block.png"), 0xff51d975, false) + }); + allTemplates.put("minecraft:spruce_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/spruce_stairs.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:birch_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/birch_stairs.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:jungle_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/jungle_stairs.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:beacon", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BEACON).build(), new TexPathBlockIcon("blocks/beacon.png"), 0xff74ddd7, false) + }); + allTemplates.put("minecraft:cobblestone_wall", new BlockTemplate[]{ + new BlockTemplate("normal", new Block.Builder(BlockType.COBBLESTONE_WALL).setProperty("wall_block_type", "cobblestone").build(), new TexPathBlockIcon("blocks/cobblestone_wall_normal.png"), 0xff7a7a7a, false), + new BlockTemplate("mossy", new Block.Builder(BlockType.COBBLESTONE_WALL).setProperty("wall_block_type", "mossy_cobblestone").build(), new TexPathBlockIcon("blocks/cobblestone_wall_mossy.png"), 0xff506a50, false) + }); + allTemplates.put("minecraft:flower_pot", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FLOWER_POT).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/flower_pot.png"), 0x31764133, false) + }); + allTemplates.put("minecraft:carrots", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CARROTS).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/carrots.png"), 0x0901ab10, false) + }); + allTemplates.put("minecraft:potatoes", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.POTATOES).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/potatoes.png"), 0x0901ab10, false) + }); + allTemplates.put("minecraft:wooden_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WOODEN_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_button.png"), 0x2878613e, false) + }); + allTemplates.put("minecraft:skull", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SKULL).setProperty("facing_direction", 0).setProperty("no_drop_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/skull.png"), 0x8c8c8c8c, false) + }); + allTemplates.put("minecraft:anvil", new BlockTemplate[]{ + new BlockTemplate("intact", new Block.Builder(BlockType.ANVIL).setProperty("direction", 0).setProperty("damage", "undamaged").build(), new TexPathBlockIcon("blocks/anvil_intact.png"), 0x9f403c3c, false), + new BlockTemplate("slightly_damaged", new Block.Builder(BlockType.ANVIL).setProperty("direction", 0).setProperty("damage", "slightly_damaged").build(), new TexPathBlockIcon("blocks/anvil_slightly_damaged.png"), 0x9f403c3c, false), + new BlockTemplate("very_damaged", new Block.Builder(BlockType.ANVIL).setProperty("direction", 0).setProperty("damage", "very_damaged").build(), new TexPathBlockIcon("blocks/anvil_very_damaged.png"), 0x9f403c3c, false) + }); + allTemplates.put("minecraft:trapped_chest", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRAPPED_CHEST).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/chest_front.png"), 0xfe6f5739, false) + }); + allTemplates.put("minecraft:light_weighted_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIGHT_WEIGHTED_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/light_weighted_pressure_plate.png"), 0xc8f9ec4e, false) + }); + allTemplates.put("minecraft:heavy_weighted_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HEAVY_WEIGHTED_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/heavy_weighted_pressure_plate.png"), 0xc8dbdbdb, false) + }); + allTemplates.put("minecraft:unpowered_comparator", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.UNPOWERED_COMPARATOR).setProperty("direction", 0).setProperty("output_lit_bit", (byte) 0).setProperty("output_subtract_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/unpowered_comparator.png"), 0xff9c9695, false) + }); + allTemplates.put("minecraft:powered_comparator", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.POWERED_COMPARATOR).setProperty("direction", 0).setProperty("output_lit_bit", (byte) 0).setProperty("output_subtract_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/powered_comparator.png"), 0xffa59594, false) + }); + allTemplates.put("minecraft:daylight_detector", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DAYLIGHT_DETECTOR).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/daylight_detector.png"), 0xff82745e, false) + }); + allTemplates.put("minecraft:redstone_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_BLOCK).build(), new TexPathBlockIcon("blocks/redstone_block.png"), 0xffab1b09, false) + }); + allTemplates.put("minecraft:quartz_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.QUARTZ_ORE).build(), new TexPathBlockIcon("blocks/quartz_ore.png"), 0xffd9d1c8, false) + }); + allTemplates.put("minecraft:hopper", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HOPPER).setProperty("facing_direction", 0).setProperty("toggle_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/hopper.png"), 0xff3e3e3e, false) + }); + allTemplates.put("minecraft:quartz_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "default").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffece9e2, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "chiseled").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_chiseled.png"), 0xffe7e4db, false), + new BlockTemplate("lines", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "lines").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_lines.png"), 0xffe8e5dd, false), + new BlockTemplate("default", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "smooth").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffe7e3db, false) + }); + allTemplates.put("minecraft:quartz_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.QUARTZ_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/quartz_stairs.png"), 0xffece9e2, false) + }); + allTemplates.put("minecraft:double_wooden_slab", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_oak.png"), 0xb4907449, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "spruce").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "birch").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_birch.png"), 0xb4dabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "jungle").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_jungle.png"), 0xb4Ba7d5d, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "acacia").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_acacia.png"), 0xb4934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "dark_oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_big_oak.png"), 0xb4907449, false) + }); + allTemplates.put("minecraft:wooden_slab", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_oak.png"), 0xff907449, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "spruce").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "birch").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_birch.png"), 0xffdabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "jungle").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_jungle.png"), 0xffBa7d5d, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "acacia").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_acacia.png"), 0xff934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "dark_oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_big_oak.png"), 0xff907449, false) + }); + allTemplates.put("minecraft:stained_hardened_clay", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_white.png"), 0xff836f64, false), + new BlockTemplate("orange", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_orange.png"), 0xff9d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_magenta.png"), 0xff915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_light_blue.png"), 0xff706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_yellow.png"), 0xffb5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_lime.png"), 0xff617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_pink.png"), 0xff9c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_gray.png"), 0xff392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_silver.png"), 0xff81655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_cyan.png"), 0xff565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_purple.png"), 0xff744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_blue.png"), 0xff463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_brown.png"), 0xff492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_green.png"), 0xff484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_red.png"), 0xffff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_black.png"), 0xff21120d, false) + }); + allTemplates.put("minecraft:stained_glass_pane", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/glass.png"), 0x32141414, false), + new BlockTemplate("orange", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/glass.png"), 0x209d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20b5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/glass.png"), 0x209c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/glass.png"), 0x2081655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20ff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/glass.png"), 0x2021120d, false) + }); + allTemplates.put("minecraft:leaves2", new BlockTemplate[]{ + new BlockTemplate("acacia", new Block.Builder(BlockType.LEAVES2).setProperty("new_leaf_type", "acacia").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves2_acacia.png"), 0xff2e780c, true), + new BlockTemplate("big_oak", new Block.Builder(BlockType.LEAVES2).setProperty("new_leaf_type", "dark_oak").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves2_big_oak.png"), 0xff878787, true) + }); + allTemplates.put("minecraft:log2", new BlockTemplate[]{ + new BlockTemplate("acacia", new Block.Builder(BlockType.LOG2).setProperty("new_log_type", "acacia").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log2_acacia.png"), 0xff934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.LOG2).setProperty("new_log_type", "dark_oak").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log2_big_oak.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:acacia_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/acacia_stairs.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:dark_oak_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dark_oak_stairs.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:slime", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SLIME).build(), new TexPathBlockIcon("blocks/slime.png"), 0xc880b672, false) + }); + allTemplates.put("minecraft:iron_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/iron_trapdoor.png"), 0xb4cccccc, false) + }); + allTemplates.put("minecraft:prismarine", new BlockTemplate[]{ + new BlockTemplate("rough", new Block.Builder(BlockType.PRISMARINE).setProperty("prismarine_block_type", "default").build(), new TexPathBlockIcon("blocks/prismarine_rough.png"), 0xff79Ad7e, false), + new BlockTemplate("dark", new Block.Builder(BlockType.PRISMARINE).setProperty("prismarine_block_type", "dark").build(), new TexPathBlockIcon("blocks/prismarine_dark.png"), 0xFF34634e, false), + new BlockTemplate("bricks", new Block.Builder(BlockType.PRISMARINE).setProperty("prismarine_block_type", "bricks").build(), new TexPathBlockIcon("blocks/prismarine_bricks.png"), 0xff59Ad7e, false) + }); + allTemplates.put("minecraft:seaLantern", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SEALANTERN).build(), new TexPathBlockIcon("blocks/seaLantern.png"), 0xffe0eae4, false) + }); + allTemplates.put("minecraft:hay_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HAY_BLOCK).setProperty("deprecated", 0).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/hay_block.png"), 0xffa3870e, false) + }); + allTemplates.put("minecraft:carpet", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.CARPET).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/carpet_white.png"), 0xffdddddd, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CARPET).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/carpet_orange.png"), 0xffdb7d3e, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CARPET).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/carpet_magenta.png"), 0xffb350bc, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CARPET).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/carpet_light_blue.png"), 0xff6a8ac9, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CARPET).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/carpet_yellow.png"), 0xffb1a627, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CARPET).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/carpet_lime.png"), 0xff41ae38, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CARPET).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/carpet_pink.png"), 0xffd08499, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CARPET).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/carpet_gray.png"), 0xff404040, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CARPET).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/carpet_silver.png"), 0xff9aa1a1, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CARPET).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/carpet_cyan.png"), 0xff2e6e89, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CARPET).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/carpet_purple.png"), 0xff7e3db5, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CARPET).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/carpet_blue.png"), 0xff2e388d, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CARPET).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/carpet_brown.png"), 0xff4f321f, false), + new BlockTemplate("green", new Block.Builder(BlockType.CARPET).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/carpet_green.png"), 0xff35461b, false), + new BlockTemplate("red", new Block.Builder(BlockType.CARPET).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/carpet_red.png"), 0xff963430, false), + new BlockTemplate("black", new Block.Builder(BlockType.CARPET).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/carpet_black.png"), 0xff191616, false) + }); + allTemplates.put("minecraft:hardened_clay", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARDENED_CLAY).build(), new TexPathBlockIcon("blocks/hardened_clay.png"), 0xff5d3828, false) + }); + allTemplates.put("minecraft:coal_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.COAL_BLOCK).build(), new TexPathBlockIcon("blocks/coal_block.png"), 0xff111111, false) + }); + allTemplates.put("minecraft:packed_ice", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PACKED_ICE).build(), new TexPathBlockIcon("blocks/packed_ice.png"), 0xff97b3e4, false) + }); + allTemplates.put("minecraft:double_plant", new BlockTemplate[]{ + new BlockTemplate("sunflower", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "sunflower").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_sunflower.png"), 0xb4d28219, false), + new BlockTemplate("syringa", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "syringa").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_syringa.png"), 0xb4dec0e2, false), + new BlockTemplate("grass", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "grass").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_grass.png"), 0xb4334e2c, false), + new BlockTemplate("fern", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "fern").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_fern.png"), 0xb43d5d34, false), + new BlockTemplate("rose", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "rose").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_rose.png"), 0xb4d10609, false), + new BlockTemplate("paeonia", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "paeonia").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_paeonia.png"), 0xb4d6c1df, false) + }); + allTemplates.put("minecraft:banner", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:daylight_detector_inverted", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DAYLIGHT_DETECTOR_INVERTED).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/daylight_detector_inverted.png"), 0xffd8c9b5, false) + }); + allTemplates.put("minecraft:red_sandstone", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.RED_SANDSTONE).setProperty("sand_stone_type", "default").build(), new TexPathBlockIcon("blocks/red_sandstone_default.png"), 0xffaa561e, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.RED_SANDSTONE).setProperty("sand_stone_type", "heiroglyphs").build(), new TexPathBlockIcon("blocks/red_sandstone_chiseled.png"), 0xffa8551e, false), + new BlockTemplate("smooth", new Block.Builder(BlockType.RED_SANDSTONE).setProperty("sand_stone_type", "cut").build(), new TexPathBlockIcon("blocks/red_sandstone_smooth.png"), 0xffcc5e16, false) + }); + allTemplates.put("minecraft:red_sandstone_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RED_SANDSTONE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/red_sandstone_stairs.png"), 0xffaa561e, false) + }); + allTemplates.put("minecraft:double_stone_slab2", new BlockTemplate[]{ + new BlockTemplate("red_sandstone", new Block.Builder(BlockType.DOUBLE_STONE_SLAB2).setProperty("stone_slab_type_2", "red_sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab2_red_sandstone.png"), 0xffaa561e, false), + new BlockTemplate("purpur", new Block.Builder(BlockType.DOUBLE_STONE_SLAB2).setProperty("stone_slab_type_2", "purpur").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab2_purpur.png"), 0xffa072a0, false) + }); + allTemplates.put("minecraft:stone_slab2", new BlockTemplate[]{ + new BlockTemplate("red_sandstone", new Block.Builder(BlockType.STONE_SLAB2).setProperty("stone_slab_type_2", "red_sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab2_red_sandstone.png"), 0xffaa561e, false), + new BlockTemplate("purpur", new Block.Builder(BlockType.STONE_SLAB2).setProperty("stone_slab_type_2", "purpur").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab2_purpur.png"), 0xffa072a0, false) + }); + allTemplates.put("minecraft:spruce_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/spruce_fence_gate.png"), 0x8f5a3d0d, false) + }); + allTemplates.put("minecraft:birch_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/birch_fence_gate.png"), 0x8fdabd8d, false) + }); + allTemplates.put("minecraft:jungle_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/jungle_fence_gate.png"), 0x8fBa7d5d, false) + }); + allTemplates.put("minecraft:dark_oak_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dark_oak_fence_gate.png"), 0x8f2d2213, false) + }); + allTemplates.put("minecraft:acacia_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/acacia_fence_gate.png"), 0x8f934f39, false) + }); + allTemplates.put("minecraft:repeating_command_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:chain_command_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:hard_glass_pane", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARD_GLASS_PANE).build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:hard_stained_glass_pane", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:chemical_heat", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHEMICAL_HEAT).build(), new TexPathBlockIcon("blocks/fire_0.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:spruce_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/spruce_door.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:birch_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/birch_door.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:jungle_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/jungle_door.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:acacia_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/acacia_door.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:dark_oak_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dark_oak_door.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:grass_path", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GRASS_PATH).build(), new TexPathBlockIcon("blocks/grass_path.png"), 0x46a0a0a0, false) + }); + allTemplates.put("minecraft:frame", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FRAME).setProperty("facing_direction", 5).setProperty("item_frame_map_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/frame.png"), 0xa04f3e4f, false) + }); + allTemplates.put("minecraft:chorus_flower", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHORUS_FLOWER).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/chorus_flower.png"), 0xa0c3b6c8, false) + }); + allTemplates.put("minecraft:purpur_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "default").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_default.png"), 0xc095c0ff, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "chiseled").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_chiseled.png"), 0xc095c0ff, false), + new BlockTemplate("lines", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "lines").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_lines.png"), 0xc095c0ff, false), + new BlockTemplate("default", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "smooth").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_default.png"), 0xc095c0ff, false) + }); + allTemplates.put("minecraft:purpur_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PURPUR_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/purpur_stairs.png"), 0xc095c0ff, false) + }); + allTemplates.put("minecraft:shulker_box", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("red", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:end_bricks", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_BRICKS).build(), new TexPathBlockIcon("blocks/end_bricks.png"), 0xffe7f2af, false) + }); + allTemplates.put("minecraft:end_rod", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_ROD).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/end_rod.png"), 0xff6e6e6e, true) + }); + allTemplates.put("minecraft:end_gateway", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_GATEWAY).build(), new TexPathBlockIcon("blocks/end_gateway.png"), 0xff171c27, false) + }); + allTemplates.put("minecraft:210", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:211", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:212", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:magma", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.MAGMA).build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffc45a12, false) + }); + allTemplates.put("minecraft:nether_wart_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.NETHER_WART_BLOCK).build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffbf2030, false) + }); + allTemplates.put("minecraft:red_nether_brick", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.RED_NETHER_BRICK).build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xff7f1020, false) + }); + allTemplates.put("minecraft:bone_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.BONE_BLOCK).setProperty("deprecated", 0).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffefe5d2, false) + }); + allTemplates.put("minecraft:purple_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false), + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false), + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false), + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false) + }); + allTemplates.put("minecraft:white_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false) + }); + allTemplates.put("minecraft:orange_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false), + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false), + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false), + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false) + }); + allTemplates.put("minecraft:magenta_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false) + }); + allTemplates.put("minecraft:light_blue_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false) + }); + allTemplates.put("minecraft:yellow_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false) + }); + allTemplates.put("minecraft:lime_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false), + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false), + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false), + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false) + }); + allTemplates.put("minecraft:pink_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false), + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false), + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false), + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false) + }); + allTemplates.put("minecraft:gray_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false), + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false), + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false), + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false) + }); + allTemplates.put("minecraft:silver_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false) + }); + allTemplates.put("minecraft:cyan_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false) + }); + allTemplates.put("minecraft:230", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:blue_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false), + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false), + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false), + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false) + }); + allTemplates.put("minecraft:brown_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false), + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false), + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false), + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false) + }); + allTemplates.put("minecraft:green_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false), + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false), + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false), + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false) + }); + allTemplates.put("minecraft:red_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false), + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false), + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false), + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false) + }); + allTemplates.put("minecraft:black_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false), + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false), + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false), + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false) + }); + allTemplates.put("minecraft:concrete", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.CONCRETE).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CONCRETE).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CONCRETE).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CONCRETE).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CONCRETE).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CONCRETE).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CONCRETE).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CONCRETE).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CONCRETE).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CONCRETE).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CONCRETE).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CONCRETE).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CONCRETE).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.CONCRETE).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("red", new Block.Builder(BlockType.CONCRETE).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.CONCRETE).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:concretePowder", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:chemistry_table", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:underwater_torch", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "west").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "east").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "north").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "south").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "top").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false) + }); + allTemplates.put("minecraft:chorus_plant", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHORUS_PLANT).build(), new TexPathBlockIcon("blocks/chorus_plant.png"), 0xaa3d6e86, false) + }); + allTemplates.put("minecraft:stained_glass", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/stained_glass_white.png"), 0x50836f64, false), + new BlockTemplate("orange", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/stained_glass_orange.png"), 0x509d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/stained_glass_magenta.png"), 0x50915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/stained_glass_light_blue.png"), 0x50706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/stained_glass_yellow.png"), 0x50b5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/stained_glass_lime.png"), 0x50617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/stained_glass_pink.png"), 0x509c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/stained_glass_gray.png"), 0x50392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/stained_glass_silver.png"), 0x5081655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/stained_glass_cyan.png"), 0x50565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/stained_glass_purple.png"), 0x50744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/stained_glass_blue.png"), 0x50463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/stained_glass_brown.png"), 0x50492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/stained_glass_green.png"), 0x50484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/stained_glass_red.png"), 0x50ff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/stained_glass_black.png"), 0x5021120d, false) + }); + allTemplates.put("minecraft:242", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:podzol", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PODZOL).build(), new TexPathBlockIcon("blocks/podzol.png"), 0xff533a1b, true) + }); + allTemplates.put("minecraft:beetroot", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BEETROOT).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/beetroot.png"), 0x0901ab10, false) + }); + allTemplates.put("minecraft:stonecutter", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONECUTTER).build(), new TexPathBlockIcon("blocks/stonecutter.png"), 0xff515151, false) + }); + allTemplates.put("minecraft:glowingobsidian", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLOWINGOBSIDIAN).build(), new TexPathBlockIcon("blocks/glowingobsidian.png"), 0xff17060a, false) + }); + allTemplates.put("minecraft:netherreactor", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.NETHERREACTOR).build(), new TexPathBlockIcon("blocks/netherreactor_default.png"), 0xffd2d200, false), + new BlockTemplate("active", new Block.Builder(BlockType.NETHERREACTOR).build(), new TexPathBlockIcon("blocks/netherreactor_active.png"), 0xff3d6e86, false), + new BlockTemplate("cooled", new Block.Builder(BlockType.NETHERREACTOR).build(), new TexPathBlockIcon("blocks/netherreactor_cooled.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:info_update", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.INFO_UPDATE).build(), new TexPathBlockIcon("blocks/info_update.png"), 0xff2f3218, false) + }); + allTemplates.put("minecraft:info_update2", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.INFO_UPDATE2).build(), new TexPathBlockIcon("blocks/info_update2.png"), 0xff2f3218, false) + }); + allTemplates.put("minecraft:movingBlock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MOVINGBLOCK).build(), new TexPathBlockIcon("blocks/movingBlock.png"), 0, false) + }); + allTemplates.put("minecraft:observer", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 1).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 2).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 3).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 4).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 5).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 1).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 2).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 3).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 4).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 5).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:structure_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "data").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "save").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "load").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "corner").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "invalid").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "export").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "data").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "data").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:hard_glass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARD_GLASS).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:hard_stained_glass", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/stained_glass_white.png"), 0x50836f64, false), + new BlockTemplate("orange", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/stained_glass_orange.png"), 0x509d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/stained_glass_magenta.png"), 0x50915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/stained_glass_light_blue.png"), 0x50706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/stained_glass_yellow.png"), 0x50b5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/stained_glass_lime.png"), 0x50617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/stained_glass_pink.png"), 0x509c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/stained_glass_gray.png"), 0x50392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/stained_glass_silver.png"), 0x5081655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/stained_glass_cyan.png"), 0x50565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/stained_glass_purple.png"), 0x50744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/stained_glass_blue.png"), 0x50463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/stained_glass_brown.png"), 0x50492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/stained_glass_green.png"), 0x50484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/stained_glass_red.png"), 0x50ff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/stained_glass_black.png"), 0x5021120d, false) + }); + allTemplates.put("minecraft:reserved6", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RESERVED6).build(), new TexPathBlockIcon("blocks/reserved6.png"), 0xff19171a, false) + }); + allTemplates.put("minecraft:256", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:prismarine_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false) + }); + allTemplates.put("minecraft:dark_prismarine_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false) + }); + allTemplates.put("minecraft:prismarine_bricks_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false) + }); + allTemplates.put("minecraft:stripped_spruce_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:stripped_birch_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:stripped_jungle_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:stripped_acacia_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:stripped_dark_oak_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:stripped_oak_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false) + }); + allTemplates.put("minecraft:blue_ice", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BLUE_ICE).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff7dbeF6, false) + }); + allTemplates.put("minecraft:seagrass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "default").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "double_top").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "double_bot").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "default").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false) + }); + allTemplates.put("minecraft:coral", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "purple").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "red").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan_dead", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "purple").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "red").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "purple").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "red").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false) + }); + allTemplates.put("minecraft:coral_fan_hang", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan_hang2", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan_hang3", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:kelp", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false) + }); + allTemplates.put("minecraft:dried_kelp_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DRIED_KELP_BLOCK).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff044b4b, false) + }); + allTemplates.put("minecraft:acacia_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false) + }); + allTemplates.put("minecraft:birch_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:dark_oak_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:jungle_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:spruce_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:acacia_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:birch_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:dark_oak_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:jungle_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:spruce_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:acacia_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:birch_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:dark_oak_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:jungle_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:spruce_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:carved_pumpkin", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false), + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false), + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false), + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false) + }); + allTemplates.put("minecraft:sea_pickle", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false) + }); + } + + public static BlockTemplate[] getOfType(@NonNull String name) { + if (!name.contains(":")) name = "minecraft:" + name; + return allTemplates.get(name); + } + + @NonNull + public static BlockTemplate getBest(@NonNull Block block) { + var type = block.getType(); + if (type == null) return getUnknownBlockTemplate(); + List candidates = Arrays.asList(Objects.requireNonNull(getOfType(type.getName()))); + for (int i = 0, limit = block.getType().getKnownProperties().length; i < limit; i++) { + List newCandidates = new ArrayList<>(); + for (var template : candidates) { + if (Objects.equals(template.getBlock().getKnownProperties()[i], block.getKnownProperties()[i])) + newCandidates.add(template); + } + switch (newCandidates.size()) { + case 0: // give up filtering based on this property + continue; + case 1: // no longer an option + return newCandidates.get(0); + default: // less candidates + candidates = newCandidates; + } + } + return candidates.size() > 0 ? candidates.get(0) : getUnknownBlockTemplate(); + } + + public static Stream getAll() { + var stream = Arrays.stream(new BlockTemplate[0]); + for (var templates : allTemplates.values()) + stream = Streams.concat(stream, Arrays.stream(templates)); + return stream; + } + + @NonNull + public static BlockTemplate getAirTemplate() { + return getOfType("minecraft:air")[0]; + } + + @NonNull + public static BlockTemplate getUnknownBlockTemplate() { + return unknownBlockTemplate; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java index 404e587f..0ef4e750 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java @@ -1,16 +1,327 @@ package com.mithrilmania.blocktopograph.block; +import androidx.annotation.Nullable; + +import com.mithrilmania.blocktopograph.block.blockproperty.BlockProperty; + import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +public enum BlockType implements Serializable { + AIR("minecraft:air", new BlockProperty[]{}), + STONE("minecraft:stone", new BlockProperty[]{BlockProperty.STONE_TYPE}), + GRASS("minecraft:grass", new BlockProperty[]{}), + DIRT("minecraft:dirt", new BlockProperty[]{BlockProperty.DIRT_TYPE}), + COBBLESTONE("minecraft:cobblestone", new BlockProperty[]{}), + PLANKS("minecraft:planks", new BlockProperty[]{BlockProperty.WOOD_TYPE}), + SAPLING("minecraft:sapling", new BlockProperty[]{BlockProperty.SAPLING_TYPE, BlockProperty.AGE_BIT}), + BEDROCK("minecraft:bedrock", new BlockProperty[]{BlockProperty.INFINIBURN_BIT}), + FLOWING_WATER("minecraft:flowing_water", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + WATER("minecraft:water", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + FLOWING_LAVA("minecraft:flowing_lava", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + LAVA("minecraft:lava", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + SAND("minecraft:sand", new BlockProperty[]{BlockProperty.SAND_TYPE}), + GRAVEL("minecraft:gravel", new BlockProperty[]{}), + GOLD_ORE("minecraft:gold_ore", new BlockProperty[]{}), + IRON_ORE("minecraft:iron_ore", new BlockProperty[]{}), + COAL_ORE("minecraft:coal_ore", new BlockProperty[]{}), + LOG("minecraft:log", new BlockProperty[]{BlockProperty.OLD_LOG_TYPE, BlockProperty.PILLAR_AXIS}), + LEAVES("minecraft:leaves", new BlockProperty[]{BlockProperty.OLD_LEAF_TYPE, BlockProperty.PERSISTENT_BIT, BlockProperty.UPDATE_BIT}), + SPONGE("minecraft:sponge", new BlockProperty[]{BlockProperty.SPONGE_TYPE}), + GLASS("minecraft:glass", new BlockProperty[]{}), + LAPIS_ORE("minecraft:lapis_ore", new BlockProperty[]{}), + LAPIS_BLOCK("minecraft:lapis_block", new BlockProperty[]{}), + DISPENSER("minecraft:dispenser", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.TRIGGERED_BIT}), + SANDSTONE("minecraft:sandstone", new BlockProperty[]{BlockProperty.SAND_STONE_TYPE}), + NOTEBLOCK("minecraft:noteblock", new BlockProperty[]{}), + BED("minecraft:bed", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.HEAD_PIECE_BIT, BlockProperty.OCCUPIED_BIT}), + GOLDEN_RAIL("minecraft:golden_rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION, BlockProperty.RAIL_DATA_BIT}), + DETECTOR_RAIL("minecraft:detector_rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION, BlockProperty.RAIL_DATA_BIT}), + STICKY_PISTON("minecraft:sticky_piston", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + WEB("minecraft:web", new BlockProperty[]{}), + TALLGRASS("minecraft:tallgrass", new BlockProperty[]{BlockProperty.TALL_GRASS_TYPE}), + DEADBUSH("minecraft:deadbush", new BlockProperty[]{}), + PISTON("minecraft:piston", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + PISTONARMCOLLISION("minecraft:pistonArmCollision", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + WOOL("minecraft:wool", new BlockProperty[]{BlockProperty.COLOR}), + ELEMENT_0("minecraft:element_0", new BlockProperty[]{}), + YELLOW_FLOWER("minecraft:yellow_flower", new BlockProperty[]{}), + RED_FLOWER("minecraft:red_flower", new BlockProperty[]{BlockProperty.FLOWER_TYPE}), + BROWN_MUSHROOM("minecraft:brown_mushroom", new BlockProperty[]{}), + RED_MUSHROOM("minecraft:red_mushroom", new BlockProperty[]{}), + GOLD_BLOCK("minecraft:gold_block", new BlockProperty[]{}), + IRON_BLOCK("minecraft:iron_block", new BlockProperty[]{}), + DOUBLE_STONE_SLAB("minecraft:double_stone_slab", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE, BlockProperty.TOP_SLOT_BIT}), + STONE_SLAB("minecraft:stone_slab", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE, BlockProperty.TOP_SLOT_BIT}), + BRICK_BLOCK("minecraft:brick_block", new BlockProperty[]{}), + TNT("minecraft:tnt", new BlockProperty[]{BlockProperty.ALLOW_UNDERWATER_BIT, BlockProperty.EXPLODE_BIT}), + BOOKSHELF("minecraft:bookshelf", new BlockProperty[]{}), + MOSSY_COBBLESTONE("minecraft:mossy_cobblestone", new BlockProperty[]{}), + OBSIDIAN("minecraft:obsidian", new BlockProperty[]{}), + TORCH("minecraft:torch", new BlockProperty[]{BlockProperty.TORCH_FACING_DIRECTION}), + FIRE("minecraft:fire", new BlockProperty[]{BlockProperty.AGE}), + MOB_SPAWNER("minecraft:mob_spawner", new BlockProperty[]{}), + OAK_STAIRS("minecraft:oak_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + CHEST("minecraft:chest", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + REDSTONE_WIRE("minecraft:redstone_wire", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + DIAMOND_ORE("minecraft:diamond_ore", new BlockProperty[]{}), + DIAMOND_BLOCK("minecraft:diamond_block", new BlockProperty[]{}), + CRAFTING_TABLE("minecraft:crafting_table", new BlockProperty[]{}), + WHEAT("minecraft:wheat", new BlockProperty[]{BlockProperty.GROWTH}), + FARMLAND("minecraft:farmland", new BlockProperty[]{BlockProperty.MOISTURIZED_AMOUNT}), + FURNACE("minecraft:furnace", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIT_FURNACE("minecraft:lit_furnace", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + STANDING_SIGN("minecraft:standing_sign", new BlockProperty[]{BlockProperty.GROUND_SIGN_DIRECTION}), + WOODEN_DOOR("minecraft:wooden_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + LADDER("minecraft:ladder", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + RAIL("minecraft:rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION}), + STONE_STAIRS("minecraft:stone_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + WALL_SIGN("minecraft:wall_sign", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LEVER("minecraft:lever", new BlockProperty[]{BlockProperty.LEVER_DIRECTION, BlockProperty.OPEN_BIT}), + STONE_PRESSURE_PLATE("minecraft:stone_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + IRON_DOOR("minecraft:iron_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + WOODEN_PRESSURE_PLATE("minecraft:wooden_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + REDSTONE_ORE("minecraft:redstone_ore", new BlockProperty[]{}), + LIT_REDSTONE_ORE("minecraft:lit_redstone_ore", new BlockProperty[]{}), + UNLIT_REDSTONE_TORCH("minecraft:unlit_redstone_torch", new BlockProperty[]{}), + REDSTONE_TORCH("minecraft:redstone_torch", new BlockProperty[]{BlockProperty.TORCH_FACING_DIRECTION}), + STONE_BUTTON("minecraft:stone_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + SNOW_LAYER("minecraft:snow_layer", new BlockProperty[]{BlockProperty.COVERED_BIT, BlockProperty.HEIGHT}), + ICE("minecraft:ice", new BlockProperty[]{}), + SNOW("minecraft:snow", new BlockProperty[]{}), + CACTUS("minecraft:cactus", new BlockProperty[]{BlockProperty.AGE}), + CLAY("minecraft:clay", new BlockProperty[]{}), + REEDS("minecraft:reeds", new BlockProperty[]{BlockProperty.AGE}), + JUKEBOX("minecraft:jukebox", new BlockProperty[]{}), + FENCE("minecraft:fence", new BlockProperty[]{BlockProperty.WOOD_TYPE}), + PUMPKIN("minecraft:pumpkin", new BlockProperty[]{BlockProperty.DIRECTION}), + NETHERRACK("minecraft:netherrack", new BlockProperty[]{}), + SOUL_SAND("minecraft:soul_sand", new BlockProperty[]{}), + GLOWSTONE("minecraft:glowstone", new BlockProperty[]{}), + PORTAL("minecraft:portal", new BlockProperty[]{BlockProperty.PORTAL_AXIS}), + LIT_PUMPKIN("minecraft:lit_pumpkin", new BlockProperty[]{BlockProperty.DIRECTION}), + CAKE("minecraft:cake", new BlockProperty[]{BlockProperty.BITE_COUNTER}), + UNPOWERED_REPEATER("minecraft:unpowered_repeater", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.REPEATER_DELAY}), + POWERED_REPEATER("minecraft:powered_repeater", new BlockProperty[]{}), + INVISIBLEBEDROCK("minecraft:invisibleBedrock", new BlockProperty[]{}), + TRAPDOOR("minecraft:trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + MONSTER_EGG("minecraft:monster_egg", new BlockProperty[]{BlockProperty.MONSTER_EGG_STONE_TYPE}), + STONEBRICK("minecraft:stonebrick", new BlockProperty[]{BlockProperty.STONE_BRICK_TYPE}), + BROWN_MUSHROOM_BLOCK("minecraft:brown_mushroom_block", new BlockProperty[]{BlockProperty.HUGE_MUSHROOM_BITS}), + RED_MUSHROOM_BLOCK("minecraft:red_mushroom_block", new BlockProperty[]{BlockProperty.HUGE_MUSHROOM_BITS}), + IRON_BARS("minecraft:iron_bars", new BlockProperty[]{}), + GLASS_PANE("minecraft:glass_pane", new BlockProperty[]{}), + MELON_BLOCK("minecraft:melon_block", new BlockProperty[]{}), + PUMPKIN_STEM("minecraft:pumpkin_stem", new BlockProperty[]{BlockProperty.GROWTH}), + MELON_STEM("minecraft:melon_stem", new BlockProperty[]{BlockProperty.GROWTH}), + VINE("minecraft:vine", new BlockProperty[]{BlockProperty.VINE_DIRECTION_BITS}), + FENCE_GATE("minecraft:fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + BRICK_STAIRS("minecraft:brick_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + STONE_BRICK_STAIRS("minecraft:stone_brick_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + MYCELIUM("minecraft:mycelium", new BlockProperty[]{}), + WATERLILY("minecraft:waterlily", new BlockProperty[]{}), + NETHER_BRICK("minecraft:nether_brick", new BlockProperty[]{}), + NETHER_BRICK_FENCE("minecraft:nether_brick_fence", new BlockProperty[]{}), + NETHER_BRICK_STAIRS("minecraft:nether_brick_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + NETHER_WART("minecraft:nether_wart", new BlockProperty[]{BlockProperty.AGE}), + ENCHANTING_TABLE("minecraft:enchanting_table", new BlockProperty[]{}), + BREWING_STAND("minecraft:brewing_stand", new BlockProperty[]{BlockProperty.BREWING_STAND_SLOT_A_BIT, BlockProperty.BREWING_STAND_SLOT_B_BIT, BlockProperty.BREWING_STAND_SLOT_C_BIT}), + CAULDRON("minecraft:cauldron", new BlockProperty[]{BlockProperty.CAULDRON_LIQUID, BlockProperty.FILL_LEVEL}), + END_PORTAL("minecraft:end_portal", new BlockProperty[]{}), + END_PORTAL_FRAME("minecraft:end_portal_frame", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.END_PORTAL_EYE_BIT}), + END_STONE("minecraft:end_stone", new BlockProperty[]{}), + DRAGON_EGG("minecraft:dragon_egg", new BlockProperty[]{}), + REDSTONE_LAMP("minecraft:redstone_lamp", new BlockProperty[]{}), + LIT_REDSTONE_LAMP("minecraft:lit_redstone_lamp", new BlockProperty[]{}), + DROPPER("minecraft:dropper", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.TRIGGERED_BIT}), + ACTIVATOR_RAIL("minecraft:activator_rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION, BlockProperty.RAIL_DATA_BIT}), + COCOA("minecraft:cocoa", new BlockProperty[]{}), + SANDSTONE_STAIRS("minecraft:sandstone_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + EMERALD_ORE("minecraft:emerald_ore", new BlockProperty[]{}), + ENDER_CHEST("minecraft:ender_chest", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + TRIPWIRE_HOOK("minecraft:tripwire_hook", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.ATTACHED_BIT, BlockProperty.POWERED_BIT}), + TRIPWIRE("minecraft:tripWire", new BlockProperty[]{BlockProperty.ATTACHED_BIT, BlockProperty.DISARMED_BIT, BlockProperty.POWERED_BIT, BlockProperty.SUSPENDED_BIT}), + EMERALD_BLOCK("minecraft:emerald_block", new BlockProperty[]{}), + SPRUCE_STAIRS("minecraft:spruce_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + BIRCH_STAIRS("minecraft:birch_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + JUNGLE_STAIRS("minecraft:jungle_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + BEACON("minecraft:beacon", new BlockProperty[]{}), + COBBLESTONE_WALL("minecraft:cobblestone_wall", new BlockProperty[]{BlockProperty.WALL_BLOCK_TYPE}), + FLOWER_POT("minecraft:flower_pot", new BlockProperty[]{BlockProperty.UPDATE_BIT}), + CARROTS("minecraft:carrots", new BlockProperty[]{BlockProperty.GROWTH}), + POTATOES("minecraft:potatoes", new BlockProperty[]{BlockProperty.GROWTH}), + WOODEN_BUTTON("minecraft:wooden_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + SKULL("minecraft:skull", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.NO_DROP_BIT}), + ANVIL("minecraft:anvil", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DAMAGE}), + TRAPPED_CHEST("minecraft:trapped_chest", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIGHT_WEIGHTED_PRESSURE_PLATE("minecraft:light_weighted_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + HEAVY_WEIGHTED_PRESSURE_PLATE("minecraft:heavy_weighted_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + UNPOWERED_COMPARATOR("minecraft:unpowered_comparator", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OUTPUT_LIT_BIT, BlockProperty.OUTPUT_SUBTRACT_BIT}), + POWERED_COMPARATOR("minecraft:powered_comparator", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OUTPUT_LIT_BIT, BlockProperty.OUTPUT_SUBTRACT_BIT}), + DAYLIGHT_DETECTOR("minecraft:daylight_detector", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + REDSTONE_BLOCK("minecraft:redstone_block", new BlockProperty[]{}), + QUARTZ_ORE("minecraft:quartz_ore", new BlockProperty[]{}), + HOPPER("minecraft:hopper", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.TOGGLE_BIT}), + QUARTZ_BLOCK("minecraft:quartz_block", new BlockProperty[]{BlockProperty.CHISEL_TYPE, BlockProperty.PILLAR_AXIS}), + QUARTZ_STAIRS("minecraft:quartz_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DOUBLE_WOODEN_SLAB("minecraft:double_wooden_slab", new BlockProperty[]{BlockProperty.WOOD_TYPE, BlockProperty.TOP_SLOT_BIT}), + WOODEN_SLAB("minecraft:wooden_slab", new BlockProperty[]{BlockProperty.WOOD_TYPE, BlockProperty.TOP_SLOT_BIT}), + STAINED_HARDENED_CLAY("minecraft:stained_hardened_clay", new BlockProperty[]{BlockProperty.COLOR}), + STAINED_GLASS_PANE("minecraft:stained_glass_pane", new BlockProperty[]{BlockProperty.COLOR}), + LEAVES2("minecraft:leaves2", new BlockProperty[]{BlockProperty.NEW_LEAF_TYPE, BlockProperty.PERSISTENT_BIT, BlockProperty.UPDATE_BIT}), + LOG2("minecraft:log2", new BlockProperty[]{BlockProperty.NEW_LOG_TYPE, BlockProperty.PILLAR_AXIS}), + ACACIA_STAIRS("minecraft:acacia_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DARK_OAK_STAIRS("minecraft:dark_oak_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + SLIME("minecraft:slime", new BlockProperty[]{}), + IRON_TRAPDOOR("minecraft:iron_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + PRISMARINE("minecraft:prismarine", new BlockProperty[]{BlockProperty.PRISMARINE_BLOCK_TYPE}), + SEALANTERN("minecraft:seaLantern", new BlockProperty[]{}), + HAY_BLOCK("minecraft:hay_block", new BlockProperty[]{BlockProperty.DEPRECATED, BlockProperty.PILLAR_AXIS}), + CARPET("minecraft:carpet", new BlockProperty[]{BlockProperty.COLOR}), + HARDENED_CLAY("minecraft:hardened_clay", new BlockProperty[]{}), + COAL_BLOCK("minecraft:coal_block", new BlockProperty[]{}), + PACKED_ICE("minecraft:packed_ice", new BlockProperty[]{}), + DOUBLE_PLANT("minecraft:double_plant", new BlockProperty[]{BlockProperty.DOUBLE_PLANT_TYPE, BlockProperty.UPPER_BLOCK_BIT}), + BANNER("minecraft:banner", new BlockProperty[]{}), + DAYLIGHT_DETECTOR_INVERTED("minecraft:daylight_detector_inverted", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + RED_SANDSTONE("minecraft:red_sandstone", new BlockProperty[]{BlockProperty.SAND_STONE_TYPE}), + RED_SANDSTONE_STAIRS("minecraft:red_sandstone_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DOUBLE_STONE_SLAB2("minecraft:double_stone_slab2", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE_2, BlockProperty.TOP_SLOT_BIT}), + STONE_SLAB2("minecraft:stone_slab2", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE_2, BlockProperty.TOP_SLOT_BIT}), + SPRUCE_FENCE_GATE("minecraft:spruce_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + BIRCH_FENCE_GATE("minecraft:birch_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + JUNGLE_FENCE_GATE("minecraft:jungle_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + DARK_OAK_FENCE_GATE("minecraft:dark_oak_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + ACACIA_FENCE_GATE("minecraft:acacia_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + REPEATING_COMMAND_BLOCK("minecraft:repeating_command_block", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.CONDITIONAL_BIT}), + CHAIN_COMMAND_BLOCK("minecraft:chain_command_block", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.CONDITIONAL_BIT}), + HARD_GLASS_PANE("minecraft:hard_glass_pane", new BlockProperty[]{}), + HARD_STAINED_GLASS_PANE("minecraft:hard_stained_glass_pane", new BlockProperty[]{BlockProperty.COLOR}), + CHEMICAL_HEAT("minecraft:chemical_heat", new BlockProperty[]{}), + SPRUCE_DOOR("minecraft:spruce_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + BIRCH_DOOR("minecraft:birch_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + JUNGLE_DOOR("minecraft:jungle_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + ACACIA_DOOR("minecraft:acacia_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + DARK_OAK_DOOR("minecraft:dark_oak_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + GRASS_PATH("minecraft:grass_path", new BlockProperty[]{}), + FRAME("minecraft:frame", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.ITEM_FRAME_MAP_BIT}), + CHORUS_FLOWER("minecraft:chorus_flower", new BlockProperty[]{BlockProperty.AGE}), + PURPUR_BLOCK("minecraft:purpur_block", new BlockProperty[]{BlockProperty.CHISEL_TYPE, BlockProperty.PILLAR_AXIS}), + PURPUR_STAIRS("minecraft:purpur_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + SHULKER_BOX("minecraft:shulker_box", new BlockProperty[]{BlockProperty.COLOR}), + END_BRICKS("minecraft:end_bricks", new BlockProperty[]{}), + END_ROD("minecraft:end_rod", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + END_GATEWAY("minecraft:end_gateway", new BlockProperty[]{}), + B_210("minecraft:210", new BlockProperty[]{}), + B_211("minecraft:211", new BlockProperty[]{}), + B_212("minecraft:212", new BlockProperty[]{}), + MAGMA("minecraft:magma", new BlockProperty[]{}), + NETHER_WART_BLOCK("minecraft:nether_wart_block", new BlockProperty[]{}), + RED_NETHER_BRICK("minecraft:red_nether_brick", new BlockProperty[]{}), + BONE_BLOCK("minecraft:bone_block", new BlockProperty[]{BlockProperty.DEPRECATED, BlockProperty.PILLAR_AXIS}), + PURPLE_GLAZED_TERRACOTTA("minecraft:purple_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + WHITE_GLAZED_TERRACOTTA("minecraft:white_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + ORANGE_GLAZED_TERRACOTTA("minecraft:orange_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + MAGENTA_GLAZED_TERRACOTTA("minecraft:magenta_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIGHT_BLUE_GLAZED_TERRACOTTA("minecraft:light_blue_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + YELLOW_GLAZED_TERRACOTTA("minecraft:yellow_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIME_GLAZED_TERRACOTTA("minecraft:lime_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + PINK_GLAZED_TERRACOTTA("minecraft:pink_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + GRAY_GLAZED_TERRACOTTA("minecraft:gray_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + SILVER_GLAZED_TERRACOTTA("minecraft:silver_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + CYAN_GLAZED_TERRACOTTA("minecraft:cyan_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + B_230("minecraft:230", new BlockProperty[]{}), + BLUE_GLAZED_TERRACOTTA("minecraft:blue_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + BROWN_GLAZED_TERRACOTTA("minecraft:brown_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + GREEN_GLAZED_TERRACOTTA("minecraft:green_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + RED_GLAZED_TERRACOTTA("minecraft:red_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + BLACK_GLAZED_TERRACOTTA("minecraft:black_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + CONCRETE("minecraft:concrete", new BlockProperty[]{BlockProperty.COLOR}), + CONCRETEPOWDER("minecraft:concretePowder", new BlockProperty[]{BlockProperty.COLOR}), + CHEMISTRY_TABLE("minecraft:chemistry_table", new BlockProperty[]{BlockProperty.CHEMISTRY_TABLE_TYPE, BlockProperty.DIRECTION}), + UNDERWATER_TORCH("minecraft:underwater_torch", new BlockProperty[]{BlockProperty.TORCH_FACING_DIRECTION}), + CHORUS_PLANT("minecraft:chorus_plant", new BlockProperty[]{}), + STAINED_GLASS("minecraft:stained_glass", new BlockProperty[]{BlockProperty.COLOR}), + B_242("minecraft:242", new BlockProperty[]{}), + PODZOL("minecraft:podzol", new BlockProperty[]{}), + BEETROOT("minecraft:beetroot", new BlockProperty[]{BlockProperty.GROWTH}), + STONECUTTER("minecraft:stonecutter", new BlockProperty[]{}), + GLOWINGOBSIDIAN("minecraft:glowingobsidian", new BlockProperty[]{}), + NETHERREACTOR("minecraft:netherreactor", new BlockProperty[]{}), + INFO_UPDATE("minecraft:info_update", new BlockProperty[]{}), + INFO_UPDATE2("minecraft:info_update2", new BlockProperty[]{}), + MOVINGBLOCK("minecraft:movingBlock", new BlockProperty[]{}), + OBSERVER("minecraft:observer", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.POWERED_BIT}), + STRUCTURE_BLOCK("minecraft:structure_block", new BlockProperty[]{BlockProperty.STRUCTURE_BLOCK_TYPE}), + HARD_GLASS("minecraft:hard_glass", new BlockProperty[]{}), + HARD_STAINED_GLASS("minecraft:hard_stained_glass", new BlockProperty[]{BlockProperty.COLOR}), + RESERVED6("minecraft:reserved6", new BlockProperty[]{}), + B_256("minecraft:256", new BlockProperty[]{}), + PRISMARINE_STAIRS("minecraft:prismarine_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DARK_PRISMARINE_STAIRS("minecraft:dark_prismarine_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + PRISMARINE_BRICKS_STAIRS("minecraft:prismarine_bricks_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + STRIPPED_SPRUCE_LOG("minecraft:stripped_spruce_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_BIRCH_LOG("minecraft:stripped_birch_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_JUNGLE_LOG("minecraft:stripped_jungle_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_ACACIA_LOG("minecraft:stripped_acacia_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_DARK_OAK_LOG("minecraft:stripped_dark_oak_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_OAK_LOG("minecraft:stripped_oak_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + BLUE_ICE("minecraft:blue_ice", new BlockProperty[]{}), + SEAGRASS("minecraft:seagrass", new BlockProperty[]{BlockProperty.SEA_GRASS_TYPE}), + CORAL("minecraft:coral", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.DEAD_BIT}), + CORAL_BLOCK("minecraft:coral_block", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.DEAD_BIT}), + CORAL_FAN("minecraft:coral_fan", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.CORAL_FAN_DIRECTION}), + CORAL_FAN_DEAD("minecraft:coral_fan_dead", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.CORAL_FAN_DIRECTION}), + CORAL_FAN_HANG("minecraft:coral_fan_hang", new BlockProperty[]{BlockProperty.CORAL_HANG_TYPE_BIT, BlockProperty.CORAL_DIRECTION, BlockProperty.DEAD_BIT}), + CORAL_FAN_HANG2("minecraft:coral_fan_hang2", new BlockProperty[]{BlockProperty.CORAL_HANG_TYPE_BIT, BlockProperty.CORAL_DIRECTION, BlockProperty.DEAD_BIT}), + CORAL_FAN_HANG3("minecraft:coral_fan_hang3", new BlockProperty[]{BlockProperty.CORAL_HANG_TYPE_BIT, BlockProperty.CORAL_DIRECTION, BlockProperty.DEAD_BIT}), + KELP("minecraft:kelp", new BlockProperty[]{BlockProperty.KELP_AGE}), + DRIED_KELP_BLOCK("minecraft:dried_kelp_block", new BlockProperty[]{}), + ACACIA_BUTTON("minecraft:acacia_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + BIRCH_BUTTON("minecraft:birch_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + DARK_OAK_BUTTON("minecraft:dark_oak_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + JUNGLE_BUTTON("minecraft:jungle_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + SPRUCE_BUTTON("minecraft:spruce_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + ACACIA_TRAPDOOR("minecraft:acacia_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + BIRCH_TRAPDOOR("minecraft:birch_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + DARK_OAK_TRAPDOOR("minecraft:dark_oak_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + JUNGLE_TRAPDOOR("minecraft:jungle_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + SPRUCE_TRAPDOOR("minecraft:spruce_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + ACACIA_PRESSURE_PLATE("minecraft:acacia_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + BIRCH_PRESSURE_PLATE("minecraft:birch_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + DARK_OAK_PRESSURE_PLATE("minecraft:dark_oak_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + JUNGLE_PRESSURE_PLATE("minecraft:jungle_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + SPRUCE_PRESSURE_PLATE("minecraft:spruce_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + CARVED_PUMPKIN("minecraft:carved_pumpkin", new BlockProperty[]{BlockProperty.DIRECTION}), + SEA_PICKLE("minecraft:sea_pickle", new BlockProperty[]{BlockProperty.CLUSTER_COUNT, BlockProperty.DEAD_BIT}), + UNKNOWN("blocktopograph:unknown", new BlockProperty[0]); + + private static final Map blockTypes = new HashMap<>(); + + private final String name; -public class BlockType implements Serializable { + private final BlockProperty[] knownProperties; - private String name; + static { + for (var block : BlockType.values()) blockTypes.put(block.name, block); + } - public BlockType(String name) { + BlockType(String name, BlockProperty[] knownProperties) { this.name = name; + this.knownProperties = knownProperties; + } + + @Nullable + public static BlockType get(String name) { + return blockTypes.get(name); } public String getName() { return name; } + + public BlockProperty[] getKnownProperties() { + return knownProperties; + } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java index c4e89f61..0e60ab48 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java @@ -4786,13 +4786,13 @@ public class BlockWithStatesToLegacyBlockMapper { } @Nullable - public static KnownBlockRepr getBestRepr(@NonNull Block block) { - Pair[] list = mMapTypeToBlocks.get(block.getBlockType()); + public static KnownBlockRepr getBestRepr(@NonNull OldBlock oldBlock) { + Pair[] list = mMapTypeToBlocks.get(oldBlock.getBlockType()); if (list == null || list.length <= 0) // Already the best we can d for now. return null; String[] checks = new String[]{"color", "type", "direction"}; - ArrayList tags = block.getStates().getValue(); + ArrayList tags = oldBlock.getStates().getValue(); List> range = new ArrayList<>(list.length); range.addAll(Arrays.asList(list)); for (String check : checks) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java new file mode 100644 index 00000000..a95e0c57 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java @@ -0,0 +1,93 @@ +package com.mithrilmania.blocktopograph.block; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; +import com.mithrilmania.blocktopograph.nbt.tags.Tag; + +import java.io.Serializable; +import java.util.ArrayList; + +public class OldBlock implements Serializable { + + @NonNull + private OldBlockType oldBlockType; + + @NonNull + private KnownBlockRepr legacyBlock; + + private ListingBlock listingBlock; + + @NonNull + private CompoundTag states; + + private int version; + + OldBlock(@NonNull OldBlockType oldBlockType, @NonNull CompoundTag states, int version) { + this.oldBlockType = oldBlockType; + this.states = states; + this.version = version; + KnownBlockRepr legacyBlock = BlockWithStatesToLegacyBlockMapper.getBestRepr(this); + if (legacyBlock == null) { + for (ListingBlock lb : ListingBlock.values()) { + if (lb.getIdentifier().equals(oldBlockType.getName())) { + listingBlock = lb; + break; + } + } + legacyBlock = KnownBlockRepr.guessBlockNew(oldBlockType.getName()); + } + this.legacyBlock = legacyBlock; + } + + OldBlock(@NonNull OldBlockType oldBlockType, @NonNull KnownBlockRepr legacyBlock, int version) { + this.oldBlockType = oldBlockType; + this.states = new CompoundTag("states", new ArrayList<>()); + this.version = version; + this.legacyBlock = legacyBlock; + } + + @NonNull + public String getBlockType() { + return oldBlockType.getName(); + } + + public int getVersion() { + return version; + } + + public boolean isOfSameType(OldBlock oldBlock) { + return oldBlockType == oldBlock.oldBlockType; + } + + public Tag getState(String key) { + return states.getChildTagByKey(key); + } + + @NonNull + public KnownBlockRepr getLegacyBlock() { + return legacyBlock; + } + + public int getColor() { + if (listingBlock != null) + return listingBlock.getColor(); + return legacyBlock.color; + } + + @NonNull + public CompoundTag getStates() { + return states; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (!(obj instanceof OldBlock)) return false; + OldBlock another = (OldBlock) obj; + // Ref compare. + if (oldBlockType != another.oldBlockType) return false; + return states.equals(another.states); + } + +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java new file mode 100644 index 00000000..38e79a3c --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java @@ -0,0 +1,52 @@ +package com.mithrilmania.blocktopograph.block; + +import androidx.annotation.NonNull; + +import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; + +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Map; + +public class OldBlockRegistry { + + private int limitedTypes; + private Map blockTypes; + + public OldBlockRegistry() { + blockTypes = new Hashtable<>(1024); + } + + public OldBlockRegistry(int limitedTypes) { + this(); + this.limitedTypes = limitedTypes; + } + + @NonNull + private OldBlockType getBlockType(String name) { + OldBlockType ret = blockTypes.get(name); + if (ret == null) { + ret = new OldBlockType(name); + if (limitedTypes > 0 && blockTypes.size() >= limitedTypes) + throw new RuntimeException("Block types exceeds your set limit."); + blockTypes.put(name, ret); + } + return ret; + } + + @NonNull + public OldBlock createBlock(@NonNull String name, @NonNull CompoundTag states, int version) { + return new OldBlock(getBlockType(name), states, version); + } + + @NonNull + public OldBlock createBlock(@NonNull String name) { + return new OldBlock(getBlockType(name), new CompoundTag("states", new ArrayList<>()), 3841); + } + + @NonNull + public OldBlock createBlock(@NonNull KnownBlockRepr legacyBlock) { + return new OldBlock(getBlockType(legacyBlock.identifier), legacyBlock, 1); + } + +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java new file mode 100644 index 00000000..6ab2d1b0 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java @@ -0,0 +1,16 @@ +package com.mithrilmania.blocktopograph.block; + +import java.io.Serializable; + +public class OldBlockType implements Serializable { + + private final String name; + + public OldBlockType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java new file mode 100644 index 00000000..6da14fa7 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java @@ -0,0 +1,4 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +public class BitValuesRange extends ValuesRange { +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java new file mode 100644 index 00000000..be27b3ae --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java @@ -0,0 +1,134 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +import androidx.annotation.Nullable; + +import com.mithrilmania.blocktopograph.nbt.convert.NBTConstants; + +import java.util.HashMap; +import java.util.Map; + +public enum BlockProperty { + AGE_BIT("age_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + ALLOW_UNDERWATER_BIT("allow_underwater_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + ATTACHED_BIT("attached_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BREWING_STAND_SLOT_A_BIT("brewing_stand_slot_a_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BREWING_STAND_SLOT_B_BIT("brewing_stand_slot_b_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BREWING_STAND_SLOT_C_BIT("brewing_stand_slot_c_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BUTTON_PRESSED_BIT("button_pressed_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + CONDITIONAL_BIT("conditional_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + CORAL_HANG_TYPE_BIT("coral_hang_type_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + COVERED_BIT("covered_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + DEAD_BIT("dead_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + DISARMED_BIT("disarmed_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + DOOR_HINGE_BIT("door_hinge_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + END_PORTAL_EYE_BIT("end_portal_eye_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + EXPLODE_BIT("explode_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + HEAD_PIECE_BIT("head_piece_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + IN_WALL_BIT("in_wall_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + INFINIBURN_BIT("infiniburn_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + ITEM_FRAME_MAP_BIT("item_frame_map_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + NO_DROP_BIT("no_drop_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OCCUPIED_BIT("occupied_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OPEN_BIT("open_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OUTPUT_LIT_BIT("output_lit_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OUTPUT_SUBTRACT_BIT("output_subtract_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + PERSISTENT_BIT("persistent_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + POWERED_BIT("powered_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + RAIL_DATA_BIT("rail_data_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + SUSPENDED_BIT("suspended_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + TOGGLE_BIT("toggle_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + TOP_SLOT_BIT("top_slot_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + TRIGGERED_BIT("triggered_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + UPDATE_BIT("update_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + UPPER_BLOCK_BIT("upper_block_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + UPSIDE_DOWN_BIT("upside_down_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + AGE("age", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + BITE_COUNTER("bite_counter", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + CLUSTER_COUNT("cluster_count", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + CORAL_DIRECTION("coral_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + CORAL_FAN_DIRECTION("coral_fan_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1})), + DEPRECATED("deprecated", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + DIRECTION("direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + FACING_DIRECTION("facing_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3, 4, 5})), + FILL_LEVEL("fill_level", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + GROUND_SIGN_DIRECTION("ground_sign_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + GROWTH("growth", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + HEIGHT("height", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + HUGE_MUSHROOM_BITS("huge_mushroom_bits", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + KELP_AGE("kelp_age", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9})), + LIQUID_DEPTH("liquid_depth", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + MOISTURIZED_AMOUNT("moisturized_amount", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + RAIL_DIRECTION("rail_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + REDSTONE_SIGNAL("redstone_signal", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9})), + REPEATER_DELAY("repeater_delay", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + VINE_DIRECTION_BITS("vine_direction_bits", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + WEIRDO_DIRECTION("weirdo_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + CAULDRON_LIQUID("cauldron_liquid", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"water"})), + CHEMISTRY_TABLE_TYPE("chemistry_table_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"compound_creator", "element_constructor", "lab_table", "material_reducer"})), + CHISEL_TYPE("chisel_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"chiseled", "default", "lines", "smooth"})), + COLOR("color", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"black", "blue", "brown", "cyan", "gray", "green", "light_blue", "lime", "magenta", "orange", "pink", "purple", "red", "silver", "white", "yellow"})), + CORAL_COLOR("coral_color", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"blue", "pink", "purple", "red", "yellow"})), + DAMAGE("damage", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"slightly_damaged", "undamaged", "very_damaged"})), + DIRT_TYPE("dirt_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"normal"})), + DOUBLE_PLANT_TYPE("double_plant_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"fern", "grass", "paeonia", "rose", "sunflower", "syringa"})), + FLOWER_TYPE("flower_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"allium", "houstonia", "orchid", "oxeye", "poppy", "tulip_orange", "tulip_pink", "tulip_red", "tulip_white"})), + LEVER_DIRECTION("lever_direction", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"down_east_west"})), + MONSTER_EGG_STONE_TYPE("monster_egg_stone_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"chiseled_stone_brick", "cobblestone", "cracked_stone_brick", "mossy_stone_brick", "stone", "stone_brick"})), + NEW_LEAF_TYPE("new_leaf_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "dark_oak"})), + NEW_LOG_TYPE("new_log_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "dark_oak"})), + OLD_LEAF_TYPE("old_leaf_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"birch", "jungle", "oak", "spruce"})), + OLD_LOG_TYPE("old_log_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"birch", "jungle", "oak", "spruce"})), + PILLAR_AXIS("pillar_axis", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"x", "y", "z"})), + PORTAL_AXIS("portal_axis", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"unknown"})), + PRISMARINE_BLOCK_TYPE("prismarine_block_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"bricks", "dark", "default"})), + SAND_STONE_TYPE("sand_stone_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"cut", "default", "heiroglyphs"})), + SAND_TYPE("sand_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"normal", "red"})), + SAPLING_TYPE("sapling_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "birch", "dark_oak", "jungle", "oak", "spruce"})), + SEA_GRASS_TYPE("sea_grass_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"default", "double_bot", "double_top"})), + SPONGE_TYPE("sponge_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"dry", "wet"})), + STONE_BRICK_TYPE("stone_brick_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"chiseled", "cracked", "default", "mossy", "smooth"})), + STONE_SLAB_TYPE("stone_slab_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"brick", "cobblestone", "nether_brick", "quartz", "sandstone", "smooth_stone", "stone_brick", "wood"})), + STONE_SLAB_TYPE_2("stone_slab_type_2", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"purpur", "red_sandstone"})), + STONE_TYPE("stone_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"andesite", "andesite_smooth", "diorite", "diorite_smooth", "granite", "granite_smooth", "stone"})), + STRUCTURE_BLOCK_TYPE("structure_block_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"corner", "data", "export", "invalid", "load", "save"})), + TALL_GRASS_TYPE("tall_grass_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"fern", "tall"})), + TORCH_FACING_DIRECTION("torch_facing_direction", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"east", "north", "south", "top", "unknown", "west"})), + WALL_BLOCK_TYPE("wall_block_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"cobblestone", "mossy_cobblestone"})), + WOOD_TYPE("wood_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "birch", "dark_oak", "jungle", "oak", "spruce"})); + + + private static final Map blockProperties = new HashMap<>(); + + private final String name; + + private final NBTConstants.NBTType type; + + private final ValuesRange valuesRange; + + static { + for (var property : BlockProperty.values()) blockProperties.put(property.name, property); + } + + BlockProperty(String name, NBTConstants.NBTType type, ValuesRange valuesRange) { + this.name = name; + this.type = type; + this.valuesRange = valuesRange; + } + + @Nullable + public static BlockProperty get(String name){ + return blockProperties.get(name); + } + + public String getName() { + return name; + } + + public NBTConstants.NBTType getType() { + return type; + } + + public ValuesRange getValuesRange() { + return valuesRange; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java new file mode 100644 index 00000000..a12171ae --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java @@ -0,0 +1,16 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +import com.mithrilmania.blocktopograph.nbt.tags.Tag; + +public class EnumValuesRange extends ValuesRange { + + private final Object[] values; + + public EnumValuesRange(Object[] values) { + this.values = values; + } + + public Object[] getValues() { + return values; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java new file mode 100644 index 00000000..dd67e8ca --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java @@ -0,0 +1,4 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +public abstract class ValuesRange { +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java new file mode 100644 index 00000000..3500921b --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java @@ -0,0 +1,11 @@ +package com.mithrilmania.blocktopograph.block.icon; + +import android.content.Context; +import android.graphics.Bitmap; + +import java.io.Serializable; + +public abstract class BlockIcon implements Serializable{ + + abstract public Bitmap getIcon(Context context); +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java new file mode 100644 index 00000000..8fff5dac --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java @@ -0,0 +1,11 @@ +package com.mithrilmania.blocktopograph.block.icon; + +import android.content.Context; +import android.graphics.Bitmap; + +public class NoBlockIcon extends BlockIcon{ + + public Bitmap getIcon(Context context){ + return null; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java new file mode 100644 index 00000000..55145b86 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java @@ -0,0 +1,45 @@ +package com.mithrilmania.blocktopograph.block.icon; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import com.mithrilmania.blocktopograph.Log; +import com.mithrilmania.blocktopograph.block.KnownBlockRepr; + +import java.io.FileNotFoundException; +import java.lang.ref.WeakReference; + +public class TexPathBlockIcon extends BlockIcon { + + private final String texPath; + + private transient WeakReference texture; + + public TexPathBlockIcon(String texPath) { + this.texPath = texPath; + texture = null; + } + + public Bitmap getIcon(Context context) { + var result = texture == null ? null : texture.get(); + if (result == null) { + result = loadIcon(context); + if (result != null) texture = new WeakReference<>(result); + } + return result; + } + + private Bitmap loadIcon(Context context) { + try { + return Bitmap.createScaledBitmap( + BitmapFactory.decodeStream( + context.getAssets().open(texPath)), 120, 120, false); + } catch (FileNotFoundException e) { + //TODO file-paths were generated from block names; some do not actually exist... + } catch (Exception e) { + Log.d(KnownBlockRepr.class, e); + } + return null; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java index abf77bb6..c98dd4a4 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java @@ -3,11 +3,15 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.mithrilmania.blocktopograph.BuildConfig; +import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.terrain.TerrainSubChunk; -import com.mithrilmania.blocktopograph.chunk.terrain.V1d2d13TerrainSubChunk; import com.mithrilmania.blocktopograph.map.Biome; import com.mithrilmania.blocktopograph.map.Dimension; import com.mithrilmania.blocktopograph.util.ColorUtil; @@ -49,7 +53,7 @@ private void load2dData(boolean createIfMissing) { mChunkX, mChunkZ, ChunkTag.DATA_2D, mDimension, (byte) 0, false); if (rawData == null) { if (createIfMissing) { - this.data2D = ByteBuffer.allocate(0x300); + this.data2D = ByteBuffer.allocate(DATA2D_LENGTH); } else { mIsError = true; mIsVoid = true; @@ -58,16 +62,15 @@ private void load2dData(boolean createIfMissing) { } this.data2D = ByteBuffer.wrap(rawData); } catch (Exception e) { + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mIsError = true; mIsVoid = true; } } } - public V1d2d13TerrainSubChunk tempGetSubChunk() { - return (V1d2d13TerrainSubChunk) getSubChunk(0, false); - } - @Nullable private TerrainSubChunk getSubChunk(int which, boolean createIfMissing) { if (mIsError || mVoidList[which]) return null; @@ -83,14 +86,16 @@ private TerrainSubChunk getSubChunk(int which, boolean createIfMissing) { return null; } } catch (Exception e) { - e.printStackTrace(); + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mErrorList[which] = true; mVoidList[which] = true; return null; } ret = raw == null ? - TerrainSubChunk.createEmpty(8, worldData.mBlockRegistry) : - TerrainSubChunk.create(raw, worldData.mBlockRegistry); + TerrainSubChunk.createEmpty(8) : + TerrainSubChunk.create(raw); if (ret == null || ret.isError()) { mVoidList[which] = true; mErrorList[which] = true; @@ -174,18 +179,23 @@ public int getGrassColor(int x, int z) { @NonNull @Override - public Block getBlock(int x, int y, int z) { - return getBlock(x, y, z, 0); + public BlockTemplate getBlockTemplate(int x, int y, int z, int layer) { + if (x >= 16 || y >= 256 || z >= 16 || x < 0 || y < 0 || z < 0 || mIsVoid) + return BlockTemplates.getAirTemplate(); + TerrainSubChunk subChunk = getSubChunk(y >> 4, false); + if (subChunk == null) + return BlockTemplates.getAirTemplate(); + return subChunk.getBlockTemplate(x, y & 0xf, z, layer); } @NonNull @Override public Block getBlock(int x, int y, int z, int layer) { if (x >= 16 || y >= 256 || z >= 16 || x < 0 || y < 0 || z < 0 || mIsVoid) - return getAir(); + throw new IllegalArgumentException(); TerrainSubChunk subChunk = getSubChunk(y >> 4, false); if (subChunk == null) - return getAir(); + return BlockTemplates.getAirTemplate().getBlock(); return subChunk.getBlock(x, y & 0xf, z, layer); } @@ -198,20 +208,17 @@ public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { if (subChunk == null) return; subChunk.setBlock(x, y & 0xf, z, layer, block); mDirtyList[which] = true; - KnownBlockRepr repr = block.getLegacyBlock(); - + BlockTemplate template = BlockTemplates.getBest(block); // Height increased. - if (repr != KnownBlockRepr.B_0_0_AIR && getHeightMapValue(x, z) < y) { + if (template != BlockTemplates.getAirTemplate() && getHeightMapValue(x, z) < y) { mIs2dDirty = true; setHeightMapValue(x, z, (short) (y + 1)); // Roof removed. - } else if (repr == KnownBlockRepr.B_0_0_AIR && getHeightMapValue(x, z) == y) { + } else if (template == BlockTemplates.getAirTemplate() && getHeightMapValue(x, z) == y) { mIs2dDirty = true; int height = 0; for (int h = y - 1; h >= 0; h--) { - Block blockAtHeight = getBlock(x, h, z); - KnownBlockRepr reprAtHeight = blockAtHeight.getLegacyBlock(); - if (reprAtHeight != KnownBlockRepr.B_0_0_AIR) { + if (getBlockTemplate(x, h, z) != BlockTemplates.getAirTemplate()) { height = h + 1; break; } @@ -247,9 +254,7 @@ public int getHighestBlockYUnderAt(int x, int z, int y) { subChunk = getSubChunk(which, false); if (subChunk == null) continue; for (int innerY = (which == (y >> 4)) ? y & 0xf : 15; innerY >= 0; innerY--) { - Block block = subChunk.getBlock(x, innerY, z, 0); - KnownBlockRepr repr = block.getLegacyBlock(); - if (repr != KnownBlockRepr.B_0_0_AIR) + if (subChunk.getBlockTemplate(x, innerY, z, 0) != BlockTemplates.getAirTemplate()) return (which << 4) | innerY; } } @@ -265,8 +270,7 @@ public int getCaveYUnderAt(int x, int z, int y) { subChunk = getSubChunk(which, false); if (subChunk == null) continue; for (int innerY = (which == (y >> 4)) ? y & 0xf : 15; innerY >= 0; innerY--) { - Block block = subChunk.getBlock(x, innerY, z, 0); - if (block.getLegacyBlock() == KnownBlockRepr.B_0_0_AIR) + if (subChunk.getBlockTemplate(x, innerY, z, 0) == BlockTemplates.getAirTemplate()) return (which << 4) | innerY; } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java index 9d158eda..fc888daa 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java @@ -5,11 +5,13 @@ import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; +import com.mithrilmania.blocktopograph.block.BlockTemplate; import com.mithrilmania.blocktopograph.map.Dimension; import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.Arrays; +import java.util.stream.IntStream; public abstract class Chunk { @@ -44,9 +46,10 @@ public static Chunk createEmpty(@NonNull WorldData worldData, int chunkX, int ch Chunk chunk; switch (createOfVersion) { case V1_2_PLUS: + case V1_16_PLUS: try { worldData.writeChunkData(chunkX, chunkZ, ChunkTag.GENERATOR_STAGE, dimension, (byte) 0, false, new byte[]{2, 0, 0, 0}); - worldData.writeChunkData(chunkX, chunkZ, ChunkTag.VERSION, dimension, (byte) 0, false, new byte[]{0xf}); + worldData.writeChunkData(chunkX, chunkZ, ChunkTag.VERSION_PRE16, dimension, (byte) 0, false, new byte[]{0xf}); chunk = new BedrockChunk(worldData, createOfVersion, chunkX, chunkZ, dimension, true); } catch (Exception e) { Log.d(Chunk.class, e); @@ -63,7 +66,9 @@ public static Chunk create(@NonNull WorldData worldData, int chunkX, int chunkZ, boolean createIfMissing, Version createOfVersion) { Version version; try { - byte[] data = worldData.getChunkData(chunkX, chunkZ, ChunkTag.VERSION, dimension, (byte) 0, false); + byte[] data = worldData.getChunkData(chunkX, chunkZ, ChunkTag.VERSION_PRE16, dimension); + if (data == null) + data = worldData.getChunkData(chunkX, chunkZ, ChunkTag.VERSION, dimension); if (data == null && createIfMissing) return createEmpty(worldData, chunkX, chunkZ, dimension, createOfVersion); version = Version.getVersion(data); @@ -73,17 +78,18 @@ public static Chunk create(@NonNull WorldData worldData, int chunkX, int chunkZ, } Chunk chunk; switch (version) { - case ERROR: - case OLD_LIMITED: - chunk = new VoidChunk(worldData, version, chunkX, chunkZ, dimension); - chunk.mIsError = true; - break; - case v0_9: - chunk = new PocketChunk(worldData, version, chunkX, chunkZ, dimension); - break; - case V1_0: - case V1_1: +// case ERROR: +// case OLD_LIMITED: +// chunk = new VoidChunk(worldData, version, chunkX, chunkZ, dimension); +// chunk.mIsError = true; +// break; +// case v0_9: +// chunk = new PocketChunk(worldData, version, chunkX, chunkZ, dimension); +// break; +// case V1_0: +// case V1_1: case V1_2_PLUS: + case V1_16_PLUS: chunk = new BedrockChunk(worldData, version, chunkX, chunkZ, dimension, false); break; case NULL: @@ -97,12 +103,10 @@ public final WorldData getWorldData() { return mWorldData.get(); } - public final boolean isVoid() { return mIsVoid; } - public final boolean isError() { return mIsError; } @@ -122,7 +126,17 @@ public final boolean isError() { abstract public int getGrassColor(int x, int z); @NonNull - abstract public Block getBlock(int x, int y, int z); + public BlockTemplate getBlockTemplate(int x, int y, int z) { + return getBlockTemplate(x, y, z, 0); + } + + @NonNull + abstract public BlockTemplate getBlockTemplate(int x, int y, int z, int layer); + + @NonNull + public Block getBlock(int x, int y, int z) { + return getBlock(x, y, z, 0); + } @NonNull abstract public Block getBlock(int x, int y, int z, int layer); @@ -139,37 +153,19 @@ public final boolean isError() { abstract public void save() throws WorldData.WorldDBException, IOException; - @NonNull - protected Block getAir() { - return mWorldData.get().mBlockRegistry.createBlock(KnownBlockRepr.B_0_0_AIR); - } - public void deleteThis() throws Exception { + // TODO: delete all with given prefix WorldData worldData = mWorldData.get(); if (worldData == null) throw new RuntimeException("World data is null."); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.VERSION, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.DATA_2D, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.DATA_2D_LEGACY, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.PENDING_TICKS, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.GENERATOR_STAGE, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.BIOME_STATE, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.ENTITY, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.BLOCK_ENTITY, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.BLOCK_EXTRA_DATA, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.V0_9_LEGACY_TERRAIN, mDimension, (byte) 0, false); - for (byte i = 0; i < 16; i++) { - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.TERRAIN, mDimension, i, true); - } + worldData.removeFullChunk(mChunkX, mChunkZ, mDimension); // Prevent saving. mIsError = true; } - public final NBTChunkData getEntity() { return mEntity; } - public final NBTChunkData getBlockEntity() { return mTileEntity; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java index 5ea022fc..be7ab281 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java @@ -16,7 +16,8 @@ public enum ChunkTag { BLOCK_EXTRA_DATA((byte) 0x34),//TODO untested, 32768 bytes, used for top-snow. BIOME_STATE((byte) 0x35),//TODO untested GENERATOR_STAGE((byte) 0x36), - VERSION((byte) 0x76); + VERSION_PRE16((byte) 0x76), + VERSION((byte) 0x2c);; public final byte dataID; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java index 7fff07a0..f4a9ec15 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk; import android.graphics.Color; @@ -5,7 +6,7 @@ import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.map.Dimension; @@ -153,14 +154,14 @@ public int getGrassColor(int x, int z) { @NonNull @Override - public Block getBlock(int x, int y, int z) { + public OldBlock getBlock(int x, int y, int z) { return getBlock(x, y, z, 0); } @NonNull @Override - public Block getBlock(int x, int y, int z, int layer) { - return mWorldData.get().mBlockRegistry.createBlock(getKnownBlock(x, y, z, layer)); + public OldBlock getBlock(int x, int y, int z, int layer) { + return mWorldData.get().mOldBlockRegistry.createBlock(getKnownBlock(x, y, z, layer)); } @NonNull @@ -175,7 +176,7 @@ private KnownBlockRepr getKnownBlock(int x, int y, int z, int layer) { } @Override - public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { + public void setBlock(int x, int y, int z, int layer, @NonNull OldBlock oldBlock) { //TODO implement setBlock for pocket chunk } @@ -219,3 +220,4 @@ public void save() { if (mIsError || mIsVoid) return; } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java deleted file mode 100644 index e759041e..00000000 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.mithrilmania.blocktopograph.chunk; - -import com.mithrilmania.blocktopograph.Log; -import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.chunk.terrain.TerrainChunkData; -import com.mithrilmania.blocktopograph.map.Dimension; - -import java.lang.ref.WeakReference; -import java.util.concurrent.atomic.AtomicReferenceArray; - - -public class TempChunk { - -// public final WeakReference worldData; -// -// public final int x, z; -// public final Dimension dimension; -// -// private Version version; -// -// private AtomicReferenceArray terrain; -// -// private volatile NBTChunkData entity, blockEntity; -// -// public TempChunk(WorldData worldData, int x, int z, Dimension dimension) { -// this.worldData = new WeakReference<>(worldData); -// this.x = x; -// this.z = z; -// this.dimension = dimension; -// try { -// byte[] data = worldData.getChunkData(x, z, ChunkTag.VERSION, dimension, (byte) 0, false); -// this.version = Version.getVersion(data); -// } catch (WorldData.WorldDBLoadException | WorldData.WorldDBException e) { -// e.printStackTrace(); -// this.version = Version.ERROR; -// } -// terrain = new AtomicReferenceArray<>(16); -// Log.e("new Chunk " + x + "," + z); -// } -// -// public boolean load2dData() throws Version.VersionException { -// TerrainChunkData terr = getTerrain((byte) 0); -// if (null == terr) return false; -// else return terr.load2DData(); -// } -// -// public int getHeightMapValue(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getHeightMapValue(x, z); -// } -// -// public int getBiome(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getBiome(x, z); -// } -// -// public int getGrassR(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getGrassR(x, z); -// } -// -// public int getGrassG(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getGrassG(x, z); -// } -// -// public int getGrassB(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getGrassB(x, z); -// } -// -// public int getBlockLightValue(int x, int y, int z) throws Version.VersionException { -// return getTerrain((byte) (y / version.subChunkHeight)).getBlockLightValue(x, y % version.subChunkHeight, z); -// } -// -// public int getBlockTypeId(int x, int y, int z) throws Version.VersionException { -// return getTerrain((byte) (y / version.subChunkHeight)).getBlockTypeId(x, y % version.subChunkHeight, z); -// } -// -// public int getBlockData(int x, int y, int z) throws Version.VersionException { -// return getTerrain((byte) (y / version.subChunkHeight)).getBlockData(x, y % version.subChunkHeight, z); -// } -// -// public boolean supportsBlockLightValues() throws Version.VersionException { -// return getTerrain((byte) 0).supportsBlockLightValues(); -// } -// -// public int getHeightLimit() { -// switch (version) { -// //This one in lower case good trip leaving for next author. -// case v0_9: -// case OLD_LIMITED: -// return 128; -// case V1_0: -// case V1_1: -// case V1_2_PLUS: -// return 256; -// default: -// return 0; -// } -// } -// -// private TerrainChunkData getTerrain(byte subChunk) throws Version.VersionException { -// TerrainChunkData data = terrain.get(subChunk & 0xff); -// if (data == null) { -// data = this.getVersion().createTerrainChunkData(this, subChunk); -// terrain.set(subChunk & 0xff, data); -// } -// return data; -// } -// -// public NBTChunkData getEntity() throws Version.VersionException { -// if (entity == null) entity = this.getVersion().createEntityChunkData(this); -// return entity; -// } -// -// -// public NBTChunkData getBlockEntity() throws Version.VersionException { -// if (blockEntity == null) blockEntity = this.getVersion().createBlockEntityChunkData(this); -// return blockEntity; -// } -// -// public Version getVersion() { -// return version; -// } -// -// -// //TODO: should we use the heightmap??? -// public int getHighestBlockYAt(int x, int z) throws Version.VersionException { -// TerrainChunkData data; -// for (int subChunk = version.subChunks - 1; subChunk >= 0; subChunk--) { -// data = this.getTerrain((byte) subChunk); -// if (data == null || !data.loadTerrain()) continue; -// -// for (int y = version.subChunkHeight; y >= 0; y--) { -// if (data.getBlockTypeId(x & 15, y, z & 15) != 0) -// return (subChunk * version.subChunkHeight) + y; -// } -// } -// return -1; -// } -// -// public int getHighestBlockYUnderAt(int x, int z, int y) throws Version.VersionException { -// ///Meow -// ///if (worldData.isMeow()) return meowTeChData.getHighestBlockYUnderAt(x, y, z); -// -// Version cVersion = getVersion(); -// int offset = y % cVersion.subChunkHeight; -// int subChunk = y / cVersion.subChunkHeight; -// TerrainChunkData data; -// -// for (; subChunk >= 0; subChunk--) { -// data = this.getTerrain((byte) subChunk); -// if (data == null || !data.loadTerrain()) continue; -// -// for (y = offset; y >= 0; y--) { -// if (data.getBlockTypeId(x & 15, y, z & 15) != 0) -// return (subChunk * cVersion.subChunkHeight) + y; -// } -// -// //start at the top of the next chunk! (current offset might differ) -// offset = cVersion.subChunkHeight - 1; -// } -// return -1; -// } -// -// public int getCaveYUnderAt(int x, int z, int y) throws Version.VersionException { -// ///Meow -// ///if (worldData.isMeow()) return meowTeChData.getHighestBlockYUnderAt(x, y, z); -// -// Version cVersion = getVersion(); -// int offset = y % cVersion.subChunkHeight; -// int subChunk = y / cVersion.subChunkHeight; -// TerrainChunkData data; -// -// for (; subChunk >= 0; subChunk--) { -// data = this.getTerrain((byte) subChunk); -// if (data == null || !data.loadTerrain()) continue; -// for (y = offset; y >= 0; y--) { -// if (data.getBlockTypeId(x & 15, y, z & 15) == 0) -// return (subChunk * cVersion.subChunkHeight) + y; -// } -// -// //start at the top of the next chunk! (current offset might differ) -// offset = cVersion.subChunkHeight - 1; -// } -// return -1; -// } - - -} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java index 8b2b622b..5d0386d3 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java @@ -15,9 +15,10 @@ public enum Version { v0_9("v0.9.0", "infinite xz, zlib leveldb; introduced in v0.9.0", 2, 128, 1), V1_0("v1.0.0", "Stacked sub-chunks, 256 world-height, 16 high sub-chunks; introduced in alpha v1.0.0 (v0.17)", 3, 16, 16), V1_1("v1.1.0", "KnownBlockRepr-light is not stored anymore", 4, 16, 16), - V1_2_PLUS("v1.2.0.13", "Global numeric id replaced with string id and per-chunk numeric id", 7, 16, 16); + V1_2_PLUS("v1.2.0.13", "Global numeric id replaced with string id and per-chunk numeric id", 7, 16, 16), + V1_16_PLUS("v1.16(17)", "val is replaced by block states",0x16,16,16); - public static final int LATEST_SUPPORTED_VERSION = V1_2_PLUS.id; + public static final int LATEST_SUPPORTED_VERSION = V1_16_PLUS.id; public final String displayName, description; public final int id, subChunkHeight, subChunks; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java index 27d66c8e..6c521804 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java @@ -4,6 +4,9 @@ import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.map.Dimension; @@ -50,18 +53,19 @@ public int getGrassColor(int x, int z) { @NonNull @Override - public Block getBlock(int x, int y, int z) { - return getBlock(x, y, z, 0); + public BlockTemplate getBlockTemplate(int x, int y, int z, int layer) { + return BlockTemplates.getAirTemplate(); } @NonNull @Override public Block getBlock(int x, int y, int z, int layer) { - return getAir(); + throw new RuntimeException(); } @Override public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { + throw new RuntimeException(); } @Override diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java index 893f1cd5..3cb23bb6 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java @@ -1,10 +1,11 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlock; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.map.Dimension; @@ -20,9 +21,9 @@ public final class PreV1d2d13TerrainSubChunk extends TerrainSubChunk { private ByteBuffer mData; - PreV1d2d13TerrainSubChunk(@NonNull ByteBuffer raw, @NonNull BlockRegistry blockRegistry) { + PreV1d2d13TerrainSubChunk(@NonNull ByteBuffer raw, @NonNull OldBlockRegistry oldBlockRegistry) { - super(blockRegistry); + super(oldBlockRegistry); int size = raw.capacity(); if (size < POS_SKY_LIGHT || size > TERRAIN_MAX_LENGTH) { @@ -38,7 +39,7 @@ public final class PreV1d2d13TerrainSubChunk extends TerrainSubChunk { @NonNull @Override - public Block getBlock(int x, int y, int z, int layer) { + public OldBlock getBlock(int x, int y, int z, int layer) { if (mIsError) return getAir(); int offset = getOffset(x, y, z); int id = mData.get(POS_BLOCK_IDS + offset) & 0xff; @@ -48,7 +49,7 @@ public Block getBlock(int x, int y, int z, int layer) { } @Override - public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { + public void setBlock(int x, int y, int z, int layer, @NonNull OldBlock oldBlock) { // TODO implement setBlock for pre v1.2.13 subChunk. } @@ -73,3 +74,4 @@ public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimensio // TODO implement save for pre v1.2.13 subChunk. } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java index 4e4bb6f5..9940a14d 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java @@ -5,43 +5,42 @@ import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.map.Dimension; import java.io.IOException; -import java.lang.ref.WeakReference; import java.nio.ByteBuffer; public abstract class TerrainSubChunk { - private final WeakReference mBlockRegistry; +// private final WeakReference mBlockRegistry; boolean mHasSkyLight; boolean mHasBlockLight; boolean mIsError; - protected TerrainSubChunk(@NonNull BlockRegistry blockRegistry) { - mBlockRegistry = new WeakReference<>(blockRegistry); + protected TerrainSubChunk() { +// mBlockRegistry = new WeakReference<>(oldBlockRegistry); } @Nullable - public static TerrainSubChunk create(@NonNull byte[] rawData, @NonNull BlockRegistry blockRegistry) { + public static TerrainSubChunk create(@NonNull byte[] rawData) { TerrainSubChunk subChunk; ByteBuffer byteBuffer = ByteBuffer.wrap(rawData); switch (rawData[0]) { - case 0: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - subChunk = new PreV1d2d13TerrainSubChunk(byteBuffer, blockRegistry); - break; +// case 0: +// case 2: +// case 3: +// case 4: +// case 5: +// case 6: +// case 7: +// subChunk = new PreV1d2d13TerrainSubChunk(byteBuffer, oldBlockRegistry); +// break; case 1: case 8: - subChunk = new V1d2d13TerrainSubChunk(byteBuffer, blockRegistry); + subChunk = new V1d2d13TerrainSubChunk(byteBuffer); break; default: subChunk = null; @@ -50,7 +49,7 @@ public static TerrainSubChunk create(@NonNull byte[] rawData, @NonNull BlockRegi } @Nullable - public static TerrainSubChunk createEmpty(int preferredVersion, @NonNull BlockRegistry blockRegistry) { + public static TerrainSubChunk createEmpty(int preferredVersion) { TerrainSubChunk subChunk; switch (preferredVersion) { case 0: @@ -64,7 +63,7 @@ public static TerrainSubChunk createEmpty(int preferredVersion, @NonNull BlockRe break; case 1: case 8: - subChunk = new V1d2d13TerrainSubChunk(blockRegistry); + subChunk = new V1d2d13TerrainSubChunk(); break; default: subChunk = null; @@ -72,16 +71,14 @@ public static TerrainSubChunk createEmpty(int preferredVersion, @NonNull BlockRe return subChunk; } - @NonNull - protected Block getAir() { - return wrapKnownBlock(KnownBlockRepr.B_0_0_AIR); - } +// @NonNull +// protected OldBlock wrapKnownBlock(KnownBlockRepr knownBlock) { +// // TODO: This would be not efficiency for old saves, add corresponding oldBlock to known blocks. +// return mBlockRegistry.get().createBlock(knownBlock); +// } @NonNull - protected Block wrapKnownBlock(KnownBlockRepr knownBlock) { - // TODO: This would be not efficiency for old saves, add corresponding block to known blocks. - return mBlockRegistry.get().createBlock(knownBlock); - } + abstract public BlockTemplate getBlockTemplate(int x, int y, int z, int layer); @NonNull abstract public Block getBlock(int x, int y, int z, int layer); @@ -106,14 +103,14 @@ public final boolean isError() { return mIsError; } - @Nullable - protected BlockRegistry getBlockRegistry() { - BlockRegistry blockRegistry = mBlockRegistry.get(); - if (blockRegistry == null) { - mIsError = true; - } - return blockRegistry; - } +// @Nullable +// protected OldBlockRegistry getBlockRegistry() { +// OldBlockRegistry oldBlockRegistry = mBlockRegistry.get(); +// if (oldBlockRegistry == null) { +// mIsError = true; +// } +// return oldBlockRegistry; +// } abstract public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimension, int which) throws WorldData.WorldDBException, IOException; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java index a16916e5..7838fec8 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -163,9 +164,11 @@ public boolean supportsBlockLightValues() { return true; } - /** + */ +/** * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -223,3 +226,4 @@ public int getHeightMapValue(int x, int z) { } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java index 4823e156..8d1eda7a 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -183,9 +184,11 @@ public boolean supportsBlockLightValues() { return true; } - /** + */ +/** * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -218,10 +221,12 @@ public byte getBiome(int x, int z) { return data2D.get(POS_BIOME_DATA + get2Di(x, z)); } - /* + */ +/* MCPE 1.0 stopped embedding foliage color data in the chunk data, so now we fake the colors by combining biome colors with Perlin noise - */ + *//* + @Override public byte getGrassR(int x, int z) { @@ -254,3 +259,4 @@ public int getHeightMapValue(int x, int z) { return ((h & 0xff) << 8) | ((h >> 8) & 0xff);//little endian to big endian } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java index 703a8754..e838c7cf 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -181,9 +182,11 @@ public boolean supportsBlockLightValues() { return false; } - /** + */ +/** * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -216,10 +219,12 @@ public byte getBiome(int x, int z) { return data2D.get(POS_BIOME_DATA + get2Di(x, z)); } - /* + */ +/* MCPE 1.0 stopped embedding foliage color data in the chunk data, so now we fake the colors by combining biome colors with Perlin noise - */ + *//* + @Override public byte getGrassR(int x, int z) { @@ -252,3 +257,4 @@ public int getHeightMapValue(int x, int z) { return ((h & 0xff) << 8) | ((h >> 8) & 0xff);//little endian to big endian } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java index a90486c6..655b493b 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -36,7 +37,7 @@ public class V1_2_Plus_TerrainChunkData extends TerrainChunkData { public static final int POS_BIOME_DATA = POS_HEIGHTMAP + area + area; public static final int DATA2D_LENGTH = POS_BIOME_DATA + area; - //Masks used to extract BlockState bits of a certain block out of a int32, and vice-versa. + //Masks used to extract BlockState bits of a certain oldBlock out of a int32, and vice-versa. private static final int[] msk = {0b1, 0b11, 0b111, 0b1111, 0b11111, 0b111111, 0b1111111, 0b11111111, 0b111111111, 0b1111111111, 0b11111111111, @@ -232,7 +233,7 @@ public byte getSkyLightValue(int x, int y, int z) { @Override public byte getBlockLightValue(int x, int y, int z) { - //block light is not stored anymore + //oldBlock light is not stored anymore return 0; } @@ -241,9 +242,11 @@ public boolean supportsBlockLightValues() { return false; } - /** - * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + */ +/** + * Sets a oldBlock type, and also set the corresponding dirty table entry and set the saving flag. + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -298,3 +301,4 @@ public int getHeightMapValue(int x, int z) { return ((h & 0xff) << 8) | ((h >> 8) & 0xff);//little endian to big endian } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java index 410cff9c..b5c69f3f 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java @@ -1,20 +1,28 @@ package com.mithrilmania.blocktopograph.chunk.terrain; +import android.util.Pair; + import androidx.annotation.NonNull; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Streams; +import com.mithrilmania.blocktopograph.BuildConfig; +import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.BlockType; +import com.mithrilmania.blocktopograph.block.blockproperty.BlockProperty; import com.mithrilmania.blocktopograph.chunk.ChunkTag; import com.mithrilmania.blocktopograph.map.Dimension; import com.mithrilmania.blocktopograph.nbt.convert.NBTInputStream; import com.mithrilmania.blocktopograph.nbt.convert.NBTOutputStream; +import com.mithrilmania.blocktopograph.nbt.tags.ByteTag; import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; import com.mithrilmania.blocktopograph.nbt.tags.IntTag; -import com.mithrilmania.blocktopograph.nbt.tags.ShortTag; import com.mithrilmania.blocktopograph.nbt.tags.StringTag; -import com.mithrilmania.blocktopograph.nbt.tags.Tag; import com.mithrilmania.blocktopograph.util.LittleEndianOutputStream; import java.io.ByteArrayInputStream; @@ -24,33 +32,32 @@ import java.nio.ByteOrder; import java.nio.IntBuffer; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.Collectors; public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { - private static final String PALETTE_KEY_NAME = "name"; - private static final String PALETTE_KEY_VAL = "val"; - private static final String PREFIX_MINECRAFT = "minecraft:"; private boolean mIsDualStorageSupported; - // Masks used to extract BlockState bits of a certain block out of a int32, and vice-versa. + // Masks used to extract BlockState bits of a certain oldBlock out of a int32, and vice-versa. private static final int[] msk = {0b1, 0b11, 0b111, 0b1111, 0b11111, 0b111111, 0b1111111, 0b11111111, 0b111111111, 0b1111111111, 0b11111111111, 0b111111111111, 0b1111111111111, 0b11111111111111, 0b11111111111111}; // There could be multiple BlockStorage let's read the first two. - private volatile BlockStorage[] mStorages; + private final BlockStorage[] mStorages; - V1d2d13TerrainSubChunk(@NonNull BlockRegistry blockRegistry) { - super(blockRegistry); + V1d2d13TerrainSubChunk() { mStorages = new BlockStorage[2]; - mIsDualStorageSupported = false; + mIsDualStorageSupported = true; createEmptyBlockStorage(0); } - V1d2d13TerrainSubChunk(@NonNull ByteBuffer raw, @NonNull BlockRegistry blockRegistry) { - super(blockRegistry); + V1d2d13TerrainSubChunk(@NonNull ByteBuffer raw) { raw.order(ByteOrder.LITTLE_ENDIAN); mStorages = new BlockStorage[2]; @@ -62,9 +69,11 @@ public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { mIsDualStorageSupported = false; raw.position(1); try { - loadBlockStorage(raw, 0); + mStorages[0] = BlockStorage.loadAndMoveForward(raw); } catch (IOException e) { - e.printStackTrace(); + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mIsError = true; } break; @@ -78,10 +87,12 @@ public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { return; } try { - loadBlockStorage(raw, 0); - if (count > 1) loadBlockStorage(raw, 1); + mStorages[0] = BlockStorage.loadAndMoveForward(raw); + if (count > 1) mStorages[1] = BlockStorage.loadAndMoveForward(raw); } catch (IOException e) { - e.printStackTrace(); + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mIsError = true; } break; @@ -94,252 +105,41 @@ public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { } @NonNull - private static BlockStorage.BlockRecord createNewBlockRecord(@NonNull Block block) { - BlockStorage.BlockRecord blockRecord = new BlockStorage.BlockRecord(); - blockRecord.blockResolved = block; - StringTag nameTag = new StringTag(PALETTE_KEY_NAME, block.getBlockType()); - ArrayList pitem = new ArrayList<>(2); - pitem.add(nameTag); - pitem.add(block.getStates()); - pitem.add(new IntTag("version", block.getVersion())); - blockRecord.tag = new CompoundTag("", pitem); - return blockRecord; - } - - private boolean setBlockIfSpace( - int x, int y, int z, @NonNull BlockStorage storage, @NonNull Block block) { - int code = -1; - - // If in palette. - List palette = storage.palette; - for (int localId = 0, paletteSize = palette.size(); localId < paletteSize; localId++) { - Block blockInPalette = palette.get(localId).blockResolved; - if (block.equals(blockInPalette)) { - code = localId; - break; - } - } - - // Or not. - if (code < 0) { - // Reached size limit. - int max = 1 << storage.blockCodeLenth; - int size = palette.size(); - if (size >= max) return false; - - BlockRegistry blockRegistry = getBlockRegistry(); - if (blockRegistry == null) return true; - - palette.add(createNewBlockRecord(block)); - code = size; - } - - // The codeOffset'th BlockState is wanted. - int codeOffset = getOffset(x, y, z); - - // How much BlockStates can one int32 hold? - int intCapa = 32 / storage.blockCodeLenth; - - // The int32 that holds the wanted BlockState. - int whichInt = codeOffset / intCapa; - int stick = storage.records.get(whichInt); - int shift = codeOffset % intCapa * storage.blockCodeLenth; - stick &= ~(msk[storage.blockCodeLenth - 1] << shift); - stick |= code << shift; - storage.records.put(whichInt, stick); - - return true; - } - - private void writeStorage(@NonNull BlockStorage storage, @NonNull LittleEndianOutputStream stream) throws IOException { - - // Code length. - stream.write(storage.blockCodeLenth << 1); - - // Int32s. - stream.write(storage.raw); - - // Palette size. - List palette = storage.palette; - int size = palette.size(); - stream.writeInt(size); - - // Palettes. - NBTOutputStream nos = new NBTOutputStream(stream, false, true); - - BlockRegistry blockRegistry = getBlockRegistry(); - if (blockRegistry == null) return; - for (int j = 0; j < size; j++) - nos.writeTag(palette.get(j).tag); - } - -// public CompoundTag[] tempGetPalettes(int baseX, int y, int z) { -// return new CompoundTag[]{ -// tempGetPaletteItemOfPosition(baseX, y, z), -// tempGetPaletteItemOfPosition(baseX + 8, y, z) -// }; -// } -// -// private CompoundTag tempGetPaletteItemOfPosition(int x, int y, int z) { -// BlockStorage storage = mStorages[0]; -// -// //The codeOffset'th BlockState is wanted. -// int codeOffset = getOffset(x, y, z); -// -// //How much BlockStates can one int32 hold? -// int intCapa = 32 / storage.blockCodeLenth; -// -// //The int32 that holds the wanted BlockState. -// int stick = storage.records.get(codeOffset / intCapa); -// -// //Get the BlockState. It's also the index in palette array. -// int ind = (stick >> (codeOffset % intCapa * storage.blockCodeLenth)) & msk[storage.blockCodeLenth - 1]; -// -// //Transform the local BlockState into global id<<8|data structure. -// return storage.palette.get(ind).tag; -// } - - private void loadBlockStorage(@NonNull ByteBuffer raw, int which) throws IOException { - - BlockStorage storage = new BlockStorage(); - mStorages[which] = storage; - - //Read BlockState length. - //this byte = (length << 2) | serializedType. - storage.blockCodeLenth = (raw.get() & 0xff) >> 1; - - if (storage.blockCodeLenth > 16) throw new IOException("mBlockLength > 16"); - - //We use this much of bytes to store BlockStates. - int bufsize = (4095 / (32 / storage.blockCodeLenth) + 1) << 2; - byte[] arr = new byte[bufsize]; - ByteBuffer byteBuffer = ByteBuffer.wrap(arr); - byteBuffer.order(ByteOrder.LITTLE_ENDIAN); - storage.records = byteBuffer.asIntBuffer(); - storage.raw = arr; - - //No convenient way copy these stuff. - byteBuffer.put(raw.array(), raw.position(), bufsize); - raw.position(raw.position() + bufsize); - - //Palette items count. - int psize = raw.getInt(); - -// if(psize>(1< most possible bound"); -// } - - //Construct the palette. Each item is a piece of nbt data. - storage.palette = new ArrayList<>(16); - - //NBT reader requires a stream. - ByteArrayInputStream bais = new ByteArrayInputStream(raw.array()); - - // Skip for byte array would not fail. - //noinspection ResultOfMethodCallIgnored - bais.skip(raw.position()); - - //Wrap it. - NBTInputStream nis = new NBTInputStream(bais, false); - BlockRegistry blockRegistry = getBlockRegistry(); - if (blockRegistry == null) return; - for (int i = 0; i < psize; i++) { - - //Read a piece of nbt data, represented by a root CompoundTag. - CompoundTag tag = (CompoundTag) nis.readTag(); - BlockStorage.BlockRecord record = new BlockStorage.BlockRecord(); - record.tag = tag; - - //Read `name` and `val` then resolve the `name` into numeric id. - String name = ((StringTag) tag.getChildTagByKey(PALETTE_KEY_NAME)).getValue(); - Tag statesTag = tag.getChildTagByKey("states"); - if (statesTag != null) { - Tag verTag = tag.getChildTagByKey("version"); - record.blockResolved = blockRegistry.createBlock(name, (CompoundTag) statesTag, - verTag == null ? 2 : ((IntTag) verTag).getValue()); - } else { - Tag valTag = tag.getChildTagByKey(PALETTE_KEY_VAL); - KnownBlockRepr repr = KnownBlockRepr.getBlockNew(name, - valTag instanceof ShortTag ? ((ShortTag) valTag).getValue() : 0); - if (repr == null) repr = KnownBlockRepr.guessBlockNew(name); - record.blockResolved = blockRegistry.createBlock(repr); - } - storage.palette.add(record); - } - - //If one day we need to read more BlockStorage's, this line helps. - raw.position(raw.position() + nis.getReadCount()); + @Override + public BlockTemplate getBlockTemplate(int x, int y, int z, int layer) { + if (mIsError) return BlockTemplates.getAirTemplate(); + BlockStorage storage = mStorages[layer]; + if (storage == null) return BlockTemplates.getAirTemplate(); + return storage.getBlock(x, y, z).second; } @NonNull @Override public Block getBlock(int x, int y, int z, int layer) { - - if (mIsError) return getAir(); - + if (mIsError) throw new RuntimeException(); BlockStorage storage = mStorages[layer]; - if (storage == null) return getAir(); - - //The codeOffset'th BlockState is wanted. - int codeOffset = getOffset(x, y, z); - - //How much BlockStates can one int32 hold? - int intCapa = 32 / storage.blockCodeLenth; - - //The int32 that holds the wanted BlockState. - int stick = storage.records.get(codeOffset / intCapa); - - //Get the BlockState. It's also the index in palette array. - int ind = (stick >> (codeOffset % intCapa * storage.blockCodeLenth)) & msk[storage.blockCodeLenth - 1]; - - //Transform the local BlockState into global id<<8|data structure. - return storage.palette.get(ind).blockResolved; + if (storage == null) return BlockTemplates.getAirTemplate().getBlock(); + return storage.getBlock(x, y, z).first; } @Override public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { // Has error or not supported. - if (mIsError || (layer > 0 && !mIsDualStorageSupported)) return; + if (mIsError || (layer > 0 && !mIsDualStorageSupported)) throw new RuntimeException(); BlockStorage storage = mStorages[layer]; // Main storage won't be null unless error. - if (storage == null) storage = createEmptyBlockStorage(1); + if (storage == null) storage = createEmptyBlockStorage(layer); // If space is enough. - if (setBlockIfSpace(x, y, z, storage, block)) return; + if (storage.setBlockIfSpace(x, y, z, block)) return; // Or we have to extend the whole storage. - BlockStorage newStorage = new BlockStorage(); - newStorage.blockCodeLenth = storage.blockCodeLenth + 1; - newStorage.palette = new ArrayList<>(storage.palette); - int capa_new = 32 / newStorage.blockCodeLenth; - int capa_old = 32 / storage.blockCodeLenth; - int stick = 4095 / capa_new + 1; - byte[] newRecs = new byte[stick << 2]; - ByteBuffer newBb = ByteBuffer.wrap(newRecs); - newBb.order(ByteOrder.LITTLE_ENDIAN); - newStorage.records = newBb.asIntBuffer(); - newStorage.raw = newRecs; - - for (int i = 0, hold = 0, hnew = 0, mold = 0, mnew = 0; i < 4096; i++) { - int idold = - (storage.records.get(hold) >> (mold * storage.blockCodeLenth)) & msk[storage.blockCodeLenth - 1]; - idold <<= mnew * newStorage.blockCodeLenth; - newStorage.records.put(hnew, newStorage.records.get(hnew) | idold); - mold++; - mnew++; - if (mold == capa_old) { - mold = 0; - hold++; - } - if (mnew == capa_new) { - mnew = 0; - hnew++; - } - } - mStorages[layer] = newStorage; - setBlockIfSpace(x, y, z, newStorage, block); + storage = BlockStorage.extend(storage); + + mStorages[layer] = storage; + storage.setBlockIfSpace(x, y, z, block); } @Override @@ -353,21 +153,8 @@ public int getSkyLightValue(int x, int y, int z) { } private BlockStorage createEmptyBlockStorage(int which) { - - BlockStorage storage = new BlockStorage(); + BlockStorage storage = BlockStorage.createNew(); mStorages[which] = storage; - - byte[] arr = new byte[512]; - ByteBuffer bbuff = ByteBuffer.wrap(arr); - bbuff.order(ByteOrder.LITTLE_ENDIAN); - storage.records = bbuff.asIntBuffer(); - storage.raw = arr; - - storage.palette = new ArrayList<>(4); - storage.palette.add(createNewBlockRecord(getAir())); - - storage.blockCodeLenth = 1; - return storage; } @@ -384,11 +171,11 @@ public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimensio if (mIsDualStorageSupported) { leos.write(8); leos.write(storageCount); - writeStorage(mStorages[0], leos); - if (storageCount == 2) writeStorage(mStorages[1], leos); + mStorages[0].write(leos); + if (storageCount == 2) mStorages[1].write(leos); } else { leos.write(1); - writeStorage(mStorages[0], leos); + mStorages[0].write(leos); } leos.flush(); @@ -399,19 +186,241 @@ public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimensio private static class BlockStorage { - byte[] raw; + public static final String PALETTE_KEY_ROOT = ""; + public static final String PALETTE_KEY_NAME = "name"; + public static final String PALETTE_KEY_STATES = "states"; + public static final String PALETTE_KEY_VERSION = "version"; + + private final byte[] raw; + + // records is a view into raw + private final IntBuffer records; + + private final List palette; - IntBuffer records; + private final List renderPalette; - List palette; + private final int blockCodeLenth; - int blockCodeLenth; + private BlockStorage() { + raw = new byte[512]; + ByteBuffer bbuff = ByteBuffer.wrap(raw); + bbuff.order(ByteOrder.LITTLE_ENDIAN); + records = bbuff.asIntBuffer(); - static class BlockRecord { + palette = new ArrayList<>(4); + renderPalette = new ArrayList<>(4); + var airTemplate = BlockTemplates.getAirTemplate(); + renderPalette.add(airTemplate); + palette.add(airTemplate.getBlock()); - CompoundTag tag; - Block blockResolved; + blockCodeLenth = 1; + } + + // stateful! wrapping with static creation method + private BlockStorage(@NonNull ByteBuffer buffer) throws IOException { + + //Read BlockState length. + //this byte = (length << 2) | serializedType. + blockCodeLenth = (buffer.get() & 0xff) >> 1; + + if (blockCodeLenth > 16) throw new IOException("mBlockLength > 16"); + + //We use this much of bytes to store BlockStates. + int bufsize = (4095 / (32 / blockCodeLenth) + 1) << 2; + byte[] arr = new byte[bufsize]; + ByteBuffer byteBuffer = ByteBuffer.wrap(arr); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + records = byteBuffer.asIntBuffer(); + raw = arr; + + //No convenient way copy these stuff. + byteBuffer.put(buffer.array(), buffer.position(), bufsize); + buffer.position(buffer.position() + bufsize); + + //Palette items count. + int psize = buffer.getInt(); + +// if(psize>(1< most possible bound"); +// } + + //Construct the palette. Each item is a piece of nbt data. + palette = new ArrayList<>(16); + renderPalette = new ArrayList<>(16); + + //NBT reader requires a stream. + var bais = new ByteArrayInputStream(buffer.array()); + + // Skip for byte array would not fail. + //noinspection ResultOfMethodCallIgnored + bais.skip(buffer.position()); + + //Wrap it. + var nis = new NBTInputStream(bais, false); + for (int i = 0; i < psize; i++) + //Read a piece of nbt data, represented by a root CompoundTag. + addToPalette(deserializeBlock((CompoundTag) nis.readTag())); + + //If one day we need to read more BlockStorage's, this line helps. + buffer.position(buffer.position() + nis.getReadCount()); + } + + private BlockStorage(@NonNull BlockStorage old) { + blockCodeLenth = old.blockCodeLenth + 1; + palette = new ArrayList<>(old.palette); + renderPalette = new ArrayList<>(old.renderPalette); + int capa_new = 32 / blockCodeLenth; + int capa_old = 32 / old.blockCodeLenth; + int stick = 4095 / capa_new + 1; + byte[] newRecs = new byte[stick << 2]; + ByteBuffer newBb = ByteBuffer.wrap(newRecs); + newBb.order(ByteOrder.LITTLE_ENDIAN); + records = newBb.asIntBuffer(); + raw = newRecs; + for (int i = 0, hold = 0, hnew = 0, mold = 0, mnew = 0; i < 4096; i++) { + int idold = + (old.records.get(hold) >> (mold * old.blockCodeLenth)) & msk[old.blockCodeLenth - 1]; + idold <<= mnew * blockCodeLenth; + records.put(hnew, records.get(hnew) | idold); + mold++; + mnew++; + if (mold == capa_old) { + mold = 0; + hold++; + } + if (mnew == capa_new) { + mnew = 0; + hnew++; + } + } + } + + public static BlockStorage createNew() { + return new BlockStorage(); + } + + public static BlockStorage loadAndMoveForward(@NonNull ByteBuffer buffer) throws IOException { + return new BlockStorage(buffer); + } + + public static BlockStorage extend(@NonNull BlockStorage storage) { + return new BlockStorage(storage); + } + + private void addToPalette(Block block) { + palette.add(block); + renderPalette.add(BlockTemplates.getBest(block)); + } + + public boolean setBlockIfSpace( + int x, int y, int z, @NonNull Block block) { + int code = -1; + + // If in palette. + for (int localId = 0, paletteSize = palette.size(); localId < paletteSize; localId++) { + Block blockInPalette = palette.get(localId); + if (block.equals(blockInPalette)) { + code = localId; + break; + } + } + + // Or not. + if (code < 0) { + // Reached size limit. + int max = 1 << blockCodeLenth; + int size = palette.size(); + if (size >= max) return false; + + addToPalette(block); + code = size; + } + + // The codeOffset'th BlockState is wanted. + int codeOffset = getOffset(x, y, z); + + // How much BlockStates can one int32 hold? + int intCapa = 32 / blockCodeLenth; + + // The int32 that holds the wanted BlockState. + int whichInt = codeOffset / intCapa; + int stick = records.get(whichInt); + int shift = codeOffset % intCapa * blockCodeLenth; + stick &= ~(msk[blockCodeLenth - 1] << shift); + stick |= code << shift; + records.put(whichInt, stick); + + return true; + } + + public Pair getBlock(int x, int y, int z) { + + //The codeOffset'th BlockState is wanted. + int codeOffset = getOffset(x, y, z); + + //How much BlockStates can one int32 hold? + int intCapa = 32 / blockCodeLenth; + + //The int32 that holds the wanted BlockState. + int stick = records.get(codeOffset / intCapa); + + //Get the BlockState. It's also the index in palette array. + int ind = (stick >> (codeOffset % intCapa * blockCodeLenth)) & msk[blockCodeLenth - 1]; + + //Transform the local BlockState into global id<<8|data structure. + return new Pair<>(palette.get(ind), renderPalette.get(ind)); + } + + private void write(@NonNull LittleEndianOutputStream stream) throws IOException { + + // Code length. + stream.write(blockCodeLenth << 1); + + // Int32s. + stream.write(raw); + + // Palette size. + int size = palette.size(); + stream.writeInt(size); + + // Palettes. + NBTOutputStream nos = new NBTOutputStream(stream, false, true); + + for (int j = 0; j < size; j++) + nos.writeTag(serializeBlock(palette.get(j))); + } + + private static CompoundTag serializeBlock(@NonNull Block block) { + return new CompoundTag(PALETTE_KEY_ROOT, Lists.newArrayList( + new StringTag(PALETTE_KEY_NAME, block.getName()), + new CompoundTag(PALETTE_KEY_STATES, new ArrayList<>(Streams.concat(Streams.zip( + Arrays.stream(block.getType().getKnownProperties()).map(BlockProperty::getName), + Arrays.stream(block.getKnownProperties()), Maps::immutableEntry).filter(Objects::nonNull), + block.getCustomProperties().entrySet().stream()).map( + (entry) -> { + var name = entry.getKey(); + var val = entry.getValue(); + if (val instanceof Byte) return new ByteTag(name, (Byte) val); + else if (val instanceof Integer) + return new IntTag(name, (Integer) val); + else if (val instanceof String) + return new StringTag(name, (String) val); + else + throw new RuntimeException("block state with unsupported type"); + }).collect(Collectors.toList()))), + new IntTag(PALETTE_KEY_VERSION, 2012) + )); + } + private static Block deserializeBlock(@NonNull CompoundTag tag) { + var name = ((StringTag) tag.getChildTagByKey(PALETTE_KEY_NAME)).getValue(); + var blockType = BlockType.get(name); + var builder = (blockType == null ? new Block.Builder(name) : new Block.Builder(blockType)); + for (var state : ((CompoundTag) tag.getChildTagByKey(PALETTE_KEY_STATES)).getValue()) + builder.setProperty(state); + Log.d(BlockStorage.class, "fuckfuckversion" + tag.getChildTagByKey(PALETTE_KEY_VERSION).getValue()); + return builder.build(); } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java index 0985aeea..96d1e068 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java @@ -19,6 +19,7 @@ import com.google.android.material.snackbar.Snackbar; import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.R; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.FragLayersBinding; import com.mithrilmania.blocktopograph.databinding.ItemWorldLayerBinding; @@ -153,13 +154,13 @@ public long getUniqueItemId(int i) { } void loadDefault() { - Layer layer = new Layer(ListingBlock.B_7_BEDROCK, 1); + Layer layer = new Layer(BlockTemplates.getOfType("minecraft:bedrock")[0], 1); addItem(0, layer); - layer = new Layer(ListingBlock.B_3_DIRT, 29); + layer = new Layer(BlockTemplates.getOfType("minecraft:dirt")[0], 29); addItem(0, layer); - layer = new Layer(ListingBlock.B_2_GRASS, 1); + layer = new Layer(BlockTemplates.getOfType("minecraft:grass")[0], 1); addItem(0, layer); - layer = new Layer(ListingBlock.B_31_TALLGRASS, 1); + layer = new Layer(BlockTemplates.getOfType("minecraft:tallgrass")[0],1); addItem(0, layer); } @@ -205,7 +206,7 @@ public void onBindViewHolder(@NonNull MeowHolder holder, int position) { super.onBindViewHolder(holder, position); Layer layer = mItemList.get(position); holder.binding.setLayer(layer); - holder.binding.icon.setImageBitmap(layer.block.getIcon(assMan)); + holder.binding.icon.setImageBitmap(layer.block.getIcon().getIcon(getContext())); } @Override @@ -216,7 +217,7 @@ public void onItemSwipeStarted(ListSwipeItem item) { private MeowHolder getHolderFromTag(@NonNull ListSwipeItem view) { Object tag = view.getTag(); if (!(tag instanceof WeakReference)) return null; - WeakReference ref = (WeakReference) tag; + WeakReference ref = (WeakReference) tag; Object mho = ref.get(); return (MeowHolder) mho; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java index 0315433e..25f75a87 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java @@ -15,6 +15,7 @@ import com.andreabaccega.widget.FormEditText; import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.R; +import com.mithrilmania.blocktopograph.block.BlockTemplate; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.DialogEditLayerBinding; import com.mithrilmania.blocktopograph.util.UiUtil; @@ -79,7 +80,7 @@ public void afterTextChanged(Editable editable) { }); amountBar.addValidator(new AmountValidator(getString(R.string.edit_layer_amount_constrait))); - mBinding.icon.setImageBitmap(layer.block.getIcon(getAssets())); + mBinding.icon.setImageBitmap(layer.block.getIcon().getIcon(this)); UiUtil.blendBlockColor(mBinding.frame, layer.block); } @@ -112,11 +113,11 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten case REQUEST_CODE_PICK_BLOCK: { if (resultCode != RESULT_OK) return; assert data != null; - ListingBlock block = (ListingBlock) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); + BlockTemplate block = (BlockTemplate) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); Layer layer = mBinding.getLayer(); layer.block = block; mBinding.setLayer(layer); - mBinding.icon.setImageBitmap(layer.block.getIcon(getAssets())); + mBinding.icon.setImageBitmap(layer.block.getIcon().getIcon(this)); UiUtil.blendBlockColor(mBinding.frame, block); //mBinding.notifyChange(); return; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java index 4b00ee26..e5522c7e 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java @@ -96,7 +96,7 @@ public String write() { JSONArray jlayers = new JSONArray(); for (Layer layer : mLayers) { JSONObject jlayer = new JSONObject(); - jlayer.put(KEY_BLOCK_NAME, layer.block.getIdentifier()); + jlayer.put(KEY_BLOCK_NAME, layer.block.getBlock().getName()); //jlayer.put(KEY_BLOCK_DATA, layer.block.subId); jlayer.put(KEY_COUNT, layer.amount); jlayers.put(jlayer); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java index 390c29c3..ab188d18 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java @@ -2,6 +2,8 @@ import androidx.annotation.Nullable; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.ListingBlock; import java.io.Serializable; @@ -9,7 +11,7 @@ public final class Layer implements Serializable { private static long counter = 0; - public ListingBlock block; + public BlockTemplate block; public int amount; public long uid; @@ -23,12 +25,12 @@ private synchronized void genUid() { } public Layer() { - block = ListingBlock.B_0_AIR; + block = BlockTemplates.getOfType("minecraft:air")[0]; amount = 1; genUid(); } - Layer(ListingBlock block, int amount) { + Layer(BlockTemplate block, int amount) { this.block = block; this.amount = amount; genUid(); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java index 3ed3d643..c6ee2419 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java @@ -1,7 +1,6 @@ package com.mithrilmania.blocktopograph.flat; import android.content.Intent; -import android.content.res.AssetManager; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; @@ -16,14 +15,17 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.common.collect.Streams; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.ListingBlock; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.databinding.DialogPickBlockBinding; import com.mithrilmania.blocktopograph.databinding.ItemPickBlockBinding; import com.mithrilmania.blocktopograph.util.UiUtil; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public final class PickBlockActivity extends AppCompatActivity { @@ -41,7 +43,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { RecyclerView list = mBinding.list; mListManager = new LinearLayoutManager(this); list.setLayoutManager(mListManager); - mAdapter = new MeowAdapter(getAssets()); + mAdapter = new MeowAdapter(); list.setAdapter(mAdapter); setResult(RESULT_CANCELED); @@ -89,12 +91,12 @@ protected void onPreExecute() { protected Void doInBackground(Void... voids) { PickBlockActivity activity = thiz.get(); if (activity == null) return null; - List list = activity.mAdapter.getListControl(); + List list = activity.mAdapter.getListControl(); //Backup all candidates. - ListingBlock[] olds = null; + BlockTemplate[] olds = null; if (index1 >= 0) { - olds = new ListingBlock[index2 - index1 + 1]; + olds = new BlockTemplate[index2 - index1 + 1]; for (int i = index1, limit = list.size(); i < olds.length && i < limit; i++) { olds[i] = list.get(i); } @@ -110,13 +112,14 @@ protected Void doInBackground(Void... voids) { } catch (NumberFormatException e) { num = -1; } - for (ListingBlock b : ListingBlock.values()) - if (b.getLegacy_id() == num || - (b.getIdentifier().contains(text)) || - (b.getName().contains(text))) + for (Iterator it = BlockTemplates.getAll().iterator(); it.hasNext(); ) { + BlockTemplate b = it.next(); + if ( + (b.getBlock().getName().contains(text))) list.add(b); + } int position = -1; - if (olds != null) for (ListingBlock b : olds) { + if (olds != null) for (BlockTemplate b : olds) { int i = list.indexOf(b); if (i != -1) { position = i; @@ -138,14 +141,10 @@ protected void onPostExecute(Void aVoid) { private class MeowAdapter extends RecyclerView.Adapter { - private final List mBlocks; - - @NonNull - private AssetManager assMan; + private final List mBlocks; - private MeowAdapter(@NonNull AssetManager assMan) { + private MeowAdapter() { mBlocks = new ArrayList<>(512); - this.assMan = assMan; } @NonNull @@ -159,7 +158,7 @@ public MeowHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { root.setOnClickListener(v -> { //UiUtil.toast(PickBlockActivity.this,""+i); setResult(RESULT_OK, new Intent() - .putExtra(EXTRA_KEY_BLOCK, holder.binding.getBlock()));//;(KnownBlockRepr) v.getTag())); + .putExtra(EXTRA_KEY_BLOCK, holder.binding.getOldBlock()));//;(KnownBlockRepr) v.getTag())); finish(); }); return holder; @@ -167,12 +166,12 @@ public MeowHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { @Override public void onBindViewHolder(@NonNull MeowHolder meowHolder, int i) { - ListingBlock block = mBlocks.get(i); + BlockTemplate oldBlock = mBlocks.get(i); ItemPickBlockBinding binding = meowHolder.binding; - binding.setBlock(block); - //binding.getRoot().setTag(block); - binding.icon.setImageBitmap(block.getIcon(assMan)); - UiUtil.blendBlockColor(binding.getRoot(), block); + binding.setOldBlock(oldBlock); + //binding.getRoot().setTag(oldBlock); + binding.icon.setImageBitmap(oldBlock.getIcon().getIcon(PickBlockActivity.this)); + UiUtil.blendBlockColor(binding.getRoot(), oldBlock); } @Override @@ -180,7 +179,7 @@ public int getItemCount() { return mBlocks.size(); } - List getListControl() { + List getListControl() { return mBlocks; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java index 943817a9..2d79abaa 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java @@ -111,16 +111,16 @@ public enum Biome { MESA_PLATEAU_F_M(166, "Mesa Plateau F M", ColorWrapper.fromRGB(255, 234, 179)), MESA_PLATEAU_M(167, "Mesa Plateau M", ColorWrapper.fromRGB(255, 220, 184)), BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)); + BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)), //Nether biome in 1.16.0 nether update. - NETHER_WASTES(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)); - - SOUL_SAND_VALLEY(170, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)); + NETHER_WASTES(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)), + + SOUL_SAND_VALLEY(170, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), - CRIMSON_FOREST(171, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)); + CRIMSON_FOREST(171, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), - WARPED_FOREST(172, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)); + WARPED_FOREST(172, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), BASALT_DELTAS(173, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java index 7b75ee10..2c369ef2 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java @@ -297,7 +297,7 @@ private void closeFloatPane() { if (mBinding.selectionBoard.hasSelection()) { SelectionMenuFragment fragment = SelectionMenuFragment .newInstance(mBinding.selectionBoard.getSelection(), - world.getWorldData().mBlockRegistry, this::doSelectionBasedEdit); + world.getWorldData().mOldBlockRegistry, this::doSelectionBasedEdit); trans.add(R.id.float_window_container, fragment); mFloatingFragment = fragment; setUpSelectionMenu(); @@ -316,7 +316,7 @@ public void onConfigurationChanged(@NonNull Configuration newConfig) { fragment = AdvancedLocatorFragment.create(world, this::frameTo); } else if (mFloatingFragment instanceof SelectionMenuFragment) { fragment = SelectionMenuFragment - .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mBlockRegistry, + .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mOldBlockRegistry, this::doSelectionBasedEdit); } else return; closeFloatPane(); @@ -756,7 +756,7 @@ private void doSelectionBasedEdit(@NonNull EditFunction func, @Nullable Bundle a case LAMPSHADE: case CHBIOME: case DCHUNK: - new SelectionBasedContextFreeEditTask(func, args, this, world.getWorldData().mBlockRegistry).execute( + new SelectionBasedContextFreeEditTask(func, args, this, world.getWorldData().mOldBlockRegistry).execute( new RectEditTarget( world.getWorldData(), mBinding.selectionBoard.getSelection(), @@ -791,7 +791,7 @@ public Object[] calculateViewPort(int marginX, int marginZ) { MapTileView tileView = mBinding.tileView; float scale = tileView.getScale(); - //scale the amount of pixels, less pixels per block if zoomed out + //scale the amount of pixels, less pixels per oldBlock if zoomed out double pixelsPerBlockW = pixelsPerBlockW_unscaled * scale; double pixelsPerBlockL = pixelsPerBlockL_unscaled * scale; @@ -1004,7 +1004,7 @@ private void beginOrEndSelection(int worldX, int worldZ) { } else { mBinding.selectionBoard.beginSelection(worldX, worldZ); SelectionMenuFragment fragment = SelectionMenuFragment - .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mBlockRegistry, this::doSelectionBasedEdit); + .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mOldBlockRegistry, this::doSelectionBasedEdit); openFloatPane(fragment); setUpSelectionMenu(); Activity activity = getActivity(); @@ -1219,7 +1219,7 @@ private void onChooseTeleportPlayer(float worldX, float worldZ, Dimension dim, V * Opens the chunk data nbt editor. * * @param chunk the chunk to edit - * @param entity if it is entity data (True) or block-entity data (False) + * @param entity if it is entity data (True) or oldBlock-entity data (False) * @return false when the chunk data could not be loaded. */ private boolean chunkDataNBT(Chunk chunk, boolean entity) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java index 4dbc62bc..e86ee3c3 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java @@ -17,10 +17,9 @@ import com.jbvincey.nestedradiobutton.NestedRadioGroupManager; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; -import com.mithrilmania.blocktopograph.block.ListingBlock; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.databinding.FragSerachAndReplaceBinding; import com.mithrilmania.blocktopograph.databinding.IncludeBlockBinding; import com.mithrilmania.blocktopograph.flat.PickBlockActivity; @@ -45,9 +44,9 @@ public class SearchAndReplaceFragment extends DialogFragment { private FragSerachAndReplaceBinding mBinding; private SelectionMenuFragment.EditFunctionEntry mEntry; private ToolTipsManager mToolTipsManager; - private BlockRegistry registry; + private OldBlockRegistry registry; - public static SearchAndReplaceFragment newInstance(BlockRegistry registry, SelectionMenuFragment.EditFunctionEntry entry) { + public static SearchAndReplaceFragment newInstance(OldBlockRegistry registry, SelectionMenuFragment.EditFunctionEntry entry) { SearchAndReplaceFragment fragment = new SearchAndReplaceFragment(); fragment.mEntry = entry; fragment.registry = registry; @@ -78,20 +77,20 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c switch (cfg.placeMode) { case 1: case 2: - recoverBlock(mBinding.replaceBlockAny, cfg.placeBlockMain); + recoverBlock(mBinding.replaceBlockAny, cfg.placeOldBlockMain); break; case 3: - recoverBlock(mBinding.replaceBlockBg, cfg.placeBlockSub); - recoverBlock(mBinding.replaceBlockFg, cfg.placeBlockMain); + recoverBlock(mBinding.replaceBlockBg, cfg.placeOldBlockSub); + recoverBlock(mBinding.replaceBlockFg, cfg.placeOldBlockMain); } //mBinding.cbIgsub.setChecked(cfg.ignoreSubId); } else { - setBlockToItem(mBinding.searchBlockAny, ListingBlock.B_2_GRASS); - setBlockToItem(mBinding.searchBlockBg, ListingBlock.B_0_AIR); - setBlockToItem(mBinding.searchBlockFg, ListingBlock.B_2_GRASS); - setBlockToItem(mBinding.replaceBlockAny, ListingBlock.B_20_GLASS); - setBlockToItem(mBinding.replaceBlockFg, ListingBlock.B_20_GLASS); - setBlockToItem(mBinding.replaceBlockBg, ListingBlock.B_9_WATER); + setBlockToItem(mBinding.searchBlockAny, BlockTemplates.getOfType("minecraft:grass")[0]); + setBlockToItem(mBinding.searchBlockBg, BlockTemplates.getOfType("minecraft:air")[0]); + setBlockToItem(mBinding.searchBlockFg, BlockTemplates.getOfType("minecraft:grass")[0]); + setBlockToItem(mBinding.replaceBlockAny, BlockTemplates.getOfType("minecraft:glass")[0]); + setBlockToItem(mBinding.replaceBlockFg, BlockTemplates.getOfType("minecraft:glass")[0]); + setBlockToItem(mBinding.replaceBlockBg, BlockTemplates.getOfType("minecraft:water")[0]); } mBinding.searchIn.setOnCheckedChangeListener(this::onCheckedChanged); @@ -169,7 +168,7 @@ private void recoverPlaceIn(int code) { } private void recoverBlock(@NonNull IncludeBlockBinding item, @Nullable Serializable data) { - setBlockToItem(item, data instanceof ListingBlock ? (ListingBlock) data : ListingBlock.B_0_AIR); + setBlockToItem(item, data instanceof BlockTemplate ? (BlockTemplate) data : BlockTemplates.getAirTemplate()); } @Override @@ -178,12 +177,6 @@ public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); } - @NonNull - private Block convertListingBlockToBlock(ListingBlock listingBlock) { - if (listingBlock == null) return registry.createBlock(KnownBlockRepr.B_0_0_AIR); - return registry.createBlock(listingBlock.getIdentifier()); - } - private void writeToBundle(@NonNull Bundle bundle) { SnrConfig cfg = new SnrConfig(); cfg.searchMode = getSearchInCode(); @@ -192,21 +185,24 @@ private void writeToBundle(@NonNull Bundle bundle) { case 1: case 2: case 3: - cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(mBinding.searchBlockAny.getBlock()); + cfg.searchBlockMain = new SnrConfig.SearchConditionBlock( + mBinding.searchBlockAny.getBlockTemplate().getBlock(), false, true); break; case 4: - cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(mBinding.searchBlockFg.getBlock()); - cfg.searchBlockSub = new SnrConfig.SearchConditionBlock(mBinding.searchBlockBg.getBlock()); + cfg.searchBlockMain = new SnrConfig.SearchConditionBlock( + mBinding.searchBlockFg.getBlockTemplate().getBlock(), false, true); + cfg.searchBlockSub = new SnrConfig.SearchConditionBlock( + mBinding.searchBlockBg.getBlockTemplate().getBlock(), false, true); break; } switch (cfg.placeMode) { case 1: case 2: - cfg.placeBlockMain = convertListingBlockToBlock(mBinding.replaceBlockAny.getBlock()); + cfg.placeOldBlockMain = mBinding.replaceBlockAny.getBlockTemplate().getBlock(); break; case 3: - cfg.placeBlockMain = convertListingBlockToBlock(mBinding.replaceBlockFg.getBlock()); - cfg.placeBlockSub = convertListingBlockToBlock(mBinding.replaceBlockBg.getBlock()); + cfg.placeOldBlockMain = mBinding.replaceBlockFg.getBlockTemplate().getBlock(); + cfg.placeOldBlockSub = mBinding.replaceBlockBg.getBlockTemplate().getBlock(); break; } cfg.ignoreSubId = true;// mBinding.cbIgsub.isChecked(); @@ -230,25 +226,25 @@ private void onBlockItemClick(@NonNull View view) { @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == RESULT_OK && data != null) { - ListingBlock block = (ListingBlock) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); + var blockTemplate = (BlockTemplate) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); switch (requestCode - REQUEST_CODE) { case 0: - setBlockToItem(mBinding.searchBlockAny, block); + setBlockToItem(mBinding.searchBlockAny, blockTemplate); break; case 1: - setBlockToItem(mBinding.searchBlockBg, block); + setBlockToItem(mBinding.searchBlockBg, blockTemplate); break; case 2: - setBlockToItem(mBinding.searchBlockFg, block); + setBlockToItem(mBinding.searchBlockFg, blockTemplate); break; case 3: - setBlockToItem(mBinding.replaceBlockAny, block); + setBlockToItem(mBinding.replaceBlockAny, blockTemplate); break; case 4: - setBlockToItem(mBinding.replaceBlockBg, block); + setBlockToItem(mBinding.replaceBlockBg, blockTemplate); break; case 5: - setBlockToItem(mBinding.replaceBlockFg, block); + setBlockToItem(mBinding.replaceBlockFg, blockTemplate); break; } return; @@ -256,10 +252,10 @@ public void onActivityResult(int requestCode, int resultCode, @Nullable Intent d super.onActivityResult(requestCode, resultCode, data); } - private void setBlockToItem(@NonNull IncludeBlockBinding item, @NonNull ListingBlock block) { - item.icon.setImageBitmap(block.getIcon(getResources().getAssets())); - UiUtil.blendBlockColor(item.getRoot(), block); - item.setBlock(block); + private void setBlockToItem(@NonNull IncludeBlockBinding item, @NonNull BlockTemplate template) { + item.icon.setImageBitmap(template.getIcon().getIcon(getContext())); + UiUtil.blendBlockColor(item.getRoot(), template); + item.setBlockTemplate(template); } private void onClickOk(View view) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java index a3e6ef40..69b92384 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java @@ -11,9 +11,9 @@ import androidx.appcompat.app.AlertDialog; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; -import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.map.Biome; import com.mithrilmania.blocktopograph.map.MapFragment; import com.mithrilmania.blocktopograph.util.UiUtil; @@ -34,13 +34,13 @@ public class SelectionBasedContextFreeEditTask extends private final WeakReference mOwner; @NonNull - private final BlockRegistry registry; + private final OldBlockRegistry registry; private AlertDialog mWaitDialog; public SelectionBasedContextFreeEditTask( @NonNull EditFunction func, @Nullable Bundle args, @NonNull MapFragment owner, - @NonNull BlockRegistry registry) { + @NonNull OldBlockRegistry registry) { mFunction = func; mArgs = args; this.registry = registry; @@ -67,8 +67,8 @@ protected EditResultCode doInBackground(EditTarget... editTargets) { SnrConfig cfg = new SnrConfig(); cfg.searchMode = 2; cfg.placeMode = 1; - cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(ListingBlock.B_50_TORCH); - cfg.placeBlockMain = registry.createBlock(KnownBlockRepr.B_20_0_GLASS); + cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(BlockTemplates.getOfType("minecraft:torch")[0].getBlock(), true, true); + cfg.placeOldBlockMain = BlockTemplates.getOfType("minecraft:glass")[0].getBlock(); cfg.ignoreSubId = true; return doSnr(cfg, editTargets); } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java index c06f6eb0..b4b98850 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java @@ -1,9 +1,15 @@ package com.mithrilmania.blocktopograph.map.edit; +import android.util.Pair; + +import androidx.annotation.NonNull; + +import com.google.common.collect.Streams; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.ListingBlock; import java.io.Serializable; +import java.util.Arrays; +import java.util.Objects; public class SnrConfig implements Serializable { @@ -21,8 +27,8 @@ public class SnrConfig implements Serializable { public int placeMode; public SearchConditionBlock searchBlockMain; public SearchConditionBlock searchBlockSub; - public Block placeBlockMain; - public Block placeBlockSub; + public Block placeOldBlockMain; + public Block placeOldBlockSub; //savedInstanceState.getInt(KEY_SEARCH_IN, 0) //savedInstanceState.getInt(KEY_PLACE_IN, 0) @@ -44,10 +50,32 @@ public class SnrConfig implements Serializable { // bundle.putSerializable(KEY_PLACE_FG, mBinding.replaceBlockFg.getBlock()); public static class SearchConditionBlock implements Serializable { - public String identifier; + private final Block examplar; + private final boolean matchNameOnly; + private final boolean allowExtraStates; + + public SearchConditionBlock(@NonNull Block block, boolean matchNameOnly, boolean allowExtraStates) { + this.examplar = block; + this.matchNameOnly = matchNameOnly; + this.allowExtraStates = allowExtraStates; + } - public SearchConditionBlock(ListingBlock block) { - identifier = block.getIdentifier(); + public boolean matches(Block block) { + if (!examplar.getName().equals(block.getName())) return false; + var examplarKnownProperties = examplar.getKnownProperties(); + if (examplarKnownProperties != null && Streams.zip(Arrays.stream(examplarKnownProperties), + Arrays.stream(block.getKnownProperties()), Pair::new) + .anyMatch(pair -> pair.first != null && !Objects.equals(pair.first, pair.second))) { + return false; + } + var examplarCustomProperties = examplar.getCustomProperties(); + var blockCustomProperties = block.getCustomProperties(); + if (!allowExtraStates && blockCustomProperties.size() > examplarCustomProperties.size()) + return false; + for (var pair : examplarCustomProperties.entrySet()) + if (!Objects.equals(pair.getValue(), blockCustomProperties.get(pair.getKey()))) + return false; + return true; } } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java index 1dc27869..4d58f347 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java @@ -3,12 +3,13 @@ import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.chunk.Chunk; public class SnrEdit implements EditTarget.RandomAccessEdit { - private SnrConfig config; + private final SnrConfig config; private SnrConfig.SearchConditionBlock b1; private SnrConfig.SearchConditionBlock b2; private Block b3; @@ -30,30 +31,26 @@ public class SnrEdit implements EditTarget.RandomAccessEdit { switch (cfg.placeMode) { case 1: case 2: - b3 = cfg.placeBlockMain; + b3 = cfg.placeOldBlockMain; break; case 3: - b3 = cfg.placeBlockMain; - b4 = cfg.placeBlockSub; + b3 = cfg.placeOldBlockMain; + b4 = cfg.placeOldBlockSub; break; } } - private boolean matches(Block got, SnrConfig.SearchConditionBlock expected) { - return got.getBlockType().equals(expected.identifier); - } - @Override public int edit(Chunk chunk, int x, int y, int z) { if ( - (config.searchMode == 1 && matches(chunk.getBlock(x, y, z, 1), b1) - ) || (config.searchMode == 2 && matches(chunk.getBlock(x, y, z), b1) + (config.searchMode == 1 && b1.matches(chunk.getBlock(x, y, z, 1)) + ) || (config.searchMode == 2 && b1.matches(chunk.getBlock(x, y, z)) ) || (config.searchMode == 3 && ( - matches(chunk.getBlock(x, y, z), b1) - || matches(chunk.getBlock(x, y, z, 1), b1)) + b1.matches(chunk.getBlock(x, y, z)) + || b1.matches(chunk.getBlock(x, y, z, 1))) ) || (config.searchMode == 4 && ( - matches(chunk.getBlock(x, y, z), b1) - && matches(chunk.getBlock(x, y, z, 1), b2)) + b1.matches(chunk.getBlock(x, y, z)) + && b2.matches(chunk.getBlock(x, y, z, 1))) ) ) { switch (config.placeMode) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java index ca7c16bd..ffd7d1c1 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java @@ -7,7 +7,8 @@ import android.graphics.Rect; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; import com.mithrilmania.blocktopograph.map.Dimension; @@ -43,67 +44,54 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int int r = 0, g = 0, b = 0; - subChunkLoop: for (int y = chunk.getHeightMapValue(x, z); y >= 0; y--) { - Block block = chunk.getBlock(x, y, z, 0); - - switch (block.getLegacyBlock()) { - case B_0_0_AIR: - //count the number of times it goes from solid to air - if (solid) layers++; - - //count the air blocks underground, - // but avoid trees by skipping the first layer - if (intoSurface) cavyness++; - break; - case B_66_0_RAIL://rail + var blockTemplate = chunk.getBlockTemplate(x, y, z, 0); + + //wooden plank + //stone bricks + //moss cobblestone + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) { + //count the number of times it goes from solid to air + if (solid) layers++; + //count the air blocks underground, + // but avoid trees by skipping the first layer + if (intoSurface) cavyness++; + } else { + var blockName = blockTemplate.getBlock().getName(); + if ("minecraft:rail".equals(blockName)) {//rail if (b < 150) { b = 150; r = g = 50; } - break; - case B_5_0_PLANKS_OAK://wooden plank - case B_5_1_PLANKS_SPRUCE: - case B_5_2_PLANKS_BIRCH: - case B_5_3_PLANKS_JUNGLE: - case B_5_4_PLANKS_ACACIA: - case B_5_5_PLANKS_BIG_OAK: + } else if ("minecraft:planks".equals(blockName)) { if (b < 100) { b = 100; r = g = 100; } - break; - case B_52_0_MOB_SPAWNER://monster spawner + } else if ("minecraft:mob_spawner".equals(blockName)) {//monster spawner r = g = b = 255; - break subChunkLoop; - case B_54_0_CHEST://chest + break; + } else if ("minecraft:chest".equals(blockName)) {//chest if (b < 170) { b = 170; r = 240; g = 40; } - break; - case B_98_0_STONEBRICK_DEFAULT://stone bricks - case B_98_1_STONEBRICK_MOSSY: - case B_98_2_STONEBRICK_CRACKED: - case B_98_3_STONEBRICK_CHISELED: - case B_98_4_STONEBRICK_SMOOTH: + } else if ("minecraft:stonebrick".equals(blockName)) { if (b < 145) { b = 145; r = g = 120; } - break; - case B_48_0_MOSSY_COBBLESTONE://moss cobblestone - case B_4_0_COBBLESTONE://cobblestone + } else if ("minecraft:mossy_cobblestone".equals(blockName) || "minecraft:cobblestone".equals(blockName)) {//cobblestone if (b < 140) { b = 140; r = g = 100; } - break; + } } r += chunk.getBlockLightValue(x, y, z); - solid = Color.alpha(block.getColor()) == 0xff; + solid = Color.alpha(blockTemplate.getColor()) == 0xff; intoSurface |= solid && (y < 60 || layers > 0); } @@ -114,8 +102,8 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int } else r *= r; - r = r < 0 ? 0 : r > 255 ? 255 : r; - g = g < 0 ? 0 : g > 255 ? 255 : g; + r = r < 0 ? 0 : Math.min(r, 255); + g = g < 0 ? 0 : Math.min(g, 255); //b = b < 0 ? 0 : b > 255 ? 255 : b; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java index bd9040da..a2037594 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java @@ -44,7 +44,7 @@ public enum MapType implements DetailLevelManager.LevelType { NETHER_BLOCK_LIGHT(new BlockLightRenderer()), //add in 1.16.0 - NETHER_BIOME(new BiomeRenderer()); + NETHER_BIOME(new BiomeRenderer()), END_SATELLITE(new SatelliteRenderer()), diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java index 3d63eb88..599345eb 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java @@ -7,7 +7,9 @@ import android.graphics.Rect; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; @@ -76,16 +78,16 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int for (y = caveceil; y >= cavefloor; y--) { - Block block = chunk.getBlock(x, y, z, 0); + var blockTemplate = chunk.getBlockTemplate(x, y, z, 0); - if (block.getLegacyBlock() == KnownBlockRepr.B_0_0_AIR) + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) continue;//skip air blocks //try the default meta value: 0 - //if (block == null) block = KnownBlockRepr.getBlock(id, 0); + //if (oldBlock == null) oldBlock = KnownBlockRepr.getBlock(id, 0); - int color = block.getColor(); - // no need to process block if it is fully transparent + int color = blockTemplate.getColor(); + // no need to process oldBlock if it is fully transparent if (Color.alpha(color) == 0) continue; float rf = Color.red(color) / 255f; @@ -103,7 +105,7 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int sumBf += blendB; a *= 1f - af; - // break when an opaque block is encountered + // break when an opaque oldBlock is encountered if (Color.alpha(color) == 0xff) break; } @@ -123,40 +125,37 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int int b = (int) (avgShading * sumBf / layers * 255f); - r = r < 0 ? 0 : r > 255 ? 255 : r; - g = g < 0 ? 0 : g > 255 ? 255 : g; - b = b < 0 ? 0 : b > 255 ? 255 : b; + r = r < 0 ? 0 : Math.min(r, 255); + g = g < 0 ? 0 : Math.min(g, 255); + b = b < 0 ? 0 : Math.min(b, 255); for (y = 0; y < chunk.getHeightLimit(); y++) { //some x-ray for important stuff like portals - switch (chunk.getBlock(x, y, z, 0).getLegacyBlock()) { - case B_52_0_MOB_SPAWNER://monster spawner - r = g = b = 255; - break; - case B_54_0_CHEST://chest - if (worth < 90) { - worth = 90; - b = 170; - r = 240; - g = 40; - } - break; - case B_115_0_NETHER_WART://nether wart - if (worth < 80) { - worth = 80; - r = b = 120; - g = 170; - } - break; - case B_90_0_PORTAL://nether portal - if (worth < 95) { - worth = 95; - r = 60; - g = 0; - b = 170; - } - break; + BlockTemplate blockTemplate = chunk.getBlockTemplate(x, y, z, 0); + var blockName = blockTemplate.getBlock().getName(); + if ("minecraft:mob_spawner".equals(blockName)) {//monster spawner + r = g = b = 255; + } else if ("minecraft:chest".equals(blockName)) {//chest + if (worth < 90) { + worth = 90; + b = 170; + r = 240; + g = 40; + } + } else if ("minecraft:nether_wart".equals(blockName)) {//nether wart + if (worth < 80) { + worth = 80; + r = b = 120; + g = 170; + } + } else if ("minecraft:portal".equals(blockName)) {//nether portal + if (worth < 95) { + worth = 95; + r = 60; + g = 0; + b = 170; + } } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java index 682d6114..ef4cc528 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java @@ -8,7 +8,8 @@ import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; @@ -33,13 +34,11 @@ static int getColumnColour(@NonNull Chunk chunk, int x, int y, int z, int height y--; for (; y >= 0 && alphaRemain >= .1f; y--) { - Block block = chunk.getBlock(x, y, z, 0); + var blockTemplate = chunk.getBlockTemplate(x, y, z, 0); - KnownBlockRepr legacyBlock = block.getLegacyBlock(); + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) continue;//skip air blocks - if (legacyBlock == KnownBlockRepr.B_0_0_AIR) continue;//skip air blocks - - int color = block.getColor(); + int color = blockTemplate.getColor(); // no need to process block if it is fully transparent if (Color.alpha(color) == 0) continue; @@ -52,7 +51,7 @@ static int getColumnColour(@NonNull Chunk chunk, int x, int y, int z, int height float blendB = alphaRemain * blendA * (Color.blue(color) / 255f); //blend biome-colored blocks - if (legacyBlock.hasBiomeShading) { + if (blockTemplate.isHasBiomeShading()) { blendR *= biomeR; blendG *= biomeG; blendB *= biomeB; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java index 247e2875..b5d13fc9 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java @@ -6,6 +6,8 @@ import android.graphics.Rect; import com.mithrilmania.blocktopograph.WorldData; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; @@ -24,39 +26,38 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int int rW = 16; int size2D = rW * (16); int index2D; - KnownBlockRepr[] bestBlock = new KnownBlockRepr[size2D]; + var bestBlock = new BlockTemplate[size2D]; int[] minValue = new int[size2D]; int bValue; - KnownBlockRepr block; int average; + BlockTemplate blockTemplate; for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { for (int y = 0; y < chunk.getHeightLimit(); y++) { - block = chunk.getBlock(x, y, z, 0).getLegacyBlock(); - + blockTemplate = chunk.getBlockTemplate(x, y, z, 0); + var blockName = blockTemplate.getBlock().getName(); index2D = (z * rW) + x; - if (block.id <= 1) - continue; - else if (block == KnownBlockRepr.B_56_0_DIAMOND_ORE) { - bestBlock[index2D] = block; + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) continue; + else if ("minecraft:diamond_ore".equals(blockName)) { + bestBlock[index2D] = blockTemplate; break; - } else if (block == KnownBlockRepr.B_129_0_EMERALD_ORE) bValue = 8; - else if (block == KnownBlockRepr.B_153_0_QUARTZ_ORE) bValue = 7; - else if (block == KnownBlockRepr.B_14_0_GOLD_ORE) bValue = 6; - else if (block == KnownBlockRepr.B_15_0_IRON_ORE) bValue = 5; - else if (block == KnownBlockRepr.B_73_0_REDSTONE_ORE) bValue = 4; - else if (block == KnownBlockRepr.B_21_0_LAPIS_ORE) bValue = 3; - //else if(block == KnownBlockRepr.COAL_ORE) bValue = 2; + } else if ("minecraft:emerald_ore".equals(blockName)) bValue = 8; + else if ("minecraft:quartz_ore".equals(blockName)) bValue = 7; + else if ("minecraft:gold_ore".equals(blockName)) bValue = 6; + else if ("minecraft:iron_ore".equals(blockName)) bValue = 5; + else if ("minecraft:redstone_ore".equals(blockName)) bValue = 4; + else if ("minecraft:lapis_ore".equals(blockName)) bValue = 3; + //else if(oldBlock == KnownBlockRepr.COAL_ORE) bValue = 2; //else if(b == KnownBlockRepr.LAVA || b == KnownBlockRepr.STATIONARY_LAVA) bValue = 1; else bValue = 0; if (bValue > minValue[index2D]) { minValue[index2D] = bValue; - bestBlock[index2D] = block; + bestBlock[index2D] = blockTemplate; } } } @@ -70,13 +71,13 @@ else if (block == KnownBlockRepr.B_56_0_DIAMOND_ORE) { for (int z = 0, tY = pY; z < 16; z++, tY += pL) { for (int x = 0, tX = pX; x < 16; x++, tX += pW) { - block = bestBlock[(z * rW) + x]; + blockTemplate = bestBlock[(z * rW) + x]; int color; - if (block == null) { + if (blockTemplate == null) { color = 0xff000000; } else { - color = block.color; + color = blockTemplate.getColor(); int r = Color.red(color); int g = Color.green(color); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java index 8d1a17dc..1ad4d5e0 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java @@ -21,7 +21,7 @@ import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.databinding.FragSelMenuBinding; import com.mithrilmania.blocktopograph.map.FloatPaneFragment; import com.mithrilmania.blocktopograph.map.edit.ChBiomeFragment; @@ -44,10 +44,10 @@ public class SelectionMenuFragment extends FloatPaneFragment { private EditFunctionEntry mEditFunctionEntry; - private BlockRegistry registry; + private OldBlockRegistry registry; public static SelectionMenuFragment newInstance( - @NonNull Rect initial, @NonNull BlockRegistry registry, @NonNull EditFunctionEntry editFunctionEntry) { + @NonNull Rect initial, @NonNull OldBlockRegistry registry, @NonNull EditFunctionEntry editFunctionEntry) { SelectionMenuFragment fragment = new SelectionMenuFragment(); fragment.mSelection.set(initial); fragment.registry = registry; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java index dc05c926..41f22b7e 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java @@ -55,7 +55,7 @@ public class SelectionView extends FrameLayout { * *

* If the drag distance of a given moment cannot move the selection - * at least 1 block's wide, we accumulate the distance to have a larger + * at least 1 oldBlock's wide, we accumulate the distance to have a larger * chance to move on the next round. *

*/ @@ -328,7 +328,7 @@ private void onMove() { //Log.d(this, "" + distOnScreen + "," + mDragCurrentPos + "," + mDragBeginPosCorr); - // If a previous round failed to move at least 1 block's wide, + // If a previous round failed to move at least 1 oldBlock's wide, // it would accumulate the distance till in a future round we could move. float movement = distOnScreen * amp + mDragAccumulation; @@ -337,7 +337,7 @@ private void onMove() { float pxPerBlx = scale * MCTileProvider.TILESIZE / 16; int distanceInBlocks = Math.round(movement / pxPerBlx); - // If it's less than a block we couldn't move, let the accumulation grow. + // If it's less than a oldBlock we couldn't move, let the accumulation grow. if (distanceInBlocks == 0) {//&& Math.abs(movement) >= 0.00001f) { mDragAccumulation = movement; break flow; @@ -545,7 +545,7 @@ protected void onLayout(boolean b, int i, int i1, int i2, int i3) { float scale = tileView.getScale(); - // Pixels per block. + // Pixels per oldBlock. float pxPerBlx = scale * MCTileProvider.TILESIZE / 16; // This would translate coordinate related to view, e.g. getScrollX() result, diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java index 127daa9b..51f0acc2 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java @@ -22,8 +22,8 @@ import com.mithrilmania.blocktopograph.R; import com.mithrilmania.blocktopograph.World; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlock; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.ChunkTag; @@ -296,13 +296,13 @@ private void onClickFixLdb(View view) { }); } - @SuppressWarnings("unchecked") + /*@SuppressWarnings("unchecked") private void onClickGenAllBlocks(View view) { new ForegroundTask(this).execute(() -> { WorldData worldData = mWorld.getWorldData(); - BlockRegistry registry = worldData.mBlockRegistry; + OldBlockRegistry registry = worldData.mOldBlockRegistry; int pos = 0; - for (KnownBlockRepr block : KnownBlockRepr.values()) { + for (KnownBlockRepr oldBlock : KnownBlockRepr.values()) { if (pos % 16 == 0) worldData.removeChunkData(pos / 16, 0, ChunkTag.TERRAIN, Dimension.OVERWORLD, (byte) 0, true); String pot = "------------X------------" + @@ -313,7 +313,7 @@ private void onClickGenAllBlocks(View view) { for (int y = 0; y < 3; y++) for (int x = 0; x < 5; x++) for (int z = 0; z < 5; z++) { - Block blk; + OldBlock blk; switch (pot.charAt(i)) { case 'X': blk = registry.createBlock(KnownBlockRepr.B_42_0_IRON_BLOCK); @@ -322,7 +322,7 @@ private void onClickGenAllBlocks(View view) { blk = registry.createBlock(KnownBlockRepr.B_3_0_DIRT); break; case '?': - blk = registry.createBlock(block); + blk = registry.createBlock(oldBlock); break; default: blk = null; @@ -343,7 +343,7 @@ private void onClickGenAllBlocks(View view) { worldData.closeDB(); return "meow"; }); - } + }*/ @SuppressWarnings("unchecked") private void onClickAnaAllBlocks(View view) { @@ -352,7 +352,7 @@ private void onClickAnaAllBlocks(View view) { // int pos = 0, valids = 0, invalids = 0, offs = 0; // StringBuilder sb = new StringBuilder(); // CompoundTag[] tags = null; -// for (KnownBlockRepr block : KnownBlockRepr.values()) { +// for (KnownBlockRepr oldBlock : KnownBlockRepr.values()) { // Chunk chunk = worldData.getChunk(pos / 16, 0, Dimension.OVERWORLD, true, Version.V1_2_PLUS); // int ind; // if (pos % 16 == 0) { @@ -360,7 +360,7 @@ private void onClickAnaAllBlocks(View view) { // ind = 0; // } else ind = 1; // String name = ((StringTag) tags[ind].getChildTagByKey("name")).getValue().substring(10); -// sb.append(block.identifier).append(":").append(block.subId).append("->").append(name).append(":"); +// sb.append(oldBlock.identifier).append(":").append(oldBlock.subId).append("->").append(name).append(":"); // CompoundTag states = ((CompoundTag) tags[ind].getChildTagByKey("states")); // sb.append("["); // ArrayList value = states.getValue(); @@ -401,7 +401,7 @@ private void onClickGenCodeAllBlocksState(View view) { // int pos = 0, valids = 0, invalids = 0; // StringBuilder sb = new StringBuilder(); // CompoundTag[] tags = null; -// for (KnownBlockRepr block : KnownBlockRepr.values()) { +// for (KnownBlockRepr oldBlock : KnownBlockRepr.values()) { // Chunk chunk = worldData.getChunk(pos / 16, 0, Dimension.OVERWORLD, true, Version.V1_2_PLUS); // int ind; // if (pos % 16 == 0) { @@ -409,7 +409,7 @@ private void onClickGenCodeAllBlocksState(View view) { // ind = 0; // } else ind = 1; // String name = ((StringTag) tags[ind].getChildTagByKey("name")).getValue().substring(10); -// if (name.equals(block.identifier)) { +// if (name.equals(oldBlock.identifier)) { // CompoundTag states = ((CompoundTag) tags[ind].getChildTagByKey("states")); // sb.append("new BlockStateBuilder()"); // Object[] value = states.getValue().toArray(); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java b/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java index ce110deb..b070b5d2 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java @@ -20,6 +20,7 @@ import com.google.android.material.snackbar.Snackbar; import com.mithrilmania.blocktopograph.R; +import com.mithrilmania.blocktopograph.block.BlockTemplate; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.GeneralWaitBinding; @@ -78,6 +79,16 @@ public static void blendBlockColor(@NonNull View view, ListingBlock block) { gradientDrawable.setColor(color); } + public static void blendBlockColor(@NonNull View view, BlockTemplate block) { + Drawable drawable = view.getBackground(); + if (!(drawable instanceof GradientDrawable)) return; + GradientDrawable gradientDrawable = (GradientDrawable) drawable; + int color = block.getColor(); + if (color != Color.TRANSPARENT) + color = ColorUtils.blendARGB(color, 0x7f7f7f7f, 0.5f); + gradientDrawable.setColor(color); + } + public static void blendBlockColor(@NonNull View view, Biome biome) { Drawable drawable = view.getBackground(); if (!(drawable instanceof GradientDrawable)) return; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java index 803857a7..a5d3e0ec 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java @@ -93,7 +93,7 @@ public static boolean verifyStoragePermissions(Activity activity) { private void showFeedbackRequestDialogIfNeeded() { SharedPreferences prefs = getPreferences(MODE_PRIVATE); if (prefs.getInt(PREF_KEY_ACCEPT_DATA_USAGE, 0) == 1) { - Log.enableCrashlytics(this); + Log.enableCrashlytics(); Log.enableFirebaseAnalytics(this); return; } @@ -113,8 +113,8 @@ private void showFeedbackRequestDialogIfNeeded() { } private void onAcceptedRequestDialog(DialogInterface dialogInterface, int i) { - Log.enableCrashlytics(this); Log.enableFirebaseAnalytics(this); + Log.enableCrashlytics(); getPreferences(MODE_PRIVATE).edit().putInt(PREF_KEY_ACCEPT_DATA_USAGE, 1).apply(); } diff --git a/app/src/main/res/layout/dialog_edit_layer.xml b/app/src/main/res/layout/dialog_edit_layer.xml index dbbfb4ed..e1eb0d35 100644 --- a/app/src/main/res/layout/dialog_edit_layer.xml +++ b/app/src/main/res/layout/dialog_edit_layer.xml @@ -44,13 +44,13 @@ + android:text="@{layer.block.block.name}" /> diff --git a/app/src/main/res/layout/include_block.xml b/app/src/main/res/layout/include_block.xml index 2695cb0a..46d4a470 100644 --- a/app/src/main/res/layout/include_block.xml +++ b/app/src/main/res/layout/include_block.xml @@ -5,8 +5,8 @@ + name="blockTemplate" + type="com.mithrilmania.blocktopograph.block.BlockTemplate" /> @@ -38,13 +38,13 @@ + android:text="@{blockTemplate.block.name}" /> diff --git a/app/src/main/res/layout/item_pick_block.xml b/app/src/main/res/layout/item_pick_block.xml index 69593b53..2c30a15f 100644 --- a/app/src/main/res/layout/item_pick_block.xml +++ b/app/src/main/res/layout/item_pick_block.xml @@ -5,8 +5,8 @@ + name="oldBlock" + type="com.mithrilmania.blocktopograph.block.BlockTemplate" /> @@ -38,13 +38,13 @@ + android:text="@{oldBlock.block.name}" /> diff --git a/app/src/main/res/layout/item_world_layer.xml b/app/src/main/res/layout/item_world_layer.xml index 72b19cb9..5c062dce 100644 --- a/app/src/main/res/layout/item_world_layer.xml +++ b/app/src/main/res/layout/item_world_layer.xml @@ -63,13 +63,13 @@ + android:text="@{layer.block.block.name+` x`+layer.amount}" /> diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 00000000..6f171388 --- /dev/null +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,421 @@ + + + 由Proto Lambda製作 + 請選擇一個地圖 + 地圖 + 地圖 + 打開導航欄 + 關閉導航欄 + 設定 + 關於 + 幫助 + 更新內容 + "無法打開地圖,沒有存儲的讀寫許可權! + 請嘗試重啟應用並接受對讀/寫許可權的請求,或者在應用設置/手機管家中開啟本應用的存儲許可權。" + 沒有自定義標記! + 還沒有自定義標記! + 你可以在地圖上你想要的地方長按來創建一個標記, + 然後點擊「創建自定義標記」。 + 然後選擇一個標記圖標和一個Y坐標。 + 最後在地圖上檢查一下你有沒有成功創建它! + 查看本應用的文檔(長期未更新): + + blocktopograph.protolambda.com/help + . + 地圖種子碼: + + 本應用由Proto Lambda(應其要求,已移除鏈接)原創, + @MithrilMania、 + @flagmaggot、 + @MeowCat、 + @MiemieMethod、 + Manuel和其他人參與更新和維護。 + 感謝百度貼吧minecraftpe吧的朋友們提供反饋。 + 可以在Google Play、Github的項目release頁面(PC版網頁)下載或百度貼吧搜索。 + 有賬號的可以點一下Star~ + 歡迎在Github查看源代碼,並參與更新維護(包括增強翻譯): + github.com/oO0oO0oO0o0o00/blocktopograph + 使用前請備份你的重要存檔,以免發生意外。一點小問題都可能導致Minecraft無法載入整個存檔→_→ + 本應用支持MCPE 0.14至1.9(當前)的存檔格式,更舊或者更新的版本【可能】不完全兼容,但不妨一試。 + 原作者網站:blocktopograph.protolambda.com + 免責聲明 + 此應用程序與Minecraft、Mojang AB或Microsoft無關。 + 這不是一個官方的而是一個飯制的APP。 + Minecraft是Mojang的一個商標。 + 請注意: + • 【這不是一個官方的MINECRAFT產品。並未經MOJANG批准並且與其無關。】 + • 【該APP「按原樣」提供,不提供任何形式的保證。】 + 使用的庫 + • FloatingActionButton + • + Tileview,mithrilmania的版本庫分支 + • leveldb-mcpe + with + android-leveldb,mithrilmania的版本庫分支 + + + + 版本: %1$s +
+ 2018之前的更新記錄可以到: + + blocktopograph.protolambda.com/changelog + 查看。]]> +
+ + 標記圖標: + • default_marker(默認標記)、blue_marker(藍標記)、green_marker(綠標記)、red_marker(紅標記) + • 實體的數據名(大小寫敏感) + • 方塊的數據名(大小寫敏感) + + 已刷新地圖列表 + 找不到任何地圖! + 無法讀/寫地圖 + 輸入文件路徑…… + 從自定義路徑打開地圖 + 打開 + + 您使用的路徑:%1$s + + 已在%2$s + 路徑中搜索包含Minecraft地圖的文件夾。 + + 在您輸入的路徑中沒有找到文件或者文件夾! + + 文件路徑(可以以「/level.dat」結尾)不是文件夾! + + 沒找到level.dat文件 + 打開地圖時發生錯誤 + 您想關閉該地圖嗎? + 輸入levelDB中的鍵…… + 從資料庫中打開NBT + 無效的鍵名 + 無法在資料庫中找到具有該名字的記錄! + + 不能從該地圖的資料庫中讀取%1$s"。 + + 未找到聯機玩家的數據 + 選擇玩家 + 打開NBT + 無法從資料庫中打開玩家的記錄。鍵: + %1$s + + 當前的Minecraft地圖無法打開。 + 如果你已在Minecraft打開該地圖,可以嘗試從Minecraft退出,然後重啟本應用。 + + 您真要關閉該地圖嗎? + 您真要關閉該NBT編輯器嗎? + 傳送單機玩家 + 創建自定義標記 + 移除標記 + 打開該區塊中實體的NBT + 打開該區塊中方塊實體的NBT + 該區塊的實體數據 + 該區塊的方塊實體數據 + 該區塊的NBT + + %1$s + (%2$d, + %3$d, + %4$d) + + + 已傳送玩家到(%1$.1f, + %2$.1f, + %3$.1f) + + 傳送玩家失敗 + 找不到或者無法編輯本地玩家數據 + 我的自定義標記 + 無效的標記名! + 無效的圖標名! + 無效的X坐標! + 無效的Y坐標! + 無效的Z坐標! + 錯誤:創建標記失敗 + + 載入%1$s失敗 + + NBT編輯器 + + 該區塊尚未具有該類型的數據。 + 它首先需要存在,您要創建它嗎? + 正在創建和保存該區塊的新NBT數據…… + 已創建和保存該區塊的新NBT數據! + 錯誤:創建或保存該區塊的新NBT數據失敗 + 錯誤:無法打開地圖詳情;地圖信息丟失 + 錯誤:無法打開地圖 + 沒有有效的存檔數據 + 地圖名字: + 地圖大小: + 遊戲模式: + 上次遊玩: + 地圖種子碼: + 文件路徑: + 載入地圖中…… + + 「%1$s」無效 + + 取消 + 複製 + 粘貼(覆蓋該標籤) + 粘貼(作為該標籤的子標籤) + 刪除 + 重命名 + 添加子標籤 + 添加新NBT標籤 + 作為子標籤粘貼 + 移除所有NBT標籤 + 不能修改根NBT標籤。 + 根NBT標籤選項 + 輸入標籤名字…… + 創建NBT標籤 + 創建 + 剪貼板為空…… + 真的要刪除所有的NBT標籤嗎? + " 刪!除!" + 錯誤:修改NBT失敗 + NBT標籤選項 + 錯誤:剪貼板中的鍵已經在該Compound中存在! + 錯誤:無法覆蓋標籤:未知的父標籤類型 + 錯誤:無法在空的父標籤里覆蓋NBT + 錯誤:無法作為子標籤粘貼:未知的父標籤類型 + 錯誤:不能從空列表移除NBT + 重命名NBT標籤 + 重命名 + 錯誤:父標籤已經包含該鍵 + 錯誤:該Compound中已存在該鍵 + 錯誤:只能在Compound或List中添加子標籤 + 沒有數據更改,無需保存 + 您真的要保存您的更改嗎? + 前往標記位置 + 找不到玩家 + 找不到出生點 + 玩家位置 + 出生點 + + %1$s + (%2$.1f, + %3$.1f, + %4$.1f) + + %1$s + (%2$d, + %3$d, + %4$d). + + 沒有有效的地圖 + 尋找玩家中…… + 檢索玩家數據失敗 + 前往玩家位置 + 前往單機玩家位置 + 前往其他玩家位置 + 前往! + 前往坐標 + 已傳送玩家到: + 這個標記不可被移除! + 區段 + 選擇一個區段(0至15): + 篩選標記 + 顯示地圖 + 選擇地圖 + 單機玩家NBT + 聯機玩家NBT + 地圖NBT + 主世界 + 俯瞰 + 洞穴 + 史萊姆區塊 + 高度圖 + 生態系 + 植被顏色 + 透視 + 光照強度 + 地獄 + 地圖 + 終末之界 + 地圖選項 + 網格開關 + 標記開關 + 高級選項 + BiomeData NBT + Overworld NBT + Villages NBT + Portals NBT + dimension0 NBT + dimension1 NBT + dimension2 NBT + AutonomousEntities NBT + 按名稱打開NBT + 生存 + 創造 + 冒險 + + (%1$.1f, + %2$.1f) + 區塊(%3$d, + %4$d) + + 傳送! + 前往出生點 + [網易] + 沒找到地圖。 + + 注意,新版的Minecraft默認將地圖放到它的私有存儲區。 + 因此,所有外部工具不能接入這些地圖。 + 您需要設置Minecraft使用「外部」的存儲方式,方法是: + Minecraft→設置→檔案→文件存儲位置,將選項又「應用程序」改為「外部」。 + 然後,新創建的地圖將能被Blocktopograph接入。您可以上網查詢如何將之前的存檔移動到外部。 + + 創建平坦地圖 + 名字: + 我的地圖 + 1.2.13至今 + 版本: + 層: + 未知錯誤。 + 請等待... + 數量: + 所有層的數量總和應該至少是0而至多是127。 + 添加一層... + 編輯 + 選取方塊 + + "1. 拖拽方塊圖標可以排序。" + "2. 點擊任一條目可以編輯。" + "3. 點擊「添加」按鈕可以新增一層。" + "4. 左劃刪除。" + + 至少要有一層。 + 好了~ + 失敗。 + 創建以後,地圖會在重啟Minecraft後顯示在列表裡。 + 測試頁 + 喵~ + "§c歡迎~ 喵嗚~""§r該地圖由""§3Blocktopograph""§r生成。""§1從Play商店/Github""§1/貼吧/mineBBS獲取,""§5創建你的自定義地圖。""""§r生成於""§d%1$s" + 地圖配料表: + " §r..以及更多" + 由Blocktopograph.txt + "歡迎~ 喵嗚~""該地圖由Blocktopograph創建,""一款Minecraft的編輯和地圖查看工具。""從Play商店/Github/貼吧/mineBBS獲取,並創建你的自定義地圖。" + 玩家 + 在%4$s的(%1$d, %2$d, %3$d) + 高級查找... + 標記 + 坐標 + 截取地圖全圖 + 生成圖片 + 這會生成地圖的完整圖片,並崩潰。 + (沒用) + (沒用) + 忽略 + 取消並返回 + 版本太舊,無法讀取。 + 沒找到地形。 + 正在分析 + 正在生成 + 預覽; + 保存 + 圖片會保存到你的「下載」目錄。 + 已保存。 + 分享 + 分享 + 生成預覽... + 放大倍數: + 每個方塊會是1像素大小。如果你選擇小一點的區域,就能夠放大圖片。 + 生成 + 開始框選 + 取消選區 + 選區選項 + 選區調整 + 從 [ + + ] + 到[ %1$d, %2$d ](含起點、終點) + 範圍 + x + 好的 + 寬度和高度至少該是1。 + 操作 + 為火把裝燈罩 + 這會給範圍內的火把加上玻璃燈罩。適用於Minecraft基岩版1.4.x或更高版本的地圖。建議您在Blocktopograph進行編輯前,備份您的地圖。 + 查找在 + 背景 + 前景 + 任何 + 全部 + 查找方塊 + 前景層: + 背景層: + 然後放置在 + 前景和背景 + 查找&替換 + 忽略子類型 + 簡單的查找替換可以無視背景層。從Minecraft BE 1.4.x開始,背景層被用於存儲與其他方塊共存的水,不過其實可以放任何方塊。作為高級地圖作者,您可以利用這個特性。 + 使用前先備份,請!(震聲) + 生物群系: + 數字ID,默認21(叢林) + 刪除區塊 + 這會【刪除】您選擇區域所涉及的區塊。Minecraft稍後能重新生成這片區域,但是您在當中的進度會丟失。除非你知道你在做什麼以及為什麼這麼做,請不要繼續。 + 自動調整並繼續 + 這東西很危險,用之前請先備份! + 您選擇的區域沒有對齊到區塊邊界。Blocktopograph可以自動調整。實際刪除的區域會比您選擇的稍大。準確說,每個方向上會多出0~15方塊。這是因為區域必須按整個區塊刪除,才能被重新生成。如果不喜歡自動調整,您可以取消並手動調節。 + 標記過多! + 屏幕上有太多標記,比如怪物。您可以在滑動抽屜頁點擊「標記開關」來關閉,或者設置過濾選項。 + 打開抽屜 + + 這個地圖沒法被Blocktopograph理解,可能版本過舊或者過新。 + 選擇生態群系 + 更改生態群系 + 對於 + 全部 + 特定的群系 + 改為 + 你可以長按地圖,選擇「開始框選」然後嘗試編輯。 + 地圖太大 + 太♂大了。你可以:(1) 在電腦上使用同類工具;(2) 或者框選一部分區域然後從選區選項里選擇截圖。 + 你可以放大圖片。每個方塊至少1像素。 + 選區太大 + 你選擇的區域太♂大了。寬度和高度都應該在%1$d方塊以內,同時面積在%2$d方塊²以內。 + 生成圖片 + 大約%1$dx%2$d。 + 雙擊屏幕以打開抽屜。 + 位置未知 + 出了點問題。。 + 抱歉,出現了一些問題,所以您沒法使用這個應用。簡單來說,缺失了一個重要的組成部分。您是否從其他擁有此應用程序的人那裡獲得了安裝包?如果是,那麼該應用是針對Ta的設備優化的,即使您們的機型一樣,也無法使用。請嘗試卸載並從Play商店重新安裝,或從GitHub等渠道下載完整版。可能需要先卸載。抱歉,但是這是由於錯誤的使用習慣導致的。 + 自動備份中... + [自動] + 自動刪除超過3天前的備份(不多於3個時將不刪除) + 每次打開地圖時,自動備份 + 備份與恢復 + 刪除備份 + 您正在刪除備份!請確保選擇了確實要刪除的那一個。 + 這是這個遊戲地圖的備份文件夾,由Blocktopograph軟體創建和管理。 + 已有的備份 + 關閉 + 創建新備份 + 每次您打開這個地圖,Blocktopograph將自動創建備份。取決於地圖的大小,這可能花費額外的時間,並佔用存儲空間。 + 啟用自動備份 + 已取消。 + 刪除 + 可以留空 + 恢復 + 恢復先前的備份文件 + 這將撤銷所有在該備份創建以後進行的更改!您確定嗎?注意不要丟失進度。 + 損壞的地圖 +
diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml new file mode 100644 index 00000000..6f171388 --- /dev/null +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -0,0 +1,421 @@ + + + 由Proto Lambda製作 + 請選擇一個地圖 + 地圖 + 地圖 + 打開導航欄 + 關閉導航欄 + 設定 + 關於 + 幫助 + 更新內容 + "無法打開地圖,沒有存儲的讀寫許可權! + 請嘗試重啟應用並接受對讀/寫許可權的請求,或者在應用設置/手機管家中開啟本應用的存儲許可權。" + 沒有自定義標記! + 還沒有自定義標記! + 你可以在地圖上你想要的地方長按來創建一個標記, + 然後點擊「創建自定義標記」。 + 然後選擇一個標記圖標和一個Y坐標。 + 最後在地圖上檢查一下你有沒有成功創建它! + 查看本應用的文檔(長期未更新): + + blocktopograph.protolambda.com/help + . + 地圖種子碼: + + 本應用由Proto Lambda(應其要求,已移除鏈接)原創, + @MithrilMania、 + @flagmaggot、 + @MeowCat、 + @MiemieMethod、 + Manuel和其他人參與更新和維護。 + 感謝百度貼吧minecraftpe吧的朋友們提供反饋。 + 可以在Google Play、Github的項目release頁面(PC版網頁)下載或百度貼吧搜索。 + 有賬號的可以點一下Star~ + 歡迎在Github查看源代碼,並參與更新維護(包括增強翻譯): + github.com/oO0oO0oO0o0o00/blocktopograph + 使用前請備份你的重要存檔,以免發生意外。一點小問題都可能導致Minecraft無法載入整個存檔→_→ + 本應用支持MCPE 0.14至1.9(當前)的存檔格式,更舊或者更新的版本【可能】不完全兼容,但不妨一試。 + 原作者網站:blocktopograph.protolambda.com + 免責聲明 + 此應用程序與Minecraft、Mojang AB或Microsoft無關。 + 這不是一個官方的而是一個飯制的APP。 + Minecraft是Mojang的一個商標。 + 請注意: + • 【這不是一個官方的MINECRAFT產品。並未經MOJANG批准並且與其無關。】 + • 【該APP「按原樣」提供,不提供任何形式的保證。】 + 使用的庫 + • FloatingActionButton + • + Tileview,mithrilmania的版本庫分支 + • leveldb-mcpe + with + android-leveldb,mithrilmania的版本庫分支 + + + + 版本: %1$s +
+ 2018之前的更新記錄可以到: + + blocktopograph.protolambda.com/changelog + 查看。]]> +
+ + 標記圖標: + • default_marker(默認標記)、blue_marker(藍標記)、green_marker(綠標記)、red_marker(紅標記) + • 實體的數據名(大小寫敏感) + • 方塊的數據名(大小寫敏感) + + 已刷新地圖列表 + 找不到任何地圖! + 無法讀/寫地圖 + 輸入文件路徑…… + 從自定義路徑打開地圖 + 打開 + + 您使用的路徑:%1$s + + 已在%2$s + 路徑中搜索包含Minecraft地圖的文件夾。 + + 在您輸入的路徑中沒有找到文件或者文件夾! + + 文件路徑(可以以「/level.dat」結尾)不是文件夾! + + 沒找到level.dat文件 + 打開地圖時發生錯誤 + 您想關閉該地圖嗎? + 輸入levelDB中的鍵…… + 從資料庫中打開NBT + 無效的鍵名 + 無法在資料庫中找到具有該名字的記錄! + + 不能從該地圖的資料庫中讀取%1$s"。 + + 未找到聯機玩家的數據 + 選擇玩家 + 打開NBT + 無法從資料庫中打開玩家的記錄。鍵: + %1$s + + 當前的Minecraft地圖無法打開。 + 如果你已在Minecraft打開該地圖,可以嘗試從Minecraft退出,然後重啟本應用。 + + 您真要關閉該地圖嗎? + 您真要關閉該NBT編輯器嗎? + 傳送單機玩家 + 創建自定義標記 + 移除標記 + 打開該區塊中實體的NBT + 打開該區塊中方塊實體的NBT + 該區塊的實體數據 + 該區塊的方塊實體數據 + 該區塊的NBT + + %1$s + (%2$d, + %3$d, + %4$d) + + + 已傳送玩家到(%1$.1f, + %2$.1f, + %3$.1f) + + 傳送玩家失敗 + 找不到或者無法編輯本地玩家數據 + 我的自定義標記 + 無效的標記名! + 無效的圖標名! + 無效的X坐標! + 無效的Y坐標! + 無效的Z坐標! + 錯誤:創建標記失敗 + + 載入%1$s失敗 + + NBT編輯器 + + 該區塊尚未具有該類型的數據。 + 它首先需要存在,您要創建它嗎? + 正在創建和保存該區塊的新NBT數據…… + 已創建和保存該區塊的新NBT數據! + 錯誤:創建或保存該區塊的新NBT數據失敗 + 錯誤:無法打開地圖詳情;地圖信息丟失 + 錯誤:無法打開地圖 + 沒有有效的存檔數據 + 地圖名字: + 地圖大小: + 遊戲模式: + 上次遊玩: + 地圖種子碼: + 文件路徑: + 載入地圖中…… + + 「%1$s」無效 + + 取消 + 複製 + 粘貼(覆蓋該標籤) + 粘貼(作為該標籤的子標籤) + 刪除 + 重命名 + 添加子標籤 + 添加新NBT標籤 + 作為子標籤粘貼 + 移除所有NBT標籤 + 不能修改根NBT標籤。 + 根NBT標籤選項 + 輸入標籤名字…… + 創建NBT標籤 + 創建 + 剪貼板為空…… + 真的要刪除所有的NBT標籤嗎? + " 刪!除!" + 錯誤:修改NBT失敗 + NBT標籤選項 + 錯誤:剪貼板中的鍵已經在該Compound中存在! + 錯誤:無法覆蓋標籤:未知的父標籤類型 + 錯誤:無法在空的父標籤里覆蓋NBT + 錯誤:無法作為子標籤粘貼:未知的父標籤類型 + 錯誤:不能從空列表移除NBT + 重命名NBT標籤 + 重命名 + 錯誤:父標籤已經包含該鍵 + 錯誤:該Compound中已存在該鍵 + 錯誤:只能在Compound或List中添加子標籤 + 沒有數據更改,無需保存 + 您真的要保存您的更改嗎? + 前往標記位置 + 找不到玩家 + 找不到出生點 + 玩家位置 + 出生點 + + %1$s + (%2$.1f, + %3$.1f, + %4$.1f) + + %1$s + (%2$d, + %3$d, + %4$d). + + 沒有有效的地圖 + 尋找玩家中…… + 檢索玩家數據失敗 + 前往玩家位置 + 前往單機玩家位置 + 前往其他玩家位置 + 前往! + 前往坐標 + 已傳送玩家到: + 這個標記不可被移除! + 區段 + 選擇一個區段(0至15): + 篩選標記 + 顯示地圖 + 選擇地圖 + 單機玩家NBT + 聯機玩家NBT + 地圖NBT + 主世界 + 俯瞰 + 洞穴 + 史萊姆區塊 + 高度圖 + 生態系 + 植被顏色 + 透視 + 光照強度 + 地獄 + 地圖 + 終末之界 + 地圖選項 + 網格開關 + 標記開關 + 高級選項 + BiomeData NBT + Overworld NBT + Villages NBT + Portals NBT + dimension0 NBT + dimension1 NBT + dimension2 NBT + AutonomousEntities NBT + 按名稱打開NBT + 生存 + 創造 + 冒險 + + (%1$.1f, + %2$.1f) + 區塊(%3$d, + %4$d) + + 傳送! + 前往出生點 + [網易] + 沒找到地圖。 + + 注意,新版的Minecraft默認將地圖放到它的私有存儲區。 + 因此,所有外部工具不能接入這些地圖。 + 您需要設置Minecraft使用「外部」的存儲方式,方法是: + Minecraft→設置→檔案→文件存儲位置,將選項又「應用程序」改為「外部」。 + 然後,新創建的地圖將能被Blocktopograph接入。您可以上網查詢如何將之前的存檔移動到外部。 + + 創建平坦地圖 + 名字: + 我的地圖 + 1.2.13至今 + 版本: + 層: + 未知錯誤。 + 請等待... + 數量: + 所有層的數量總和應該至少是0而至多是127。 + 添加一層... + 編輯 + 選取方塊 + + "1. 拖拽方塊圖標可以排序。" + "2. 點擊任一條目可以編輯。" + "3. 點擊「添加」按鈕可以新增一層。" + "4. 左劃刪除。" + + 至少要有一層。 + 好了~ + 失敗。 + 創建以後,地圖會在重啟Minecraft後顯示在列表裡。 + 測試頁 + 喵~ + "§c歡迎~ 喵嗚~""§r該地圖由""§3Blocktopograph""§r生成。""§1從Play商店/Github""§1/貼吧/mineBBS獲取,""§5創建你的自定義地圖。""""§r生成於""§d%1$s" + 地圖配料表: + " §r..以及更多" + 由Blocktopograph.txt + "歡迎~ 喵嗚~""該地圖由Blocktopograph創建,""一款Minecraft的編輯和地圖查看工具。""從Play商店/Github/貼吧/mineBBS獲取,並創建你的自定義地圖。" + 玩家 + 在%4$s的(%1$d, %2$d, %3$d) + 高級查找... + 標記 + 坐標 + 截取地圖全圖 + 生成圖片 + 這會生成地圖的完整圖片,並崩潰。 + (沒用) + (沒用) + 忽略 + 取消並返回 + 版本太舊,無法讀取。 + 沒找到地形。 + 正在分析 + 正在生成 + 預覽; + 保存 + 圖片會保存到你的「下載」目錄。 + 已保存。 + 分享 + 分享 + 生成預覽... + 放大倍數: + 每個方塊會是1像素大小。如果你選擇小一點的區域,就能夠放大圖片。 + 生成 + 開始框選 + 取消選區 + 選區選項 + 選區調整 + 從 [ + + ] + 到[ %1$d, %2$d ](含起點、終點) + 範圍 + x + 好的 + 寬度和高度至少該是1。 + 操作 + 為火把裝燈罩 + 這會給範圍內的火把加上玻璃燈罩。適用於Minecraft基岩版1.4.x或更高版本的地圖。建議您在Blocktopograph進行編輯前,備份您的地圖。 + 查找在 + 背景 + 前景 + 任何 + 全部 + 查找方塊 + 前景層: + 背景層: + 然後放置在 + 前景和背景 + 查找&替換 + 忽略子類型 + 簡單的查找替換可以無視背景層。從Minecraft BE 1.4.x開始,背景層被用於存儲與其他方塊共存的水,不過其實可以放任何方塊。作為高級地圖作者,您可以利用這個特性。 + 使用前先備份,請!(震聲) + 生物群系: + 數字ID,默認21(叢林) + 刪除區塊 + 這會【刪除】您選擇區域所涉及的區塊。Minecraft稍後能重新生成這片區域,但是您在當中的進度會丟失。除非你知道你在做什麼以及為什麼這麼做,請不要繼續。 + 自動調整並繼續 + 這東西很危險,用之前請先備份! + 您選擇的區域沒有對齊到區塊邊界。Blocktopograph可以自動調整。實際刪除的區域會比您選擇的稍大。準確說,每個方向上會多出0~15方塊。這是因為區域必須按整個區塊刪除,才能被重新生成。如果不喜歡自動調整,您可以取消並手動調節。 + 標記過多! + 屏幕上有太多標記,比如怪物。您可以在滑動抽屜頁點擊「標記開關」來關閉,或者設置過濾選項。 + 打開抽屜 + + 這個地圖沒法被Blocktopograph理解,可能版本過舊或者過新。 + 選擇生態群系 + 更改生態群系 + 對於 + 全部 + 特定的群系 + 改為 + 你可以長按地圖,選擇「開始框選」然後嘗試編輯。 + 地圖太大 + 太♂大了。你可以:(1) 在電腦上使用同類工具;(2) 或者框選一部分區域然後從選區選項里選擇截圖。 + 你可以放大圖片。每個方塊至少1像素。 + 選區太大 + 你選擇的區域太♂大了。寬度和高度都應該在%1$d方塊以內,同時面積在%2$d方塊²以內。 + 生成圖片 + 大約%1$dx%2$d。 + 雙擊屏幕以打開抽屜。 + 位置未知 + 出了點問題。。 + 抱歉,出現了一些問題,所以您沒法使用這個應用。簡單來說,缺失了一個重要的組成部分。您是否從其他擁有此應用程序的人那裡獲得了安裝包?如果是,那麼該應用是針對Ta的設備優化的,即使您們的機型一樣,也無法使用。請嘗試卸載並從Play商店重新安裝,或從GitHub等渠道下載完整版。可能需要先卸載。抱歉,但是這是由於錯誤的使用習慣導致的。 + 自動備份中... + [自動] + 自動刪除超過3天前的備份(不多於3個時將不刪除) + 每次打開地圖時,自動備份 + 備份與恢復 + 刪除備份 + 您正在刪除備份!請確保選擇了確實要刪除的那一個。 + 這是這個遊戲地圖的備份文件夾,由Blocktopograph軟體創建和管理。 + 已有的備份 + 關閉 + 創建新備份 + 每次您打開這個地圖,Blocktopograph將自動創建備份。取決於地圖的大小,這可能花費額外的時間,並佔用存儲空間。 + 啟用自動備份 + 已取消。 + 刪除 + 可以留空 + 恢復 + 恢復先前的備份文件 + 這將撤銷所有在該備份創建以後進行的更改!您確定嗎?注意不要丟失進度。 + 損壞的地圖 +
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d4996ab9..e88a622c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -364,7 +364,7 @@ 背景層: 然後放置在 前景和背景 - 查找&替換 + 查找&替換 忽略子類型 簡單的查找替換可以無視背景層。從Minecraft BE 1.4.x開始,背景層被用於存儲與其他方塊共存的水,不過其實可以放任何方塊。作為高級地圖作者,您可以利用這個特性。 使用前先備份,請!(震聲) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh/strings.xml similarity index 100% rename from app/src/main/res/values-zh-rCN/strings.xml rename to app/src/main/res/values-zh/strings.xml diff --git a/build.gradle b/build.gradle index 4ebd7d84..bed62e96 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,14 @@ buildscript { repositories { - jcenter() google() - maven { - url 'https://maven.fabric.io/public' - } + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' - - classpath 'com.google.gms:google-services:4.3.3' + classpath 'com.android.tools.build:gradle:7.0.0' +// classpath 'com.guardsquare:proguard-gradle:7.1.0' + classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' - classpath 'io.fabric.tools:gradle:1.29.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -20,10 +17,10 @@ buildscript { allprojects { repositories { - jcenter() google() mavenCentral() maven { url "https://jitpack.io" } + jcenter() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48b2ae3a..ed820d1f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip diff --git a/tileview/build.gradle b/tileview/build.gradle index 973aef05..cbb0d5ac 100644 --- a/tileview/build.gradle +++ b/tileview/build.gradle @@ -5,8 +5,6 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionCode 33 - versionName "2.2.2" } buildTypes { release { From fa366d749a666e799468b6b0312e71335b644e10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?MC=E7=9A=84wither=E8=8F=8C?= Date: Sat, 14 Aug 2021 19:59:16 +0800 Subject: [PATCH 03/20] Delete old biome MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 旧下界生物群系和下界荒地同时存在导致渲染出黑色 --- .../java/com/mithrilmania/blocktopograph/map/Biome.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java index 2d79abaa..d85768fe 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java @@ -21,7 +21,7 @@ public enum Biome { TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), - HELL(8, "Hell", ColorWrapper.fromRGB(255, 0, 1)), + //ID8: line 117 SKY(9, "Sky", ColorWrapper.fromRGB(130, 129, 254)), FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), @@ -115,13 +115,9 @@ public enum Biome { //Nether biome in 1.16.0 nether update. NETHER_WASTES(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)), - SOUL_SAND_VALLEY(170, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), - CRIMSON_FOREST(171, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), - WARPED_FOREST(172, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), - BASALT_DELTAS(173, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)); private static final SparseArray biomeMap; From 3d561d3301954f45bd3804c001d1218f54be659b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=94=BE=E5=AF=92=E5=81=87?= <40489495+MiemieMethod@users.noreply.github.com> Date: Fri, 27 Aug 2021 15:06:33 +0800 Subject: [PATCH 04/20] Update Biome.java comment hell --- .../main/java/com/mithrilmania/blocktopograph/map/Biome.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java index d85768fe..f7c7c94a 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java @@ -21,7 +21,7 @@ public enum Biome { TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), - //ID8: line 117 + //HELL(8, "Hell", ColorWrapper.fromRGB(255, 0, 1)), SKY(9, "Sky", ColorWrapper.fromRGB(130, 129, 254)), FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), From d9045c5e99c77a164c305c399d6ab866d815f4eb Mon Sep 17 00:00:00 2001 From: Etanarvazac Taseet <55290878+Etanarvazac@users.noreply.github.com> Date: Sat, 28 Aug 2021 14:27:58 -0400 Subject: [PATCH 05/20] Fix for 1.17 worlds? Hopefully this will get the map to display the overworld correctly again. Some ID's have either changed or have been removed entirely. --- .../blocktopograph/map/Biome.java | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java index f7c7c94a..496ccf05 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java @@ -144,6 +144,131 @@ public static Biome getBiome(int id) { } + public String getName() { + return name; + } +} +package com.mithrilmania.blocktopograph.map; + +import android.util.SparseArray; + +import com.mithrilmania.blocktopograph.util.ColorWrapper; + + + +/* +Biome enum for MCPE -- by @mithrilmania +--- Please attribute @mithrilmania for generating+updating this enum + */ +public enum Biome { + OCEAN(0, "Ocean", ColorWrapper.fromRGB(2, 0, 112)), + PLAINS(1, "Plains", ColorWrapper.fromRGB(140, 176, 96)), + DESERT(2, "Desert", ColorWrapper.fromRGB(251, 148, 27)), + EXTREME_HILLS(3, "Extreme Hills", ColorWrapper.fromRGB(93, 99, 93)), + FOREST(4, "Forest", ColorWrapper.fromRGB(2, 99, 32)), + TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), + SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), + RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), + HELL(8, "Nether Wastes", ColorWrapper.fromRGB(255, 0, 1)), + THE_END(9, "The End", ColorWrapper.fromRGB(130, 129, 254)), + FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), + FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), + ICE_PLAINS(12, "Snowy Tundra", ColorWrapper.fromRGB(255, 254, 255)), + ICE_MOUNTAINS(13, "Snowy Mountains", ColorWrapper.fromRGB(162, 157, 157)), + MUSHROOM_ISLAND(14, "Mushroom Fields", ColorWrapper.fromRGB(254, 1, 255)), + MUSHROOM_ISLAND_SHORE(15, "Mushroom Field Shore", ColorWrapper.fromRGB(158, 3, 253)), + BEACH(16, "Beach", ColorWrapper.fromRGB(250, 223, 85)), + DESERT_HILLS(17, "Desert Hills", ColorWrapper.fromRGB(212, 94, 15)), + FOREST_HILLS(18, "Wooded Hills", ColorWrapper.fromRGB(37, 86, 30)), + TAIGA_HILLS(19, "Taiga Hills", ColorWrapper.fromRGB(25, 54, 49)), + EXTREME_HILLS_EDGE(20, "Mountain Edge", ColorWrapper.fromRGB(115, 118, 157)), + JUNGLE(21, "Jungle", ColorWrapper.fromRGB(82, 122, 7)), + JUNGLE_HILLS(22, "Jungle Hills", ColorWrapper.fromRGB(46, 64, 3)), + JUNGLE_EDGE(23, "Jungle Edge", ColorWrapper.fromRGB(99, 142, 24)), + DEEP_OCEAN(24, "Deep Ocean", ColorWrapper.fromRGB(2, 0, 47)), + STONE_BEACH(25, "Stone Shore", ColorWrapper.fromRGB(162, 164, 132)), + COLD_BEACH(26, "Snowy Beach", ColorWrapper.fromRGB(250, 238, 193)), + BIRCH_FOREST(27, "Birch Forest", ColorWrapper.fromRGB(48, 117, 70)), + BIRCH_FOREST_HILLS(28, "Birch Forest Hills", ColorWrapper.fromRGB(29, 94, 51)), + ROOFED_FOREST(29, "Dark Forest", ColorWrapper.fromRGB(66, 82, 24)), + COLD_TAIGA(30, "Snowy Taiga", ColorWrapper.fromRGB(49, 85, 75)), + COLD_TAIGA_HILLS(31, "Snowy Taiga Hills", ColorWrapper.fromRGB(34, 61, 52)), + MEGA_TAIGA(32, "Giant Tree Taiga", ColorWrapper.fromRGB(92, 105, 84)), + MEGA_TAIGA_HILLS(33, "Giant Tree Taiga Hills", ColorWrapper.fromRGB(70, 76, 59)), + EXTREME_HILLS_PLUS_TREES(34, "Wooded Mountains", ColorWrapper.fromRGB(79, 111, 81)), + SAVANNA(35, "Savanna", ColorWrapper.fromRGB(192, 180, 94)), + SAVANNA_PLATEAU(36, "Savanna Plateau", ColorWrapper.fromRGB(168, 157, 98)), + MESA(37, "Badlands", ColorWrapper.fromRGB(220, 66, 19)), + MESA_PLATEAU(38, "Badlands Plateau ", ColorWrapper.fromRGB(174, 152, 100)), + MESA_PLATEAU_STONE(39, "Wooded Badlands Plateau", ColorWrapper.fromRGB(202, 139, 98)), + + // ID corrections. Colors still need fixed... + WARM_OCEAN(40, "Warm Ocean", ColorWrapper.fromRGB(202,139,98)), + LUKEWARM_OCEAN(41, "Lukewarm Ocean", ColorWrapper.fromRGB(202,139,98)), + COLD_OCEAN(42, "Cold Ocean", ColorWrapper.fromRGB(202,139,98)), + DEEP_WARM_OCEAN(43, "Deep Warm Ocean", ColorWrapper.fromRGB(202,139,98)), + DEEP_LUKEWARM_OCEAN(44, "Deep Lukewarm Ocean", ColorWrapper.fromRGB(202,139,98)), + DEEP_COLD_OCEAN(45, "Deep Cold Ocean", ColorWrapper.fromRGB(202,139,98)), + DEEP_FROZEN_OCEAN(46, "Deep Frozen Ocean", ColorWrapper.fromRGB(202,139,98)), + LEGACY_FROZEN_OCEAN(47, "Legacy Frozen Ocean", ColorWrapper.fromRGB(202,139,98)), + + SUNFLOWER_PLAINS(129, "Sunflower Plains", ColorWrapper.fromRGB(220, 255, 177)), + DESERT_MUTATED(130, "Desert Lakes", ColorWrapper.fromRGB(255, 230, 101)), + EXTREME_HILLS_MUTATED(131, "Gravelly Mountains", ColorWrapper.fromRGB(177, 176, 174)), + FLOWER_FOREST(132, "Flower Forest", ColorWrapper.fromRGB(82, 180, 110)), + TAIGA_MUTATED(133, "Taiga Mountains", ColorWrapper.fromRGB(90, 182, 171)), + SWAMPLAND_MUTATED(134, "Swamp Hills", ColorWrapper.fromRGB(87, 255, 255)), + RIVER_M(135, "River M", ColorWrapper.fromRGB(82, 79, 255)), + HELL_M(136, "Hell M", ColorWrapper.fromRGB(255, 80, 83)), + SKY_M(137, "Sky M", ColorWrapper.fromRGB(210, 211, 255)), + ICE_PLAINS_SPIKES(140, "Ice Spikes", ColorWrapper.fromRGB(223, 255, 255)), + JUNGLE_MUTATED(149, "Modified Jungle", ColorWrapper.fromRGB(160, 203, 92)), + JUNGLE_EDGE_MUTATED(151, "Modified Jungle Edge", ColorWrapper.fromRGB(179, 217, 105)), + BIRCH_FOREST_MUTATED(155, "Tall Birch Forest", ColorWrapper.fromRGB(131, 194, 148)), + BIRCH_FOREST_HILLS_MUTATED(156, "Tall Birch Hills", ColorWrapper.fromRGB(111, 175, 133)), + ROOFED_FOREST_MUTATED(157, "Dark Forest Hills", ColorWrapper.fromRGB(143, 158, 109)), + COLD_TAIGA_MUTATED(158, "Snowy Taiga Mountains", ColorWrapper.fromRGB(132, 163, 156)), + REDWOOD_TAIGA_MUTATED(160, "Giant Spruce Taiga", ColorWrapper.fromRGB(168, 180, 164)), + REDWOOD_TAIGA_HILLS_MUTATED(161, "Giant Spruce Taiga Hills", ColorWrapper.fromRGB(150, 158, 140)), + EXTREME_HILLS_PLUS_MUTATED(162, "Gravelly Hills+", ColorWrapper.fromRGB(161, 194, 158)), + SAVANNA_MUTATED(163, "Shattered Savanna", ColorWrapper.fromRGB(255, 255, 173)), + SAVANNA_PLATEAU_MUTATED(164, "Shattered Savanna Plateau", ColorWrapper.fromRGB(247, 238, 180)), + MESA_BRYCE(165, "Eroded Badlands", ColorWrapper.fromRGB(255, 151, 101)), + MESA_PLATEAU(166, "Modified Badlands Plateau", ColorWrapper.fromRGB(255, 234, 179)), + MESA_PLATEAU_STONE_MUTATED(167, "Modified Wooded Badlands Plateau", ColorWrapper.fromRGB(255, 220, 184)), + BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), + BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)), + + //ID correction for Nether biomes. Also, see ID 8 for Nether Wastes. + SOUL_SAND_VALLEY(178, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), + CRIMSON_FOREST(179, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), + WARPED_FOREST(180, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), + BASALT_DELTAS(181, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)); + + private static final SparseArray biomeMap; + + static { + biomeMap = new SparseArray<>(); + for (Biome b : Biome.values()) { + biomeMap.put(b.id, b); + } + } + + public final int id; + public final String name; + public final ColorWrapper color; + + Biome(int id, String name, ColorWrapper color) { + this.id = id; + this.name = name; + this.color = color; + } + + public static Biome getBiome(int id) { + return biomeMap.get(id); + } + + public String getName() { return name; } From 28954e745369245490f2413fc728d0c35aba1e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20V=C4=83n=20=C4=90=E1=BB=A9c?= <83252725+NguyenDuck@users.noreply.github.com> Date: Sun, 5 Dec 2021 10:49:02 +0700 Subject: [PATCH 06/20] Set theme jekyll-theme-architect --- docs/_config.yml | 1 + docs/index.md | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 docs/_config.yml create mode 100644 docs/index.md diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..3397c9a4 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-architect \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..2a37fcc9 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,37 @@ +## Welcome to GitHub Pages + +You can use the [editor on GitHub](https://github.com/NguyenDuck/blocktopograph/edit/master/docs/index.md) to maintain and preview the content for your website in Markdown files. + +Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files. + +### Markdown + +Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for + +```markdown +Syntax highlighted code block + +# Header 1 +## Header 2 +### Header 3 + +- Bulleted +- List + +1. Numbered +2. List + +**Bold** and _Italic_ and `Code` text + +[Link](url) and ![Image](src) +``` + +For more details see [Basic writing and formatting syntax](https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax). + +### Jekyll Themes + +Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/NguyenDuck/blocktopograph/settings/pages). The name of this theme is saved in the Jekyll `_config.yml` configuration file. + +### Support or Contact + +Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and we’ll help you sort it out. From 5c6a40a5c45577e81d08d420fa27549dbe5b3dc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20V=C4=83n=20=C4=90=E1=BB=A9c?= <83252725+NguyenDuck@users.noreply.github.com> Date: Sun, 5 Dec 2021 10:50:59 +0700 Subject: [PATCH 07/20] Added github pages Initialize From e317355d412a10944fbedeafbf5160771a289e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20V=C4=83n=20=C4=90=E1=BB=A9c?= Date: Sun, 5 Dec 2021 12:44:36 +0700 Subject: [PATCH 08/20] Update submodule leveldb-mcpe --- .gitmodules | 4 ++-- leveldb/src/main/cpp/leveldb-mcpe | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) create mode 160000 leveldb/src/main/cpp/leveldb-mcpe diff --git a/.gitmodules b/.gitmodules index 9f1f6254..84c8d6ba 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "leveldb/src/main/cpp/leveldb-mcpe"] +[submodule "leveldb-mcpe"] path = leveldb/src/main/cpp/leveldb-mcpe - url = https://github.com/Mojang/leveldb-mcpe + url = git@github.com:Mojang/leveldb-mcpe diff --git a/leveldb/src/main/cpp/leveldb-mcpe b/leveldb/src/main/cpp/leveldb-mcpe new file mode 160000 index 00000000..8fb637be --- /dev/null +++ b/leveldb/src/main/cpp/leveldb-mcpe @@ -0,0 +1 @@ +Subproject commit 8fb637be077c3747cae1a8aecff1a14570d39921 From ad186de504a120a3a8d10f980d340959ee931675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20V=C4=83n=20=C4=90=E1=BB=A9c?= Date: Sun, 5 Dec 2021 13:06:51 +0700 Subject: [PATCH 09/20] Remove use com.google.gms:google-services and Add JVM argrument for optimize build time --- app/build.gradle | 3 ++- build.gradle | 3 +-- gradle.properties | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7e5e02b1..df92d832 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.android.application' //apply plugin: 'com.guardsquare.proguard' -apply plugin: 'com.google.gms.google-services' +//apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.firebase.crashlytics' android { @@ -13,6 +13,7 @@ android { versionName "1.9.5" vectorDrawables.useSupportLibrary = true } + dataBinding { enabled true } diff --git a/build.gradle b/build.gradle index bed62e96..a5732f7e 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:7.0.0' // classpath 'com.guardsquare:proguard-gradle:7.1.0' - classpath 'com.google.gms:google-services:4.3.10' +// classpath 'com.google.gms:google-services:4.3.10' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' @@ -20,7 +20,6 @@ allprojects { google() mavenCentral() maven { url "https://jitpack.io" } - jcenter() } } diff --git a/gradle.properties b/gradle.properties index 57c5ef2f..431c8da7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects From 99cdbb13155e85e9d81d96796850c52b2b95956f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20V=C4=83n=20=C4=90=E1=BB=A9c?= Date: Sun, 5 Dec 2021 13:21:02 +0700 Subject: [PATCH 10/20] Update Implementation packages and Graddle JVM argrument for optimize build time --- app/build.gradle | 4 ++-- gradle.properties | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index df92d832..95cc84fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -78,8 +78,8 @@ dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' //implementation 'com.github.MikeOrtiz:TouchImageView:2.1.1' implementation 'com.github.chrisbanes:PhotoView:2.3.0' - implementation 'com.github.florent37:expansionpanel:1.2.2' - implementation 'com.jbvincey:nestedradiobutton:1.0' + implementation 'com.github.florent37:expansionpanel:1.2.4' + implementation 'com.github.jbvincey:nestedradiobutton:1.1' implementation 'net.lingala.zip4j:zip4j:2.9.0' // do NOT accidentally "up"-grade to the 2003 version //noinspection GradleDependency diff --git a/gradle.properties b/gradle.properties index 431c8da7..eeb01698 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,10 +7,10 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.parallel=true android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true +org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 From 8c4b08ed9a3250b25a5d8c104b6aa1bb7ed64925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20V=C4=83n=20=C4=90=E1=BB=A9c?= Date: Sun, 5 Dec 2021 16:27:25 +0700 Subject: [PATCH 11/20] Update and Rename Biome --- .../blocktopograph/map/Biome.java | 407 +++++++----------- .../map/edit/ChBiomeFragment.java | 2 +- 2 files changed, 148 insertions(+), 261 deletions(-) diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java index 496ccf05..41624d90 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java @@ -5,271 +5,158 @@ import com.mithrilmania.blocktopograph.util.ColorWrapper; - /* Biome enum for MCPE -- by @mithrilmania +Reference link: https://minecraft.fandom.com/wiki/Biome/ID --- Please attribute @mithrilmania for generating+updating this enum */ public enum Biome { - OCEAN(0, "Ocean", ColorWrapper.fromRGB(2, 0, 112)), - PLAINS(1, "Plains", ColorWrapper.fromRGB(140, 176, 96)), - DESERT(2, "Desert", ColorWrapper.fromRGB(251, 148, 27)), - EXTREME_HILLS(3, "Extreme Hills", ColorWrapper.fromRGB(93, 99, 93)), - FOREST(4, "Forest", ColorWrapper.fromRGB(2, 99, 32)), - TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), - SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), - RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), - //HELL(8, "Hell", ColorWrapper.fromRGB(255, 0, 1)), - SKY(9, "Sky", ColorWrapper.fromRGB(130, 129, 254)), - FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), - FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), - ICE_PLAINS(12, "Ice Plains", ColorWrapper.fromRGB(255, 254, 255)), - ICE_MOUNTAINS(13, "Ice Mountains", ColorWrapper.fromRGB(162, 157, 157)), - MUSHROOM_ISLAND(14, "Mushroom Island", ColorWrapper.fromRGB(254, 1, 255)), - MUSHROOM_ISLAND_SHORE(15, "Mushroom Island Shore", ColorWrapper.fromRGB(158, 3, 253)), - BEACH(16, "Beach", ColorWrapper.fromRGB(250, 223, 85)), - DESERT_HILLS(17, "Desert Hills", ColorWrapper.fromRGB(212, 94, 15)), - FOREST_HILLS(18, "Forest Hills", ColorWrapper.fromRGB(37, 86, 30)), - TAIGA_HILLS(19, "Taiga Hills", ColorWrapper.fromRGB(25, 54, 49)), - EXTREME_HILLS_EDGE(20, "Extreme Hills Edge", ColorWrapper.fromRGB(115, 118, 157)), - JUNGLE(21, "Jungle", ColorWrapper.fromRGB(82, 122, 7)), - JUNGLE_HILLS(22, "Jungle Hills", ColorWrapper.fromRGB(46, 64, 3)), - JUNGLE_EDGE(23, "Jungle Edge", ColorWrapper.fromRGB(99, 142, 24)), - DEEP_OCEAN(24, "Deep Ocean", ColorWrapper.fromRGB(2, 0, 47)), - STONE_BEACH(25, "Stone Beach", ColorWrapper.fromRGB(162, 164, 132)), - COLD_BEACH(26, "Cold Beach", ColorWrapper.fromRGB(250, 238, 193)), - BIRCH_FOREST(27, "Birch Forest", ColorWrapper.fromRGB(48, 117, 70)), - BIRCH_FOREST_HILLS(28, "Birch Forest Hills", ColorWrapper.fromRGB(29, 94, 51)), - ROOFED_FOREST(29, "Roofed Forest", ColorWrapper.fromRGB(66, 82, 24)), - COLD_TAIGA(30, "Cold Taiga", ColorWrapper.fromRGB(49, 85, 75)), - COLD_TAIGA_HILLS(31, "Cold Taiga Hills", ColorWrapper.fromRGB(34, 61, 52)), - MEGA_TAIGA(32, "Mega Taiga", ColorWrapper.fromRGB(92, 105, 84)), - MEGA_TAIGA_HILLS(33, "Mega Taiga Hills", ColorWrapper.fromRGB(70, 76, 59)), - EXTREME_HILLS_PLUS(34, "Extreme Hills+", ColorWrapper.fromRGB(79, 111, 81)), - SAVANNA(35, "Savanna", ColorWrapper.fromRGB(192, 180, 94)), - SAVANNA_PLATEAU(36, "Savanna Plateau", ColorWrapper.fromRGB(168, 157, 98)), - MESA(37, "Mesa", ColorWrapper.fromRGB(220, 66, 19)), - MESA_PLATEAU_F(38, "Mesa Plateau F", ColorWrapper.fromRGB(174, 152, 100)), - MESA_PLATEAU(39, "Mesa Plateau", ColorWrapper.fromRGB(202, 139, 98)), - - //fix the colors for these - SMALL_END_ISLANDS(40, "Small End Islands", ColorWrapper.fromRGB(202, 139, 98)), - END_MIDLANDS(41, "End Midlands", ColorWrapper.fromRGB(202, 139, 98)), - END_HIGHLANDS(42, "End Highlands", ColorWrapper.fromRGB(202, 139, 98)), - END_BARRENS(43, "End Barrens", ColorWrapper.fromRGB(202, 139, 98)), - WARM_OCEAN(44, "Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - LUKEWARM_OCEAN(45, "Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - COLD_OCEAN(46, "Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_WARM_OCEAN(47, "Deep Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_LUKEWARM_OCEAN(48, "Deep Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_COLD_OCEAN(49, "Deep Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_FROZEN_OCEAN(50, "Deep Frozen Ocean", ColorWrapper.fromRGB(202, 139, 98)), - - //fix the colors for the void - THE_VOID(127, "The Void", ColorWrapper.fromRGB(81, 79, 195)), - - OCEAN_M(128, "Ocean M", ColorWrapper.fromRGB(81, 79, 195)), - SUNFLOWER_PLAINS(129, "Sunflower Plains", ColorWrapper.fromRGB(220, 255, 177)), - DESERT_M(130, "Desert M", ColorWrapper.fromRGB(255, 230, 101)), - EXTREME_HILLS_M(131, "Extreme Hills M", ColorWrapper.fromRGB(177, 176, 174)), - FLOWER_FOREST(132, "Flower Forest", ColorWrapper.fromRGB(82, 180, 110)), - TAIGA_M(133, "Taiga M", ColorWrapper.fromRGB(90, 182, 171)), - SWAMPLAND_M(134, "Swampland M", ColorWrapper.fromRGB(87, 255, 255)), - RIVER_M(135, "River M", ColorWrapper.fromRGB(82, 79, 255)), - HELL_M(136, "Hell M", ColorWrapper.fromRGB(255, 80, 83)), - SKY_M(137, "Sky M", ColorWrapper.fromRGB(210, 211, 255)), - FROZEN_OCEAN_M(138, "Frozen Ocean M", ColorWrapper.fromRGB(226, 224, 241)), - FROZEN_RIVER_M(139, "Frozen River M", ColorWrapper.fromRGB(239, 242, 255)), - ICE_PLAINS_SPIKES(140, "Ice Plains Spikes", ColorWrapper.fromRGB(223, 255, 255)), - ICE_MOUNTAINS_M(141, "Ice Mountains M", ColorWrapper.fromRGB(237, 237, 238)), - MUSHROOM_ISLAND_M(142, "Mushroom Island M", ColorWrapper.fromRGB(255, 82, 255)), - MUSHROOM_ISLAND_SHORE_M(143, "Mushroom Island Shore M", ColorWrapper.fromRGB(243, 82, 255)), - BEACH_M(144, "Beach M", ColorWrapper.fromRGB(255, 255, 162)), - DESERT_HILLS_M(145, "Desert Hills M", ColorWrapper.fromRGB(255, 177, 100)), - FOREST_HILLS_M(146, "Forest Hills M", ColorWrapper.fromRGB(113, 167, 109)), - TAIGA_HILLS_M(147, "Taiga Hills M", ColorWrapper.fromRGB(103, 135, 134)), - EXTREME_HILLS_EDGE_M(148, "Extreme Hills Edge M", ColorWrapper.fromRGB(196, 203, 234)), - JUNGLE_M(149, "Jungle M", ColorWrapper.fromRGB(160, 203, 92)), - JUNGLE_HILLS_M(150, "Jungle Hills M", ColorWrapper.fromRGB(127, 146, 86)), - JUNGLE_EDGE_M(151, "Jungle Edge M", ColorWrapper.fromRGB(179, 217, 105)), - DEEP_OCEAN_M(152, "Deep Ocean M", ColorWrapper.fromRGB(82, 79, 130)), - STONE_BEACH_M(153, "Stone Beach M", ColorWrapper.fromRGB(242, 243, 209)), - COLD_BEACH_M(154, "Cold Beach M", ColorWrapper.fromRGB(255, 255, 255)), - BIRCH_FOREST_M(155, "Birch Forest M", ColorWrapper.fromRGB(131, 194, 148)), - BIRCH_FOREST_HILLS_M(156, "Birch Forest Hills M", ColorWrapper.fromRGB(111, 175, 133)), - ROOFED_FOREST_M(157, "Roofed Forest M", ColorWrapper.fromRGB(143, 158, 109)), - COLD_TAIGA_M(158, "Cold Taiga M", ColorWrapper.fromRGB(132, 163, 156)), - COLD_TAIGA_HILLS_M(159, "Cold Taiga Hills M", ColorWrapper.fromRGB(113, 143, 136)), - MEGA_SPRUCE_TAIGA(160, "Mega Spruce Taiga", ColorWrapper.fromRGB(168, 180, 164)), - REDWOOD_TAIGA_HILLS_M(161, "Redwood Taiga Hills M", ColorWrapper.fromRGB(150, 158, 140)), - EXTREME_HILLS_PLUS_M(162, "Extreme Hills+ M", ColorWrapper.fromRGB(161, 194, 158)), - SAVANNA_M(163, "Savanna M", ColorWrapper.fromRGB(255, 255, 173)), - SAVANNA_PLATEAU_M(164, "Savanna Plateau M", ColorWrapper.fromRGB(247, 238, 180)), - MESA_BRYCE(165, "Mesa (Bryce)", ColorWrapper.fromRGB(255, 151, 101)), - MESA_PLATEAU_F_M(166, "Mesa Plateau F M", ColorWrapper.fromRGB(255, 234, 179)), - MESA_PLATEAU_M(167, "Mesa Plateau M", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)), - - //Nether biome in 1.16.0 nether update. - NETHER_WASTES(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)), - SOUL_SAND_VALLEY(170, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), - CRIMSON_FOREST(171, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), - WARPED_FOREST(172, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), - BASALT_DELTAS(173, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)); - - private static final SparseArray biomeMap; - - static { - biomeMap = new SparseArray<>(); - for (Biome b : Biome.values()) { - biomeMap.put(b.id, b); - } - } - - public final int id; - public final String name; - public final ColorWrapper color; - - Biome(int id, String name, ColorWrapper color) { - this.id = id; - this.name = name; - this.color = color; - } - - public static Biome getBiome(int id) { - return biomeMap.get(id); - } - - - public String getName() { - return name; - } -} -package com.mithrilmania.blocktopograph.map; - -import android.util.SparseArray; - -import com.mithrilmania.blocktopograph.util.ColorWrapper; - - - -/* -Biome enum for MCPE -- by @mithrilmania ---- Please attribute @mithrilmania for generating+updating this enum - */ -public enum Biome { - OCEAN(0, "Ocean", ColorWrapper.fromRGB(2, 0, 112)), - PLAINS(1, "Plains", ColorWrapper.fromRGB(140, 176, 96)), - DESERT(2, "Desert", ColorWrapper.fromRGB(251, 148, 27)), - EXTREME_HILLS(3, "Extreme Hills", ColorWrapper.fromRGB(93, 99, 93)), - FOREST(4, "Forest", ColorWrapper.fromRGB(2, 99, 32)), - TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), - SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), - RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), - HELL(8, "Nether Wastes", ColorWrapper.fromRGB(255, 0, 1)), - THE_END(9, "The End", ColorWrapper.fromRGB(130, 129, 254)), - FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), - FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), - ICE_PLAINS(12, "Snowy Tundra", ColorWrapper.fromRGB(255, 254, 255)), - ICE_MOUNTAINS(13, "Snowy Mountains", ColorWrapper.fromRGB(162, 157, 157)), - MUSHROOM_ISLAND(14, "Mushroom Fields", ColorWrapper.fromRGB(254, 1, 255)), - MUSHROOM_ISLAND_SHORE(15, "Mushroom Field Shore", ColorWrapper.fromRGB(158, 3, 253)), - BEACH(16, "Beach", ColorWrapper.fromRGB(250, 223, 85)), - DESERT_HILLS(17, "Desert Hills", ColorWrapper.fromRGB(212, 94, 15)), - FOREST_HILLS(18, "Wooded Hills", ColorWrapper.fromRGB(37, 86, 30)), - TAIGA_HILLS(19, "Taiga Hills", ColorWrapper.fromRGB(25, 54, 49)), - EXTREME_HILLS_EDGE(20, "Mountain Edge", ColorWrapper.fromRGB(115, 118, 157)), - JUNGLE(21, "Jungle", ColorWrapper.fromRGB(82, 122, 7)), - JUNGLE_HILLS(22, "Jungle Hills", ColorWrapper.fromRGB(46, 64, 3)), - JUNGLE_EDGE(23, "Jungle Edge", ColorWrapper.fromRGB(99, 142, 24)), - DEEP_OCEAN(24, "Deep Ocean", ColorWrapper.fromRGB(2, 0, 47)), - STONE_BEACH(25, "Stone Shore", ColorWrapper.fromRGB(162, 164, 132)), - COLD_BEACH(26, "Snowy Beach", ColorWrapper.fromRGB(250, 238, 193)), - BIRCH_FOREST(27, "Birch Forest", ColorWrapper.fromRGB(48, 117, 70)), - BIRCH_FOREST_HILLS(28, "Birch Forest Hills", ColorWrapper.fromRGB(29, 94, 51)), - ROOFED_FOREST(29, "Dark Forest", ColorWrapper.fromRGB(66, 82, 24)), - COLD_TAIGA(30, "Snowy Taiga", ColorWrapper.fromRGB(49, 85, 75)), - COLD_TAIGA_HILLS(31, "Snowy Taiga Hills", ColorWrapper.fromRGB(34, 61, 52)), - MEGA_TAIGA(32, "Giant Tree Taiga", ColorWrapper.fromRGB(92, 105, 84)), - MEGA_TAIGA_HILLS(33, "Giant Tree Taiga Hills", ColorWrapper.fromRGB(70, 76, 59)), - EXTREME_HILLS_PLUS_TREES(34, "Wooded Mountains", ColorWrapper.fromRGB(79, 111, 81)), - SAVANNA(35, "Savanna", ColorWrapper.fromRGB(192, 180, 94)), - SAVANNA_PLATEAU(36, "Savanna Plateau", ColorWrapper.fromRGB(168, 157, 98)), - MESA(37, "Badlands", ColorWrapper.fromRGB(220, 66, 19)), - MESA_PLATEAU(38, "Badlands Plateau ", ColorWrapper.fromRGB(174, 152, 100)), - MESA_PLATEAU_STONE(39, "Wooded Badlands Plateau", ColorWrapper.fromRGB(202, 139, 98)), - - // ID corrections. Colors still need fixed... - WARM_OCEAN(40, "Warm Ocean", ColorWrapper.fromRGB(202,139,98)), - LUKEWARM_OCEAN(41, "Lukewarm Ocean", ColorWrapper.fromRGB(202,139,98)), - COLD_OCEAN(42, "Cold Ocean", ColorWrapper.fromRGB(202,139,98)), - DEEP_WARM_OCEAN(43, "Deep Warm Ocean", ColorWrapper.fromRGB(202,139,98)), - DEEP_LUKEWARM_OCEAN(44, "Deep Lukewarm Ocean", ColorWrapper.fromRGB(202,139,98)), - DEEP_COLD_OCEAN(45, "Deep Cold Ocean", ColorWrapper.fromRGB(202,139,98)), - DEEP_FROZEN_OCEAN(46, "Deep Frozen Ocean", ColorWrapper.fromRGB(202,139,98)), - LEGACY_FROZEN_OCEAN(47, "Legacy Frozen Ocean", ColorWrapper.fromRGB(202,139,98)), - - SUNFLOWER_PLAINS(129, "Sunflower Plains", ColorWrapper.fromRGB(220, 255, 177)), - DESERT_MUTATED(130, "Desert Lakes", ColorWrapper.fromRGB(255, 230, 101)), - EXTREME_HILLS_MUTATED(131, "Gravelly Mountains", ColorWrapper.fromRGB(177, 176, 174)), - FLOWER_FOREST(132, "Flower Forest", ColorWrapper.fromRGB(82, 180, 110)), - TAIGA_MUTATED(133, "Taiga Mountains", ColorWrapper.fromRGB(90, 182, 171)), - SWAMPLAND_MUTATED(134, "Swamp Hills", ColorWrapper.fromRGB(87, 255, 255)), - RIVER_M(135, "River M", ColorWrapper.fromRGB(82, 79, 255)), - HELL_M(136, "Hell M", ColorWrapper.fromRGB(255, 80, 83)), - SKY_M(137, "Sky M", ColorWrapper.fromRGB(210, 211, 255)), - ICE_PLAINS_SPIKES(140, "Ice Spikes", ColorWrapper.fromRGB(223, 255, 255)), - JUNGLE_MUTATED(149, "Modified Jungle", ColorWrapper.fromRGB(160, 203, 92)), - JUNGLE_EDGE_MUTATED(151, "Modified Jungle Edge", ColorWrapper.fromRGB(179, 217, 105)), - BIRCH_FOREST_MUTATED(155, "Tall Birch Forest", ColorWrapper.fromRGB(131, 194, 148)), - BIRCH_FOREST_HILLS_MUTATED(156, "Tall Birch Hills", ColorWrapper.fromRGB(111, 175, 133)), - ROOFED_FOREST_MUTATED(157, "Dark Forest Hills", ColorWrapper.fromRGB(143, 158, 109)), - COLD_TAIGA_MUTATED(158, "Snowy Taiga Mountains", ColorWrapper.fromRGB(132, 163, 156)), - REDWOOD_TAIGA_MUTATED(160, "Giant Spruce Taiga", ColorWrapper.fromRGB(168, 180, 164)), - REDWOOD_TAIGA_HILLS_MUTATED(161, "Giant Spruce Taiga Hills", ColorWrapper.fromRGB(150, 158, 140)), - EXTREME_HILLS_PLUS_MUTATED(162, "Gravelly Hills+", ColorWrapper.fromRGB(161, 194, 158)), - SAVANNA_MUTATED(163, "Shattered Savanna", ColorWrapper.fromRGB(255, 255, 173)), - SAVANNA_PLATEAU_MUTATED(164, "Shattered Savanna Plateau", ColorWrapper.fromRGB(247, 238, 180)), - MESA_BRYCE(165, "Eroded Badlands", ColorWrapper.fromRGB(255, 151, 101)), - MESA_PLATEAU(166, "Modified Badlands Plateau", ColorWrapper.fromRGB(255, 234, 179)), - MESA_PLATEAU_STONE_MUTATED(167, "Modified Wooded Badlands Plateau", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)), - - //ID correction for Nether biomes. Also, see ID 8 for Nether Wastes. - SOUL_SAND_VALLEY(178, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), - CRIMSON_FOREST(179, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), - WARPED_FOREST(180, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), - BASALT_DELTAS(181, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)); - - private static final SparseArray biomeMap; - - static { - biomeMap = new SparseArray<>(); - for (Biome b : Biome.values()) { - biomeMap.put(b.id, b); - } - } - - public final int id; - public final String name; - public final ColorWrapper color; - - Biome(int id, String name, ColorWrapper color) { - this.id = id; - this.name = name; - this.color = color; - } - - public static Biome getBiome(int id) { - return biomeMap.get(id); - } - - - public String getName() { - return name; - } + OCEAN(0, "Ocean", ColorWrapper.fromRGB(2, 0, 112)), + PLAINS(1, "Plains", ColorWrapper.fromRGB(140, 176, 96)), + DESERT(2, "Desert", ColorWrapper.fromRGB(251, 148, 27)), + EXTREME_HILLS(3, "Mountains", ColorWrapper.fromRGB(93, 99, 93)), + FOREST(4, "Forest", ColorWrapper.fromRGB(2, 99, 32)), + TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), + SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), + RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), + HELL(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)), + THE_END(9, "The End", ColorWrapper.fromRGB(130, 129, 254)), + FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), + FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), + ICE_PLAINS(12, "Ice Plains", ColorWrapper.fromRGB(255, 254, 255)), + ICE_MOUNTAINS(13, "Ice Mountains", ColorWrapper.fromRGB(162, 157, 157)), + MUSHROOM_ISLAND(14, "Mushroom Fields", ColorWrapper.fromRGB(254, 1, 255)), + MUSHROOM_ISLAND_SHORE(15, "Mushroom Fields Shore", ColorWrapper.fromRGB(158, 3, 253)), + BEACH(16, "Beach", ColorWrapper.fromRGB(250, 223, 85)), + DESERT_HILLS(17, "Desert Hills", ColorWrapper.fromRGB(212, 94, 15)), + FOREST_HILLS(18, "Wooded Hills", ColorWrapper.fromRGB(37, 86, 30)), + TAIGA_HILLS(19, "Taiga Hills", ColorWrapper.fromRGB(25, 54, 49)), + EXTREME_HILLS_EDGE(20, "Mountain Edge", ColorWrapper.fromRGB(115, 118, 157)), + JUNGLE(21, "Jungle", ColorWrapper.fromRGB(82, 122, 7)), + JUNGLE_HILLS(22, "Jungle Hills", ColorWrapper.fromRGB(46, 64, 3)), + JUNGLE_EDGE(23, "Jungle Edge", ColorWrapper.fromRGB(99, 142, 24)), + DEEP_OCEAN(24, "Deep Ocean", ColorWrapper.fromRGB(2, 0, 47)), + STONE_BEACH(25, "Stone Shore", ColorWrapper.fromRGB(162, 164, 132)), + COLD_BEACH(26, "Snowy Beach", ColorWrapper.fromRGB(250, 238, 193)), + BIRCH_FOREST(27, "Birch Forest", ColorWrapper.fromRGB(48, 117, 70)), + BIRCH_FOREST_HILLS(28, "Birch Forest Hills", ColorWrapper.fromRGB(29, 94, 51)), + ROOFED_FOREST(29, "Dark Forest", ColorWrapper.fromRGB(66, 82, 24)), + COLD_TAIGA(30, "Snowy Taiga", ColorWrapper.fromRGB(49, 85, 75)), + COLD_TAIGA_HILLS(31, "Snowy Taiga Hills", ColorWrapper.fromRGB(34, 61, 52)), + MEGA_TAIGA(32, "Giant Tree Taiga", ColorWrapper.fromRGB(92, 105, 84)), + MEGA_TAIGA_HILLS(33, "Giant Tree Taiga Hills", ColorWrapper.fromRGB(70, 76, 59)), + EXTREME_HILLS_PLUS_TREE(34, "Wooded Mountains", ColorWrapper.fromRGB(79, 111, 81)), + SAVANNA(35, "Savanna", ColorWrapper.fromRGB(192, 180, 94)), + SAVANNA_PLATEAU(36, "Savanna Plateau", ColorWrapper.fromRGB(168, 157, 98)), + MESA(37, "Badlands", ColorWrapper.fromRGB(220, 66, 19)), + MESA_PLATEAU(38, "Badlands Plateau", ColorWrapper.fromRGB(174, 152, 100)), + MESA_PLATEAU_STONE(39, "Wooded Badlands Plateau", ColorWrapper.fromRGB(202, 139, 98)), + + //fix the colors for these + WARM_OCEAN(40, "Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + LUKEWARM_OCEAN(41, "Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + COLD_OCEAN(42, "Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_WARM_OCEAN(43, "Deep Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_LUKEWARM_OCEAN(44, "Deep Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_COLD_OCEAN(45, "Deep Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_FROZEN_OCEAN(46, "Deep Frozen Ocean", ColorWrapper.fromRGB(202, 139, 98)), + LEGACY_FROZEN_OCEAN(47, "Legacy Frozen Ocean", ColorWrapper.fromRGB(202, 139, 98)), + + // Not sure are available ( need tester ) +// OCEAN_M(128, "Ocean M", ColorWrapper.fromRGB(81, 79, 195)), + + SUNFLOWER_PLAINS(129, "Sunflower Plains", ColorWrapper.fromRGB(220, 255, 177)), + DESERT_MUTATED(130, "Desert Lakes", ColorWrapper.fromRGB(255, 230, 101)), + EXTREME_HILLS_MUTATED(131, "Gravelly Mountains", ColorWrapper.fromRGB(177, 176, 174)), + FLOWER_FOREST(132, "Flower Forest", ColorWrapper.fromRGB(82, 180, 110)), + TAIGA_MUTATED(133, "Taiga Mountains", ColorWrapper.fromRGB(90, 182, 171)), + SWAMPLAND_MUTATED(134, "Swamp Hills", ColorWrapper.fromRGB(87, 255, 255)), + + // Not sure available ( need tester ) +// RIVER_M(135, "River M", ColorWrapper.fromRGB(82, 79, 255)), +// HELL_M(136, "Hell M", ColorWrapper.fromRGB(255, 80, 83)), +// SKY_M(137, "Sky M", ColorWrapper.fromRGB(210, 211, 255)), +// FROZEN_OCEAN_M(138, "Frozen Ocean M", ColorWrapper.fromRGB(226, 224, 241)), +// FROZEN_RIVER_M(139, "Frozen River M", ColorWrapper.fromRGB(239, 242, 255)), + + ICE_PLAINS_SPIKES(140, "Ice Spikes", ColorWrapper.fromRGB(223, 255, 255)), + + // Not sure available ( need tester ) +// ICE_MOUNTAINS_M(141, "Ice Mountains M", ColorWrapper.fromRGB(237, 237, 238)), +// MUSHROOM_ISLAND_M(142, "Mushroom Island M", ColorWrapper.fromRGB(255, 82, 255)), +// MUSHROOM_ISLAND_SHORE_M(143, "Mushroom Island Shore M", ColorWrapper.fromRGB(243, 82, 255)), +// BEACH_M(144, "Beach M", ColorWrapper.fromRGB(255, 255, 162)), +// DESERT_HILLS_M(145, "Desert Hills M", ColorWrapper.fromRGB(255, 177, 100)), +// FOREST_HILLS_M(146, "Forest Hills M", ColorWrapper.fromRGB(113, 167, 109)), +// TAIGA_HILLS_M(147, "Taiga Hills M", ColorWrapper.fromRGB(103, 135, 134)), +// EXTREME_HILLS_EDGE_M(148, "Extreme Hills Edge M", ColorWrapper.fromRGB(196, 203, 234)), + + JUNGLE_MUTATED(149, "Modified Jungle", ColorWrapper.fromRGB(160, 203, 92)), +// JUNGLE_HILLS_M(150, "Jungle Hills M", ColorWrapper.fromRGB(127, 146, 86)), + JUNGLE_EDGE_MUTATED(151, "Modified Jungle Edge", ColorWrapper.fromRGB(179, 217, 105)), +// DEEP_OCEAN_M(152, "Deep Ocean M", ColorWrapper.fromRGB(82, 79, 130)), +// STONE_BEACH_M(153, "Stone Beach M", ColorWrapper.fromRGB(242, 243, 209)), +// COLD_BEACH_M(154, "Cold Beach M", ColorWrapper.fromRGB(255, 255, 255)), + BIRCH_FOREST_MUTATED(155, "Tall Birch Forest", ColorWrapper.fromRGB(131, 194, 148)), + BIRCH_FOREST_HILLS_MUTATED(156, "Tall Birch Hills", ColorWrapper.fromRGB(111, 175, 133)), + ROOFED_FOREST_MUTATED(157, "Dark Forest Hills", ColorWrapper.fromRGB(143, 158, 109)), + COLD_TAIGA_MUTATED(158, "Snowy Taiga Mountains", ColorWrapper.fromRGB(132, 163, 156)), +// COLD_TAIGA_HILLS_M(159, "Cold Taiga Hills M", ColorWrapper.fromRGB(113, 143, 136)), + REDWOOD_TAIGA_MUTATED(160, "Giant Spruce Taiga", ColorWrapper.fromRGB(168, 180, 164)), + REDWOOD_TAIGA_HILLS_MUTATED(161, "Giant Spruce Taiga Hills", ColorWrapper.fromRGB(150, 158, 140)), + EXTREME_HILLS_PLUS_TREE_MUTATED(162, "Gravelly Mountains", ColorWrapper.fromRGB(161, 194, 158)), + SAVANNA_MUTATED(163, "Shattered Savanna", ColorWrapper.fromRGB(255, 255, 173)), + SAVANNA_PLATEAU_MUTATED(164, "Shattered Savanna Plateau", ColorWrapper.fromRGB(247, 238, 180)), + MESA_BRYCE(165, "Eroded Badlands", ColorWrapper.fromRGB(255, 151, 101)), + MESA_PLATEAU_MUTATED(166, "Modified Badlands Plateau", ColorWrapper.fromRGB(255, 234, 179)), + MESA_PLATEAU_STONE_MUTATED(167, "Modified Wooded Badlands Plateau", ColorWrapper.fromRGB(255, 220, 184)), + BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), + BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)), + + // 1.16 BIOME + SOUL_SAND_VALLEY(178, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), + CRIMSON_FOREST(179, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), + WARPED_FOREST(180, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), + BASALT_DELTAS(181, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)), + + // 1.17 BIOME ? + JAGGED_PEAKS(182, "Jagged Peaks", ColorWrapper.fromRGB(0, 0, 0)), + FROZEN_PEAKS(183, "Frozen Peaks", ColorWrapper.fromRGB(0, 0, 0)), + SNOWY_SLOPES(184, "Snowy Slopes", ColorWrapper.fromRGB(0, 0, 0)), + GROVE(185, "Grove", ColorWrapper.fromRGB(0, 0, 0)), + MEADOW(186, "Meadow", ColorWrapper.fromRGB(0, 0, 0)), + LUSH_CAVES(187, "Lush Caves", ColorWrapper.fromRGB(0, 0, 0)), + DRIPSTONE_CAVES(188, "Dripstone Caves", ColorWrapper.fromRGB(0, 0, 0)), + STONY_PEAKS(189, "Stony Peaks", ColorWrapper.fromRGB(0, 0, 0)) + ; + + private static final SparseArray biomeMap; + + static { + biomeMap = new SparseArray<>(); + for (Biome b : Biome.values()) { + biomeMap.put(b.id, b); + } + } + + public final int id; + public final String name; + public final ColorWrapper color; + + Biome(int id, String name, ColorWrapper color) { + this.id = id; + this.name = name; + this.color = color; + } + + public static Biome getBiome(int id) { + return biomeMap.get(id); + } + + + public String getName() { + return name; + } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java index fdf62b1e..556eb60f 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java @@ -113,7 +113,7 @@ private void onClickOk(DialogInterface dia, int i) { mBinding.changeFor.getCheckedRadioButtonId() == R.id.biome_for_all ? null : mBinding.biomeView.getBiome()); Biome biomeTo = mBinding.biomeReplace.getBiome(); - bundle.putSerializable(KEY_TO, biomeTo == null ? Biome.THE_VOID : biomeTo); + bundle.putSerializable(KEY_TO, biomeTo == null ? Biome.PLAINS : biomeTo); mEntry.invokeEditFunction(EditFunction.CHBIOME, bundle); } } From 37e65d6876e3a53ddfed6e3dde3f7cc68c865c60 Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 15:43:04 +0500 Subject: [PATCH 12/20] Delete strings.xml --- app/src/main/res/values-ru/strings.xml | 490 ------------------------- 1 file changed, 490 deletions(-) delete mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml deleted file mode 100644 index 73756e5e..00000000 --- a/app/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,490 +0,0 @@ - - - Blocktopograph - - Приложение, созданное сообществом - - Выберите мир - Мир - Мир - - Открыть панель навигации - Закрыть панель навигации - - Настройки - О (Около) - Помощь - Журнал изменений - - Невозможно открыть миры, нет доступа для чтения/записи в хранилище! - Попробуйте перезапустить приложение и принять запрос разрешения на чтение/запись. - - Нет пользовательских маркеров! (Никаких пользовательских маркеров!) - Пользовательских маркеров пока нет! \n - Вы можете создать его, долго держа то место на карте, где вы хотите маркер, - затем нажмите \ "Создать пользовательский маркер \". - Затем выберите значок маркера и её координаты. - А затем проверьте, можете ли вы найти его здесь! - - - Это приложение создан Protol Lambda (ссылка удалена по его просьбе), - пополняемая - @MithrilMania, - @flagmaggot, - @MeowCat, - @MiemieMethod, - Manuel, - ScrapperBox25, Tcbdxh и многие другие.\n\n - Доступно в Google Play.\n\n - Текущий активный репозиторий github: - github.com/oO0oO0oO0o0o00/blocktopograph - Не стесняйтесь звездить или вилять, помогать с проектом или просто добавлять свою собственную языковую поддержку. - Ваш вклад на github приветствуется! - Более подробную информацию (включая дорожную карту, список изменений и справочную информацию) можно найти по адресу: - blocktopograph.protolambda.com. \n - \n - Пожалуйста, сделайте резервную копию всех ваших любимых миров MCPE на случай повреждения данных!\n - ПРИМЕЧАНИЕ: Minecraft может не загрузить весь мир из-за одного поврежденного фрагмента NBT!\n - \n - Это приложение создано и протестировано для MCPE 1.9.x (бета), 1.8.x, 1.7.x, 1.6.x, 1.5.x, 1.4.x, 1.2.x, 1.1.x, 1.0.x, 0.16.x, 0.15.x, и 0.14.x\n - Старые версии MCPE не поддерживаются.\n - \n - \n - Отказ от ответственности\n - Это приложение не связано с Minecraft, Mojang AB или Microsoft.\n - Это не официальное приложение, а созданное фанатами.\n - Minecraft является товарным знаком Mojang AB.\n - Пожалуйста, обратите внимание:\n - • НЕ ОФИЦИАЛЬНЫЙ ПРОДУКТ MINECRAFT. НЕ УТВЕРЖДЕНО ИЛИ НЕ СВЯЗАНО С MOJANG.\n - • ПРИЛОЖЕНИЕ ПРЕДОСТАВЛЯЕТСЯ \"КАК ЕСТЬ\", БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.\n - \n - \n - Используемые библиотеки\n - • FloatingActionButton \n - • - Tileview, fork by mithrilmania \n - • leveldb-mcpe \n - с - android-leveldb, fork by mithrilmania \n - \n - Исходный код на GitHub:\n - github.com/mithrilmania/blocktopograph \n - \n - - - Документацию к приложению можно найти (возможно, устаревшую): - - blocktopograph.protolambda.com/help - . - - - - Версия: %1$s -
- Полный список изменений можно найти по адресу (устарело): - - blocktopograph.protolambda.com/changelog - ]]> -
- - - Сид мира - - Blocktopograph - - - Значки маркеров:\n - • default_marker (стандартный маркер), blue_marker (голубй маркер), green_marker (зелёный маркер), red_marker(красный маркер). \n - • Имена данных сущностей (с учетом регистра) \n - • Имена данных блока (с учетом регистра) \n - - - - Перезагруженный список миров. - Не удалось найти ни одного мира! - Нет доступа для чтения/записи к мирам. - Путь к хранилищу здесь… - Открыть мир с пользовательским путём - Открыть - - Ваш путь: %1$s\n - \n - Мир уже искали в папках %2$s - По пути не найдено ни одного файла/папки! - - Этот путь (необязательно с суффиксом /level.dat) не является каталогом! - Файл level.dat не найден! - Произошла ошибка при открытии мира. - Вы хотите закрыть этот мир? - Здесь ключ levelDB… - Открыть NBT из DB - Неверное имя ключа. - Не удается найти запись в БД (наверно БД - база данных) с таким именем! - - Не удалось прочитать \"%1$s\" - из базы данных мира. - Данных по многопользовательской игре не найдено. - Выбрать игрока - Открыть NBT - Не удалось открыть запись игрока в DB. ключ: - %1$s - - Текущий мир Minecraft не удалось открыть. - Попробуйте перезапустить это приложение и закрыть мир в MCPE, если он был открыт. - Вы хотите закрыть этот мир? - Вы действительно хотите закрыть этот редактор NBT? - Телепортировать местного игрока - Создать пользовательский маркер - Удалить маркер - Открыть NBT фрагмент сущности - Открыть NBT фрагмент плиты-сущности - Данные фрагмента сущности - Данные фрагмента плиты-сущности - Данные NBT фрагмента - - %1$s - (%2$d, - %3$d, - %4$d) - Телепортировал игрока в - (%1$.1f, - %2$.1f, - %3$.1f) - Не удалось телепортировать игрока. - - Не удалось найти/отредактировать данные локального игрока. - Мой пользовательский маркер - Неверное название маркера! - Неверное название значка! - Неверная X координата маркера! - Неверная Y координата маркера! - Неверная Z координата маркера! - Ошибка: не удалось создать маркер. - - Ошибка загрузки %1$s. - - Редактор NBT - - Этот тип данных ещё не существует для этого фрагмента. - Сначала он должен существовать, вы хотите его создать? - - Создание и сохранение новых данных чанка NBT… - - Созданы и сохранены новые данные чанка NBT! - - Ошибка: не удалось создать / сохранить новые данные чанка NBT. - дд/ММ/гггг чч:мм -а - - Ошибка: не удалось открыть сведения о мире; потерял след мира. - Ошибка: не удалось открыть мир. - - данные об уровне отсутствуют - Имя мира: - Размер мира: - Режим игры: - Последняя игра: - Сид мира: - Путь к файлу: - - Загрузка мира… - - \"%1$s\" является недействительным! - Отмена - Копировать - Вставить (перезаписать) - Вставить (как подтег) - Удалить - Переименовать - Добавить подтег - Добавить NBT тег - Вставить как подтег - Удалить все NBT теги - Не удается изменить корневой NBT тег. - Параметры корневого NBT - Имя тега здесь… - Создать NBT тег - Создать - Буфер обмена пуст! - Вы действительно хотите удалить все NBT теги? - УДАЛИТЬ! - Ошибка: не удалось изменить NBT. - Параметры NBT тегов - - Ошибка: ключ буфера обмена уже существует в составной части! - - Ошибка: не удается перезаписать тег: неизвестный родительский тип NBT. - - Ошибка: не удается перезаписать NBT в пустом родительском теге. - - Ошибка: не удается перезаписать NBT в пустом родительском теге. - - Ошибка: не удается удалить NBT из пустого списка. - Переименовать NBT тег - Переименовать - - Ошибка: родительский NBT-тег уже содержит этот ключ! - - Ошибка: этот ключ уже существует в соединении! - - Ошибка: подтеги можно добавлять только в составные теги и теги списка. - - Данные не изменились, нечего сохранять. - - Вы действительно хотите сохранить изменения? - Не удалось найти игрока. - Не удалось найти респаун. - Перейти к маркеру: - Перейти к локальному игроку - Перейти к другому игроку - Игрок - Спаун - - %1$s - (%2$.1f, - %3$.1f, - %4$.1f) - - %1$s at, - (%2$d, - %3$d, - %4$d) - Карта недоступна. - Поиск маркеров… - Не удалось получить данные игрока. - Перейти к игроку - Вперед! - Перейти к координатам - Телепортировал игрока в: - Этот маркер не предназначен для удаления! - Подфрагмент - Выберите подфрагмент (0…): - Фильтровать маркеры - Показать карту - Выбрать мир - Однопользовательский NBT - Нногопользовательский NBT - NBT мира - Надземный мир - Спутник - Пещера - Слайм-чанк - Карта высот - Биомы - Цвет листвы - X-Ray (Рентген) - Свет - Нижний мир - Карта - Край - Параметры карты - Переключить сетку - Переключить маркеры / мобы - Расширенные опции (их нельзя переводить) - - BiomeData NBT - Overworld NBT - Villages NBT - Portals NBT - dimension0 NBT - dimension1 NBT - dimension2 NBT - AutonomousEntities NBT - - Открыть NBT по имени - - Выживание - Творческий - Приключение - - (%1$.1f, - %2$.1f) - Чанк(%3$d, - %4$d) - Телепорт! - Иди на возрождение - Миров не найдено. - - Обратите внимание, что более новая версия Minecraft по умолчанию помещает ваши миры в свои личные данные. - По этой причине все инструменты не смогут получить доступ к мирам. - Вам нужно будет настроить Minecraft на использование \"внешнего\" хранилища, перейдя в Minecraft.-> - Настройки->Профиль->Расположение хранилища файлов, и измените параметр с - \"Приложение\" на \"Внешнее\". - После этого вновь созданные миры будут доступны для Blocktopograph, в то время как - существующие миры не могут быть открыты. Возможно, вам захочется погуглить о том,как переместить предыдущие миры во внешние. - - [NetEase] - Создать плоский мир - Имя: - Мой Мир - 1.2.13~последняя - Версия: - Слои: - Неизвестная ошибка. - Пожалуйста, подождите... - Количество: - Сумма из всех слоев должна быть не менее 0 и не более 127. - Добавить слой... - редактировать - Выберите блок - - "1. Перетащите значок блока для сортировки.\n" - "2. Нажмите любой элемент для редактирования.\n" - "3. Нажмите кнопку \"Добавить\", чтобы добавить слой.\n" - "4. Проведите пальцем влево, чтобы удалить." - "." - - Должен быть хотя бы один слой. - Готово. - Не удалось. - После создания, мир появится в Minecraft, после перезапуска игры. - Тестовая страница - Мяу~ - "\n§cДобро пожаловать~ мяу~""\n§rСоздано""\n§3Blocktopograph""\n""\n§1Получить из Play Store""\n§5и создайте свой""\n§5собственный индивидуальный мир!""\n""\n§rМир создан в""\n§d%1$s" - Рецепт мира:\n - §r%1$dx §b%2$s\n - " §r..И многое другое" - "by_Blocktopograph.txt" - "Welcome~ Мяу~""\nМир был создан Blocktopograph-ом,""\nредактором миров Minecraft и просмотровщиком ландшафта.""\nПолучите из Play Store и создайте свой собственный мир!" - Игроки - В (%1$d, %2$d, %3$d) из %4$s - Расширенный локатор... - Маркеры - Координаты - Получить полную картину\в мире - Сделать фотографию - Это создаст картину мира и может привести к сбою. - Есть повреждённые или неподдерживаемые данные, пропустить или отменить? - В мире есть данные из старой версии Майнкрафт. Возможно, вы захотите отменить сейчас и открыть мир в новой версии Minecraft, чтобы данные обновлялись автоматически. Вы также можете игнорировать эти данные. - Игнорировать - - Blocktopograph не может понять ваш мир, возможно, ваша версия игры слишком старая или слишком новая. - Этот мир слишком старой версии Minecraft, поэтому не может быть прочитан. - Рельеф не найден. - Анализируя - Содание - Предварительный просмотр: - Сохранить - Картинка будет сохранена в папке Загрузки (Download). - Картинка сохранена. - Поделиться - Поделиться с - Выберите масштаб: - Каждый блок будет размером в один пиксель. Если вы выберете меньшую область, то сможете масштабировать картинку больше. - Создавать - Начать выбор - Отменить выбор - Варианты выбора - Выбор - Из [ - , - ] - К [ %1$d, %2$d ] (в том числе от и до) - Диапазон - x - Применять - Ширина и высота должны быть не менее 1. - Операции - Абажуры факелов - Это добавило бы стеклянные плафоны к факелам в выбранной области. Поддерживаются миры Minecraft Bedrock 1.4.x и выше. Мы советуем вам сделать резервную копию вашего мира перед любыми изменениями в Blocktopograph. - Найти в - Задний план - Передний план - Либо - Оба - Найти для - Слот переднего плана: - Фоновый слот: - Затем поместите в - Передний план и фон - Находить & Заменить - Игнорировать подтипы - Простой поиск и замену можно выполнить без учета фонового слота. Начиная с Minecraft BE 1.4.x, фоновые слоты используются для хранения воды, сосуществующей с другими блоками, однако их можно использовать для размещения любого блока. Опытные составители карт могут действительно эффективно использовать эту функцию. - ВСЕГДА СОЗДАВАЙТЕ РЕЗЕРВНУЮ КОПИЮ ПЕРЕД ПРОДОЛЖЕНИЕМ! - Биом: - Числовой идентификатор биома, по умолчанию 21 - Примерно %1$dx%2$d. - Удалить чанк - Это УДАЛЯЕТ все чанки, задействованные в выбранной области. Позже Minecraft может снова создать эту область, но ваш прогресс в ней будет потерян. Если вы не знаете, что такое \"чанк\" в Minecraft, и не понимаете последствий, вы не должны продолжать. Не просто следите за случайными онлайн-статьями. - Выбранная область не была выровнена по границе фрагмента. Не волнуйтесь, Blocktopograph может подстроиться под вас. Фактическая удаленная область будет немного больше, чем выделенная область. Если быть точным, это будет на 0-15 блоков больше с каждой стороны. Это потому, что область может быть повторно сгенерирована только в том случае, если она была удалена вместе с содержащимися в ней фрагментами. Если вам не нравится автоматическая регулировка, вы можете отменить и изменить выбор самостоятельно. - Продолжить автонастройку - Приложение опасно, \nперед редактированием сделайте резервную копию! - Слишком много маркеров! - На экране слишком много маркеров, например мобы. Вы можете отключить их, нажав \"переключить маркеры\" на панели слайдов, или установить фильтр маркеров. - Открыть ящик - Понятно - Политика конфиденциальности - Привет, друг,\n\nДля лучшего опыта при использовании нашего Сервиса я могу потребовать, чтобы вы предоставили нам определённую информацию, включая, помимо прочего, общую информацию о ваших открытых Мирах Майнкрафт, включая версии, сиды; и собранная статистика, связанная с устройством/ОС от Firebase автоматически, что технически может быть (косвенно) идентифицируемым лично.\n\nСсылка на политику конфиденциальности сторонних поставщиков услуг, используемых приложением:\nGoogle Play Services\nFirebase Analytics\nCrashlytics\n\nВсе собранные данные будут обрабатываться только на защищённых услугах, предоставляемых публично доверенные провайдеры в сети.\n\nДоступна полная политика конфиденциальности в Политика конфиденциальности Blocktopograph - Accept> - Выйти - Выберите биом - Изменить биом - Для - Все - Конкретный биом - Изменить на - Вы можете долго щелкнуть по карте, выбрать \"Начать выбор\" и попробовать отредактировать. - Мир слишком велик - Мир слишком велик. Вы также можете:\n(1) Используйте аналогичный инструмент на ПК;\n(2) Или начните выделение части мира и выберите \"Создать картинку\" из меню выбора. - You can scale the picture larger. One pixel per block at least. - Слишком большой выбор - Выбранная вами область слишком велика. Ширина и высота должны быть в пределах %1$d блоки, и область должна быть в пределах %2$d блоках². - Создать картинку - Создание предварительного просмотра ... - Позиция неизвестна - Дважды коснитесь экрана, чтобы открыть ящик. - Что-то пошло не так... - Извините, что-то пошло не так, так что вы не сможете использовать это приложение. Короче говоря, волшебная часть приложения отсутствует. \\nВы получили приложение (файл apk) от кого-то, кто ранее установил приложение? Затем приложение было оптимизировано только для устройства этого человека, даже если у вас та же модель устройства, оно не будет работать. Попробуйте удалить и переустановить из Google Play Store, чтобы решить эту проблему. Вы также можете загрузить полную версию приложения с GitHub или других источников. В этом случае вам также может потребоваться удалить эту версию приложения. Приносим извинения за неудобства, но это определённо вызвано вашей дурной привычкой загружать файлы не из нужного места.\\nЕсли это не так, то мы понятия не имеем. - Закрыть - - Создать новую резервную копию - Существующие резервные копии - Автоматически удалять резервные копии старше 3 дней (не удалять, если существует не более 3 резервных копий) - Автоматически делать резервные копии при открытии мира - - Каждый раз, когда вы открываете мир, Blocktopograph будет делать новую резервную копию. Это может занять некоторое время и вызвать дополнительное использование хранилища. - Включить автозагрузку - Вы можете оставить это пустым - Отменено. - Восстановить - Восстановление предыдущей резервной копии - Это отменит все изменения в мире до создания резервной копии! Ты уверен? Будьте осторожны, это может разрушить вашу работу! - Удалить - Удаление резервной копии - Вы удаляете резервную копию. Убедитесь, что вы выбрали правильный вариант. - Выполняется автоматическое резервное копирование... - [Авто] - Сломанный Мир -
From b6f4711a3e8ccb3308bbab9ac1937500fba5d47c Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 15:44:16 +0500 Subject: [PATCH 13/20] Create 6.g --- app/src/main/res/values-ru/6.g | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/values-ru/6.g diff --git a/app/src/main/res/values-ru/6.g b/app/src/main/res/values-ru/6.g new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/app/src/main/res/values-ru/6.g @@ -0,0 +1 @@ + From 839936258075ae2319e0b46e4bc9423a42400207 Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 15:44:50 +0500 Subject: [PATCH 14/20] Add files via upload --- app/src/main/res/values-ru/strings.xml | 517 +++++++++++++++++++++++++ 1 file changed, 517 insertions(+) create mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..a364ed54 --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,517 @@ + + + NBT данные ~local_player + Моя отметка + Ещё + Найти в + Показать все + Выберите приложение + ВЫКЛ + ВКЛ + Alt + + Ctrl + + Удалить + Ввод + Fn + + Meta + + Shift + + Пробел + Sym + + Меню + + Введите запрос + Удалить запрос + Поисковый запрос + Поиск + Отправить запрос + Голосовой поиск + Поделиться с помощью + Поделиться с помощью %s + Свернуть + Дополнительная информация + История изменений + Помощь + Настройки + Телепортировать! + Дополнительные параметры + Это приложение создано Protol Lambda (Ссылка удалена, так как он и просил), Участники проекта: @MithrilMania, @flagmaggot, @MeowCat, @MiemieMethod, Manuel", ScrapperBox25, Tcbdxh и многие другие. + +Приложение больше не доступно в Google Play. "Источник для загрузки APK. Текущий активный github репозиторий: github.com/oO0oO0oO0o0o00/blocktopograph Не стесняйтесь ставить звезду или форкать исходный код, помогать с проектом или просто добавлять свою собственную языковую поддержку. Ваш вклад на github приветствуется! Больше информации (включая дорожную карту проекта, список изменений и справочную информацию) можно найти по адресу: blocktopograph.protolambda.com (web archive)". + +Пожалуйста, сделайте резервную копию всех ваших любимых Minecraft миров на случай повреждения данных! +ПРИМЕЧАНИЕ: Minecraft может не загрузить целый мир из-за одного поврежденного фрагмента NBT! + +Это приложение создано и протестировано для Minecraft 1.16.x, 1.15.x, 1.14.x, 1.13.x, 1.12.x, 1.11.x, 1.10.x, 1.9.x(бета-версия), 1.8.x, 1.7.x, 1.6.x, 1.5.x, 1.4.x, 1.2.x, 1.1.x, 1.0.x, 0.16.x, 0.15.x и 0.14.x +Более старые версии MCPE не поддерживаются. + +Blocktopograph не может читать чанки миров созданных в Minecraft версии 1.16.100 и выше. Это означает, что если вы откройте такой мир в Blocktopograph, то его карта будет пустой. + +Начиная с Minecraft 1.18 Mojang изменил путь хранения миров с (/storage/emulated/0/games/com.mojang/minecraftWorlds) на (/storage/emulated/0/Android/data/com.mojang.minecraftpe/files/games/com.mojang/minecraftWorlds), Blocktopograph не может получить доступ к папкам в ...Android/data... из-за ограничений Android 11. Даже если вы укажите путь к файлу level.dat лежащему в этих папках Blocktopograph всë равно не сможет открыть мир. Вы можете: + • Использовать аналогичную программу на ПК или телефоне. + • Отправить миры из недоступной папки в (/storage/emulated/0/games/com.mojang/minecraftWorlds) для этого можно использовать ПК либо проводники способные обойти ограничения Android 11 такие как: ES проводник, Zarchiver, Total Commander и.т.д. Если Android в более новых версиях заблокирует доступ даже этим проводниками, то вы можете найти другой обходной путь либо другой проводник способный обходить это ограничение, либо произвести рутирование своего телефона и тогда у вас будет доступ ко всей ФС. + • Отредактировать APK Minecraft, чтобы заставить его сохранять миры в (/storage/emulated/0/games/com.mojang/minecraftWorlds) или туда куда вы хотите и там где доступ для Blocktopograph не заблокирован. + + + +"предупреждение" +"Это приложение не связано с Mojang AB или Microsoft." +Это не официальное, а фанатское приложение. +Minecraft является торговой маркой Mojang AB. +Пожалуйста, обратите внимание: +• Blocktopograph НЕ ЯВЛЯЕТСЯ ОФИЦИАЛЬНЫМ ПРОДУКТОМ MINECRAFT. НЕ ОДОБРЕН MOJANG И НЕ СВЯЗАН С НИМ. +• ПРИЛОЖЕНИЕ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. + + + "Библиотеки используемыев Blocktopograph:" + • "FloatingActionButton" + • "Tileview, fork by mithrilmania" + • "leveldb-mcpe" + с " android-leveldb, форк от mithrilmania" + +"Исходный код на GitHub:" +"https://github.com/oO0oO0oO0o0o00/blocktopograph" + +" + Версия: %1$s &lt;br/>&lt;br/> Полный список изменений можно найти по адресу (устарел): &lt;a href=https://web.archive.org/web/20200801044719/http://blocktopograph.protolambda.com/changelog> blocktopograph.protolambda.com/changelog (web archive) &lt;/a> + Документацию к приложению можно найти по адресу (страница была удалена, а часть информации устарела, вы можете перейти по ссылке, но попадëте на страницу сохранëнную в web archive): blocktopograph.protolambda.com/help (web archive)". " + Blocktopograph + com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior + Вы хотите закрыть этот мир? + Выполняется автоматическое резервное копирование... + [Авто] + Автоматически удалять резервные копии старше 3 дней (не удаляет, если существует не более 3 резервных копий) + Автоматически создавать резервные копии при каждом открытии мира в Blocktopograph + NBT автономных сущностей + Создание резервных копий и восстановление + Удаление резервной копии + Вы действительно хотите удалить резервную копию? + Это папка резервных копий для этого мира, созданная и управляемая NBT редактором миров Minecraft для Android и средством просмотра карт - Blocktopograph. Пожалуйста, не изменяйте файлы здесь, иначе вы не сможете восстановить эти резервные копии с помощью Blocktopograph. + Выберите биом + NBT данные биомов + Показать биомы + com.google.android.material.bottomsheet.BottomSheetBehavior + Приложение, созданное сообществом Minecraft + Невозможно отредактировать корневой NBT. + Не удается найти запись с таким именем! + Существующие резервные копии + Показать пещеры + Введенные символы %1$d of %2$d + Превышен лимит символов %1$d of %2$d + %1$d / %2$d + Текст чипа + Выбрать саб чанк(0…): + Открытый текст + Буфер обмена пуст! + Ошибка: элемент из буфера обмена уже существует в данном compound теге! + Закрыть + 243c826a-0ebd-4702-b35e-37032f3a8ba5 + Включить + Для работы приложения \"%1$s\" требуется включить сервисы Google Play. + Включите сервисы Google Play + Установить + Для работы приложения \"%1$s\" требуется установить сервисы Google Play. + Установите сервисы Google Play + Доступность сервисов Google Play + Ошибка сервисов Google Play + Приложению \"%1$s\" не удается подключиться к сервисам Google Play. Повторите попытку. + Для работы с приложением \"%1$s\" требуются сервисы Google Play. Они не поддерживаются на вашем устройстве. + Обновить + Чтобы запустить приложение \"%1$s\", обновите сервисы Google Play. + Обновите сервисы Google Play + Сервисы Google Play, необходимые для работы приложения \"%1$s\", в настоящий момент обновляются. + Версия сервисов Google Play устарела. Они автоматически обновятся в ближайшее время. + Открыть на телефоне + Войти + Войти через аккаунт Google + Вы действительно хотите закрыть этот NBT редактор? + Вы хотите закрыть этот мир? + Вы действительно хотите удалить все NBT? + Вы действительно хотите сохранить внесëнные изменения? + Не удалось найти миры! + Создать + Создать отметку на карте + "Ярлыки отметок: + • default_marker, blue_marker, green_marker, red_marker + • Вы можете использовать имена сущностей для ярлыков + • Вы можете использовать имена блоков для ярлыков +" + Создать NBT + После создания мира в Blocktopograph он появится в Minecraft (если Minecraft в этот момент был включен, то его нужно перезапустить). + Создать новую резервную копию + Числовой id биома, по умолчанию 21 + Биом: + " +§cДобро~ пожаловать~ Мяу~ +§rЭтот мир создан программой +§3Blocktopograph + +§1Скачайте в Google Play +§5и редактируйте ваши +§5собственные миры! + +§rДата создания мира: +§d%1$s" + "§r%1$dx §b%2$s +" + "Слои мира: +" + " §r..И больше" + Мяу~ + Мой мир + от_Blocktopograph.txt + "Добро~ пожаловать~ Мяу~ +Этот мир создан программой Blocktopograph, +NBT редактором миров Minecraft для Android. +Скачайте в Google Play или GitHub +и редактируйте ваши собственные миры!" + Слои: + Имя: + Создать плоский мир + Версия: + 1.2.13 + Созданы и сохранены новые NBT данные чанка! + Создание и сохранение новых NBT данных чанка… + Этот тип данных пока не существует для этого блока. Сначала он должен появиться, вы хотите его создать? + Моя отметка + 245780358673-r3au662jj4b7f4ou7j0vses5iqh7vu6i.apps.googleusercontent.com + УДАЛИТЬ! + NBT данные dimension0 + NBT данные dimension1 + NBT данные dimension2 + Добавить вложенный тег + Закрыть это окно + Копировать + Удалить + Добавить слой... + Здесь должен быть хотя бы один слой. + Редактировать + "1. Вы можете менять слои местами перетаскивая их за ярлык. +2. Кликните по любому элементу для начала редактирования. +3. Нажмите кнопку \"+\", чтобы добавить слой. +4. Проведите пальцем влево, чтобы удалить слой." + Количество: + Сумма всех слоев должна быть не менее 0 и не более 127. + Вставить (заменив текущий(е) тег(и)) + Вставить (как вложенный тег) + Переименовать + Добавить NBT + Вставить как вложенный тег + Удалить все NBT + Каждый раз, когда вы открываете мир, Blocktopograph будет создавать новую резервную копию. Это может занять некоторое время и привести к дополнительному использованию памяти. + Включить автоматическое резервное копирование + Данные сущностей в чанке + Миры не найдены. + "Обратите внимание, что более новый Minecraft по умолчанию помещает ваши миры в свои личные данные (доступ без root прав невозможен). По этой причине никакие инструменты не способны получить доступ к мирам. Вам нужно будет настроить Minecraft на использование \"внешнего\" хранилища, перейдя в Minecraft-> Настройки-> Профиль-> Расположение хранилища файлов и измените параметр с \"Приложение\" на \"Внешнее\". После этого вновь созданные миры будут доступны для Blocktopograph, в то время как существующие миры в корневой папке Minecraft не могут быть открыты. Возможно, вы захотите поискать в Google информацию о том, как переместить миры из внешнего хранилища во внутреннее. Для этого можно использовать WorldExporter: https://tikolu.net/world-exporter/ +Инструкция: https://youtu.be/7CsP52xNfTA + +Либо вы можете рутировать телефон и скопировать миры из папки (/data/user/0/com.mojang.minecraftpe/games/com.mojang/minecraftWorlds/) в (/storage/emulated/0/games/com.mojang/minecraftWorlds) с помощью проводников таких как: ES проводник, Zarchiver, Total Commander и.т.д" + Не удалось открыть этот мир Minecraft. Попробуйте перезапустить Blocktopograph и выйти из мира в Minecraft, если он был там открыт. + Ошибка: не удается перезаписать NBT в пустом родительском теге. + Ошибка: не удается перезаписать тег: неподходящий тип родительского NBT. + Ошибка: не удается вставить в качестве вложенного тега: неподходящий тип родительского NBT. + Ошибка: не удается удалить NBT из пустого списка. + Ошибка: не удалось открыть мир. + Ошибка: не удалось открыть сведения мира; потерян трекер мира. + Номер кредитной карты введён некорректно + Неправильный формат ввода + Доменное имя некорректно + Email введён некорректно + Поле не может быть пустым + Неизвестная ошибка. + Ошибка + IP-адрес введён некорректо + Ошибка: этот ключ уже существует в теге compound! + Некорректный ввод имени. + Некорректный ввод имени или фамилии. + Допускаются только цифры. + Допускаются только цифры из разрешённого диапазона + Допускается только стандартный текст + Произошла ошибка при попытке открыть мир + Ошибка: родительский NBT уже содержит этот ключ! + Номер телефона введён некорректно + Это поле не может содержать специальные символы + Интернет-адрес введён некорректно + Показать выпадающее меню + com.google.android.material.transformation.FabTransformationScrimBehavior + com.google.android.material.transformation.FabTransformationSheetBehavior + Не удалось найти игрока. + Не удалось найти спавн. + Не удалось открыть запись игрока из БД. ключ: %1$s + Не удалось телепортировать игрока. + Ошибка: не удалось создать отметку. + Ошибка: не удалось создать/сохранить новые NBT данные чанка. + Ошибка: не удалось выполнить изменение NBT. + Не удалось найти/отредактировать данные ~local_player. + Не удалось загрузить %1$s. + Не удалось прочитать \"%1$s\" из базы данных мира + Не удалось получить данные игрока. + Фильтр отметок + https://rbq2012-blocktopograph-r.firebaseio.com + Показать цвета листвы + dd/MM/yyyy hh:mm a + Выделить область + Убрать выделитель области + Приключения + Креатив + Выживание + 245780358673 + Отменено. + Удалить + Готово. + Не удалось. + Понятно + Игнорировать + Пожалуйста подождите... + Поделиться + Перейти! + Перейти к отметке: + Перейти к координатам + Перейти к ~local_player + Перейти к другому игроку + Перейти к позиции игрока + Перейти к спавну + AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ + 1:245780358673:android:09760b39a1d3e21f + AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ + rbq2012-blocktopograph-r.appspot.com + Продвинутый поисковик... + "Создать полную картину +мира" + Показать карту высот + com.google.android.material.behavior.HideBottomViewOnScrollBehavior + Дать имя резервной копии (это не обязательно) + Введите имя для тега... + Ярлык диалогового окна + Неверное имя ярлыка! + Неверное имя ключа. + Недопустимая координата X для отметки! + Недопустимая координата Y для отметки! + Недопустимая координата Z для отметки! + Введите levelDB ключ... + Показать карту света + Загрузка мира... + Координаты + Отметки + Игроки + Карта измерения + Дважды коснитесь экрана, чтобы открыть меню. + Всë выделенное + Что изменить + Конкретные биомы + Заменить на + Это приведëт к удалению всех фрагментов в пределах выбранной вами области. Позже Minecraft может снова сгенерировать эту область, но ваш прогресс внутри неë будет потерян. Если вы не знаете, что такое чанк в Minecraft, и не понимаете последствий, вам не следует продолжать. Не верьте рандомным онлайн-статьям, только Minecraft WIKI + Продолжить с автоматической настройкой + Выбранная вами область не была выровнена по границам чанков/чанка. Не волнуйтесь, Blocktopograph может подстроиться под вас. Фактическая удаленная область будет немного больше выделенной. Чтобы быть точным, это будет на 0 ~ 15 блоков больше с каждой стороны. Это потому, что область может быть сгенерирована повторно только в том случае, если она была удалена вместе с содержащимися в ней чанками. Если вам не нравится автоматическая настройка, вы можете нажать \"ОТМЕНА\" и изменить выделение самостоятельно. + Изменить биом + Удалить чанки + Факелы с абажурами + Создать картину + Найти и заменить + Это добавит стеклянные абажуры к факелам в выбранной области. Поддерживаются миры Minecraft Bedrock 1.4.x или выше. Мы советуем вам создать резервную копию вашего мира перед любыми изменениями в Blocktopograph. + Массив и под-массив + Под-массив + Под-массив: + Оба + Массив + Массив: + Выбрать + Искать в + "Простой поиск и замену можно выполнить, игнорируя под-массив. + +Начиная с версии Minecraft 1.4.x, под-массивы используются для хранения воды, сосуществующей с другими блоками в одной и той же позиции, однако их можно использовать для размещения любого блока вместо воды. Вы можете использовать эту функцию для размещения 2 разных блоков в одной и той же позиции." + Игнорировать подтипы + Любой + Заменить на + Неизвестная позиция + Вы можете удержать палец на экране для открытия меню и выбрать \"Выделить область\" чтобы начать редактировать область. + Параметры карты + Вы можете масштабировать изображение и сделать его больше. Минимальный масштаб - 1 пиксель на 1 блок. + Выбранная область слишком велика + Выбранная вами область слишком большая. Ширина и высота должны быть в пределах %1$d блоков, и площадь должна быть в пределах %2$d блоков². + "Мир слишком огромный. Вы можете: +(1) Использовать аналогичный инструмент на ПК; +(2) Начать выбор части мира, а не всего целиком и нажать \"Создать картину\" в меню выбора." + Мир слишком огромный + Ширина и высота должны быть не менее 1. + От [ + , + ] + Применить + Функции + Выделенная область + Функции для выделенной области + Диапазон + x + До [ %1$d, %2$d ] (включая от и до) + ВСЕГДА СОЗДАВАЙТЕ РЕЗЕРВНУЮ КОПИЮ, ПРЕЖДЕ ЧЕМ ПРОДОЛЖИТЬ! + Слишком много отметок! + На вашем экране слишком много отметок, например, мобов. Вы можете отключить их отображение, нажав Отображение отметок в маню или настроив фильтр отметок. + Открыть меню + Blocktopograph + %1$s (%2$d, %3$d, %4$d) + Недопустимое имя отметки! + Эта отметка не может быть удалена! + Новое уведомление + Убрать %1$s + %1$d%2$s + Переход к следующему месяцу + Переход к предыдущему месяцу + Текущее выделение: %1$s + brut.androlib.res.data.value.ResReferenceValue@f37859 + brut.androlib.res.data.value.ResReferenceValue@42b8c1e + %1$s + Выбрать дату + Выбранная дата + Колонка дней: %1$s + Неверный формат + Пример: %1$s + Использовать: %1$s + Недопустимый диапазон. + Перейдите к году %1$s + Вне диапазона: %1$s + Первая дата – %1$s + %1$s – последняя дата + %1$s – %2$s + Выберите диапазон дат + Первая дата - последняя дата + Сохранить + Дата + Последняя дата + Первая дата + д + м + г + Переключиться в режим ввода для календаря + Нажмите, чтобы переключиться на выбор дня + Переключиться в режим ввода текста + Нажмите, чтобы переключиться на выбор года + NBT данные игроков + Закрыть меню + Открыть меню + NBT данные чанка + NBT редактор + Функции NBT + Незер + "Пользовательские отметки не были созданы в этом мире! + +Вы можете создать их, долго нажимая на точку на карте, где вы хотите установить отметку, затем нажмите \"Создать отметку на карте\". Затем выберите ярлык отметки и высоту по координате Y. + +После создания отметки на карте она появится в этом списке!" + Нет отметок! + Никакие данные не были отредактированы, нечего сохранять. + Файл/папка не найдены по этому пути! + Файл level.dat не найден! + данные об уровне отсутствуют + Карта недоступна. + Не найдены NBT данные игроков. + Нет доступа на чтение/запись к мирам. + Не удается открыть миры, нет доступа на чтение/запись в хранилище! Попробуйте перезапустить приложение и разрешите доступ на чтение/запись в появившемся окне. + Открыть + Показать NBT данные сущностей в чанке + Показать NBT данные блоков в чанке + Открыть NBT данные игрока + Открыть NBT по имени + Поиск NBT данных в БД + "Приложение опасно, +сделайте резервную копию перед редактированием!" + Открыть мир с пользовательским путем + Основное измерение + NBT основного измерения + Показать пароль + M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z + M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M3.27,4.27 L19.74,20.74 + "В мире есть данные из старой версии Minecraft. Возможно, вы захотите выйти из программы и открыть мир в более новом Minecraft, чтобы данные автоматически обновились. Вы также можете игнорировать эти данные. " + Есть поврежденные или неподдерживаемые данные, пропустить или выйти? + Сгенерировать + Отмена и возврат + Это создало бы картину мира и может привести к сбою. + Ваш мир не может быть распознан через Blocktopograph, возможно, ваша версия игры слишком старая или слишком новая. + Местность не найдена. + Этот Minecraft мир имеет слишком старую версию, поэтому не может быть прочитан. + Предварительный просмотр: + Создание предварительного просмотра... + Анализ + Сохранить + Картина будет сохранена в вашей папке загрузки. + Картина сохранена. + Примерно %1$dx%2$d. + Выберите масштаб: + Поделиться с + Сгенерировать картину мира + Каждый блок будет размером в один пиксель. Если вы выберете меньшую область, то сможете увеличить масштаб изображения. + Выберите блок + Игрок + Координаты: (%1$d, %2$d, %3$d) Измерение: %4$s + "NBT данные незер порталов " + Координаты:(%1$.1f, %2$.1f) чанк:(%3$d, %4$d) + Принять и продолжить + Выход + "Здравствуй друг, + +Для улучшения работы Blocktopograph от вас может потребоваться предоставить нам определенную информацию, включая, но не ограничиваясь, общую информацию об открытых вами мирах Minecraft, включая версии, сиды и статистику, связанную с устройством/ОС, автоматически собираемую Firebase, которая может быть (косвенно) идентифицируемой лично, технически. + +Ссылки на политику конфиденциальности сторонних поставщиков услуг, используемых приложением: +"Сервисы Google Play" +"Firebase Analytics" +"Crashlytics (web archive)" + +Все собранные данные будут обрабатываться только на защищенных сервисах, предоставляемых этими общедоступными поставщиками онлайн услуг. + +Полная политика конфиденциальности доступна по адресу "Политика конфиденциальности Blocktopograph + Политика конфиденциальности + rbq2012-blocktopograph-r + Список миров обновлëн. + Удалить отметку + Переименовать + Переименовать NBT + "Ваш путь: %1$s + + Уже произведен поиск мировых папок в: %2$s" + Восстановить + Восстановление предыдущей резервной копии + Это возвратит вспять все изменения в мире, которые были внесены до создания резервной копии! Вы уверены? Будьте осторожны, это может стереть вашу работу! + Функции для корневого NBT + Карта измерения + Поиск + Поиск отметок… + Выбрать игрока + Выйти из мира + Показать карту + NBT данные ~local_player + Показать слайм чанки + Что-то пошло не так... + %1$s (%2$.1f, %3$.1f, %4$.1f) + %1$s в, (%2$d, %3$d, %4$d) + Спавн + >999 + Укажите путь до файла level.dat + Саб чанк + Ошибка: вставлять тег можно только в теги типа \"compound\" и теги типа \"list\". + Телепортировать игрока в точку которую вы нажали + Игрок телепортирован в (%1$.1f, %2$.1f, %3$.1f) + Игрок телепортирован в: + Эндер мир + Данные блоков в чанке + Мир + Тестовая страница + Мир + Выберите мир + Включить/выключить сетку + Отображение отметок + Извините, что-то пошло не так, и вы не сможете использовать это приложение. Короче говоря, волшебная часть приложения отсутствует. \\nВы приложение (apk-файл) от кого-то другого, кто ранее установил приложение? Затем приложение было оптимизировано только для устройства этого человека, даже если у вас та же модель устройства, оно не будет работать. Попробуйте удалить и переустановить из Google Play Store, возможно, это решит проблему. Вы также можете скачать полную версию приложения с GitHub или из других источников. В этом случае вам также может потребоваться удалить эту версию приложения. Извините за неудобства.\\nЕсли это не та ситуация, то мы понятия не имеем в чëм проблема. + NBT данные деревень + [NetEase] + Повреждëнный мир + NBT данные level.dat + Сид мира: + Путь к файлу: + Режим игры: + Последняя игра: + Имя мира: + Сид мира: + Размер мира: + Этот путь (необязательно с суффиксом /level.dat) не является директорией! + \"%1$s\" некорректный! + X-Ray (показать руды) + From 24a59daedc94180b7e7e27da88dc30869af86426 Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 15:45:14 +0500 Subject: [PATCH 15/20] Delete 6.g --- app/src/main/res/values-ru/6.g | 1 - 1 file changed, 1 deletion(-) delete mode 100644 app/src/main/res/values-ru/6.g diff --git a/app/src/main/res/values-ru/6.g b/app/src/main/res/values-ru/6.g deleted file mode 100644 index 8b137891..00000000 --- a/app/src/main/res/values-ru/6.g +++ /dev/null @@ -1 +0,0 @@ - From d06f3aa026de9e5aa62e82007027c5c2354e7781 Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 16:03:28 +0500 Subject: [PATCH 16/20] Create 0.txt --- app/src/main/res/values-ru/0.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/values-ru/0.txt diff --git a/app/src/main/res/values-ru/0.txt b/app/src/main/res/values-ru/0.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/app/src/main/res/values-ru/0.txt @@ -0,0 +1 @@ + From 6cde66d9ada6e070cc61e382eeb44b5e96cfe41d Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 16:03:37 +0500 Subject: [PATCH 17/20] Delete strings.xml --- app/src/main/res/values-ru/strings.xml | 517 ------------------------- 1 file changed, 517 deletions(-) delete mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml deleted file mode 100644 index a364ed54..00000000 --- a/app/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,517 +0,0 @@ - - - NBT данные ~local_player - Моя отметка - Ещё - Найти в - Показать все - Выберите приложение - ВЫКЛ - ВКЛ - Alt + - Ctrl + - Удалить - Ввод - Fn + - Meta + - Shift + - Пробел - Sym + - Меню + - Введите запрос - Удалить запрос - Поисковый запрос - Поиск - Отправить запрос - Голосовой поиск - Поделиться с помощью - Поделиться с помощью %s - Свернуть - Дополнительная информация - История изменений - Помощь - Настройки - Телепортировать! - Дополнительные параметры - Это приложение создано Protol Lambda (Ссылка удалена, так как он и просил), Участники проекта: @MithrilMania, @flagmaggot, @MeowCat, @MiemieMethod, Manuel", ScrapperBox25, Tcbdxh и многие другие. - -Приложение больше не доступно в Google Play. "Источник для загрузки APK. Текущий активный github репозиторий: github.com/oO0oO0oO0o0o00/blocktopograph Не стесняйтесь ставить звезду или форкать исходный код, помогать с проектом или просто добавлять свою собственную языковую поддержку. Ваш вклад на github приветствуется! Больше информации (включая дорожную карту проекта, список изменений и справочную информацию) можно найти по адресу: blocktopograph.protolambda.com (web archive)". - -Пожалуйста, сделайте резервную копию всех ваших любимых Minecraft миров на случай повреждения данных! -ПРИМЕЧАНИЕ: Minecraft может не загрузить целый мир из-за одного поврежденного фрагмента NBT! - -Это приложение создано и протестировано для Minecraft 1.16.x, 1.15.x, 1.14.x, 1.13.x, 1.12.x, 1.11.x, 1.10.x, 1.9.x(бета-версия), 1.8.x, 1.7.x, 1.6.x, 1.5.x, 1.4.x, 1.2.x, 1.1.x, 1.0.x, 0.16.x, 0.15.x и 0.14.x -Более старые версии MCPE не поддерживаются. - -Blocktopograph не может читать чанки миров созданных в Minecraft версии 1.16.100 и выше. Это означает, что если вы откройте такой мир в Blocktopograph, то его карта будет пустой. - -Начиная с Minecraft 1.18 Mojang изменил путь хранения миров с (/storage/emulated/0/games/com.mojang/minecraftWorlds) на (/storage/emulated/0/Android/data/com.mojang.minecraftpe/files/games/com.mojang/minecraftWorlds), Blocktopograph не может получить доступ к папкам в ...Android/data... из-за ограничений Android 11. Даже если вы укажите путь к файлу level.dat лежащему в этих папках Blocktopograph всë равно не сможет открыть мир. Вы можете: - • Использовать аналогичную программу на ПК или телефоне. - • Отправить миры из недоступной папки в (/storage/emulated/0/games/com.mojang/minecraftWorlds) для этого можно использовать ПК либо проводники способные обойти ограничения Android 11 такие как: ES проводник, Zarchiver, Total Commander и.т.д. Если Android в более новых версиях заблокирует доступ даже этим проводниками, то вы можете найти другой обходной путь либо другой проводник способный обходить это ограничение, либо произвести рутирование своего телефона и тогда у вас будет доступ ко всей ФС. - • Отредактировать APK Minecraft, чтобы заставить его сохранять миры в (/storage/emulated/0/games/com.mojang/minecraftWorlds) или туда куда вы хотите и там где доступ для Blocktopograph не заблокирован. - - - -"предупреждение" -"Это приложение не связано с Mojang AB или Microsoft." -Это не официальное, а фанатское приложение. -Minecraft является торговой маркой Mojang AB. -Пожалуйста, обратите внимание: -• Blocktopograph НЕ ЯВЛЯЕТСЯ ОФИЦИАЛЬНЫМ ПРОДУКТОМ MINECRAFT. НЕ ОДОБРЕН MOJANG И НЕ СВЯЗАН С НИМ. -• ПРИЛОЖЕНИЕ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. - - - "Библиотеки используемыев Blocktopograph:" - • "FloatingActionButton" - • "Tileview, fork by mithrilmania" - • "leveldb-mcpe" - с " android-leveldb, форк от mithrilmania" - -"Исходный код на GitHub:" -"https://github.com/oO0oO0oO0o0o00/blocktopograph" - -" - Версия: %1$s &lt;br/>&lt;br/> Полный список изменений можно найти по адресу (устарел): &lt;a href=https://web.archive.org/web/20200801044719/http://blocktopograph.protolambda.com/changelog> blocktopograph.protolambda.com/changelog (web archive) &lt;/a> - Документацию к приложению можно найти по адресу (страница была удалена, а часть информации устарела, вы можете перейти по ссылке, но попадëте на страницу сохранëнную в web archive): blocktopograph.protolambda.com/help (web archive)". " - Blocktopograph - com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior - Вы хотите закрыть этот мир? - Выполняется автоматическое резервное копирование... - [Авто] - Автоматически удалять резервные копии старше 3 дней (не удаляет, если существует не более 3 резервных копий) - Автоматически создавать резервные копии при каждом открытии мира в Blocktopograph - NBT автономных сущностей - Создание резервных копий и восстановление - Удаление резервной копии - Вы действительно хотите удалить резервную копию? - Это папка резервных копий для этого мира, созданная и управляемая NBT редактором миров Minecraft для Android и средством просмотра карт - Blocktopograph. Пожалуйста, не изменяйте файлы здесь, иначе вы не сможете восстановить эти резервные копии с помощью Blocktopograph. - Выберите биом - NBT данные биомов - Показать биомы - com.google.android.material.bottomsheet.BottomSheetBehavior - Приложение, созданное сообществом Minecraft - Невозможно отредактировать корневой NBT. - Не удается найти запись с таким именем! - Существующие резервные копии - Показать пещеры - Введенные символы %1$d of %2$d - Превышен лимит символов %1$d of %2$d - %1$d / %2$d - Текст чипа - Выбрать саб чанк(0…): - Открытый текст - Буфер обмена пуст! - Ошибка: элемент из буфера обмена уже существует в данном compound теге! - Закрыть - 243c826a-0ebd-4702-b35e-37032f3a8ba5 - Включить - Для работы приложения \"%1$s\" требуется включить сервисы Google Play. - Включите сервисы Google Play - Установить - Для работы приложения \"%1$s\" требуется установить сервисы Google Play. - Установите сервисы Google Play - Доступность сервисов Google Play - Ошибка сервисов Google Play - Приложению \"%1$s\" не удается подключиться к сервисам Google Play. Повторите попытку. - Для работы с приложением \"%1$s\" требуются сервисы Google Play. Они не поддерживаются на вашем устройстве. - Обновить - Чтобы запустить приложение \"%1$s\", обновите сервисы Google Play. - Обновите сервисы Google Play - Сервисы Google Play, необходимые для работы приложения \"%1$s\", в настоящий момент обновляются. - Версия сервисов Google Play устарела. Они автоматически обновятся в ближайшее время. - Открыть на телефоне - Войти - Войти через аккаунт Google - Вы действительно хотите закрыть этот NBT редактор? - Вы хотите закрыть этот мир? - Вы действительно хотите удалить все NBT? - Вы действительно хотите сохранить внесëнные изменения? - Не удалось найти миры! - Создать - Создать отметку на карте - "Ярлыки отметок: - • default_marker, blue_marker, green_marker, red_marker - • Вы можете использовать имена сущностей для ярлыков - • Вы можете использовать имена блоков для ярлыков -" - Создать NBT - После создания мира в Blocktopograph он появится в Minecraft (если Minecraft в этот момент был включен, то его нужно перезапустить). - Создать новую резервную копию - Числовой id биома, по умолчанию 21 - Биом: - " -§cДобро~ пожаловать~ Мяу~ -§rЭтот мир создан программой -§3Blocktopograph - -§1Скачайте в Google Play -§5и редактируйте ваши -§5собственные миры! - -§rДата создания мира: -§d%1$s" - "§r%1$dx §b%2$s -" - "Слои мира: -" - " §r..И больше" - Мяу~ - Мой мир - от_Blocktopograph.txt - "Добро~ пожаловать~ Мяу~ -Этот мир создан программой Blocktopograph, -NBT редактором миров Minecraft для Android. -Скачайте в Google Play или GitHub -и редактируйте ваши собственные миры!" - Слои: - Имя: - Создать плоский мир - Версия: - 1.2.13 - Созданы и сохранены новые NBT данные чанка! - Создание и сохранение новых NBT данных чанка… - Этот тип данных пока не существует для этого блока. Сначала он должен появиться, вы хотите его создать? - Моя отметка - 245780358673-r3au662jj4b7f4ou7j0vses5iqh7vu6i.apps.googleusercontent.com - УДАЛИТЬ! - NBT данные dimension0 - NBT данные dimension1 - NBT данные dimension2 - Добавить вложенный тег - Закрыть это окно - Копировать - Удалить - Добавить слой... - Здесь должен быть хотя бы один слой. - Редактировать - "1. Вы можете менять слои местами перетаскивая их за ярлык. -2. Кликните по любому элементу для начала редактирования. -3. Нажмите кнопку \"+\", чтобы добавить слой. -4. Проведите пальцем влево, чтобы удалить слой." - Количество: - Сумма всех слоев должна быть не менее 0 и не более 127. - Вставить (заменив текущий(е) тег(и)) - Вставить (как вложенный тег) - Переименовать - Добавить NBT - Вставить как вложенный тег - Удалить все NBT - Каждый раз, когда вы открываете мир, Blocktopograph будет создавать новую резервную копию. Это может занять некоторое время и привести к дополнительному использованию памяти. - Включить автоматическое резервное копирование - Данные сущностей в чанке - Миры не найдены. - "Обратите внимание, что более новый Minecraft по умолчанию помещает ваши миры в свои личные данные (доступ без root прав невозможен). По этой причине никакие инструменты не способны получить доступ к мирам. Вам нужно будет настроить Minecraft на использование \"внешнего\" хранилища, перейдя в Minecraft-> Настройки-> Профиль-> Расположение хранилища файлов и измените параметр с \"Приложение\" на \"Внешнее\". После этого вновь созданные миры будут доступны для Blocktopograph, в то время как существующие миры в корневой папке Minecraft не могут быть открыты. Возможно, вы захотите поискать в Google информацию о том, как переместить миры из внешнего хранилища во внутреннее. Для этого можно использовать WorldExporter: https://tikolu.net/world-exporter/ -Инструкция: https://youtu.be/7CsP52xNfTA - -Либо вы можете рутировать телефон и скопировать миры из папки (/data/user/0/com.mojang.minecraftpe/games/com.mojang/minecraftWorlds/) в (/storage/emulated/0/games/com.mojang/minecraftWorlds) с помощью проводников таких как: ES проводник, Zarchiver, Total Commander и.т.д" - Не удалось открыть этот мир Minecraft. Попробуйте перезапустить Blocktopograph и выйти из мира в Minecraft, если он был там открыт. - Ошибка: не удается перезаписать NBT в пустом родительском теге. - Ошибка: не удается перезаписать тег: неподходящий тип родительского NBT. - Ошибка: не удается вставить в качестве вложенного тега: неподходящий тип родительского NBT. - Ошибка: не удается удалить NBT из пустого списка. - Ошибка: не удалось открыть мир. - Ошибка: не удалось открыть сведения мира; потерян трекер мира. - Номер кредитной карты введён некорректно - Неправильный формат ввода - Доменное имя некорректно - Email введён некорректно - Поле не может быть пустым - Неизвестная ошибка. - Ошибка - IP-адрес введён некорректо - Ошибка: этот ключ уже существует в теге compound! - Некорректный ввод имени. - Некорректный ввод имени или фамилии. - Допускаются только цифры. - Допускаются только цифры из разрешённого диапазона - Допускается только стандартный текст - Произошла ошибка при попытке открыть мир - Ошибка: родительский NBT уже содержит этот ключ! - Номер телефона введён некорректно - Это поле не может содержать специальные символы - Интернет-адрес введён некорректно - Показать выпадающее меню - com.google.android.material.transformation.FabTransformationScrimBehavior - com.google.android.material.transformation.FabTransformationSheetBehavior - Не удалось найти игрока. - Не удалось найти спавн. - Не удалось открыть запись игрока из БД. ключ: %1$s - Не удалось телепортировать игрока. - Ошибка: не удалось создать отметку. - Ошибка: не удалось создать/сохранить новые NBT данные чанка. - Ошибка: не удалось выполнить изменение NBT. - Не удалось найти/отредактировать данные ~local_player. - Не удалось загрузить %1$s. - Не удалось прочитать \"%1$s\" из базы данных мира - Не удалось получить данные игрока. - Фильтр отметок - https://rbq2012-blocktopograph-r.firebaseio.com - Показать цвета листвы - dd/MM/yyyy hh:mm a - Выделить область - Убрать выделитель области - Приключения - Креатив - Выживание - 245780358673 - Отменено. - Удалить - Готово. - Не удалось. - Понятно - Игнорировать - Пожалуйста подождите... - Поделиться - Перейти! - Перейти к отметке: - Перейти к координатам - Перейти к ~local_player - Перейти к другому игроку - Перейти к позиции игрока - Перейти к спавну - AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ - 1:245780358673:android:09760b39a1d3e21f - AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ - rbq2012-blocktopograph-r.appspot.com - Продвинутый поисковик... - "Создать полную картину -мира" - Показать карту высот - com.google.android.material.behavior.HideBottomViewOnScrollBehavior - Дать имя резервной копии (это не обязательно) - Введите имя для тега... - Ярлык диалогового окна - Неверное имя ярлыка! - Неверное имя ключа. - Недопустимая координата X для отметки! - Недопустимая координата Y для отметки! - Недопустимая координата Z для отметки! - Введите levelDB ключ... - Показать карту света - Загрузка мира... - Координаты - Отметки - Игроки - Карта измерения - Дважды коснитесь экрана, чтобы открыть меню. - Всë выделенное - Что изменить - Конкретные биомы - Заменить на - Это приведëт к удалению всех фрагментов в пределах выбранной вами области. Позже Minecraft может снова сгенерировать эту область, но ваш прогресс внутри неë будет потерян. Если вы не знаете, что такое чанк в Minecraft, и не понимаете последствий, вам не следует продолжать. Не верьте рандомным онлайн-статьям, только Minecraft WIKI - Продолжить с автоматической настройкой - Выбранная вами область не была выровнена по границам чанков/чанка. Не волнуйтесь, Blocktopograph может подстроиться под вас. Фактическая удаленная область будет немного больше выделенной. Чтобы быть точным, это будет на 0 ~ 15 блоков больше с каждой стороны. Это потому, что область может быть сгенерирована повторно только в том случае, если она была удалена вместе с содержащимися в ней чанками. Если вам не нравится автоматическая настройка, вы можете нажать \"ОТМЕНА\" и изменить выделение самостоятельно. - Изменить биом - Удалить чанки - Факелы с абажурами - Создать картину - Найти и заменить - Это добавит стеклянные абажуры к факелам в выбранной области. Поддерживаются миры Minecraft Bedrock 1.4.x или выше. Мы советуем вам создать резервную копию вашего мира перед любыми изменениями в Blocktopograph. - Массив и под-массив - Под-массив - Под-массив: - Оба - Массив - Массив: - Выбрать - Искать в - "Простой поиск и замену можно выполнить, игнорируя под-массив. - -Начиная с версии Minecraft 1.4.x, под-массивы используются для хранения воды, сосуществующей с другими блоками в одной и той же позиции, однако их можно использовать для размещения любого блока вместо воды. Вы можете использовать эту функцию для размещения 2 разных блоков в одной и той же позиции." - Игнорировать подтипы - Любой - Заменить на - Неизвестная позиция - Вы можете удержать палец на экране для открытия меню и выбрать \"Выделить область\" чтобы начать редактировать область. - Параметры карты - Вы можете масштабировать изображение и сделать его больше. Минимальный масштаб - 1 пиксель на 1 блок. - Выбранная область слишком велика - Выбранная вами область слишком большая. Ширина и высота должны быть в пределах %1$d блоков, и площадь должна быть в пределах %2$d блоков². - "Мир слишком огромный. Вы можете: -(1) Использовать аналогичный инструмент на ПК; -(2) Начать выбор части мира, а не всего целиком и нажать \"Создать картину\" в меню выбора." - Мир слишком огромный - Ширина и высота должны быть не менее 1. - От [ - , - ] - Применить - Функции - Выделенная область - Функции для выделенной области - Диапазон - x - До [ %1$d, %2$d ] (включая от и до) - ВСЕГДА СОЗДАВАЙТЕ РЕЗЕРВНУЮ КОПИЮ, ПРЕЖДЕ ЧЕМ ПРОДОЛЖИТЬ! - Слишком много отметок! - На вашем экране слишком много отметок, например, мобов. Вы можете отключить их отображение, нажав Отображение отметок в маню или настроив фильтр отметок. - Открыть меню - Blocktopograph - %1$s (%2$d, %3$d, %4$d) - Недопустимое имя отметки! - Эта отметка не может быть удалена! - Новое уведомление - Убрать %1$s - %1$d%2$s - Переход к следующему месяцу - Переход к предыдущему месяцу - Текущее выделение: %1$s - brut.androlib.res.data.value.ResReferenceValue@f37859 - brut.androlib.res.data.value.ResReferenceValue@42b8c1e - %1$s - Выбрать дату - Выбранная дата - Колонка дней: %1$s - Неверный формат - Пример: %1$s - Использовать: %1$s - Недопустимый диапазон. - Перейдите к году %1$s - Вне диапазона: %1$s - Первая дата – %1$s - %1$s – последняя дата - %1$s – %2$s - Выберите диапазон дат - Первая дата - последняя дата - Сохранить - Дата - Последняя дата - Первая дата - д - м - г - Переключиться в режим ввода для календаря - Нажмите, чтобы переключиться на выбор дня - Переключиться в режим ввода текста - Нажмите, чтобы переключиться на выбор года - NBT данные игроков - Закрыть меню - Открыть меню - NBT данные чанка - NBT редактор - Функции NBT - Незер - "Пользовательские отметки не были созданы в этом мире! - -Вы можете создать их, долго нажимая на точку на карте, где вы хотите установить отметку, затем нажмите \"Создать отметку на карте\". Затем выберите ярлык отметки и высоту по координате Y. - -После создания отметки на карте она появится в этом списке!" - Нет отметок! - Никакие данные не были отредактированы, нечего сохранять. - Файл/папка не найдены по этому пути! - Файл level.dat не найден! - данные об уровне отсутствуют - Карта недоступна. - Не найдены NBT данные игроков. - Нет доступа на чтение/запись к мирам. - Не удается открыть миры, нет доступа на чтение/запись в хранилище! Попробуйте перезапустить приложение и разрешите доступ на чтение/запись в появившемся окне. - Открыть - Показать NBT данные сущностей в чанке - Показать NBT данные блоков в чанке - Открыть NBT данные игрока - Открыть NBT по имени - Поиск NBT данных в БД - "Приложение опасно, -сделайте резервную копию перед редактированием!" - Открыть мир с пользовательским путем - Основное измерение - NBT основного измерения - Показать пароль - M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z - M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z - M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z - M3.27,4.27 L19.74,20.74 - "В мире есть данные из старой версии Minecraft. Возможно, вы захотите выйти из программы и открыть мир в более новом Minecraft, чтобы данные автоматически обновились. Вы также можете игнорировать эти данные. " - Есть поврежденные или неподдерживаемые данные, пропустить или выйти? - Сгенерировать - Отмена и возврат - Это создало бы картину мира и может привести к сбою. - Ваш мир не может быть распознан через Blocktopograph, возможно, ваша версия игры слишком старая или слишком новая. - Местность не найдена. - Этот Minecraft мир имеет слишком старую версию, поэтому не может быть прочитан. - Предварительный просмотр: - Создание предварительного просмотра... - Анализ - Сохранить - Картина будет сохранена в вашей папке загрузки. - Картина сохранена. - Примерно %1$dx%2$d. - Выберите масштаб: - Поделиться с - Сгенерировать картину мира - Каждый блок будет размером в один пиксель. Если вы выберете меньшую область, то сможете увеличить масштаб изображения. - Выберите блок - Игрок - Координаты: (%1$d, %2$d, %3$d) Измерение: %4$s - "NBT данные незер порталов " - Координаты:(%1$.1f, %2$.1f) чанк:(%3$d, %4$d) - Принять и продолжить - Выход - "Здравствуй друг, - -Для улучшения работы Blocktopograph от вас может потребоваться предоставить нам определенную информацию, включая, но не ограничиваясь, общую информацию об открытых вами мирах Minecraft, включая версии, сиды и статистику, связанную с устройством/ОС, автоматически собираемую Firebase, которая может быть (косвенно) идентифицируемой лично, технически. - -Ссылки на политику конфиденциальности сторонних поставщиков услуг, используемых приложением: -"Сервисы Google Play" -"Firebase Analytics" -"Crashlytics (web archive)" - -Все собранные данные будут обрабатываться только на защищенных сервисах, предоставляемых этими общедоступными поставщиками онлайн услуг. - -Полная политика конфиденциальности доступна по адресу "Политика конфиденциальности Blocktopograph - Политика конфиденциальности - rbq2012-blocktopograph-r - Список миров обновлëн. - Удалить отметку - Переименовать - Переименовать NBT - "Ваш путь: %1$s - - Уже произведен поиск мировых папок в: %2$s" - Восстановить - Восстановление предыдущей резервной копии - Это возвратит вспять все изменения в мире, которые были внесены до создания резервной копии! Вы уверены? Будьте осторожны, это может стереть вашу работу! - Функции для корневого NBT - Карта измерения - Поиск - Поиск отметок… - Выбрать игрока - Выйти из мира - Показать карту - NBT данные ~local_player - Показать слайм чанки - Что-то пошло не так... - %1$s (%2$.1f, %3$.1f, %4$.1f) - %1$s в, (%2$d, %3$d, %4$d) - Спавн - >999 - Укажите путь до файла level.dat - Саб чанк - Ошибка: вставлять тег можно только в теги типа \"compound\" и теги типа \"list\". - Телепортировать игрока в точку которую вы нажали - Игрок телепортирован в (%1$.1f, %2$.1f, %3$.1f) - Игрок телепортирован в: - Эндер мир - Данные блоков в чанке - Мир - Тестовая страница - Мир - Выберите мир - Включить/выключить сетку - Отображение отметок - Извините, что-то пошло не так, и вы не сможете использовать это приложение. Короче говоря, волшебная часть приложения отсутствует. \\nВы приложение (apk-файл) от кого-то другого, кто ранее установил приложение? Затем приложение было оптимизировано только для устройства этого человека, даже если у вас та же модель устройства, оно не будет работать. Попробуйте удалить и переустановить из Google Play Store, возможно, это решит проблему. Вы также можете скачать полную версию приложения с GitHub или из других источников. В этом случае вам также может потребоваться удалить эту версию приложения. Извините за неудобства.\\nЕсли это не та ситуация, то мы понятия не имеем в чëм проблема. - NBT данные деревень - [NetEase] - Повреждëнный мир - NBT данные level.dat - Сид мира: - Путь к файлу: - Режим игры: - Последняя игра: - Имя мира: - Сид мира: - Размер мира: - Этот путь (необязательно с суффиксом /level.dat) не является директорией! - \"%1$s\" некорректный! - X-Ray (показать руды) - From fbac5ad762fc9fd2c35831356c0d7826d64ba671 Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 16:03:53 +0500 Subject: [PATCH 18/20] Add files via upload --- app/src/main/res/values-ru/strings.xml | 516 +++++++++++++++++++++++++ 1 file changed, 516 insertions(+) create mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..640dc22b --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,516 @@ + + + NBT данные ~local_player + Моя отметка + Ещё + Найти в + Показать все + Выберите приложение + ВЫКЛ + ВКЛ + Alt + + Ctrl + + Удалить + Ввод + Fn + + Meta + + Shift + + Пробел + Sym + + Меню + + Введите запрос + Удалить запрос + Поисковый запрос + Поиск + Отправить запрос + Голосовой поиск + Поделиться с помощью + Поделиться с помощью %s + Свернуть + Дополнительная информация + История изменений + Помощь + Настройки + Телепортировать! + Дополнительные параметры + Это приложение создано Protol Lambda (Ссылка удалена, так как он и просил), Участники проекта: @MithrilMania, @flagmaggot, @MeowCat, @MiemieMethod, Manuel", ScrapperBox25, Tcbdxh и многие другие. + +Приложение больше не доступно в Google Play. "Источник для загрузки APK. Текущий активный github репозиторий: github.com/oO0oO0oO0o0o00/blocktopograph Не стесняйтесь ставить звезду или форкать исходный код, помогать с проектом или просто добавлять свою собственную языковую поддержку. Ваш вклад на github приветствуется! Больше информации (включая дорожную карту проекта, список изменений и справочную информацию) можно найти по адресу: blocktopograph.protolambda.com (web archive)". + +Пожалуйста, сделайте резервную копию всех ваших любимых Minecraft миров на случай повреждения данных! +ПРИМЕЧАНИЕ: Minecraft может не загрузить целый мир из-за одного поврежденного фрагмента NBT! + +Это приложение создано и протестировано для Minecraft 1.16.x, 1.15.x, 1.14.x, 1.13.x, 1.12.x, 1.11.x, 1.10.x, 1.9.x(бета-версия), 1.8.x, 1.7.x, 1.6.x, 1.5.x, 1.4.x, 1.2.x, 1.1.x, 1.0.x, 0.16.x, 0.15.x и 0.14.x +Более старые версии MCPE не поддерживаются. + +Blocktopograph не может читать чанки миров созданных в Minecraft версии 1.16.100 и выше. Это означает, что если вы откройте такой мир в Blocktopograph, то его карта будет пустой. + +Начиная с Minecraft 1.18 Mojang изменил путь хранения миров с (/storage/emulated/0/games/com.mojang/minecraftWorlds) на (/storage/emulated/0/Android/data/com.mojang.minecraftpe/files/games/com.mojang/minecraftWorlds), Blocktopograph не может получить доступ к папкам в ...Android/data... из-за ограничений Android 11. Даже если вы укажите путь к файлу level.dat лежащему в этих папках Blocktopograph всë равно не сможет открыть мир. Вы можете: + • Использовать аналогичную программу на ПК или телефоне. + • Отправить миры из недоступной папки в (/storage/emulated/0/games/com.mojang/minecraftWorlds) для этого можно использовать ПК либо проводники способные обойти ограничения Android 11 такие как: ES проводник, Zarchiver, Total Commander и.т.д. Если Android в более новых версиях заблокирует доступ даже этим проводниками, то вы можете найти другой обходной путь либо другой проводник способный обходить это ограничение, либо произвести рутирование своего телефона и тогда у вас будет доступ ко всей ФС. + • Отредактировать APK Minecraft, чтобы заставить его сохранять миры в (/storage/emulated/0/games/com.mojang/minecraftWorlds) или туда куда вы хотите и там где доступ для Blocktopograph не заблокирован. + + + +"предупреждение" +"Это приложение не связано с Mojang AB или Microsoft." +Это не официальное, а фанатское приложение. +Minecraft является торговой маркой Mojang AB. +Пожалуйста, обратите внимание: +• Blocktopograph НЕ ЯВЛЯЕТСЯ ОФИЦИАЛЬНЫМ ПРОДУКТОМ MINECRAFT. НЕ ОДОБРЕН MOJANG И НЕ СВЯЗАН С НИМ. +• ПРИЛОЖЕНИЕ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. + + + "Библиотеки используемыев Blocktopograph:" + • "FloatingActionButton" + • "Tileview, fork by mithrilmania" + • "leveldb-mcpe" + с " android-leveldb, форк от mithrilmania" + +"Исходный код на GitHub:" +"https://github.com/oO0oO0oO0o0o00/blocktopograph" + Перевод на Русский язык выполнил "@Max_RM_" " + Версия: %1$s &lt;br/>&lt;br/> Полный список изменений можно найти по адресу (устарел): &lt;a href=https://web.archive.org/web/20200801044719/http://blocktopograph.protolambda.com/changelog> blocktopograph.protolambda.com/changelog (web archive) &lt;/a> + Документацию к приложению можно найти по адресу (страница была удалена, а часть информации устарела, вы можете перейти по ссылке, но попадëте на страницу сохранëнную в web archive): blocktopograph.protolambda.com/help (web archive)". " + Blocktopograph + com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior + Вы хотите закрыть этот мир? + Выполняется автоматическое резервное копирование... + [Авто] + Автоматически удалять резервные копии старше 3 дней (не удаляет, если существует не более 3 резервных копий) + Автоматически создавать резервные копии при каждом открытии мира в Blocktopograph + NBT автономных сущностей + Создание резервных копий и восстановление + Удаление резервной копии + Вы действительно хотите удалить резервную копию? + Это папка резервных копий для этого мира, созданная и управляемая NBT редактором миров Minecraft для Android и средством просмотра карт - Blocktopograph. Пожалуйста, не изменяйте файлы здесь, иначе вы не сможете восстановить эти резервные копии с помощью Blocktopograph. + Выберите биом + NBT данные биомов + Показать биомы + com.google.android.material.bottomsheet.BottomSheetBehavior + Приложение, созданное сообществом Minecraft + Невозможно отредактировать корневой NBT. + Не удается найти запись с таким именем! + Существующие резервные копии + Показать пещеры + Введенные символы %1$d of %2$d + Превышен лимит символов %1$d of %2$d + %1$d / %2$d + Текст чипа + Выбрать саб чанк(0…): + Открытый текст + Буфер обмена пуст! + Ошибка: элемент из буфера обмена уже существует в данном compound теге! + Закрыть + 243c826a-0ebd-4702-b35e-37032f3a8ba5 + Включить + Для работы приложения \"%1$s\" требуется включить сервисы Google Play. + Включите сервисы Google Play + Установить + Для работы приложения \"%1$s\" требуется установить сервисы Google Play. + Установите сервисы Google Play + Доступность сервисов Google Play + Ошибка сервисов Google Play + Приложению \"%1$s\" не удается подключиться к сервисам Google Play. Повторите попытку. + Для работы с приложением \"%1$s\" требуются сервисы Google Play. Они не поддерживаются на вашем устройстве. + Обновить + Чтобы запустить приложение \"%1$s\", обновите сервисы Google Play. + Обновите сервисы Google Play + Сервисы Google Play, необходимые для работы приложения \"%1$s\", в настоящий момент обновляются. + Версия сервисов Google Play устарела. Они автоматически обновятся в ближайшее время. + Открыть на телефоне + Войти + Войти через аккаунт Google + Вы действительно хотите закрыть этот NBT редактор? + Вы хотите закрыть этот мир? + Вы действительно хотите удалить все NBT? + Вы действительно хотите сохранить внесëнные изменения? + Не удалось найти миры! + Создать + Создать отметку на карте + "Ярлыки отметок: + • default_marker, blue_marker, green_marker, red_marker + • Вы можете использовать имена сущностей для ярлыков + • Вы можете использовать имена блоков для ярлыков +" + Создать NBT + После создания мира в Blocktopograph он появится в Minecraft (если Minecraft в этот момент был включен, то его нужно перезапустить). + Создать новую резервную копию + Числовой id биома, по умолчанию 21 + Биом: + " +§cДобро~ пожаловать~ Мяу~ +§rЭтот мир создан программой +§3Blocktopograph + +§1Скачайте в Google Play +§5и редактируйте ваши +§5собственные миры! + +§rДата создания мира: +§d%1$s" + "§r%1$dx §b%2$s +" + "Слои мира: +" + " §r..И больше" + Мяу~ + Мой мир + от_Blocktopograph.txt + "Добро~ пожаловать~ Мяу~ +Этот мир создан программой Blocktopograph, +NBT редактором миров Minecraft для Android. +Скачайте в Google Play или GitHub +и редактируйте ваши собственные миры!" + Слои: + Имя: + Создать плоский мир + Версия: + 1.2.13 + Созданы и сохранены новые NBT данные чанка! + Создание и сохранение новых NBT данных чанка… + Этот тип данных пока не существует для этого блока. Сначала он должен появиться, вы хотите его создать? + Моя отметка + 245780358673-r3au662jj4b7f4ou7j0vses5iqh7vu6i.apps.googleusercontent.com + УДАЛИТЬ! + NBT данные dimension0 + NBT данные dimension1 + NBT данные dimension2 + Добавить вложенный тег + Закрыть это окно + Копировать + Удалить + Добавить слой... + Здесь должен быть хотя бы один слой. + Редактировать + "1. Вы можете менять слои местами перетаскивая их за ярлык. +2. Кликните по любому элементу для начала редактирования. +3. Нажмите кнопку \"+\", чтобы добавить слой. +4. Проведите пальцем влево, чтобы удалить слой." + Количество: + Сумма всех слоев должна быть не менее 0 и не более 127. + Вставить (заменив текущий(е) тег(и)) + Вставить (как вложенный тег) + Переименовать + Добавить NBT + Вставить как вложенный тег + Удалить все NBT + Каждый раз, когда вы открываете мир, Blocktopograph будет создавать новую резервную копию. Это может занять некоторое время и привести к дополнительному использованию памяти. + Включить автоматическое резервное копирование + Данные сущностей в чанке + Миры не найдены. + "Обратите внимание, что более новый Minecraft по умолчанию помещает ваши миры в свои личные данные (доступ без root прав невозможен). По этой причине никакие инструменты не способны получить доступ к мирам. Вам нужно будет настроить Minecraft на использование \"внешнего\" хранилища, перейдя в Minecraft-> Настройки-> Профиль-> Расположение хранилища файлов и измените параметр с \"Приложение\" на \"Внешнее\". После этого вновь созданные миры будут доступны для Blocktopograph, в то время как существующие миры в корневой папке Minecraft не могут быть открыты. Возможно, вы захотите поискать в Google информацию о том, как переместить миры из внешнего хранилища во внутреннее. Для этого можно использовать WorldExporter: https://tikolu.net/world-exporter/ +Инструкция: https://youtu.be/7CsP52xNfTA + +Либо вы можете рутировать телефон и скопировать миры из папки (/data/user/0/com.mojang.minecraftpe/games/com.mojang/minecraftWorlds/) в (/storage/emulated/0/games/com.mojang/minecraftWorlds) с помощью проводников таких как: ES проводник, Zarchiver, Total Commander и.т.д" + Не удалось открыть этот мир Minecraft. Попробуйте перезапустить Blocktopograph и выйти из мира в Minecraft, если он был там открыт. + Ошибка: не удается перезаписать NBT в пустом родительском теге. + Ошибка: не удается перезаписать тег: неподходящий тип родительского NBT. + Ошибка: не удается вставить в качестве вложенного тега: неподходящий тип родительского NBT. + Ошибка: не удается удалить NBT из пустого списка. + Ошибка: не удалось открыть мир. + Ошибка: не удалось открыть сведения мира; потерян трекер мира. + Номер кредитной карты введён некорректно + Неправильный формат ввода + Доменное имя некорректно + Email введён некорректно + Поле не может быть пустым + Неизвестная ошибка. + Ошибка + IP-адрес введён некорректо + Ошибка: этот ключ уже существует в теге compound! + Некорректный ввод имени. + Некорректный ввод имени или фамилии. + Допускаются только цифры. + Допускаются только цифры из разрешённого диапазона + Допускается только стандартный текст + Произошла ошибка при попытке открыть мир + Ошибка: родительский NBT уже содержит этот ключ! + Номер телефона введён некорректно + Это поле не может содержать специальные символы + Интернет-адрес введён некорректно + Показать выпадающее меню + com.google.android.material.transformation.FabTransformationScrimBehavior + com.google.android.material.transformation.FabTransformationSheetBehavior + Не удалось найти игрока. + Не удалось найти спавн. + Не удалось открыть запись игрока из БД. ключ: %1$s + Не удалось телепортировать игрока. + Ошибка: не удалось создать отметку. + Ошибка: не удалось создать/сохранить новые NBT данные чанка. + Ошибка: не удалось выполнить изменение NBT. + Не удалось найти/отредактировать данные ~local_player. + Не удалось загрузить %1$s. + Не удалось прочитать \"%1$s\" из базы данных мира + Не удалось получить данные игрока. + Фильтр отметок + https://rbq2012-blocktopograph-r.firebaseio.com + Показать цвета листвы + dd/MM/yyyy hh:mm a + Выделить область + Убрать выделитель области + Приключения + Креатив + Выживание + 245780358673 + Отменено. + Удалить + Готово. + Не удалось. + Понятно + Игнорировать + Пожалуйста подождите... + Поделиться + Перейти! + Перейти к отметке: + Перейти к координатам + Перейти к ~local_player + Перейти к другому игроку + Перейти к позиции игрока + Перейти к спавну + AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ + 1:245780358673:android:09760b39a1d3e21f + AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ + rbq2012-blocktopograph-r.appspot.com + Продвинутый поисковик... + "Создать полную картину +мира" + Показать карту высот + com.google.android.material.behavior.HideBottomViewOnScrollBehavior + Дать имя резервной копии (это не обязательно) + Введите имя для тега... + Ярлык диалогового окна + Неверное имя ярлыка! + Неверное имя ключа. + Недопустимая координата X для отметки! + Недопустимая координата Y для отметки! + Недопустимая координата Z для отметки! + Введите levelDB ключ... + Показать карту света + Загрузка мира... + Координаты + Отметки + Игроки + Карта измерения + Дважды коснитесь экрана, чтобы открыть меню. + Всë выделенное + Что изменить + Конкретные биомы + Заменить на + Это приведëт к удалению всех фрагментов в пределах выбранной вами области. Позже Minecraft может снова сгенерировать эту область, но ваш прогресс внутри неë будет потерян. Если вы не знаете, что такое чанк в Minecraft, и не понимаете последствий, вам не следует продолжать. Не верьте рандомным онлайн-статьям, только Minecraft WIKI + Продолжить с автоматической настройкой + Выбранная вами область не была выровнена по границам чанков/чанка. Не волнуйтесь, Blocktopograph может подстроиться под вас. Фактическая удаленная область будет немного больше выделенной. Чтобы быть точным, это будет на 0 ~ 15 блоков больше с каждой стороны. Это потому, что область может быть сгенерирована повторно только в том случае, если она была удалена вместе с содержащимися в ней чанками. Если вам не нравится автоматическая настройка, вы можете нажать \"ОТМЕНА\" и изменить выделение самостоятельно. + Изменить биом + Удалить чанки + Факелы с абажурами + Создать картину + Найти и заменить + Это добавит стеклянные абажуры к факелам в выбранной области. Поддерживаются миры Minecraft Bedrock 1.4.x или выше. Мы советуем вам создать резервную копию вашего мира перед любыми изменениями в Blocktopograph. + Массив и под-массив + Под-массив + Под-массив: + Оба + Массив + Массив: + Выбрать + Искать в + "Простой поиск и замену можно выполнить, игнорируя под-массив. + +Начиная с версии Minecraft 1.4.x, под-массивы используются для хранения воды, сосуществующей с другими блоками в одной и той же позиции, однако их можно использовать для размещения любого блока вместо воды. Вы можете использовать эту функцию для размещения 2 разных блоков в одной и той же позиции." + Игнорировать подтипы + Любой + Заменить на + Неизвестная позиция + Вы можете удержать палец на экране для открытия меню и выбрать \"Выделить область\" чтобы начать редактировать область. + Параметры карты + Вы можете масштабировать изображение и сделать его больше. Минимальный масштаб - 1 пиксель на 1 блок. + Выбранная область слишком велика + Выбранная вами область слишком большая. Ширина и высота должны быть в пределах %1$d блоков, и площадь должна быть в пределах %2$d блоков². + "Мир слишком огромный. Вы можете: +(1) Использовать аналогичный инструмент на ПК; +(2) Начать выбор части мира, а не всего целиком и нажать \"Создать картину\" в меню выбора." + Мир слишком огромный + Ширина и высота должны быть не менее 1. + От [ + , + ] + Применить + Функции + Выделенная область + Функции для выделенной области + Диапазон + x + До [ %1$d, %2$d ] (включая от и до) + ВСЕГДА СОЗДАВАЙТЕ РЕЗЕРВНУЮ КОПИЮ, ПРЕЖДЕ ЧЕМ ПРОДОЛЖИТЬ! + Слишком много отметок! + На вашем экране слишком много отметок, например, мобов. Вы можете отключить их отображение, нажав Отображение отметок в маню или настроив фильтр отметок. + Открыть меню + Blocktopograph + %1$s (%2$d, %3$d, %4$d) + Недопустимое имя отметки! + Эта отметка не может быть удалена! + Новое уведомление + Убрать %1$s + %1$d%2$s + Переход к следующему месяцу + Переход к предыдущему месяцу + Текущее выделение: %1$s + brut.androlib.res.data.value.ResReferenceValue@f37859 + brut.androlib.res.data.value.ResReferenceValue@42b8c1e + %1$s + Выбрать дату + Выбранная дата + Колонка дней: %1$s + Неверный формат + Пример: %1$s + Использовать: %1$s + Недопустимый диапазон. + Перейдите к году %1$s + Вне диапазона: %1$s + Первая дата – %1$s + %1$s – последняя дата + %1$s – %2$s + Выберите диапазон дат + Первая дата - последняя дата + Сохранить + Дата + Последняя дата + Первая дата + д + м + г + Переключиться в режим ввода для календаря + Нажмите, чтобы переключиться на выбор дня + Переключиться в режим ввода текста + Нажмите, чтобы переключиться на выбор года + NBT данные игроков + Закрыть меню + Открыть меню + NBT данные чанка + NBT редактор + Функции NBT + Незер + "Пользовательские отметки не были созданы в этом мире! + +Вы можете создать их, долго нажимая на точку на карте, где вы хотите установить отметку, затем нажмите \"Создать отметку на карте\". Затем выберите ярлык отметки и высоту по координате Y. + +После создания отметки на карте она появится в этом списке!" + Нет отметок! + Никакие данные не были отредактированы, нечего сохранять. + Файл/папка не найдены по этому пути! + Файл level.dat не найден! + данные об уровне отсутствуют + Карта недоступна. + Не найдены NBT данные игроков. + Нет доступа на чтение/запись к мирам. + Не удается открыть миры, нет доступа на чтение/запись в хранилище! Попробуйте перезапустить приложение и разрешите доступ на чтение/запись в появившемся окне. + Открыть + Показать NBT данные сущностей в чанке + Показать NBT данные блоков в чанке + Открыть NBT данные игрока + Открыть NBT по имени + Поиск NBT данных в БД + "Приложение опасно, +сделайте резервную копию перед редактированием!" + Открыть мир с пользовательским путем + Основное измерение + NBT основного измерения + Показать пароль + M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z + M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M3.27,4.27 L19.74,20.74 + "В мире есть данные из старой версии Minecraft. Возможно, вы захотите выйти из программы и открыть мир в более новом Minecraft, чтобы данные автоматически обновились. Вы также можете игнорировать эти данные. " + Есть поврежденные или неподдерживаемые данные, пропустить или выйти? + Сгенерировать + Отмена и возврат + Это создало бы картину мира и может привести к сбою. + Ваш мир не может быть распознан через Blocktopograph, возможно, ваша версия игры слишком старая или слишком новая. + Местность не найдена. + Этот Minecraft мир имеет слишком старую версию, поэтому не может быть прочитан. + Предварительный просмотр: + Создание предварительного просмотра... + Анализ + Сохранить + Картина будет сохранена в вашей папке загрузки. + Картина сохранена. + Примерно %1$dx%2$d. + Выберите масштаб: + Поделиться с + Сгенерировать картину мира + Каждый блок будет размером в один пиксель. Если вы выберете меньшую область, то сможете увеличить масштаб изображения. + Выберите блок + Игрок + Координаты: (%1$d, %2$d, %3$d) Измерение: %4$s + "NBT данные незер порталов " + Координаты:(%1$.1f, %2$.1f) чанк:(%3$d, %4$d) + Принять и продолжить + Выход + "Здравствуй друг, + +Для улучшения работы Blocktopograph от вас может потребоваться предоставить нам определенную информацию, включая, но не ограничиваясь, общую информацию об открытых вами мирах Minecraft, включая версии, сиды и статистику, связанную с устройством/ОС, автоматически собираемую Firebase, которая может быть (косвенно) идентифицируемой лично, технически. + +Ссылки на политику конфиденциальности сторонних поставщиков услуг, используемых приложением: +"Сервисы Google Play" +"Firebase Analytics" +"Crashlytics (web archive)" + +Все собранные данные будут обрабатываться только на защищенных сервисах, предоставляемых этими общедоступными поставщиками онлайн услуг. + +Полная политика конфиденциальности доступна по адресу "Политика конфиденциальности Blocktopograph + Политика конфиденциальности + rbq2012-blocktopograph-r + Список миров обновлëн. + Удалить отметку + Переименовать + Переименовать NBT + "Ваш путь: %1$s + + Уже произведен поиск мировых папок в: %2$s" + Восстановить + Восстановление предыдущей резервной копии + Это возвратит вспять все изменения в мире, которые были внесены до создания резервной копии! Вы уверены? Будьте осторожны, это может стереть вашу работу! + Функции для корневого NBT + Карта измерения + Поиск + Поиск отметок… + Выбрать игрока + Выйти из мира + Показать карту + NBT данные ~local_player + Показать слайм чанки + Что-то пошло не так... + %1$s (%2$.1f, %3$.1f, %4$.1f) + %1$s в, (%2$d, %3$d, %4$d) + Спавн + >999 + Укажите путь до файла level.dat + Саб чанк + Ошибка: вставлять тег можно только в теги типа \"compound\" и теги типа \"list\". + Телепортировать игрока в точку которую вы нажали + Игрок телепортирован в (%1$.1f, %2$.1f, %3$.1f) + Игрок телепортирован в: + Эндер мир + Данные блоков в чанке + Мир + Тестовая страница + Мир + Выберите мир + Включить/выключить сетку + Отображение отметок + Извините, что-то пошло не так, и вы не сможете использовать это приложение. Короче говоря, волшебная часть приложения отсутствует. \\nВы приложение (apk-файл) от кого-то другого, кто ранее установил приложение? Затем приложение было оптимизировано только для устройства этого человека, даже если у вас та же модель устройства, оно не будет работать. Попробуйте удалить и переустановить из Google Play Store, возможно, это решит проблему. Вы также можете скачать полную версию приложения с GitHub или из других источников. В этом случае вам также может потребоваться удалить эту версию приложения. Извините за неудобства.\\nЕсли это не та ситуация, то мы понятия не имеем в чëм проблема. + NBT данные деревень + [NetEase] + Повреждëнный мир + NBT данные level.dat + Сид мира: + Путь к файлу: + Режим игры: + Последняя игра: + Имя мира: + Сид мира: + Размер мира: + Этот путь (необязательно с суффиксом /level.dat) не является директорией! + \"%1$s\" некорректный! + X-Ray (показать руды) + From 84cd2619e0b02ff49c5af66e6878589979fdbe7e Mon Sep 17 00:00:00 2001 From: Max-RM <81485476+Max-RM@users.noreply.github.com> Date: Tue, 17 Jan 2023 16:04:16 +0500 Subject: [PATCH 19/20] Delete 0.txt --- app/src/main/res/values-ru/0.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 app/src/main/res/values-ru/0.txt diff --git a/app/src/main/res/values-ru/0.txt b/app/src/main/res/values-ru/0.txt deleted file mode 100644 index 8b137891..00000000 --- a/app/src/main/res/values-ru/0.txt +++ /dev/null @@ -1 +0,0 @@ - From 41924ff47dceda64fdf9bf7328753fda373c74ba Mon Sep 17 00:00:00 2001 From: oO0oO0oO0o0o00 <10877157+oO0oO0oO0o0o00@users.noreply.github.com> Date: Wed, 25 Jan 2023 22:58:32 +0800 Subject: [PATCH 20/20] Update README.md --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 614074d6..a5ea78ef 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,10 @@ By *Proto Lambda*\(Link removed, as he asked to\), [@MithrilMania](https://githu [@flagmaggot](https://github.com/flagmaggot) and many other community contributors, including translation. This fork is the only one supporting MCPE 1.13+ for now. -## ![translate](https://github.com/Templarian/MaterialDesign/blob/master/svg/web.svg) Help improve translation -[Click here](https://github.com/oO0oO0oO0o0o00/blocktopograph/blob/master/translation.md). +## Redirection +Update is currently paused due to several difficulties (including sections below). The current active fork is now https://github.com/NguyenDuck/blocktopograph -## Update paused -As title. - -Translations and pull requests **will still be processed**, but we encourage you to -take over this project and develope on your own. +Translations and pull requests are encouraged to be made to the active forks instead of this one. ## ![download](https://github.com/Templarian/MaterialDesign/blob/master/svg/download.svg)Download [>>> Download on Google Play <<<](https://play.google.com/store/apps/details?id=rbq2012.blocktopograph)