From 7d4adbb38d349a2fdd390c0479f57f7e4e022f5a Mon Sep 17 00:00:00 2001 From: KhottyManatee55 <67944172+KhottyManatee55@users.noreply.github.com> Date: Wed, 29 Jul 2020 13:57:47 +0300 Subject: [PATCH 01/36] The addition of the Russian translation --- .../resources/assets/create/lang/ru_ru.json | 1664 ++++++++++++----- 1 file changed, 1204 insertions(+), 460 deletions(-) diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index 2f593b992..9e5c3f497 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -1,352 +1,831 @@ { - - "_comment": "-------------------------] GAME ELEMENTS [------------------------------------------------", - "item.create.wand_of_symmetry": "Посох симметрии", - "item.create.handheld_blockzapper": "Портативный размещатель блоков", - "item.create.tree_fertilizer": "Удобрение для деревьев", - "item.create.empty_schematic": "Пустая схема", - "item.create.andesite_alloy_cube": "Андезитовый сплав", - "item.create.blaze_brass_cube": "Огненная латунь", - "item.create.chorus_chrome_cube": "Хром хоруса", - "item.create.chromatic_compound_cube": "Хроматический сплав", - "item.create.shadow_steel_cube": "Теневая сталь", - "item.create.schematic_and_quill": "Схема и перо", - "item.create.schematic": "Схема", - "item.create.belt_connector": "Механическая лента", - "item.create.filter": "Фильтр", - "item.create.rose_quartz": "Розовый Кварц", - "item.create.refined_rose_quartz": "Очищенный розовый кварц", - "item.create.refined_radiance_cube": "Очищенное свечение", - "item.create.iron_sheet": "Железная пластина", - "item.create.gold_sheet": "Золотая пластина", - "item.create.propeller": "Пропеллер", - "item.create.flour": "Пшеничная мука", - "item.create.dough": "Тесто", - - "item.create.blazing_pickaxe": "Кирка из огненной латуни", - "item.create.blazing_shovel": "Лопата из огненной латуни", - "item.create.blazing_axe": "Топор из огненной латуни", - "item.create.blazing_sword": "Длинный меч из огненной латуни", - - "item.create.shadow_steel_pickaxe": "Кирка из теневой стали", - "item.create.shadow_steel_mattock": "Садовая тяпка из теневой стали", - "item.create.shadow_steel_sword": "Меч из теневой стали", - - "item.create.rose_quartz_pickaxe": "Позолоченная кирка из розового кварца", - "item.create.rose_quartz_shovel": "Позолоченная лопата из розового кварца", - "item.create.rose_quartz_axe": "Позолоченный топор из розового кварца", - "item.create.rose_quartz_sword": "Позолоченный клинок из розового кварца", - + "_": "->------------------------] Предметы игры [------------------------<-", + + "block.create.acacia_window": "Акациевое окно", + "block.create.acacia_window_pane": "Панель из акациевого окна", + "block.create.adjustable_crate": "Регулируемый ящик", + "block.create.adjustable_pulley": "Настраиваемый конвейерный привод", + "block.create.adjustable_pulse_repeater": "Регулируемый импульсный повторитель", + "block.create.adjustable_repeater": "Регулируемый повторитель", + "block.create.analog_lever": "Аналоговый рычаг", + "block.create.andesite_bricks": "Андезитовый кирпич", + "block.create.andesite_bricks_slab": "Плита из андезитового кирпича", + "block.create.andesite_bricks_stairs": "Ступени из андезитового кирпича", + "block.create.andesite_bricks_wall": "Стена из андезитового кирпича", + "block.create.andesite_casing": "Андезитовый корпус", + "block.create.andesite_cobblestone": "Андезит-булыжник", + "block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита", + "block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени", + "block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена", + "block.create.andesite_pillar": "Андезитовая колонна", + "block.create.basin": "Чаша", + "block.create.belt": "Конвейер", + "block.create.belt_observer": "Конвейерный сканер", + "block.create.belt_tunnel": "Конвейерный туннель", + "block.create.birch_window": "Берёзовое окно", + "block.create.birch_window_pane": "Панель берёзового окна", + "block.create.brass_block": "Латунный блок", + "block.create.brass_casing": "Латунный корпус", + "block.create.cart_assembler": "Сборщик вагонеток", + "block.create.chiseled_dark_scoria": "Резной тёмный пепел", + "block.create.chiseled_dolomite": "Резной доломит", + "block.create.chiseled_gabbro": "Резной габбро", + "block.create.chiseled_limestone": "Резной известняк", + "block.create.chiseled_scoria": "Резной пепел", + "block.create.chiseled_weathered_limestone": "Выветренный резной известняк", + "block.create.clockwork_bearing": "Часовой механизм", + "block.create.clutch": "Сцепление", "block.create.cogwheel": "Шестерня", - "block.create.large_cogwheel": "Большая шестерня", - "block.create.turntable": "Поворотный стол", - "block.create.gearbox": "Муфта", - "block.create.gearshift": "Реверсивная муфта", - "block.create.clutch": "Переключаемая муфта", - "block.create.shaft": "Вал", - "block.create.encased_belt": "Ленточный привод", - "block.create.encased_shaft": "Вальный привод", - "block.create.encased_fan": "Вентилятор", - "block.create.motor": "Мотор", - "block.create.belt": "Механическая лента", - "block.create.crushing_wheel": "Дробильное колесо", - "block.create.mechanical_drill": "Механический бур", - "block.create.mechanical_harvester": "Механический комбайнер", - "block.create.water_wheel": "Водяное колесо", - "block.create.belt_support": "Ленточная опора", - "block.create.mechanical_press": "Механический пресс", - - "block.create.sticky_mechanical_piston": "Липкий механический поршень", - "block.create.mechanical_piston": "Механический поршень", - "block.create.mechanical_piston_head": "Ствол механического поршня", - "block.create.piston_extension_pole": "Удлинитель поршня", - "block.create.mechanical_bearing": "Механический подшипник", - "block.create.linear_chassis": "Поступательная рама", - "block.create.radial_chassis": "Поворотная рама", - - "block.create.redstone_contact": "Контактное соединение", - "block.create.redstone_link": "Сигнальное соединение", - "block.create.stockpile_switch": "Коммутатор хранилища", - "block.create.adjustable_crate": "Гибкий ящик", - "block.create.extractor": "Экстрактор", - "block.create.funnel": "Ленточная воронка", - "block.create.linked_extractor": "Сигнальный экстрактор", - "block.create.pulse_repeater": "Повторитель импульса", - "block.create.adjustable_repeater": "Настраиваемый повторитель", - "block.create.belt_observer": "Ленточный сканер", - - "block.create.tiled_glass": "Плиточное стекло", - "block.create.tiled_glass_pane": "Плиточная стеклянная панель", - - "block.create.window_in_a_block": "Блок со стеклянной панелью", - "block.create.andesite_bricks": "Андезитовые кирпичи", - "block.create.diorite_bricks": "Диоритовые кирпичи", - "block.create.granite_bricks": "Гранитные кирпичи", - - "block.create.gabbro": "Габбро", - "block.create.gabbro_stairs": "Габбровые ступеньки", - "block.create.gabbro_slab": "Габбровая плита", - "block.create.gabbro_wall": "Габбровая ограда", - "block.create.polished_gabbro": "Полированный габбро", - "block.create.gabbro_bricks": "Габбровые кирпичи", - "block.create.gabbro_bricks_stairs": "Ступеньки из габбрового кирпича", - "block.create.gabbro_bricks_wall": "Ограда из габбрового кирпича", - "block.create.paved_gabbro_bricks": "Мощёный габбровый кирпич", - "block.create.paved_gabbro_bricks_slab": "Плита из мощёного габбрового кирпича", - "block.create.indented_gabbro": "Резная габбровая плитка", - "block.create.indented_gabbro_slab": "Плита из резной габбровой плитки", - "block.create.slightly_mossy_gabbro_bricks": "Замшелые габбровые кирпичи", - "block.create.mossy_gabbro_bricks": "Заросшие габбровые кирпичи", - - "block.create.weathered_limestone": "Обветренный известняк", - "block.create.weathered_limestone_stairs": "Ступеньки из обветренного известняка", - "block.create.weathered_limestone_wall": "Ограда из обветренного известняка", - "block.create.weathered_limestone_slab": "Плита из обветренного известняка", - "block.create.polished_weathered_limestone": "Полированный обветренный известняк", - "block.create.polished_weathered_limestone_slab": "Плита из полированного обветренного известняка", - "block.create.weathered_limestone_bricks": "Кирпичи из обветренного известняка", - "block.create.weathered_limestone_bricks_stairs": "Ступеньки из кирпича из обветренного известняка", - "block.create.weathered_limestone_bricks_wall": "Ограда из кирпича из обветренного известняка", - "block.create.weathered_limestone_bricks_slab": "Плита из кирпича из обветренного известняка", - "block.create.weathered_limestone_pillar": "Колонна из обветренного известняка", - - "block.create.dolomite_pillar": "Доломитовая колонна", + "block.create.copper_block": "Медный блок", + "block.create.copper_casing": "Медный корпус", + "block.create.copper_ore": "Медная руда", + "block.create.copper_shingles": "Медная черепица", + "block.create.creative_crate": "Творческий ящик", + "block.create.creative_motor": "Творческий мотор", + "block.create.crushing_wheel": "Колесо дробления", + "block.create.crushing_wheel_controller": "Контроллер колеса дробления", + "block.create.cuckoo_clock": "Часы с кукушкой", + "block.create.dark_oak_window": "Окно из тёмного дуба", + "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", + "block.create.dark_scoria": "Тёмный пепел", + "block.create.dark_scoria_bricks": "Тёмные пепельный кирпич", + "block.create.dark_scoria_bricks_slab": "Плита из тёмного пепельного кирпича", + "block.create.dark_scoria_bricks_stairs": "Ступени из тёмного пепельного кирпича", + "block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича", + "block.create.dark_scoria_cobblestone": "Ступени из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone_slab": "Плита из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone_stairs": "Ступени из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепел-булыжника", + "block.create.dark_scoria_pillar": "Колонна из тёмного пепел-булыжника", + "block.create.deployer": "Автономный активатор", + "block.create.diorite_bricks": "Диоритовый кирпич", + "block.create.diorite_bricks_slab": "Плита из диоритового кирпича", + "block.create.diorite_bricks_stairs": "Ступени из диоритового кирпича", + "block.create.diorite_bricks_wall": "Стена из диоритового кирпича", + "block.create.diorite_cobblestone": "Диорит-булыжник", + "block.create.diorite_cobblestone_slab": "Плита из диорит-булыжника", + "block.create.diorite_cobblestone_stairs": "Ступени из диорит-булыжника", + "block.create.diorite_cobblestone_wall": "Стена из диорит-булыжника", + "block.create.diorite_pillar": "Диоритовая колонна", "block.create.dolomite": "Доломит", - "block.create.dolomite_stairs": "Доломитовые ступенки", - "block.create.dolomite_wall": "Доломитовая ограда", - "block.create.dolomite_slab": "Доломитовая плита", - "block.create.dolomite_bricks": "Доломитовые кирпичи", - "block.create.dolomite_bricks_wall": "Ограда из доломитового кирпича", - "block.create.dolomite_bricks_stairs": "Ступеньки из доломитового кирпича", + "block.create.dolomite_bricks": "Доломитовый кирпич", "block.create.dolomite_bricks_slab": "Плита из доломитового кирпича", - "block.create.polished_dolomite": "Полированный доломит", - - "block.create.limesand": "Известь", + "block.create.dolomite_bricks_stairs": "Ступени из доломитового кирпича", + "block.create.dolomite_bricks_wall": "Стена из доломитового кирпича", + "block.create.dolomite_cobblestone": "Доломит-булыжник", + "block.create.dolomite_cobblestone_slab": "Плита доломит-булыжника", + "block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника", + "block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника", + "block.create.dolomite_pillar": "Доломитовая колонна", + "block.create.encased_belt": "Конвейерный привод", + "block.create.encased_fan": "Вентилятор в кожухе", + "block.create.encased_shaft": "Вал в кожухе", + "block.create.extractor": "Извлекающее устройство", + "block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич", + "block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича", + "block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича", + "block.create.fancy_andesite_bricks_wall": "Стена из красивого андезитового кирпича", + "block.create.fancy_dark_scoria_bricks": "Красивый тёмный пепельный кирпич", + "block.create.fancy_dark_scoria_bricks_slab": "Плита из красивого тёмного пепельного кирпича", + "block.create.fancy_dark_scoria_bricks_stairs": "Ступени из красивого тёмного пепельного кирпича", + "block.create.fancy_dark_scoria_bricks_wall": "Стена из красивого тёмного пепельного кирпича", + "block.create.fancy_diorite_bricks": "Красивый диоритовый кирпич", + "block.create.fancy_diorite_bricks_slab": "Плита из красивого диоритового кирпича", + "block.create.fancy_diorite_bricks_stairs": "Ступени из красивого диоритового кирпича", + "block.create.fancy_diorite_bricks_wall": "Стена из красивого диоритового кирпича", + "block.create.fancy_dolomite_bricks": "Красивый доломитовый кирпич", + "block.create.fancy_dolomite_bricks_slab": "Плита из красивого доломитового кирпича", + "block.create.fancy_dolomite_bricks_stairs": "Ступени из красивого доломитового кирпича", + "block.create.fancy_dolomite_bricks_wall": "Стена из красивого доломитового кирпича", + "block.create.fancy_gabbro_bricks": "Красивый габбро кирпич", + "block.create.fancy_gabbro_bricks_slab": "Плита из красивого габбро кирпича", + "block.create.fancy_gabbro_bricks_stairs": "Ступени из красивого габбро кирпича", + "block.create.fancy_gabbro_bricks_wall": "Стена из красивого габбро кирпича", + "block.create.fancy_granite_bricks": "Красивый гранитный кирпич", + "block.create.fancy_granite_bricks_slab": "Плита из красивого гранитного кирпича", + "block.create.fancy_granite_bricks_stairs": "Ступени из красивого гранитного кирпича", + "block.create.fancy_granite_bricks_wall": "Стена красивого гранитного кирпича", + "block.create.fancy_limestone_bricks": "Красивый известняковый кирпич", + "block.create.fancy_limestone_bricks_slab": "Плита из красивого известнякового кирпича", + "block.create.fancy_limestone_bricks_stairs": "Ступени из красивого известнякового кирпича", + "block.create.fancy_limestone_bricks_wall": "Стена из красивого известнякового кирпича", + "block.create.fancy_scoria_bricks": "Красивый пепельный кирпич", + "block.create.fancy_scoria_bricks_slab": "Плита из красивого пепельного кирпича", + "block.create.fancy_scoria_bricks_stairs": "Ступени из красивого пепельного кирпича", + "block.create.fancy_scoria_bricks_wall": "Стена из красивого пепельного кирпича", + "block.create.fancy_weathered_limestone_bricks": "Красивый выветренный известняковый кирпич", + "block.create.fancy_weathered_limestone_bricks_slab": "Плита из красивого выветренного известнякового кирпича", + "block.create.fancy_weathered_limestone_bricks_stairs": "Ступени из красивого выветренного известнякового кирпича", + "block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича", + "block.create.flywheel": "Маховик", + "block.create.framed_glass": "Обрамлённое стекло", + "block.create.framed_glass_pane": "Обрамлённая стеклянная панель", + "block.create.funnel": "Воронка", + "block.create.furnace_engine": "Печной двигатель", + "block.create.gabbro": "Габбро", + "block.create.gabbro_bricks": "Габбровый кирпич", + "block.create.gabbro_bricks_slab": "Плита из габбро кирпича", + "block.create.gabbro_bricks_stairs": "Ступени из габбро кирпича", + "block.create.gabbro_bricks_wall": "Стена из габбро кирпича", + "block.create.gabbro_cobblestone": "Габбро-булыжник", + "block.create.gabbro_cobblestone_slab": "Плита из габбро-булыжника", + "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", + "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", + "block.create.gabbro_pillar": "Габбро колонна", + "block.create.gearbox": "Коробка передач", + "block.create.gearshift": "Реверсивный механизм", + "block.create.granite_bricks": "Гранитный кирпич", + "block.create.granite_bricks_slab": "Плита из гранитного кирпича", + "block.create.granite_bricks_stairs": "Ступени из гранитного кирпича", + "block.create.granite_bricks_wall": "Стена из гранитного кирпича", + "block.create.granite_cobblestone": "Гранит-булыжник", + "block.create.granite_cobblestone_slab": "Плита из гранит-булыжника", + "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", + "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", + "block.create.granite_pillar": "Гранитная колонна", + "block.create.hand_crank": "Рукоятка", + "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", + "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", + "block.create.jungle_window": "Окно из тропического дерева", + "block.create.jungle_window_pane": "Панель окна из тропического дерева", + "block.create.large_cogwheel": "Большая шестерня", + "block.create.layered_andesite": "Слоистый андезит", + "block.create.layered_dark_scoria": "Слоистый тёмный пепел", + "block.create.layered_diorite": "Слоистый диорит", + "block.create.layered_dolomite": "Слоистый доломит", + "block.create.layered_gabbro": "Слоистый габбро", + "block.create.layered_granite": "Слоистый гранит", + "block.create.layered_limestone": "Слоистый известняк", + "block.create.layered_scoria": "Слоистый пепел", + "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", + "block.create.limesand": "Известковый песок", "block.create.limestone": "Известняк", - "block.create.limestone_stairs": "Известковые ступеньки", - "block.create.limestone_slab": "Известняковая плита", - "block.create.limestone_wall": "Известняковая ограда", - "block.create.limestone_bricks": "Известковые кирпичи", - "block.create.limestone_bricks_stairs": "Ступеньки из известкового кирпича", - "block.create.limestone_bricks_slab": "Плита из известкового кирпича", - "block.create.limestone_bricks_wall": "Ограда из известкового кирпича", + "block.create.limestone_bricks": "Известняковый кирпич", + "block.create.limestone_bricks_slab": "Плита из известнякового кирпича", + "block.create.limestone_bricks_stairs": "Ступени из известнякового кирпича", + "block.create.limestone_bricks_wall": "Стена из известнякового кирпича", + "block.create.limestone_cobblestone": "Известняк-булыжник", + "block.create.limestone_cobblestone_slab": "Плита из известняк-булыжника", + "block.create.limestone_cobblestone_stairs": "Ступени из известняк-булыжника", + "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", + "block.create.limestone_pillar": "Известковая колонна", + "block.create.linear_chassis": "Линейное шасси", + "block.create.linked_extractor": "Беспроводное извлекающее устройство", + "block.create.linked_transposer": "Беспроводной переместитель", + "block.create.mechanical_bearing": "Механический вращатель", + "block.create.mechanical_crafter": "Механический крафтер", + "block.create.mechanical_drill": "Механическая дрель", + "block.create.mechanical_harvester": "Механический комбайн", + "block.create.mechanical_mixer": "Механический смешиватель", + "block.create.mechanical_piston": "Механический поршень", + "block.create.mechanical_piston_head": "Механическая головка поршня", + "block.create.mechanical_plough": "Механический плуг", + "block.create.mechanical_press": "Механический пресс", + "block.create.mechanical_saw": "Механическая пила", + "block.create.millstone": "Жернов", + "block.create.minecart_anchor": "Вагонеточный якорь", + "block.create.mossy_andesite": "Замшелый андезит", + "block.create.mossy_dark_scoria": "Замшелый тёмный пепел", + "block.create.mossy_diorite": "Замшелый диорит", + "block.create.mossy_dolomite": "Замшелый доломит", + "block.create.mossy_gabbro": "Замшелый габбро", + "block.create.mossy_granite": "Замшелый гранит", + "block.create.mossy_limestone": "Замшелый известняк", + "block.create.mossy_scoria": "Замшелый пепел", + "block.create.mossy_weathered_limestone": "Замшелый выветренный известняк", + "block.create.mysterious_cuckoo_clock": "Часы с кукушкой", + "block.create.natural_scoria": "Натуральный пепел", + "block.create.nixie_tube": "Газоразрядный индикатор", + "block.create.nozzle": "Форсунка", + "block.create.oak_window": "Дубовое окно", + "block.create.oak_window_pane": "Панель из дубового окна", + "block.create.ornate_iron_window": "Украшенное железное окно", + "block.create.ornate_iron_window_pane": "Панель из украшенного железного окна", + "block.create.overgrown_andesite": "Заросший андезит", + "block.create.overgrown_dark_scoria": "Заросший тёмный пепел", + "block.create.overgrown_diorite": "Заросший диорит", + "block.create.overgrown_dolomite": "Заросший доломит", + "block.create.overgrown_gabbro": "Заросший габбро", + "block.create.overgrown_granite": "Заросший гранит", + "block.create.overgrown_limestone": "Заросший известняк", + "block.create.overgrown_scoria": "Заросший пепел", + "block.create.overgrown_weathered_limestone": "Заросший выветренный известняк", + "block.create.paved_andesite": "Мощёный андезит", + "block.create.paved_andesite_slab": "Плита из мощёного андезита", + "block.create.paved_andesite_stairs": "Ступени из мощёного андезита", + "block.create.paved_andesite_wall": "Стена из мощёного андезита", + "block.create.paved_dark_scoria": "Мощёный тёмный пепел", + "block.create.paved_dark_scoria_slab": "Плита из мощёного пепла", + "block.create.paved_dark_scoria_stairs": "Ступени из мощёного пепла", + "block.create.paved_dark_scoria_wall": "Стена из мощёного тёмного пепла", + "block.create.paved_diorite": "Мощёный диорит", + "block.create.paved_diorite_slab": "Плита из мощёного диорита", + "block.create.paved_diorite_stairs": "Ступени из мощёного диорита", + "block.create.paved_diorite_wall": "Стена из мощёного диорита", + "block.create.paved_dolomite": "Мощёный доломит", + "block.create.paved_dolomite_slab": "Плита из мощёного доломита", + "block.create.paved_dolomite_stairs": "Ступени из мощёного доломита", + "block.create.paved_dolomite_wall": "Стена из мощёного доломита", + "block.create.paved_gabbro": "Мощёный габбро", + "block.create.paved_gabbro_slab": "Плита из мощёного габбро", + "block.create.paved_gabbro_stairs": "Ступени из мощёного габбро", + "block.create.paved_gabbro_wall": "Стена из мощёного габбро", + "block.create.paved_granite": "Мощёный гранит", + "block.create.paved_granite_slab": "Плита из мощёного гранита", + "block.create.paved_granite_stairs": "Ступени из мощёного гранита", + "block.create.paved_granite_wall": "Стена из мощёного гранита", + "block.create.paved_limestone": "Мощёный известняк", + "block.create.paved_limestone_slab": "Плита из мощёного известняка", + "block.create.paved_limestone_stairs": "Ступени из мощёного известняка", + "block.create.paved_limestone_wall": "Стена из мощёного известняка", + "block.create.paved_scoria": "Мощёный пепел", + "block.create.paved_scoria_slab": "Плита из мощёного пепла", + "block.create.paved_scoria_stairs": "Ступени из мощёного пепла", + "block.create.paved_scoria_wall": "Стена из мощёного пепла", + "block.create.paved_weathered_limestone": "Мощёный выветренный известняк", + "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", + "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", + "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", + "block.create.piston_extension_pole": "Удлинитель поршня", + "block.create.polished_dark_scoria": "Полированный тёмный пепел", + "block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла", + "block.create.polished_dark_scoria_stairs": "Ступени из полированного тёмного пепла", + "block.create.polished_dark_scoria_wall": "Стена из полированного тёмного пепла", + "block.create.polished_dolomite": "Полированный доломит", + "block.create.polished_dolomite_slab": "Плита из полированного доломита", + "block.create.polished_dolomite_stairs": "Ступени из полированного доломита", + "block.create.polished_dolomite_wall": "Стена из полированного доломита", + "block.create.polished_gabbro": "Полированный габро", + "block.create.polished_gabbro_slab": "Плита из полированного габро", + "block.create.polished_gabbro_stairs": "Ступени из полированного габро", + "block.create.polished_gabbro_wall": "Стена из полированного габро", "block.create.polished_limestone": "Полированный известняк", "block.create.polished_limestone_slab": "Плита из полированного известняка", - "block.create.limestone_pillar": "Известняковая колонна", - - "block.create.schematicannon": "Схемопушка", - "block.create.schematic_table": "Стол для схем", - "block.create.creative_crate": "Креативный ящик", + "block.create.polished_limestone_stairs": "Ступени из полированного известняка", + "block.create.polished_limestone_wall": "Стена из полированного известняка", + "block.create.polished_scoria": "Полированный пепел", + "block.create.polished_scoria_slab": "Плита из полированного пепла", + "block.create.polished_scoria_stairs": "Ступени из полированного пепла", + "block.create.polished_scoria_wall": "Стена из полированного пепла", + "block.create.polished_weathered_limestone": "Полированный выветренный известняк", + "block.create.polished_weathered_limestone_slab": "Плита из полированного выветренного известняка", + "block.create.polished_weathered_limestone_stairs": "Ступени из полированного выветренного известняка", + "block.create.polished_weathered_limestone_wall": "Стена из полированного выветренного известняка", + "block.create.portable_storage_interface": "Портативный интерфейс хранения", + "block.create.powered_latch": "Механизированная защёлка", + "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", + "block.create.pulley_magnet": "Шкивный магнит", + "block.create.pulse_repeater": "Импульсный повторитель", + "block.create.radial_chassis": "Радиальное шасси", + "block.create.redstone_contact": "Контакт сигнала красного камня", + "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", + "block.create.reinforced_rail": "Усиленные рельсы", + "block.create.rope": "Канат", + "block.create.rope_pulley": "Лебёдка", + "block.create.rotation_speed_controller": "Регулятор скорости вращения", + "block.create.schematic_table": "Схематичный стол", + "block.create.schematicannon": "Схематичная пушка", + "block.create.scoria": "Пепел", + "block.create.scoria_bricks": "Пепельный кирпич", + "block.create.scoria_bricks_slab": "Плита из пепельного кирпича", + "block.create.scoria_bricks_stairs": "Ступени из пепельного кирпича", + "block.create.scoria_bricks_wall": "Стена из пепельного кирпича", + "block.create.scoria_cobblestone": "Пепел-булыжник", + "block.create.scoria_cobblestone_slab": "Плита из пепел-булыжника", + "block.create.scoria_cobblestone_stairs": "Ступени из пепел-булыжника", + "block.create.scoria_cobblestone_wall": "Стена из пепел-булыжника", + "block.create.scoria_pillar": "Колонна из пепла", + "block.create.secondary_linear_chassis": "Вторичное линейное шасси", + "block.create.sequenced_gearshift": "Последовательный переключатель передач", + "block.create.shaft": "Вал", + "block.create.speedometer": "Спидометр", + "block.create.spruce_window": "Еловое окно", + "block.create.spruce_window_pane": "Панель из елового окна", + "block.create.sticky_mechanical_piston": "Липкий механический поршень", + "block.create.stockpile_switch": "Настраиваемый компаратор", + "block.create.stressometer": "Динамометр", + "block.create.tiled_glass": "Плиточное стекло", + "block.create.tiled_glass_pane": "Плиточная стеклянная панель", + "block.create.transposer": "Переместитель", + "block.create.turntable": "Поворотный стол", + "block.create.vertical_extractor": "Вертикальное извлекающее устройство", + "block.create.vertical_framed_glass": "Вертикальное обрамлённое стекло", + "block.create.vertical_framed_glass_pane": "Вертикальная обрамлённая стеклянная панель", + "block.create.vertical_funnel": "Вертикальная воронка", + "block.create.vertical_linked_extractor": "Беспроводное вертикальное извлекающее устройство", + "block.create.vertical_linked_transposer": "Вертикальный беспроводной переместитель", + "block.create.vertical_transposer": "Вертикальный переместитель", + "block.create.water_wheel": "Водяное колесо", + "block.create.weathered_limestone": "Выветренный известняк", + "block.create.weathered_limestone_bricks": "Выветренный известняковый кирпич", + "block.create.weathered_limestone_bricks_slab": "Плита из выветренного известнякового кирпича", + "block.create.weathered_limestone_bricks_stairs": "Ступени из выветренного известнякового кирпича", + "block.create.weathered_limestone_bricks_wall": "Стена из выветренного известнякового кирпича", + "block.create.weathered_limestone_cobblestone": "Выветренный известняк-булыжник", + "block.create.weathered_limestone_cobblestone_slab": "Плита из известняк-булыжника", + "block.create.weathered_limestone_cobblestone_stairs": "Ступени из известняк-булыжника", + "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", + "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", + "block.create.zinc_block": "Цинковый блок", + "block.create.zinc_ore": "Цинковая руда", - "block.create.cocoa_log": "Бревно какао-дерева", - - "block.create.shop_shelf": "Витрина", - - "_comment": "-------------------------] UI & MESSAGES [------------------------------------------------", + "entity.create.contraption": "Штуковина", + "entity.create.stationary_contraption": "Стационарная штуковина", + "entity.create.super_glue": "Супер клей", - "death.attack.create.crush": "%1$s был переработан дробильными колёсами", - "death.attack.create.fan_fire": "%1$s сгорел заживо от горячего воздуха.", - "death.attack.create.fan_lava": "%1$s сгорел заживо от лавового вентилятора", - "death.attack.create.mechanical_drill": "%1$s был проколот механическим буром", - - "create.recipe.crushing": "Дробление", - "create.recipe.splashing": "Промывка вентилятором", + "item.create.andesite_alloy": "Андезитовый сплав", + "item.create.attribute_filter": "Фильтр атрибутов", + "item.create.belt_connector": "Механический ремень", + "item.create.brass_hand": "Латунная рука", + "item.create.brass_ingot": "Латунный слиток", + "item.create.brass_nugget": "Кусочек латуни", + "item.create.brass_sheet": "Латунный лист", + "item.create.chromatic_compound": "Хроматический компаунд", + "item.create.copper_ingot": "Медный слиток", + "item.create.copper_nugget": "Кусочек меди", + "item.create.copper_sheet": "Медный лист", + "item.create.crafter_slot_cover": "Крышка на слот крафтера", + "item.create.crushed_brass": "Дробленая латунь", + "item.create.crushed_copper_ore": "Измельчённая медная руда", + "item.create.crushed_gold_ore": "Измельчённая золотая руда", + "item.create.crushed_iron_ore": "Измельчённая железная руда", + "item.create.crushed_zinc_ore": "Измельчённая цинковая руда", + "item.create.deforester": "Уничтожитель леса", + "item.create.dough": "Тесто", + "item.create.electron_tube": "Электронная лампа", + "item.create.empty_schematic": "Пустая схематика", + "item.create.extendo_grip": "Удлинённая рука", + "item.create.filter": "Фильтр", + "item.create.furnace_minecart_contraption": "Печно-вагонеточная штуковина", + "item.create.goggles": "Инженерные очки", + "item.create.golden_sheet": "Золотой лист", + "item.create.handheld_blockzapper": "Ручная блоковая пушка", + "item.create.handheld_worldshaper": "Ручной редактор мира", + "item.create.integrated_circuit": "Интегральная схема", + "item.create.iron_sheet": "Железный лист", + "item.create.lapis_sheet": "Лазуритовый лист", + "item.create.minecart_contraption": "Вагонетка штуковина", + "item.create.polished_rose_quartz": "Полированный розовый кварц", + "item.create.powdered_obsidian": "Порошкообразный обсидиан", + "item.create.propeller": "Пропеллер", + "item.create.red_sand_paper": "Красная наждачная бумага", + "item.create.refined_radiance": "Изысканное сияние", + "item.create.rose_quartz": "Розовый кварц", + "item.create.sand_paper": "Наждачная бумага", + "item.create.schematic": "Схематика", + "item.create.schematic_and_quill": "Схематика и перо", + "item.create.shadow_steel": "Призрачная сталь", + "item.create.super_glue": "Супер клей", + "item.create.tree_fertilizer": "Удобрение для деревьев", + "item.create.vertical_gearbox": "Вертикальная коробка передач", + "item.create.wand_of_symmetry": "Жезл симметрии", + "item.create.wheat_flour": "Пшеничная мука", + "item.create.whisk": "Венчик", + "item.create.wrench": "Гаечный ключ", + "item.create.zinc_ingot": "Цинковый слиток", + "item.create.zinc_nugget": "Кусочек цинка", + + + "_": "->------------------------] Достижения [------------------------<-", + + "advancement.create.root": "Добро пожаловать в Create", + "advancement.create.root.desc": "Пришло время начать строить некоторые удивительные штуковины!", + "advancement.create.andesite_alloy": "Повторение - мать учения", + "advancement.create.andesite_alloy.desc": "Материалы Create имеют странные названия, одно из них - Андезитовый сплав", + "advancement.create.its_alive": "Оно живое!", + "advancement.create.its_alive.desc": "Смастерите ваш первый кинетический компонент вращения.", + "advancement.create.shifting_gears": "Механизм переключения", + "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", + "advancement.create.overstressed": "Перегрузка", + "advancement.create.overstressed.desc": "Испытайте пределы стресса из первых рук.", + "advancement.create.belt": "Передай все это", + "advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.", + "advancement.create.wrench": "Конфигурировать удобно", + "advancement.create.wrench.desc": "Создайте гаечный ключ, чтобы помочь себе в создании изобретений.", + "advancement.create.goggles": "Стресс-о-зрение", + "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации для компонентов.", + "advancement.create.speedometer": "Что действительно быстро?", + "advancement.create.speedometer.desc": "Поставьте и подключите спидометр. Посмотрите на спидометр через очки, чтобы прочитать точное значение.", + "advancement.create.stressometer": "Что действительно сильно?", + "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", + "advancement.create.water_wheel": "Гидравлика", + "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", + "advancement.create.lava_wheel": "Адское колесо", + "advancement.create.lava_wheel.desc": "Это не должно было работать.", + "advancement.create.millstone": "Карманная дробилка", + "advancement.create.millstone.desc": "Поставьте и приведите в действие жернов", + "advancement.create.andesite_casing": "Андезитовый век", + "advancement.create.andesite_casing.desc": "Используйте немного андезитового сплава и дерева для создания корпуса.", + "advancement.create.mechanical_drill": "Стационарные выключатели", + "advancement.create.mechanical_drill.desc": "Установите и приведите в действие механическую дрель", + "advancement.create.press": "Пресс делает «Бонк!'", + "advancement.create.press.desc": "Приведите механический пресс в действие и используйте его для создания пластин.", + "advancement.create.polished_rose_quartz": "Розовый алмаз", + "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет прозрачным.", + "advancement.create.electron_tube": "Бип бип", + "advancement.create.electron_tube.desc": "Сделайте несколько электронных ламп, пригодных для изготовления менее примитивных машин.", + "advancement.create.mechanical_saw": "Стационарная рубка", + "advancement.create.mechanical_saw.desc": "Поставьте и подключите механическую пилу", + "advancement.create.basin": "Операция в чаше", + "advancement.create.basin.desc": "Поставьте чашу и попытайтесь бросить в неё предметы.", + "advancement.create.mixer": "Смешай это", + "advancement.create.mixer.desc": "Поставьте механический смешиватель над чашей, подключите его и начните смешивать некоторые ингредиенты.", + "advancement.create.compact": "Автоматическое уплотнение", + "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", + "advancement.create.expert_lane_1": "Знаток дорожек андезита", + "advancement.create.expert_lane_1.desc": "Работа в процессе", + "advancement.create.brass": "Действительный сплав", + "advancement.create.brass.desc": "Используйте измельчённую медь и измельчённый цинк, чтобы создать немного латуни.", + "advancement.create.brass_casing": "Бронзовый век", + "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", + "advancement.create.copper_casing": "Медный век", + "advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.", + "advancement.create.crafter": "Автоматизированная сборка", + "advancement.create.crafter.desc": "Поставьте и подключите механический крафтер", + "advancement.create.deployer": "Тыкайте, ставьте и атакуйте", + "advancement.create.deployer.desc": "Приведите в действие автономный активатор, идеальное отражение себя.", + "advancement.create.fist_bump": "Брось это, братан!", + "advancement.create.fist_bump.desc": "Сделайте два удара кулаком.", + "advancement.create.crushing_wheel": "Пара гигантов", + "advancement.create.crushing_wheel.desc": "Создайте несколько дробящих колес, чтобы более эффективно разрушать больше материалов.", + "advancement.create.chromatic_compound": "Биполярные минералы", + "advancement.create.chromatic_compound.desc": "Создайте хроматический компаунд", + "advancement.create.shadow_steel": "Возвращение пустоты", + "advancement.create.shadow_steel.desc": "Создайте призрачную сталь, металлический слиток небытия.", + "advancement.create.refined_radiance": "Яркий и вдохновляющий", + "advancement.create.refined_radiance.desc": "Создайте изысканное сияние, мощное хроматическое вещество.", + "advancement.create.zapper": "Строительство со стилем", + "advancement.create.zapper.desc": "Создайте ручную блоковую пушку, которая поможет вам строить.", + "advancement.create.upgraded_zapper": "Сияющий овердрайв", + "advancement.create.upgraded_zapper.desc": "Создайте и активируйте полностью модернизированную ручную блоковую пушку.", + "advancement.create.wand_of_symmetry": "Сияющие зеркала", + "advancement.create.wand_of_symmetry.desc": "Создайте жезл симметрии.", + "advancement.create.deforester": "Лучистая рубка", + "advancement.create.deforester.desc": "Создайте уничтожитель леса и попрощайтесь с местным лесом.", + "advancement.create.extendo_grip": "Кипение!", + "advancement.create.extendo_grip.desc": "Возьмите в руки удлинённую руку", + "advancement.create.dual_extendo_grip": "Окончательное выкипание", + "advancement.create.dual_extendo_grip.desc": "Две удлинённой руки для сверхчеловеческого охвата.", + "advancement.create.eob": "Конец бета-версии", + "advancement.create.eob.desc": "Ожидайте больше контента здесь в будущем. <3", + + + "_": "->------------------------] Пользовательский интерфейс и сообщения [------------------------<-", + + "itemGroup.create.base": "Create: Механизмы", + "itemGroup.create.palettes": "Create: Декор", + + "death.attack.create.crush": "%1$s был обработан колёсами дробления", + "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", + "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", + "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", + "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", + "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", + + "create.block.deployer.damage_source_name": "автономным активатором", + "create.block.cart_assembler.invalid": "Поместите сборщик вагонеток на блок рельс", + + "create.recipe.crushing": "Измельчение", + "create.recipe.milling": "Помол", + "create.recipe.splashing": "Массовое промывание", "create.recipe.splashing.fan": "Вентилятор за проточной водой", - "create.recipe.smoking_via_fan": "Копчение вентилятором", - "create.recipe.smoking_via_fan.fan": "Вентилятор за огнём", - "create.recipe.blasting_via_fan": "Плавление вентилятором", - "create.recipe.blasting_via_fan.fan": "Вентелятор за лавой", - "create.recipe.pressing": "Механический пресс", - "create.recipe.blockzapper_upgrade": "Портативный размещатель блоков", - "create.recipe.processing.chance": "%1$s%% шанс выпадения", - - "create.generic.range": "Зона", + "create.recipe.smoking_via_fan": "Массовое копчение", + "create.recipe.smoking_via_fan.fan": "Вентилятор за огнем", + "create.recipe.blasting_via_fan": "Массовая плавка", + "create.recipe.blasting_via_fan.fan": "Вентилятор за лавой", + "create.recipe.pressing": "Прессование", + "create.recipe.mixing": "Смешивание", + "create.recipe.packing": "Прессование", + "create.recipe.mechanical_sawing": "Механическое распиливание", + "create.recipe.mechanical_crafting": "Механическое создание", + "create.recipe.block_cutting": "Резка блока", + "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", + "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", + "create.recipe.mystery_conversion": "Хроматический метаморфоз", + "create.recipe.processing.catalyst": "Катализатор", + "create.recipe.processing.chance": "%1$s%% шанса", + "create.recipe.processing.chanceToReturn": "%1$s%% шанса вернуть", + + "create.generic.range": "Диапазон", "create.generic.radius": "Радиус", + "create.generic.width": "Ширина", + "create.generic.height": "Высота", + "create.generic.length": "Длина", "create.generic.speed": "Скорость", "create.generic.delay": "Задержка", - "create.generic.unit.ticks": "тик", - "create.generic.unit.seconds": "сек", - "create.generic.unit.minutes": "мин", - - "create.action.scroll": "КолМыши", + "create.generic.unit.ticks": "тиков", + "create.generic.unit.seconds": "секунд", + "create.generic.unit.minutes": "минут", + "create.generic.unit.rpm": "об./мин.", + "create.generic.unit.stress": "Н*м", + "create.generic.unit.degrees": "\u00B0", + + "create.action.scroll": "Прокрутка", "create.action.confirm": "Подтвердить", - "create.action.abort": "Отменить", + "create.action.abort": "Прервать", "create.action.saveToFile": "Сохранить", - "create.action.discard": "Сбросить", - - "create.keyinfo.toolmenu": "Фокусировка меню иструментов", - - "create.gui.scrollInput.defaultTitle": "Выберите:", - "create.gui.scrollInput.scrollToModify": "КолМыши, чтобы изменить", - "create.gui.scrollInput.scrollToSelect": "КолМыши, чтобы выделить", - "create.gui.scrollInput.shiftScrollsFaster": "Зажмите Shift, чтобы прокручивать быстрее", - - "create.gui.toolmenu.focusKey": "Зажмите [%1$s], чтобы сфокусироваться", - "create.gui.toolmenu.cycle": "[КолМыши] , чтобы выбрать", - + "create.action.discard": "Отказаться", + + "create.keyinfo.toolmenu": "Меню инструмента фокусировки", + "create.keyinfo.scrollup": "Имитация движения мыши вверх (в мире)", + "create.keyinfo.scrolldown": "Имитация движения мыши вниз (в мире)", + + "create.gui.scrollInput.defaultTitle": "Выбрать опцию:", + "create.gui.scrollInput.scrollToModify": "Прокрутите, чтобы изменить", + "create.gui.scrollInput.scrollToAdjustAmount": "Прокрутите, чтобы настроить количество", + "create.gui.scrollInput.scrollToSelect": "Прокрутите, чтобы выбрать", + "create.gui.scrollInput.shiftScrollsFaster": "Нажмите Shift для быстрой прокрутки", + "create.gui.toolmenu.focusKey": "Удерживайте [%1$s] для смены задач", + "create.gui.toolmenu.cycle": "[Прокрутка] для переключения", "create.gui.symmetryWand.mirrorType": "Зеркало", "create.gui.symmetryWand.orientation": "Ориентация", - "create.symmetry.mirror.plane": "Линейно", - "create.symmetry.mirror.doublePlane": "Прямоугольно", - "create.symmetry.mirror.triplePlane": "Восьмиугольно", - "create.orientation.orthogonal": "Перпендикулярно", - "create.orientation.diagonal": "Диагонально", - "create.orientation.horizontal": "Горизонтально", - "create.orientation.alongZ": "По оси Z", - "create.orientation.alongX": "По оси X", - - "create.gui.blockzapper.title": "Порт. размещ. блоков", + + "create.symmetry.mirror.plane": "Одинарное", + "create.symmetry.mirror.doublePlane": "Двойное", + "create.symmetry.mirror.triplePlane": "Тройное", + + "create.orientation.orthogonal": "Перпендикуляр.", + "create.orientation.diagonal": "Диагональ.", + "create.orientation.horizontal": "Горизонталь.", + "create.orientation.alongZ": "Вдоль Z", + "create.orientation.alongX": "Вдоль X", + + "create.gui.blockzapper.title": "Ручная блоковая пушка", "create.gui.blockzapper.replaceMode": "Режим замены", - "create.gui.blockzapper.searchDiagonal": "Следовать диагоналям", - "create.gui.blockzapper.searchFuzzy": "Игнорировать материальные границы", - "create.gui.blockzapper.range": "Радиус", - "create.gui.blockzapper.patternSection": "Шаблоны", - "create.gui.blockzapper.pattern.solid": "Сплошной", + "create.gui.blockzapper.searchDiagonal": "Следовать по диагонали", + "create.gui.blockzapper.searchFuzzy": "Игнорировать границы материала", + "create.gui.blockzapper.range": "Диапазон распространения", + "create.gui.blockzapper.needsUpgradedAmplifier": "Требуется модернизированный усилитель", + "create.gui.blockzapper.patternSection": "Шаблон", + "create.gui.blockzapper.pattern.solid": "Всё", "create.gui.blockzapper.pattern.checkered": "Шахматная доска", - "create.gui.blockzapper.pattern.inversecheckered": "Обратная шахматная доска", - "create.gui.blockzapper.pattern.chance25": "25% покрытия", - "create.gui.blockzapper.pattern.chance50": "50% покрытия", - "create.gui.blockzapper.pattern.chance75": "75% покрытия", - - "create.blockzapper.usingBlock": "Материал: %1$s", - "create.blockzapper.componentUpgrades": "Улучшения компонентов:", + "create.gui.blockzapper.pattern.inversecheckered": "Перевернутая шахматная доска", + "create.gui.blockzapper.pattern.chance25": "25% крен", + "create.gui.blockzapper.pattern.chance50": "50% крен", + "create.gui.blockzapper.pattern.chance75": "75% крен", + "create.gui.terrainzapper.title": "Ручной редактор мира", + "create.gui.terrainzapper.placement": "Размещение", + "create.gui.terrainzapper.placement.merged": "Слитый", + "create.gui.terrainzapper.placement.attached": "Прикреплённый", + "create.gui.terrainzapper.placement.inserted": "Вставленный", + "create.gui.terrainzapper.brush": "Обычный", + "create.gui.terrainzapper.brush.cuboid": "Куб", + "create.gui.terrainzapper.brush.sphere": "Сфера", + "create.gui.terrainzapper.brush.cylinder": "Цилиндр", + "create.gui.terrainzapper.tool": "Инструмент", + "create.gui.terrainzapper.tool.fill": "Заполнить", + "create.gui.terrainzapper.tool.place": "Поставить", + "create.gui.terrainzapper.tool.replace": "Заменить", + "create.gui.terrainzapper.tool.clear": "Очистить", + "create.gui.terrainzapper.tool.overlay": "Наложение", + "create.gui.terrainzapper.tool.flatten": "Выравнивание", + + "create.terrainzapper.shiftRightClickToSet": "ПКМ крадясь, чтобы выбрать форму", + + "create.blockzapper.usingBlock": "С помощью: %1$s", + "create.blockzapper.componentUpgrades": "Обновления компонентов:", "create.blockzapper.component.body": "Корпус", "create.blockzapper.component.amplifier": "Усилитель", "create.blockzapper.component.accelerator": "Ускоритель", - "create.blockzapper.component.retriever": "Коллектор", - "create.blockzapper.component.scope": "Прицел", - "create.blockzapper.componentTier.none": "Ничего", - "create.blockzapper.componentTier.blazebrass": "Огненная латунь", - "create.blockzapper.componentTier.choruschrome": "Хром хоруса", - "create.blockzapper.leftClickToSet": "ЛКМ на блок, чтобы выбрать материал", - "create.blockzapper.empty": "Закончились блоки!", - + "create.blockzapper.component.retriever": "Поисковик", + "create.blockzapper.component.scope": "Объем", + "create.blockzapper.componentTier.none": "Нет", + "create.blockzapper.componentTier.brass": "Латунный", + "create.blockzapper.componentTier.chromatic": "Хроматический", + "create.blockzapper.leftClickToSet": "Щелкните ЛКМ по блоку, чтобы выбрать материал", + "create.blockzapper.empty": "Вне блоков!", + + "create.contraptions.movement_mode": "Режим движения", + "create.contraptions.movement_mode.move_place": "Всегда ставить при остановке", + "create.contraptions.movement_mode.move_place_returned": "Ставить только в исходное положение", + "create.contraptions.movement_mode.move_never_place": "Ставить только, когда якорь уничтожен", + "create.contraptions.movement_mode.rotate_place": "Всегда ставить при остановке", + "create.contraptions.movement_mode.rotate_place_returned": "Только место возле начального угла", + "create.contraptions.movement_mode.rotate_never_place": "Только место, когда якорь уничтожен", + "create.contraptions.cart_movement_mode": "Режим движения вагонетки", + "create.contraptions.cart_movement_mode.rotate": "Всегда лицом к движению", + "create.contraptions.cart_movement_mode.rotate_paused": "Пауза во время вращения", + "create.contraptions.cart_movement_mode.rotation_locked": "Блокировка вращения", + "create.logistics.filter": "Фильтр", - "create.logistics.firstFrequency": "Част. #1", - "create.logistics.secondFrequency": "Част. #2", - - "create.gui.adjustable_crate.title": "Гибкий ящик", - "create.gui.adjustable_crate.storageSpace": "Обьём хранилища", - - "create.gui.stockpile_switch.title": "Сенсор хранилища", + "create.logistics.firstFrequency": "Частота #1", + "create.logistics.secondFrequency": "Частота #2", + + "create.gui.goggles.generator_stats": "Статистика генератора:", + "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", + "create.gui.goggles.at_current_speed": "На текущей скорости", + "create.gui.goggles.base_value": "Базовая стоимость", + "create.gui.gauge.info_header": "Калибровочная информация:", + "create.gui.speedometer.title": "Скорость вращения", + "create.gui.stressometer.title": "Сетевой момент", + "create.gui.stressometer.capacity": "Оставшаяся емкость", + "create.gui.stressometer.overstressed": "Перегрузка", + "create.gui.stressometer.no_rotation": "Нет вращения", + "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с_достаточной_ _скоростью_.", + "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _замедлите_ _скорость_ компонентов с высоким _влиянием_ на _момент_.", + "create.gui.adjustable_crate.title": "Регулируемый ящик", + "create.gui.adjustable_crate.storageSpace": "Ёмкость", + "create.gui.stockpile_switch.title": "Настраиваемый компаратор", "create.gui.stockpile_switch.lowerLimit": "Нижний порог", "create.gui.stockpile_switch.upperLimit": "Верхний порог", - "create.gui.stockpile_switch.startAt": "Включить на", - "create.gui.stockpile_switch.startAbove": "Включить выше", - "create.gui.stockpile_switch.stopAt": "Отключить на", - "create.gui.stockpile_switch.stopBelow": "Отключить ниже", - - "create.schematicAndQuill.dimensions": "Размер схемы: %1$sx%2$sx%3$s", + "create.gui.stockpile_switch.startAt": "Старт сигнал на", + "create.gui.stockpile_switch.startAbove": "Старт сигнал выше", + "create.gui.stockpile_switch.stopAt": "Стоп сигнал на", + "create.gui.stockpile_switch.stopBelow": "Стоп сигнал ниже", + "create.gui.sequenced_gearshift.title": "Посл. переключ. передач", + "create.gui.sequenced_gearshift.instruction": "Инструкция", + "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол", + "create.gui.sequenced_gearshift.instruction.turn_distance": "Поршень", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Расстояние", + "create.gui.sequenced_gearshift.instruction.wait": "Перерыв", + "create.gui.sequenced_gearshift.instruction.wait.duration": "Продолжительность", + "create.gui.sequenced_gearshift.instruction.end": "Конец", + "create.gui.sequenced_gearshift.speed": "Скорость, Направление", + "create.gui.sequenced_gearshift.speed.forward": "Скорость ввода, вперед", + "create.gui.sequenced_gearshift.speed.forward_fast": "Двойная скорость, вперед", + "create.gui.sequenced_gearshift.speed.back": "Скорость ввода, реверс", + "create.gui.sequenced_gearshift.speed.back_fast": "Двойная скорость, реверс", + + "create.schematicAndQuill.dimensions": "Размер схематики: %1$sx%2$sx%3$s", "create.schematicAndQuill.firstPos": "Первая позиция установлена.", "create.schematicAndQuill.secondPos": "Вторая позиция установлена.", - "create.schematicAndQuill.noTarget": "Зажмите [Ctrl], чтобы выделять блоки воздуха.", - "create.schematicAndQuill.abort": "Выделение удалено.", - "create.schematicAndQuill.prompt": "Введите название для новой схемы:", - "create.schematicAndQuill.fallbackName": "Моя схема", + "create.schematicAndQuill.noTarget": "Удерживайте [Ctrl], чтобы выбрать воздушные блоки.", + "create.schematicAndQuill.abort": "Выделение убрано", + "create.schematicAndQuill.prompt": "Введите имя для схематики:", + "create.schematicAndQuill.fallbackName": "Моя схематика", "create.schematicAndQuill.saved": "Сохранено как %1$s", - - "create.schematic.invalid": "[!] Недействительный предмет - используйте стол для схем", + + "create.schematic.invalid": "[!] Недопустимый предмет — вместо этого используйте схематичный стол", "create.schematic.position": "Позиция", "create.schematic.rotation": "Вращение", - "create.schematic.rotation.none": "Ничего", - "create.schematic.rotation.cw90": "90° по часовой", - "create.schematic.rotation.cw180": "180° по часовой", - "create.schematic.rotation.cw270": "270° по часовой", - "create.schematic.mirror": "Отразить", - "create.schematic.mirror.none": "Ничего", - "create.schematic.mirror.frontBack": "Перед-зад", - "create.schematic.mirror.leftRight": "Лево-право", - - "create.schematic.tool.deploy": "Разместить", - "create.schematic.tool.move": "Сдвиг по XZ", - "create.schematic.tool.movey": "Сдвиг по Y", - "create.schematic.tool.rotate": "Повернуть", - "create.schematic.tool.print": "Напечатать", - "create.schematic.tool.flip": "Отразить", - - "create.schematic.tool.deploy.description.0": "Размещает конструкцию.", - "create.schematic.tool.deploy.description.1": "ПКМ на земле для размещения.", - "create.schematic.tool.deploy.description.2": "Зажмите [Ctrl] для перемещения на фикс. дистанции.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-КолМыши для изменения дистанции.", - "create.schematic.tool.move.description.0": "Сдвигает схему по горизонтали", - "create.schematic.tool.move.description.1": "Смотрите на схему и [CTRL]-КолМыши для сдвига.", + "create.schematic.rotation.none": "Нет", + "create.schematic.rotation.cw90": "По час. стрелке 90", + "create.schematic.rotation.cw180": "По час. стрелке 180", + "create.schematic.rotation.cw270": "По час. стрелке 270", + "create.schematic.mirror": "Зеркало", + "create.schematic.mirror.none": "Нет", + "create.schematic.mirror.frontBack": "Спереди-сзади", + "create.schematic.mirror.leftRight": "Влево-вправо", + "create.schematic.tool.deploy": "Развернуть", + "create.schematic.tool.move": "Подвинуть XZ", + "create.schematic.tool.movey": "Подвинуть Y", + "create.schematic.tool.rotate": "Вращать", + "create.schematic.tool.print": "Печать", + "create.schematic.tool.flip": "Перевернуть", + "create.schematic.tool.deploy.description.0": "Перемещает структуру в локации.", + "create.schematic.tool.deploy.description.1": "Щелкните ПКМ на земле, чтобы разместить.", + "create.schematic.tool.deploy.description.2": "Удерживайте [Ctrl], чтобы выбрать фиксированное расстояние.", + "create.schematic.tool.deploy.description.3": "[Ctrl] и прокрутка, чтобы изменить расстояние.", + "create.schematic.tool.move.description.0": "Сдвинуть схему по горизонтали.", + "create.schematic.tool.move.description.1": "Наведите курсор на схему и нажмите [CTRL] и прокрутка, чтобы нажать на нее.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", - "create.schematic.tool.movey.description.0": "Сдвигает схему по вертикали", - "create.schematic.tool.movey.description.1": "[CTRL]-КолМыши для сдвига вверх/вниз", + "create.schematic.tool.movey.description.0": "Сдвигает схему по вертикали.", + "create.schematic.tool.movey.description.1": "[CTRL] и прокрутка - переместить вверх/вниз.", "create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.3": "", - "create.schematic.tool.rotate.description.0": "Вращает схему вокруг центра.", - "create.schematic.tool.rotate.description.1": "[CTRL]-КолМыши для поворота на 90°", + "create.schematic.tool.rotate.description.0": "Вращает схематику вокруг ее центра.", + "create.schematic.tool.rotate.description.1": "[CTRL] и прокрутка вращать на 90 градусов.", "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", - "create.schematic.tool.print.description.0": "Моментально размещает структуру в мире", - "create.schematic.tool.print.description.1": "[ПКМ] для размещения в текущем месте.", - "create.schematic.tool.print.description.2": "Только для креативного режима.", + "create.schematic.tool.print.description.0": "Мгновенно размещает структуру в мире.", + "create.schematic.tool.print.description.1": "[ПКМ], чтобы подтвердить размещение в текущем местоположении.", + "create.schematic.tool.print.description.2": "Этот инструмент предназначен только для творческого режима.", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "Отражает схему вдоль выбранной стороны.", - "create.schematic.tool.flip.description.1": "Смотрите на схему и [CTRL]-КолМыши для отражения.", + "create.schematic.tool.flip.description.0": "Переверните схему вдоль выбранного лица.", + "create.schematic.tool.flip.description.1": "Наведите курсор на схему и [CTRL] + прокрутка, чтобы перевернуть ее.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", - - "create.schematics.synchronizing": "Синхронизация...", - "create.schematics.uploadTooLarge": "Схема слишком большая", - "create.schematics.maxAllowedSize": "Максимальный размер файла схемы:", - - "create.gui.schematicTable.title": "Стол для схем", + + "create.schematics.synchronizing": "Синхронизация..", + "create.schematics.uploadTooLarge": "Ваша схематика слишком велика.", + "create.schematics.maxAllowedSize": "Максимально допустимый размер файла:", + + "create.gui.schematicTable.title": "Схематичный стол", "create.gui.schematicTable.availableSchematics": "Доступные схемы", - "create.gui.schematicTable.noSchematics": "Нет сохранённых схем", - "create.gui.schematicTable.uploading": "Загрузка...", + "create.gui.schematicTable.noSchematics": "Схемы не сохранены", + "create.gui.schematicTable.uploading": "Загрузка ...", "create.gui.schematicTable.finished": "Загрузка завершена!", - - "create.gui.schematicannon.title": "Схемопушка", - "create.gui.schematicannon.settingsTitle": "Параметры размещения", - "create.gui.schematicannon.listPrinter": "Распечатать список материалов", - "create.gui.schematicannon.gunpowderLevel": "Порох: %1$s%%", + "create.gui.schematicannon.title": "Схематичная пушка", + "create.gui.schematicannon.settingsTitle": "Настройки размещения", + "create.gui.schematicannon.listPrinter": "Список материалов", + "create.gui.schematicannon.gunpowderLevel": "Порох на %1$s%%", "create.gui.schematicannon.shotsRemaining": "Выстрелов осталось: %1$s", - "create.gui.schematicannon.shotsRemainingWithBackup": "C запасом: %1$s", - "create.gui.schematicannon.optionEnabled": "Включена", - "create.gui.schematicannon.optionDisabled": "Отключена", + "create.gui.schematicannon.shotsRemainingWithBackup": "С резервной копией: %1$s", + "create.gui.schematicannon.optionEnabled": "В настоящее время включен", + "create.gui.schematicannon.optionDisabled": "В настоящее время отключен", "create.gui.schematicannon.option.dontReplaceSolid": "Не заменять целые блоки", "create.gui.schematicannon.option.replaceWithSolid": "Заменять целые блоки целыми блоками", "create.gui.schematicannon.option.replaceWithAny": "Заменять целые блоки чем угодно", "create.gui.schematicannon.option.replaceWithEmpty": "Заменять целые блоки пустотой", "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", - "create.gui.schematicannon.option.skipTileEntities": "Защита от сущностей", - - "create.gui.schematicannon.option.skipMissing.description": "Если схемопушка не найдёт нужный блок, то она продолжит в следующем месте.", - "create.gui.schematicannon.option.skipTileEntities.description": "Схемопушка будет избегать замены блоков с данными, например сундуки.", - "create.gui.schematicannon.option.dontReplaceSolid.description": "Схемопушка никогда не заменит целые блоки, только не целые и воздух.", - "create.gui.schematicannon.option.replaceWithSolid.description": "Схемопушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", - "create.gui.schematicannon.option.replaceWithAny.description": "Схемопушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", - "create.gui.schematicannon.option.replaceWithEmpty.description": "Схемопушка отчистит все блоки, включая замену на воздух.", - + "create.gui.schematicannon.option.skipTileEntities": "Защитить имущество", + "create.gui.schematicannon.option.skipMissing.description": "Если пушка не может найти требуемый блок, она будет строить в следующем месте.", + "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения данных, такие как сундуки.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Пушка никогда не заменит целые блоки, только не целые и воздух.", + "create.gui.schematicannon.option.replaceWithSolid.description": "Пушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", + "create.gui.schematicannon.option.replaceWithAny.description": "Пушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Пушка отчистит все блоки, включая замену на воздух.", + "create.schematicannon.status.idle": "Бездействует", "create.schematicannon.status.ready": "Готова", "create.schematicannon.status.running": "Работает", "create.schematicannon.status.finished": "Закончила", "create.schematicannon.status.paused": "Приостановлена", "create.schematicannon.status.stopped": "Остановлена", - "create.schematicannon.status.noGunpowder": "Кончился порох", - "create.schematicannon.status.targetNotLoaded": "Блок не загружен", + "create.schematicannon.status.noGunpowder": "Требуется порох", + "create.schematicannon.status.targetNotLoaded": "Цель не загружена", "create.schematicannon.status.targetOutsideRange": "Цель слишком далеко", "create.schematicannon.status.searching": "Поиск", "create.schematicannon.status.skipping": "Пропуск", - "create.schematicannon.status.missingBlock": "Нет блока:", - "create.schematicannon.status.placing": "Размещение", - "create.schematicannon.status.clearing": "Отчистка", - "create.schematicannon.status.schematicInvalid": "Схема недействительна", - "create.schematicannon.status.schematicNotPlaced": "Схема не размещена", + "create.schematicannon.status.missingBlock": "Требует блок:", + "create.schematicannon.status.placing": "Стройка", + "create.schematicannon.status.clearing": "Очистка", + "create.schematicannon.status.schematicInvalid": "Неверная схема", + "create.schematicannon.status.schematicNotPlaced": "Схема не загружена", "create.schematicannon.status.schematicExpired": "Срок действия файла схемы истек", - - "create.tooltip.holdKey": "Зажмите [%1$s]", - "create.tooltip.holdKeyOrKey": "Зажмите [%1$s] или [%2$s]", + + "create.gui.filter.blacklist": "Чёрный список", + "create.gui.filter.blacklist.description": "Предметы проходят, если они не соответствуют ни одному из вышеперечисленных. Пустой черный список принимает все.", + "create.gui.filter.whitelist": "Белый список", + "create.gui.filter.whitelist.description": "Предметы проходят, если они соответствуют любому из вышеперечисленных. Пустой белый список отвергает все.", + "create.gui.filter.respect_data": "Использование данных", + "create.gui.filter.respect_data.description": "Предметы совпадают только в том случае, если их прочность, чары и другие атрибуты совпадают.", + "create.gui.filter.ignore_data": "Игнорирование данных", + "create.gui.filter.ignore_data.description": "Предметы совпадают независимо от их атрибутов.", + + "create.item_attributes.placeable": "можно разместить", + "create.item_attributes.consumable": "можно съесть", + "create.item_attributes.smeltable": "можно расплавить", + "create.item_attributes.washable": "можно промыть", + "create.item_attributes.smokable": "можно коптить", + "create.item_attributes.blastable": "плавится в доменной печи", + "create.item_attributes.enchanted": "зачарован", + "create.item_attributes.damaged": "повреждён", + "create.item_attributes.badly_damaged": "сильно повреждён", + "create.item_attributes.not_stackable": "не может складываться", + "create.item_attributes.equipable": "может быть надет", + "create.item_attributes.furnace_fuel": "это топливо", + "create.item_attributes.in_tag": "помечен %1$s", + "create.item_attributes.in_item_group": "принадлежит %1$s", + "create.item_attributes.added_by": "был добавлен %1$s", + + "create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны", + "create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:", + "create.gui.attribute_filter.whitelist_disjunctive": "Белый список (любой)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "Предметы проходят, если у них есть какой-либо из выбранных атрибутов.", + "create.gui.attribute_filter.whitelist_conjunctive": "Белый список (все)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "Предметы проходят, только если они имеют ВСЕ выбранные атрибуты.", + "create.gui.attribute_filter.blacklist": "Чёрный список", + "create.gui.attribute_filter.blacklist.description": "Предметы проходят, если они НЕ имеют ни одного из выбранных атрибутов.", + "create.gui.attribute_filter.add_reference_item": "Добавить предмет", + + "create.tooltip.holdKey": "Удерживайте [%1$s]", + "create.tooltip.holdKeyOrKey": "Удерживайте [%1$s] или [%2$s]", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", - - "_comment": "-------------------------] ITEM DESCRIPTIONS [------------------------------------------------", - + "create.tooltip.speedRequirement": "Требование к скорости: %1$s", + "create.tooltip.speedRequirement.none": "Нет", + "create.tooltip.speedRequirement.medium": "Умеренная", + "create.tooltip.speedRequirement.high": "Быстрая", + "create.tooltip.stressImpact": "Требование к моменту: %1$s", + "create.tooltip.stressImpact.low": "Низкий", + "create.tooltip.stressImpact.medium": "Средний", + "create.tooltip.stressImpact.high": "Высокий", + "create.tooltip.stressImpact.overstressed": "Перегрузка", + "create.tooltip.capacityProvided": "Ёмкостный момент: %1$s", + "create.tooltip.capacityProvided.low": "Маленький", + "create.tooltip.capacityProvided.medium": "Средний", + "create.tooltip.capacityProvided.high": "Большой", + "create.tooltip.capacityProvided.asGenerator": "(Как генератор)", + "create.tooltip.generationSpeed": "Создаёт %1$s %2$s", + "create.tooltip.analogStrength": "Аналоговая сила: %1$s/15", + + "create.mechanical_mixer.min_ingredients": "Минимум ингредиентов", + + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Тики сервера в настоящее время замедлены на %s мс :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Тики сервера теперь замедлены на %s мс >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Тики сервера вернулись к в норму :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: используйте /killtps stop , чтобы вернуть тик сервера на обычную скорость", + "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", + "create.command.killTPSCommand.argument.tickTime": "Время тика", + + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", + "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.mechanical_press_activation": "Механический пресс активирован", + "create.subtitle.mechanical_press_item_break": "Лязг металла", + "create.subtitle.blockzapper_place": "Блок запрыгивает на место", + "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.blockzapper_deny": "Тихий буп", + "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", + + + "_": "->------------------------] Описание предметов [------------------------<-", + "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", "item.create.example_item.tooltip.summary": "A brief description of the item. _Underscores_ highlight a term.", "item.create.example_item.tooltip.condition1": "When this", @@ -354,8 +833,8 @@ "item.create.example_item.tooltip.condition2": "And When this", "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", "item.create.example_item.tooltip.control1": "When Ctrl pressed", - "item.create.example_item.tooltip.action1": "These controls are displayed.", - + "item.create.example_item.tooltip.action1": "These controls are displayed.", + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", "item.create.wand_of_symmetry.tooltip.condition1": "На панели быстрого доступа", @@ -365,8 +844,8 @@ "item.create.wand_of_symmetry.tooltip.control2": "ПКМ в воздух", "item.create.wand_of_symmetry.tooltip.action2": "_Убирает_ зеркало", "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадясь", - "item.create.wand_of_symmetry.tooltip.action3": "Открывает _Меню_ _настройки_", - + "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", "item.create.handheld_blockzapper.tooltip.summary": "Новейшее устройство для размещения или замены блоков на расстоянии.", "item.create.handheld_blockzapper.tooltip.control1": "ЛКМ на блок", @@ -374,235 +853,500 @@ "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадясь", - "item.create.handheld_blockzapper.tooltip.action3": "Открывает _Меню_ _настройки_", - + "item.create.handheld_blockzapper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", + + "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "Удобный инструмент для создания _ландшафтов_ и _рельефа_ _местности_.", + "item.create.handheld_worldshaper.tooltip.control1": "ЛКМ на блок", + "item.create.handheld_worldshaper.tooltip.action1": "Устанавливает блоки, помещенные инструментом, в целевой блок.", + "item.create.handheld_worldshaper.tooltip.control2": "ПКМ на блок", + "item.create.handheld_worldshaper.tooltip.action2": "Применяет выбранную _кисть_ и _инструмент_ в выбранном месте.", + "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_worldshaper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", - "item.create.tree_fertilizer.tooltip.summary": "Сильная смесь минералов, подходящая обычным видам деревьев.", + "item.create.tree_fertilizer.tooltip.summary": "Мощная комбинация минералов подходит для ускорения роста распространенных типов деревьев.", "item.create.tree_fertilizer.tooltip.condition1": "При использовании на саженце", - "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья независимо от свободного пространства", - - "block.create.cocoa_log.tooltip": "COCOA LOG", - "block.create.cocoa_log.tooltip.summary": "Улучшенное бревно тропического дерева для упрощения авто фермы _Какао-бобов._", - "block.create.cocoa_log.tooltip.condition1": "Когда вырастет", - "block.create.cocoa_log.tooltip.behaviour1": "Выращивает _Какао-бобы_ со всех сторон", - + "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья,_независимо_ от _условий_ _их_ _расположения_", + + "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip.summary": "_Уничтожитель_ _леса_, способен рубить деревья за доли секунды.", + + "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "Бойоиоинг! Значительно _увеличивает_ _досягаемость_ владельца.", + "item.create.extendo_grip.tooltip.condition1": "Находясь в другой руке", + "item.create.extendo_grip.tooltip.behaviour1": "Увеличьте _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", + + "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip.summary": "Управляет_ _выходами_ и входами логистических устройств с _большей_ _точностью_, _сопоставляя_ их со _списком_ _предметов_ или несколькими _вложенными_ _фильтрами_.", + "item.create.filter.tooltip.condition1": "Когда в слоте фильтра", + "item.create.filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", + "item.create.filter.tooltip.condition2": "При ПКМ", + "item.create.filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", + + "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "_Управляет_ _выходами_ и _входами_ логистических устройств с _большей_ _точностью_, сопоставляя их с набором _атрибутов_ и _категорий предметов_.", + "item.create.attribute_filter.tooltip.condition1": "Когда в слоте фильтра", + "item.create.attribute_filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", + "item.create.attribute_filter.tooltip.condition2": "ПКМ", + "item.create.attribute_filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", + "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", - "item.create.empty_schematic.tooltip.summary": "Используется для крафта и записи в _Столе_ _для_ _схем._", - + "item.create.empty_schematic.tooltip.summary": "Используется в качестве ингредиента рецепта и для записи в _Схематичный столе_", + "item.create.schematic.tooltip": "SCHEMATIC", - "item.create.schematic.tooltip.summary": "Хранит структуру для размещения. Расположите голограмму и используйте _Схемопушку_ для построения голограммы.", - "item.create.schematic.tooltip.condition1": "Когда в руке", - "item.create.schematic.tooltip.behaviour1": "Может быть размещена с помошью инструментов на экране", + "item.create.schematic.tooltip.summary": "Содержит структуру, которая будет позиционироваться и помещаться в мир. Расположите голограмму по своему усмотрению и используйте _схематичную пушку_ для ее построения.", + "item.create.schematic.tooltip.condition1": "При удерживании", + "item.create.schematic.tooltip.behaviour1": "Может быть позиционирован с помощью инструментов на экране.", "item.create.schematic.tooltip.control1": "ПКМ крадясь", - "item.create.schematic.tooltip.action1": "Открывает _Меню_ для ввода точных _Координат._", - + "item.create.schematic.tooltip.action1": "Открывает _интерфейс_ для ввода _точных_ _координат_.", + "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", - "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в .nbt файл.", + "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в вашем мире в файл .nbt.", "item.create.schematic_and_quill.tooltip.condition1": "Шаг 1", - "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две точки с помощью ПКМ", + "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две угловые точки, используя ПКМ.", "item.create.schematic_and_quill.tooltip.condition2": "Шаг 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-КолМыши_ на сторону для изменения размера. ПКМ еще раз для сохранения.", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl_ и _прокрутка_ на голограмме для изменения размера. Нажмите ПКМ, чтобы сохранить.", "item.create.schematic_and_quill.tooltip.control1": "ПКМ", - "item.create.schematic_and_quill.tooltip.action1": "Выбрать точку / Сохранить", - "item.create.schematic_and_quill.tooltip.control2": "С зажатым Ctrl", - "item.create.schematic_and_quill.tooltip.action2": "Выбрать точки в _воздухе._ _КолМыши_ для изменения расстояния.", + "item.create.schematic_and_quill.tooltip.action1": "Выберите угловые точки / подтвердите сохранение.", + "item.create.schematic_and_quill.tooltip.control2": "Удержание Ctrl", + "item.create.schematic_and_quill.tooltip.action2": "Выберите точки в воздухе. Прокрутка для настройки расстояния.", "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадясь", - "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _Удаляет_ выделение.", - - "block.create.creative_crate.tooltip": "CREATIVE CRATE", - "block.create.creative_crate.tooltip.summary": "Снабжает _Схемопушку_ бесконечным запасом блоков", - + "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _удаляет_ выделение.", + "block.create.schematicannon.tooltip": "SCHEMATICANNON", - "block.create.schematicannon.tooltip.summary": "Стреляет блоками для воссоздания размещенной _Схемы._ Использует блоки из соседних инвентарей и _Порох_ в качестве топлива.", - "block.create.schematicannon.tooltip.control1": "ПКМ по пушке", - "block.create.schematicannon.tooltip.action1": "Открывает _Меню_", - + "block.create.schematicannon.tooltip.summary": "_Ставит блоки_ для воссоздания _схематики_ в мире. Использует предметы из _соседнего_ _инвентаря_ и _порох_ в качестве _топлива_.", + "block.create.schematicannon.tooltip.control1": "ПКМ", + "block.create.schematicannon.tooltip.action1": "Открывает _интерфейс_", + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", - "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схемы на _Пустые_ _схемы._", - "block.create.schematic_table.tooltip.condition1": "Если положить пустую схему.", - "block.create.schematic_table.tooltip.behaviour1": "Записывает выбранный файл из папки со схемами", - + "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схематики в _пустые_ _схематики_.", + "block.create.schematic_table.tooltip.condition1": "Когда дана пустая схема", + "block.create.schematic_table.tooltip.behaviour1": "Загружает выбранный файл из вашей папки Schematics.", + "block.create.shaft.tooltip": "SHAFT", "block.create.shaft.tooltip.summary": "_Передаёт_ _вращение_ по прямой.", - + "block.create.cogwheel.tooltip": "COGWHEEL", - "block.create.cogwheel.tooltip.summary": "_Передаёт_ _вращение_ по прямой и к присоеденённым _Шестерням._", + "block.create.cogwheel.tooltip.summary": "_Передаёт_ _вращение_ по прямой и к присоединённым _шестерням._", "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", - "block.create.large_cogwheel.tooltip.summary": "Увеличенная версия _Шестерни,_ позволяющая _изменять_ _скорость_ _вращения_ при соединении с меньшим аналогом.", - + "block.create.large_cogwheel.tooltip.summary": "_Увеличенная_ _версия_ _шестерни_, позволяющая изменять _скорость_ _вращения_ при подключении к _меньшей_ _шестерне_.", + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", "block.create.encased_shaft.tooltip.summary": "_Передаёт_ _вращение_ по прямой. Подходит для передачи вращения через стены.", "block.create.gearbox.tooltip": "GEARBOX", "block.create.gearbox.tooltip.summary": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.", - + + "item.create.vertical_gearbox.tooltip": " VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.", + "block.create.gearshift.tooltip": "GEARSHIFT", - "block.create.gearshift.tooltip.summary": "_Переключатель_ _вращения_ для подсоединенных валов.", - "block.create.gearshift.tooltip.condition1": "Когда запитан", - "block.create.gearshift.tooltip.behaviour1": "_Реверсирует_ выходящее _вращение._", - + "block.create.gearshift.tooltip.summary": "_Управляет_ _направлением_ _вращения_ для соединенных валов.", + "block.create.gearshift.tooltip.condition1": "Когда приведён в действие", + "block.create.gearshift.tooltip.behaviour1": "_Изменяет_ исходящее вращение.", + "block.create.clutch.tooltip": "CLUTCH", - "block.create.clutch.tooltip.summary": "_Переключатель_ _вращения_ для подсоединенных валов.", - "block.create.clutch.tooltip.condition1": "Когда запитан", - "block.create.clutch.tooltip.behaviour1": "_Останавливает_ подачу вращения на другую сторону.", - + "block.create.clutch.tooltip.summary": "_Управляет_ _включением_/_выключением вращения для соединенных валов.", + "block.create.clutch.tooltip.condition1": "Когда приведён в действие", + "block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.", + "block.create.encased_belt.tooltip": "ENCASED_BELT", - "block.create.encased_belt.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоеденённому _Ленточному_ _приводу._", - "block.create.encased_belt.tooltip.condition1": "При присоеденёнии к другому Ленточному приводу", - "block.create.encased_belt.tooltip.behaviour1": "Присоеденённый блок будет иметь те же _скорость_ и _направление_ _вращения._ Присоеденённые ленты не обязаны смотреть в ту же сторону.", - + "block.create.encased_belt.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоединённому конвейерному приводу.", + "block.create.encased_belt.tooltip.condition1": "Когда подключён", + "block.create.encased_belt.tooltip.behaviour1": "Прикреплённые блоки будут иметь одинаковую скорость вращения и направление. Присоединённые приводы не обязаны смотреть в ту же сторону.", + + "block.create.adjustable_pulley.tooltip": "ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоединённому конвейерному приводу. При подаче _аналогового_ _сигнала_ _красного_ _камня_ привод будет вращаться _в_ _2_ _раза_ _быстрее_.", + "block.create.adjustable_pulley.tooltip.condition1": "Управление сигналом красивого камня", + "block.create.adjustable_pulley.tooltip.behaviour1": "_Без_ сигнала он _не_ ускорит работу подключённых приводов. При _полной_ _мощности_ сигнала, _скорость_ _удваивается_.", + "item.create.belt_connector.tooltip": "BELT CONNECTOR", - "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _Механической_ _ленты._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _Конвейер_ для _Существ._", + "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", "item.create.belt_connector.tooltip.control1": "ПКМ по валу", - "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива ленты. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению ленты.", + "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива конвейера. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению конвейера.", "item.create.belt_connector.tooltip.control2": "ПКМ крадясь", - "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для ленты.", - - "block.create.belt_support.tooltip": "BELT SUPPORT", - "block.create.belt_support.tooltip.summary": "_Исключительно_ _декоративный_ блок, пригодный для монтажа _Механических_ _лент_ к земле.", - "block.create.belt_support.tooltip.condition1": "При размещении под лентой", - "block.create.belt_support.tooltip.behaviour1": "Поддерживает верхнюю часть ремня, скрывая нижнюю.", - - "block.create.motor.tooltip": "MOTOR", - "block.create.motor.tooltip.summary": "Настраиваемый источник _силы_ _вращения_", + "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для конвейера.", + "item.create.belt_connector.tooltip.control3": "Крадясь на конвейере", + "item.create.belt_connector.tooltip.action3": "Вы не будете двигаться.", + + "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip.summary": "Очки для улучшения зрения с помощью полезной кинетической информации.", + "item.create.goggles.tooltip.condition1": "При ношении", + "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также воздействию момента и мощности отдельных компонентов.", + "item.create.goggles.tooltip.condition2": "При взгляде на датчик", + "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или моменте сети, к которой подключён датчик.", + + "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", + "item.create.wrench.tooltip.control1": "ПКМ по кинетическому блоку", + "item.create.wrench.tooltip.action1": "_Поворачивает_ _компонент_ с которым вы взаимодействуете _к_ _лицу_ или _от_ _лица_.", + "item.create.wrench.tooltip.control2": "ПКМ крадясь", + "item.create.wrench.tooltip.action2": "Разбирает кинетические компоненты и помещает их обратно в ваш инвентарь.", + + "block.create.creative_motor.tooltip": "CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "Настраиваемый источник вращательной силы.", "block.create.water_wheel.tooltip": "WATER WHEEL", "block.create.water_wheel.tooltip.summary": "Предоставляет _силу_ _вращения_ из смежных _источников_ _воды._", "block.create.encased_fan.tooltip": "ENCASED FAN", - "block.create.encased_fan.tooltip.summary": "Преобразовывает _силу_ _вращения_ в _воздушный_ _поток_ и обратно. Имеет множество применений.", - "block.create.encased_fan.tooltip.condition1": "При нахождении над огнём", - "block.create.encased_fan.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ (должен стоять вертикально)", + "block.create.encased_fan.tooltip.summary": "_Преобразует_ _вращательную_ _силу_ в _воздушные_ _потоки_ и обратно. Имеет множество применений.", + "block.create.encased_fan.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.encased_fan.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ от любых _источников_ _тепла_, непосредственно под собой. Вентилятор должен быть обращен вниз.", "block.create.encased_fan.tooltip.condition2": "При вращении", - "block.create.encased_fan.tooltip.behaviour2": "_Толкает_ существ с одной стороны, _притягивает_ с другой. Сила и скорость зависят от входящего вращения.", - "block.create.encased_fan.tooltip.condition3": "Когда воздух проходит через специальные блоки", - "block.create.encased_fan.tooltip.behaviour3": "Обрабатывает предметы перед блоком: _вода_ моет, _огонь_ коптит, _лава_ плавит.", + "block.create.encased_fan.tooltip.behaviour2": "Толкает или вытягивает объекты в зависимости от направления вращения.", + "block.create.encased_fan.tooltip.condition3": "При продувке через специальные блоки", + "block.create.encased_fan.tooltip.behaviour3": "_Жидкости_ и _частицы_ _огня_ выбрасываются в _воздушный_ _поток_. Это может быть использовано для _обработки_ _предметов_.", + + "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip.summary": "Прикрепите к передней части _вентилятора_, чтобы распределить его влияние на сущностей _во_ _всех_ _направлениях_.", + + "block.create.hand_crank.tooltip": "HAND CRANK", + "block.create.hand_crank.tooltip.summary": "Простой _источник_ _вращательной_ _силы_, требующий взаимодействия игроков.", + "block.create.hand_crank.tooltip.condition1": "При использовании", + "block.create.hand_crank.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ прикреплённому приспособлению. Крадитесь, чтобы повернуть вращение вспять.", + + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "_Прекрасное_ _мастерство_ для _украшения_ пространства и _отслеживания_ _времени_.", + "block.create.cuckoo_clock.tooltip.condition1": "При вращении", + "block.create.cuckoo_clock.tooltip.behaviour1": "Показывает текущее время и напевает мелодию два раза в день. _Активируется_ _один_ _раз_ в _полдень_ и в _сумерках_, как только _игроки_ _могут_ _спать_.", "block.create.turntable.tooltip": "TURNTABLE", "block.create.turntable.tooltip.summary": "Преобразует _силу_ _вращения_ прямиком в морскую болезнь.", + "block.create.millstone.tooltip": "MILLSTONE", + "block.create.millstone.tooltip.summary": "Кинетический компонент, подходящий для _измельчения_ вставленных _материалов_. Может быть приведён в действие шестернёй или соединенён с валом внизу. Результаты должны быть извлечены из компонента.", + "block.create.millstone.tooltip.condition1": "При вращении", + "block.create.millstone.tooltip.behaviour1": "Начинает применять рецепты дробления к любым предметам, вставленным сбоку или сверху блока.", + "block.create.millstone.tooltip.condition2": "При ПКМ", + "block.create.millstone.tooltip.behaviour2": "Измельчённые материалы следует извлекать вручную.", + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", - "block.create.crushing_wheel.tooltip.summary": "Большие вращающиеся колеса, которые _дробят_ всё, что мешает их движению.", - "block.create.crushing_wheel.tooltip.condition1": "При присоеденении к другому дробильному колесу", - "block.create.crushing_wheel.tooltip.behaviour1": "Формирует дробильную установку для обработки различных вещей. Зубцы колёс должны соединяться и двигаться с _одинаковой_ _скоростью_ в _противоположных_ _направлениях._", + "block.create.crushing_wheel.tooltip.summary": "Большие вращающиеся колёса, которые _ломают_ _всё_ что угодно.", + "block.create.crushing_wheel.tooltip.condition1": "При присоединении к другому колесу дробления", + "block.create.crushing_wheel.tooltip.behaviour1": "Образует дробильную машину для обработки самых разных вещей. Зубья колёс должны _соединяться_ и _двигаться_ с _одинаковой_ _скоростью_ в _противоположных_ _направлениях_.", "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", - "block.create.mechanical_press.tooltip.summary": "Мощный поршень для спрессовывания предметов под ним. Требуется постоянная _сила_ _вращения._", - "block.create.mechanical_press.tooltip.condition1": "Когда запитан", - "block.create.mechanical_press.tooltip.behaviour1": "_Начинает_ спрессовывать предметы под ним.", - "block.create.mechanical_press.tooltip.condition2": "При нахождении над механической лентой", - "block.create.mechanical_press.tooltip.behaviour2": "_Автоматически_ спрессовывает проходящие по ленте предметы.", - + "block.create.mechanical_press.tooltip.summary": "Силовой поршень для сжатия предметов под ним. Требуется _постоянная_ _вращательная_ _сила_.", + "block.create.mechanical_press.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.mechanical_press.tooltip.behaviour1": "_Начинает_ сжимать предметы, упавшие под него.", + "block.create.mechanical_press.tooltip.condition2": "Когда над конвейером", + "block.create.mechanical_press.tooltip.behaviour2": "_Автоматически_ спрессовывает проходящие по конвейеру предметы.", + "block.create.mechanical_press.tooltip.condition3": "Когда над чашей", + "block.create.mechanical_press.tooltip.behaviour3": "Начинает _компактировать_ _предметы_ в чаше, когда присутствуют все необходимые ингредиенты.", + + "block.create.basin.tooltip": "BASIN", + "block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.", + + "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "Рельсы, которые не нуждаются в поддержке.", + + "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", + "block.create.mechanical_mixer.tooltip.summary": "Кинетический венчик, используемый для смешивания предметов, находящихся под ним. Требуется _постоянная_ _вращательная_ _сила_ и _чаша_, расположенная внизу (с промежутком между ними).", + "block.create.mechanical_mixer.tooltip.condition1": "Когда над чашей", + "block.create.mechanical_mixer.tooltip.behaviour1": "Начинает смешивать предметы в бассейне, когда присутствуют все необходимые ингредиенты.", + "block.create.mechanical_mixer.tooltip.condition2": "При использовании с гаечным ключом", + "block.create.mechanical_mixer.tooltip.behaviour2": "_Настраивает_ _минимальное_ _количество_ _общих_ _ингредиентов_ для применяемых рецептов. Используйте эту опцию, чтобы исключить _нежелательные рецепты_ с аналогичными, но с _меньшим_ _количеством_ ингредиентов.", + + "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "_Кинетический_ _сборщик_ для автоматизации любого рецепта крафта. _Поместите_ _ингредиенты_ в сетку, _соответственно_ _нужному_ _рецепту_, и расположите их так, чтобы _создать_ _поток_, который _кончается_ на одном из крафтеров.", + "block.create.mechanical_crafter.tooltip.condition1": "При вращении", + "block.create.mechanical_crafter.tooltip.behaviour1": "Начинает процесс изготовления, как только _всем_ _крафтерам_ _в_ _сетке_ _даётся_ _предмет_.", + "block.create.mechanical_crafter.tooltip.condition2": "При подаче сигнала красного камня", + "block.create.mechanical_crafter.tooltip.behaviour2": "Вызывает начало процесса крафта со всеми заданными в данный момент предметами в сетке.", + "block.create.mechanical_crafter.tooltip.control1": "Когда вывернут наизнанку спереди", + "block.create.mechanical_crafter.tooltip.action1": "_Зацикливает_ _направление_, в котором отдельный крафтер перемещает свои предметы. Чтобы сформировать рабочую сетку, расположите крафтеры в потоке, который перемещает все предметы к конечному кратеру. Конечный должен указывать в сторону от сетки.", + "block.create.mechanical_crafter.tooltip.control2": "Когда вывернут на спину", + "block.create.mechanical_crafter.tooltip.action2": "_Подключает_ _входной_ _инвентарь_ соседних крафтеров. Используйте это, чтобы объединить слоты в сетке крафта и сэкономить на вызоде.", + + "block.create.furnace_engine.tooltip": "FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "_Мощный_ источник _энергии_ _вращения_, для работы которого требуется _работающая_ _печь.", + "block.create.furnace_engine.tooltip.condition1": "Когда прикреплен к работающей печи", + "block.create.furnace_engine.tooltip.behaviour1": "_Начинает_ _приводить_ _в_ _действие_ _маховик_, расположенный _перед_ ним (на расстоянии 1 м). Используйте доменную печь для более высоких скоростей.", + + "block.create.flywheel.tooltip": "FLYWHEEL", + "block.create.flywheel.tooltip.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90\u00B0_ друг к другу.", + "block.create.flywheel.tooltip.condition1": "При подключении к работающему двигателю", + "block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.", + + "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов в и из _конструкции_, перемещаемой поршнем, шасси, вагонеткой или конвейром.", + "block.create.portable_storage_interface.tooltip.condition1": "Во время движения", + "block.create.portable_storage_interface.tooltip.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.", + + "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "_Настраиваемое_ _реле_, способное _ускорять_ или _замедлять_ скорость до любой желаемой.", + "block.create.rotation_speed_controller.tooltip.condition1": "Когда прикреплено к большой шестерне", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Передаёт поступающее вращательное усилие на шестерню, пытаясь соответствовать скорости, на которую оно настроено. Шестерня должна быть прикреплена к верхней части контроллера.", + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", - "block.create.mechanical_piston.tooltip.summary": "Более продвинутая версия _Поршня,_ использующая _силу_ _вращения_ для более точного перемещения присоединенных конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без удлинителей поршень не будет двигаться. Используйте _Поступательную_ _раму_ для перемещения более чем одной линии блоков.", + "block.create.mechanical_piston.tooltip.summary": "Более продвинутая версия _поршня_. Он использует _силу_ _вращения_ для _точного_ перемещения прикреплённых конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без _удлинителей_ поршень _не_ будет двигаться. Используйте блоки _шасси_ или _слизи_, чтобы перемещать _более_ одной линии блоков.", "block.create.mechanical_piston.tooltip.condition1": "При вращении", - "block.create.mechanical_piston.tooltip.behaviour1": "Начинает перемещать прикрепленную конструкцию. Скорость и направление зависят от входящего вращения.", - + "block.create.mechanical_piston.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", + "block.create.sticky_mechanical_piston.tooltip": "STICKY MECHANICAL PISTON", - "block.create.sticky_mechanical_piston.tooltip.summary": "Более продвинутая версия _Липкого_ _поршня,_ использующая _силу_ _вращения_ для более точного перемещения присоединенных конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без удлинителей поршень не будет двигаться. Используйте _Поступательную_ _раму_ для перемещения более чем одной линии блоков.", + "block.create.sticky_mechanical_piston.tooltip.summary": "Более продвинутая версия _липкого_ _поршня_. Он использует _силу_ _вращения_ для _точного_ перемещения прикреплённых конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без _удлинителей_ поршень _не_ будет двигаться. Используйте блоки _шасси_ или _слизи_, чтобы перемещать _более_ одной линии блоков.", "block.create.sticky_mechanical_piston.tooltip.condition1": "При вращении", - "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Начинает перемещать прикрепленную конструкцию. Скорость и направление зависят от входящего вращения.", - + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", + "block.create.piston_extension_pole.tooltip": "PISTON POLE", - "block.create.piston_extension_pole.tooltip.summary": "Используется для увеличения длины _Механического_ _поршня._", - "block.create.piston_extension_pole.tooltip.condition1": "При присоеденении к механическому поршню", - "block.create.piston_extension_pole.tooltip.behaviour1": "Увеличивает длину поршня на 1 блок", - + "block.create.piston_extension_pole.tooltip.summary": "Используется для увеличения длины _механического_ _поршня_.", + "block.create.piston_extension_pole.tooltip.condition1": "При присоединении к механическому поршню", + "block.create.piston_extension_pole.tooltip.behaviour1": "Расширяет диапазон поршня на 1 блок", + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", - "block.create.mechanical_bearing.tooltip.summary": "Используется для вращения _больших_ конструкций_ или генерации _силы_ _вращения_ с помощью ветра.", + "block.create.mechanical_bearing.tooltip.summary": "Используется для _вращения_ _больших_ _конструкций_ или генерации _силы_ _вращения_ с помощью ветра.", "block.create.mechanical_bearing.tooltip.condition1": "При вращении", - "block.create.mechanical_bearing.tooltip.behaviour1": "Начинает вращать присоединенную _Поворотную_ _раму_ и связанные с ним блоки.", - "block.create.mechanical_bearing.tooltip.condition2": "Когда запитан", - "block.create.mechanical_bearing.tooltip.behaviour2": "Начинает предоставлять _силу_ _вращения_ из вращения присоединенной конструкции. Структура должна включать подходящий _парус_ (в настоящее время любой блок шерсти).", - + "block.create.mechanical_bearing.tooltip.behaviour1": "Начинает вращение прикреплённых блоков. Используйте блоки шасси или слизи, чтобы перемещать более одного блока.", + "block.create.mechanical_bearing.tooltip.condition2": "При подаче сигнала красного камня", + "block.create.mechanical_bearing.tooltip.behaviour2": "Обеспечивает вращательную силу, создаваемую вращением прикреплённой структуры. Структура должна включать подходящие _парусные_ _блоки_ (в настоящее время любой шерстяной блок).", + + "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "Усовершенствованная версия _радиального_ _шасси_ для вращения _до_ _двух_ стрелок в соответствии с текущим _игровым_ _временем_.", + "block.create.clockwork_bearing.tooltip.condition1": "При вращении", + "block.create.clockwork_bearing.tooltip.behaviour1": "Начинает вращать прикреплённую структуру в направлении _текущего_ _часа_. Если независимая _вторая_ _структура_ существует _перед_ первой, она будет служить _минутной_ _стрелкой_.", + + "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "_Программируемый_ компонент, который может _изменять_ свою _скорость_ вращения в соответствии с _5_ _последовательными_ _инструкциями._ Используйте это для питания _радиального_ _шасси_, _поршней_ или _конвейров_ с большим контролем _времени_ и _скорости_. Может стать менее точным на более высоких скоростях.", + "block.create.sequenced_gearshift.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.sequenced_gearshift.tooltip.behaviour1": "Начинает выполнять _запрограммированные_ _инструкции_ на основе _скорости_ ввода.", + "block.create.sequenced_gearshift.tooltip.condition2": "При ПКМ", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Открывается _интерфейс_ _конфигурации_.", + + "block.create.cart_assembler.tooltip": "CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "При _размещении_ _над_ _рельсами_ принимает функциональные возможности и _собирает/разбирает_ конструкции на _вагонетках_.", + "block.create.cart_assembler.tooltip.condition1": "При размещении над рельсами", + "block.create.cart_assembler.tooltip.behaviour1": "По умолчанию _разбирает_ _вагонетки_, _при_ _подаче_ _сигнала_ красного камня _собирает-.", + "block.create.cart_assembler.tooltip.condition2": "При размещении над энергорельсами", + "block.create.cart_assembler.tooltip.behaviour2": "_Собирает_ и _ускоряет_ вагонетки _при_ _сигнале_ красного камня, в противном случае _разбирает_ и _удерживает_ их.", + "block.create.cart_assembler.tooltip.condition3": "При размещении над рельсами с датчиком", + "block.create.cart_assembler.tooltip.behaviour3": "_Собирает_ _разобранные_ вагонетки, _разбирает_ _собранные_ вагонетки.", + "block.create.cart_assembler.tooltip.condition4": "При размещении над активирующими рельсами", + "block.create.cart_assembler.tooltip.behaviour4": "_Разбирает_ _тележки_ _при_ сигнале_ красного камня.", + + "block.create.rope_pulley.tooltip": "ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "Перемещает прикреплённые _блоки_ и _конструкции_ по _вертикали_. Используйте блоки _шасси_ или _слизи_, чтобы перемещать более одного блока.", + "block.create.rope_pulley.tooltip.condition1": "При вращении", + "block.create.rope_pulley.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", + "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", - "block.create.linear_chassis.tooltip.summary": "Настраиваемая основа для конструкций, перемещаемых _Механическим_ _поршнем._ Эти блоки должны формировать первый слой блоков перед поршнем.", - "block.create.linear_chassis.tooltip.condition1": "При движении механическим поршнем", - "block.create.linear_chassis.tooltip.behaviour1": "_Перемещает_ все _прикрепленные_ _рамы_ с одинаковой ориентацией, и блоки перед ним. При возврате поршня в исходное положение блоки будут втягиваться, только если лицевая сторона рамы _липкая_ (см. [Ctrl]).", - "block.create.linear_chassis.tooltip.control1": "ПКМ со сгустком слизи", - "block.create.linear_chassis.tooltip.action1": "Делает выбранную сторону _липкой._ При возвращении поршня, рама будет _втягивать_ все подсоединенные блоки в своей колонне и в пределах заданного диапазона.", - + "block.create.linear_chassis.tooltip.summary": "Настраиваемый базовый блок, соединяющий конструкции для перемещения.", + "block.create.linear_chassis.tooltip.condition1": "При движении", + "block.create.linear_chassis.tooltip.behaviour1": "_Перемещает_ все _подключённые_ _шасси_ с _одинаковой_ ориентацией, а также _столбец_ _блоков_ в пределах своего _диапазона_. Блоки будут вытягиваться только в том случае, если лицевая сторона шасси липкая (см. [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "Используя гаечный ключ", + "block.create.linear_chassis.tooltip.behaviour2": "Настройте диапазон для этого блока шасси. Удерживайте CTRL, чтобы изменить диапазон всех подключённых блоков шасси.", + "block.create.linear_chassis.tooltip.control1": "ПКМ сгустком слизи", + "block.create.linear_chassis.tooltip.action1": "Делает нужную сторону липкой. При перемещении шасси будет тянуть прикреплённые блоки независимо от направления движения.", + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", - "block.create.radial_chassis.tooltip.summary": "Требуется для вращающихся конструкций с _Механическим_ _подшипником._", - "block.create.radial_chassis.tooltip.condition1": "При вращении с помощью подшипника", - "block.create.radial_chassis.tooltip.behaviour1": "_Поворачивает_ все блоки, прикрепленные к _липким_ сторонам (см. [Ctrl]) в пределах заданного диапазона вокруг себя. _Передает_ вращение на присоединенные поворотные рамы.", - "block.create.radial_chassis.tooltip.control1": "ПКМ со сгустком слизи", - "block.create.radial_chassis.tooltip.action1": "Делает выбранную сторону _липкой._ При вращении, все присоединенные блоки в пределах заданного диапазона будут вращаться вместе с ней.", - - "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", - "block.create.mechanical_drill.tooltip.summary": "Механическое устройство, пригодное для _разрушения_ _блоков._", + "block.create.radial_chassis.tooltip.summary": "Конфигурируемый базовый блок, соединяющий конструкции для движения.", + "block.create.radial_chassis.tooltip.condition1": "При движении", + "block.create.radial_chassis.tooltip.behaviour1": "_Перемещает_ все _прикреплённые_ _шасси_ в колонне, и цилиндр из блоков вокруг себя. Блоки вокруг него перемещаются только тогда, когда они находятся в пределах досягаемости и прикреплён к липкой стороне (см. [Ctrl]).", + "block.create.radial_chassis.tooltip.condition2": "Используя гаечный ключ", + "block.create.radial_chassis.tooltip.behaviour2": "Настройте диапазон для этого блока шасси. Удерживайте CTRL, чтобы изменить диапазон всех подключённых блоков шасси.", + "block.create.radial_chassis.tooltip.control1": "ПКМ сгустком слизи", + "block.create.radial_chassis.tooltip.action1": "Делает нужную сторону липкой. При перемещении шасси все обозначенные блоки, прикреплённые к липкой стороне, перемещаются вместе с ним.", + + "block.create.mechanical_drill.tooltip": "MECHANICAL DRILL", + "block.create.mechanical_drill.tooltip.summary": "Механическое устройство, подходящее _для_ _разрушения_ _блоков_. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", "block.create.mechanical_drill.tooltip.condition1": "При вращении", "block.create.mechanical_drill.tooltip.behaviour1": "Действует как _стационарный_ разрушитель блоков. Также _наносит_ _урон_ _существам_ в рабочей области.", - "block.create.mechanical_drill.tooltip.condition2": "При движении механическим поршнем", - "block.create.mechanical_drill.tooltip.behaviour2": "Разрушает блоки, на которые наталкивается.", - - "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", - "block.create.mechanical_harvester.tooltip.summary": "Механический резак для растений, подходящий для автоматизации выращивания средних растений", - "block.create.mechanical_harvester.tooltip.condition1": "При движении механическим поршнем", - "block.create.mechanical_harvester.tooltip.behaviour1": "_Срезает_ все _зрелые_ _посевы_ и сбрасывает их в исходное состояние роста.", - + "block.create.mechanical_drill.tooltip.condition2": "Во время движения", + "block.create.mechanical_drill.tooltip.behaviour2": "Ломает блоки, с которыми сталкивается.", + + "block.create.mechanical_harvester.tooltip": "MECHANICAL HARVESTER", + "block.create.mechanical_harvester.tooltip.summary": "Механический кусторез, подходящий для автоматизации выращивания средних растений. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", + "block.create.mechanical_harvester.tooltip.condition1": "Во время движения", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Собирает_ все _зрелые_ _культуры_, с которыми сталкивается лезвие, и возвращает их в исходное состояние роста.", + + "block.create.mechanical_plough.tooltip": "MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "Механический плуг имеет множество применений. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", + "block.create.mechanical_plough.tooltip.condition1": "Во время движения", + "block.create.mechanical_plough.tooltip.behaviour1": "_Разбивает блоки_, с которыми _невозможно_ _столкнуться_, например, факелы, дорожки пыли или слои снега. Применяет его движение к _сущностям_, не причиняя им _вреда_. _Обрабатывает_ блоки земли, как _мотыга_.", + + "block.create.mechanical_saw.tooltip": "MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "Подходит для эффективной _резки_ _деревьев_ и для резки _плотницких_ _блоков_. Она подвижна с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", + "block.create.mechanical_saw.tooltip.condition1": "Когда лицевой стороной вверх", + "block.create.mechanical_saw.tooltip.behaviour1": "Применяет _рецепты_ _пиления_ и _камнерезания_ к предметам, упавшим на него или вставленным в него. Когда возможно несколько выходов, он циклически проходит через них, если только не назначен фильтр.", + "block.create.mechanical_saw.tooltip.condition2": "Если направлена горизонтально", + "block.create.mechanical_saw.tooltip.behaviour2": "_Ломает_ _бревна_ перед ним. Если бревно само по себе _поддерживало_ дерево, то _дерево_ _рухнет_ от пилы.", + "block.create.mechanical_saw.tooltip.condition3": "Во время движения", + "block.create.mechanical_saw.tooltip.behaviour3": "_Вырезает_ все _деревья_, с которыми сталкивается пила.", + "block.create.stockpile_switch.tooltip": "stockpile_switch", - "block.create.stockpile_switch.tooltip.summary": "Переключение сигнала на основе _предметов_ и _объёма_ _хранилища_ в прикрепленном контейнере.", - "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего порога", - "block.create.stockpile_switch.tooltip.behaviour1": "Перестаёт подавать сигнал", - "block.create.stockpile_switch.tooltip.condition2": "Когда выше верхнего порога", - "block.create.stockpile_switch.tooltip.behaviour2": "Начинает подавать _сигнал_ пока не будет достигнут нижний порог", - "block.create.stockpile_switch.tooltip.control1": "ПКМ", - "block.create.stockpile_switch.tooltip.action1": "Открывает _Меню_ _настройки_", - + "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполниности_ _прикреплённого_ _ящика_.", + "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего предела", + "block.create.stockpile_switch.tooltip.behaviour1": "Не подаёт _сигнал_ _красного_ _камня_.", + "block.create.stockpile_switch.tooltip.condition2": "Когда выше верхнего предела", + "block.create.stockpile_switch.tooltip.behaviour2": "Начинает давать _сигнал_ _красного_ _камня_, пака нижний предел не будет достигнут снова.", + "block.create.stockpile_switch.tooltip.control1": "При ПКМ", + "block.create.stockpile_switch.tooltip.action1": "Открывается _интерфейс_ _конфигурации_.", + "block.create.redstone_link.tooltip": "REDSTONE LINK", - "block.create.redstone_link.tooltip.summary": "Конечные точки для _беспроводных_ соединений. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", - "block.create.redstone_link.tooltip.condition1": "Когда запитан", - "block.create.redstone_link.tooltip.behaviour1": "Получает сигнал на той же _частоте_ и выводит его.", - "block.create.redstone_link.tooltip.control1": "ПКМ с предметом", - "block.create.redstone_link.tooltip.action1": "Устанавливает _частоту_ для этого звена. Всего для определения частоты можно использовать _2_ _предмета._", + "block.create.redstone_link.tooltip.summary": "_Беспроводной_ _передатчик_ сигнала красного камня. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", + "block.create.redstone_link.tooltip.condition1": "Когда приведен в действие", + "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той-же _частоты_ выдаёт сигнал красного камня или наоборот.", + "block.create.redstone_link.tooltip.control1": "При ПКМ предметом", + "block.create.redstone_link.tooltip.action1": "Устанавливает частоту для этого предмета. Всего _два_ разных предмета могут быть использованы в комбинации для определения частоты.", "block.create.redstone_link.tooltip.control2": "ПКМ крадясь", - "block.create.redstone_link.tooltip.action2": "Переключение между режимами _приёма_ и _передачи._", - - "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", - "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов.", + "block.create.redstone_link.tooltip.action2": "Переключение между режимом _приемника_ и _передатчика_.", + + "block.create.nixie_tube.tooltip": "NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "Красивый дисплей с питанием от _сигнала_ _красного_ _камня_ в диапазоне от 0 до 15.", + "block.create.nixie_tube.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.nixie_tube.tooltip.behaviour1": "Показывает _текущую_ _силу_ _сигнала_ красного камня в качестве отображаемого значения.", + + "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", + "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", "block.create.redstone_contact.tooltip.condition1": "Когда смотрит на другое контактное соединение", - "block.create.redstone_contact.tooltip.behaviour1": "Подаёт _сигнал_", - "block.create.redstone_contact.tooltip.condition2": "При движении механическим поршнем", - "block.create.redstone_contact.tooltip.behaviour2": "Включает все стационарные контактные соединения, через которые проходит.", - - "block.create.adjustable_crate.tooltip": "adjustable_crate", - "block.create.adjustable_crate.tooltip.summary": "Этот _контейнер_ позволяет контролировать его емкость. Он может содержать до _16_ _стаков_ любого предмета.", - "block.create.adjustable_crate.tooltip.control1": "ПКМ", - "block.create.adjustable_crate.tooltip.action1": "Открывает _Меню_", - + "block.create.redstone_contact.tooltip.behaviour1": "Выдаёт _сигнал_ _красного_ _камня_", + "block.create.redstone_contact.tooltip.condition2": "Во время движения", + "block.create.redstone_contact.tooltip.behaviour2": "Активирует все стационарные контакты, которые проходит.", + + "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", + "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стеков любого предмета. Поддерживает компараторы.", + "block.create.adjustable_crate.tooltip.control1": "При ПКМ", + "block.create.adjustable_crate.tooltip.action1": "Открывается _интерфейс_.", + + "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip.summary": "Этот _контейнер_ для _хранения_ позволяющий _бесконечную_ _дублировать_ любой предмет. Поместите рядом со схематичной пушкой, чтобы удалить любые требования к материалу.", + "block.create.creative_crate.tooltip.condition1": "Когда предмет в слоте фильтра", + "block.create.creative_crate.tooltip.behaviour1": "Все, что извлечено из этого контейнера, обеспечит бесконечную поставку указанного предмета. Предметы, _вставленные_ в этот ящик, будут _аннулированы_.", + "block.create.extractor.tooltip": "EXTRACTOR", - "block.create.extractor.tooltip.summary": "_Извлекает_ _предметы_ из прилагаемого _инвентаря_ и бросает на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов.", - "block.create.extractor.tooltip.condition1": "Когда запитан", - "block.create.extractor.tooltip.behaviour1": "_Приостанавливает_ экстрактор", + "block.create.extractor.tooltip.summary": "_Берет_ _предметы_ из прикреплённого _инвентаря_ и _бросает_ их на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов.", + "block.create.extractor.tooltip.condition1": "При получении сигнал красного камня", + "block.create.extractor.tooltip.behaviour1": "Приостанавливает извлечение.", + "block.create.extractor.tooltip.condition2": "В конвейере", + "block.create.extractor.tooltip.behaviour2": "Извлекающие устройства могут вытягивать предметы с _конвейеров_, усиленных _латунным_ _корпусом_. Когда извлекающие устройство не может бросать предметы, конвейер останавливается.", "block.create.extractor.tooltip.control1": "ПКМ по фильтру", - "block.create.extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Экстрактор будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_ по фильтру.", - + "block.create.extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Извлекающие устройство будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", + + "block.create.transposer.tooltip": "TRANSPOSER", + "block.create.transposer.tooltip.summary": "_Берет_ _предметы_ из прикреплённого _инвентаря_ и немедленно помещает их в целевой _инвентарь_. Может быть назначен стек предметов в качестве _фильтра_.", + "block.create.transposer.tooltip.condition1": "При получении сигнала красного камня", + "block.create.transposer.tooltip.behaviour1": "_Приостанавливает_ преместитель.", + "block.create.transposer.tooltip.condition2": "В конвейере", + "block.create.transposer.tooltip.behaviour2": "Переместители могут вытягивать предметы с _конвейеров_, усиленных _латунным_ _корпусом_. Когда переместитель не может бросать предметы, конвейер останавливается.", + "block.create.transposer.tooltip.control1": "ПКМ по фильтру", + "block.create.transposer.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Переместитель будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", + + "block.create.deployer.tooltip": "DEPLOYER", + "block.create.deployer.tooltip.summary": "_Ударяет_, _использует_ и _активирует_. Эта машина постарается максимально _имитировать_ _игрока_. Может _брать_ и _класть_ _предметы_ в соседний _инвентарь_. Может быть назначен _фильтр_ в виде стака предметов.", + "block.create.deployer.tooltip.condition1": "При вращении", + "block.create.deployer.tooltip.behaviour1": "_Вытягивает_ _руку_ и _активирует_ на _2_ _м_ _впереди_ себя.", + "block.create.deployer.tooltip.condition2": "ПКМ гаечным ключом", + "block.create.deployer.tooltip.behaviour2": "Переключает режим удара. В режиме пробивки автономный активатор попытается использовать свой предмет, чтобы разбить блоки или нанести урон сущностям.", + "block.create.linked_extractor.tooltip": "LINKED EXTRACTOR", - "block.create.linked_extractor.tooltip.summary": "_Извлекает_ _предметы_ из прилагаемого _инвентаря_ и бросает на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов. Может управляться дистанционно через _Передатчик_ _сигнала._", + "block.create.linked_extractor.tooltip.summary": "_Берет_ _предметы_ из прикреплённого _инвентаря_ и _бросает_ их на землю. Не будет бросать предметы до тех пор, пока пространство не освободится. Может быть назначен _фильтр_ в виде стака предметов. Может управляться удаленно через беспроводной передатчик сигнала красного камня.", "block.create.linked_extractor.tooltip.condition1": "Когда соединение активно", - "block.create.linked_extractor.tooltip.behaviour1": "_Приостанавливает_ экстрактор", + "block.create.linked_extractor.tooltip.behaviour1": "Приостанавливает извлечение.", "block.create.linked_extractor.tooltip.control1": "ПКМ по фильтру", - "block.create.linked_extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Экстрактор будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_ по фильтру.", - "block.create.linked_extractor.tooltip.control2": "ПКМ по частоте", - "block.create.linked_extractor.tooltip.action2": "Устанавливает _частоту_ для этого экстрактора. При передаче сигнала с передающего _Сигнального_ _соединения_ экстрактор будет приостановлен.", - - "block.create.funnel.tooltip": "BELT FUNNEL", - "block.create.funnel.tooltip.summary": "Собирает входящие предметы на _Механической_ _ленте_ и по возможности кладет их в прилагаемый _инвентарь._ Должен быть непосредственно _над_ лентой, с проёмом, смотрящим против направления ленты. Инвентарь должен быть на той же высоте, что и воронка.", - + "block.create.linked_extractor.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Извлекающие устройство будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", + "block.create.linked_extractor.tooltip.control2": "При ПКМ предметом на частотном пространстве", + "block.create.linked_extractor.tooltip.action2": "Назначает текущий _удерживаемый_ _предмет_ как часть прослушиваемой частоты. Каждый раз когда на беспроводной передатчик сигнала красного камня, настроенного на ту-же частоту подаётся сигнал - извлечение приостанавливается.", + + "block.create.linked_transposer.tooltip": "LINKED TRANSPOSER", + "block.create.linked_transposer.tooltip.summary": "_Берет_ _предметы_ из прикрёпленного _инвентаря_ и немедленно помещает их в целевой _инвентарь_. Может быть назначен стек предметов в качестве _фильтра_. Может управляться удаленно через беспроводной передатчик сигнала красного камня.", + "block.create.linked_transposer.tooltip.condition1": "Когда соединение активно", + "block.create.linked_transposer.tooltip.behaviour1": "_Приостанавливает_ преместитель.", + "block.create.linked_transposer.tooltip.control1": "ПКМ по фильтру", + "block.create.linked_transposer.tooltip.action1": "Устанавливает _стак_ _в_ _руке_ в качестве _фильтра._ Переместитель будет извлекать _определённый_ _предмет_ в _определённом_ _количестве_, согласно фильтру.", + "block.create.linked_transposer.tooltip.control2": "При ПКМ предметом на частотном пространстве", + "block.create.linked_transposer.tooltip.action2": "Назначает текущий _удерживаемый_ _предмет_ как часть прослушиваемой частоты. Каждый раз когда на беспроводной передатчик сигнала красного камня, настроенного на ту-же частоту подаётся сигнал - переместитель приостанавливается.", + + "block.create.funnel.tooltip": "FUNNEL", + "block.create.funnel.tooltip.summary": "_Собирает_ _поступающие_ _предметы_ и вставляет их в прилагаемый _инвентарь_, если это возможно. Может собирать предметы из мира или из конвейера.", + "block.create.funnel.tooltip.condition1": "Сбор предметов с конвейера", + "block.create.funnel.tooltip.behaviour1": "Воронки могут вытягивать предметы с _конвейеров_, когда они находятся над ними, сбоку или на конце. При отсутствии свободного места в прилагаемом инвентаре, предметы _на_ _конвейере_ _не_ _останавливаются_.", + + "block.create.belt_tunnel.tooltip": "BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "Эстетичный вариант для прохождения ваших _конвейеров_ сквозь стены. Конвейеры при этом должны быть усилены латунным корпусом. Туннели могут с_инхронизироваться_ _со_ _своими_ _соседями_, пропуская предметы, только если все туннели в группе имеют одно ожидание. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "ПКМ по передней стороне ключом", + "block.create.belt_tunnel.tooltip.action1": "Переключает _синхронизированное_ _поведение_. Синхронизированные туннели удерживают предметы до тех пор, пока их соседи не получат предмет.", + "block.create.belt_tunnel.tooltip.control2": "ПКМ по стороне ключом", + "block.create.belt_tunnel.tooltip.action2": "_Регулирует_ _шторки_, если у туннеля есть окно на этой стороне.", + + "block.create.brass_casing.tooltip": "BRASS CASING", + "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Сейф для украшения.", + "block.create.brass_casing.tooltip.condition1": "При использовании на конвейере", + "block.create.brass_casing.tooltip.behaviour1": "Усиливает конвейеры латунным основанием. Усиленные конвейеры _поддерживают_ _конвейерные_ _тунели_, _извлекающие_ _устройства_, _воронки_ и _периместители_, взаимодействующие с конвейером сбоку и снизу.", + "block.create.belt_observer.tooltip": "BELT OBSERVER", - "block.create.belt_observer.tooltip.summary": "Сканирует предметы, проходящие по _Механической_ _ленте_ перед ним. Хорошо работает с _поршнем_ сверху, отталкивающим определенные предметы.", - "block.create.belt_observer.tooltip.condition1": "Когда предмет соответствует фильтру", - "block.create.belt_observer.tooltip.behaviour1": "Подаёт короткий _импульс_ со всех сторон. Пустой фильтр соответствует любому элементу.", - "block.create.belt_observer.tooltip.control1": "ПКМ по фильтру", - "block.create.belt_observer.tooltip.action1": "Устанавливает _предмет_ _в_ _руке_ в качестве _фильтра._ Сканер будет реагировать только на этот предмет.", - + "block.create.belt_observer.tooltip.summary": "Обнаруживает предметы и объекты, проходящие мимо по _конвейеру_ перед ним. Используйте _гаечный_ _ключ_ для смены режима. Не предметы всегда будут обрабатываться в режиме обнаружения независимо от настроек.", + "block.create.belt_observer.tooltip.condition1": "Режим обнаружения", + "block.create.belt_observer.tooltip.behaviour1": "_Обеспечивает_ _сигнал_ красного камня, _пока_ _соответствующий_ _предмет_ находится в наблюдаемом сегменте конвейера.", + "block.create.belt_observer.tooltip.condition2": "Импульсный режим", + "block.create.belt_observer.tooltip.behaviour2": "_Издаёт_ _импульс_, когда _соответствующий_ _элемент_ проходит центр наблюдаемого сегмента конвейера.", + "block.create.belt_observer.tooltip.condition3": "Режим выброса", + "block.create.belt_observer.tooltip.behaviour3": "_Выбрасывает_ _соответствующие_ _предметы со стороны. Если целевой конвейер или пространство _занято_, предмет будет удерживаться на месте.", + "block.create.belt_observer.tooltip.condition4": "Режим разделения", + "block.create.belt_observer.tooltip.behaviour4": "_Разбивает_ _соответствующий_ _стек_ _предметов_ и _выбрасывает_ _половину_ из него сбоку.", + "block.create.pulse_repeater.tooltip": "PULSE REPEATER", - "block.create.pulse_repeater.tooltip.summary": "Простая схема для уменьшения времени проходящего сигнала до _1_ _тика._", - + "block.create.pulse_repeater.tooltip.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.", + "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", - "block.create.adjustable_repeater.tooltip.summary": "Продвинутый _Повторитель_ с _настраиваемой_ _задержкой_ вплоть до 30 минут.", - - "itemGroup.create": "Create" + "block.create.adjustable_repeater.tooltip.summary": "_Усовершенствованный_ _повторитель_ с _настраиваемой_ _задержкой_ до 30 минут.", + + "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "_Импульсный_ _повторитель_ с _настраиваемой_ _задержкой_ до 30 минут.", + + "block.create.analog_lever.tooltip": "ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "Рычаг с более точным _контролем_ над _уровнем_ _излучаемого_ _сигнала_.", + + "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "Рычаг, который может переключаться с помощью импульса сигнал красного камня.", + + "block.create.powered_latch.tooltip": "POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "Рычаг, которым можно управлять с помощью сигналов красного камня. Сигнал с задней стороны включает его, сигнал со стороны сбрасывает его.", + + "block.create.speedometer.tooltip": "SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "Измеряет и отображает _скорость_ _вращения_ прикреплённых кинетических компонентов. Поддерживает _компараторы_.", + "block.create.speedometer.tooltip.condition1": "При вращении", + "block.create.speedometer.tooltip.behaviour1": "Указывает цвет, соответствующий уровню скорости. _Зелёный_ указывает на медленное, _синий_ - на умеренное, а _пурпурное_ - на быстрое вращение. Некоторые механические компоненты требуют достаточного уровня скорости для правильной работы.", + + "block.create.stressometer.tooltip": "STRESSOMETER", + "block.create.stressometer.tooltip.summary": "Измеряет и отображает _общий_ _момент_ подключённой кинетической сети. Поддерживает _компараторы_.", + "block.create.stressometer.tooltip.condition1": "При вращении", + "block.create.stressometer.tooltip.behaviour1": "Указывает цвет, соответствующий уровню момента. Перенапряженные сети перестанут двигаться. Напряжение можно снять, добавив в сеть дополнительные источники вращения.", + + "tool.create.sand_paper.tooltip": "SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "Грубая бумага, которую можно использовать для _полировки_ _материалов_. Может быть автоматически применен с помощью автономного активатора.", + "tool.create.sand_paper.tooltip.condition1": "При использовании", + "tool.create.sand_paper.tooltip.behaviour1": "Полирует предметы, находящиеся в другой руке или лежащие на полу, при наведении на них", + + "item.create.super_glue.tooltip": "SUPER GLUE", + "item.create.super_glue.tooltip.summary": "Приклейте блок к другому, и они навсегда будут неразлучны.", + "item.create.super_glue.tooltip.condition1": "При использовании", + "item.create.super_glue.tooltip.behaviour1": "Делает лицевую сторону _липкой_. Блоки, прикреплённые к липким граням, будут _перемещаться_ при помощи _механических поршней_, _радиальных_ _шасси_ и других контроллеров.", + "item.create.super_glue.tooltip.condition2": "Кода в другой руке", + "item.create.super_glue.tooltip.behaviour2": "Автоматически _прикрепляет_ _блоки_, расположенные от основной руки, к той _стороне_, _против_ _которой_ они были.", + + "item.create.refined_radiance.tooltip": "REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "Хроматический материал, _добытый_ _из_ _поглощенного_ _света_.", + + "item.create.shadow_steel.tooltip": "SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", + + "item.create.crafter_slot_cover.tooltip": "SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "Используется для обозначения слота как пустой слот рецепта в _механическом_ _крафтере_. Крафтеры не обязательно должны образовывать полную квадратную сетку. Это полезно если есть рецепты, где ингредиенты располагаются _по_ _диагонали_ друг к другу.", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Работа продолжается!", + "create.tooltip.randomWipDescription0": "Пожалуйста держите этот предмет подальше от детей!", + "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Время.", + "create.tooltip.randomWipDescription2": "Используйте на свой страх и риск.", + "create.tooltip.randomWipDescription3": "Это не тот предмет, который вы ищете, *шевелит пальцами* пожалуйста, ускорьтесь.", + "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится за 10 секунд. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Поверьте мне, это бесполезно.", + "create.tooltip.randomWipDescription6": "Используя этот пункт, вы тем самым соглашаетесь с нашим отказом от ответственности и соглашаетесь с его условиями.", + "create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?", + "create.tooltip.randomWipDescription8": "Используя его, вы немедленно пожалеете о своем решении.", + + "_": "Thank you for translating Create!" + } From 25fd5a5aa203b29be28dec2592dd200ad053fe06 Mon Sep 17 00:00:00 2001 From: Yukkuri C <799433638@qq.com> Date: Fri, 28 Aug 2020 23:31:07 +0800 Subject: [PATCH 02/36] fix one-to-one loading order problem --- .../content/logistics/RedstoneLinkNetworkHandler.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java index 304ac2f7c..17fa4c15e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java @@ -110,6 +110,12 @@ public class RedstoneLinkNetworkHandler { break; } + // fix one-to-one loading order problem + if(actor.isListening()){ + actor.newPosition = true; + actor.updateReceiver(power); + } + for (Iterator iterator = network.iterator(); iterator.hasNext();) { LinkBehaviour other = iterator.next(); if (other.tileEntity.isRemoved()) { From 8c0b8963bbaec62a5db022029bb2872b0a101766 Mon Sep 17 00:00:00 2001 From: qkrehf2 <64183602+qkrehf2@users.noreply.github.com> Date: Thu, 1 Oct 2020 13:03:42 +0900 Subject: [PATCH 03/36] Times past quiet a lot, and I forgot to upload kr file. But here it is! Learning how to make Create 0.3 via gradle... --- ko_kr.json | 1415 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1415 insertions(+) create mode 100644 ko_kr.json diff --git a/ko_kr.json b/ko_kr.json new file mode 100644 index 000000000..5ecf8fc09 --- /dev/null +++ b/ko_kr.json @@ -0,0 +1,1415 @@ + + { + + "_comment": "-------------------------] GAME ELEMENTS [------------------------------------------------", + + "item.create.wand_of_symmetry": "대칭의 지팡이", + "item.create.handheld_blockzapper": "휴대용 블럭발사기", + "item.create.handheld_worldshaper": "휴대용 세계편집기", + "item.create.tree_fertilizer": "나무 비료", + "item.create.empty_schematic": "빈 청사진", + "item.create.andesite_alloy": "안산암 합금", + "item.create.chromatic_compound": "색채 혼합물", + "item.create.shadow_steel": "그림자 강철", + "item.create.schematic_and_quill": "청사진과 깃펜", + "item.create.schematic": "청사진", + "item.create.belt_connector": "기계식 벨트", + "item.create.goggles": "엔지니어의 고글", + "item.create.filter": "필터 틀", + "item.create.attribute_filter": "속성 필터 틀", + "item.create.rose_quartz": "장밋빛 석영", + "item.create.polished_rose_quartz": "윤나는 장밋빛 석영", + "item.create.refined_radiance": "정제된 광채", + "item.create.iron_sheet": "철 판", + "item.create.golden_sheet": "금 판", + "item.create.lapis_sheet": "청금석 판", + "item.create.powdered_obsidian": "흑요석 가루", + "item.create.propeller": "프로펠러", + "item.create.whisk": "혼합기", + "item.create.brass_hand": "황동 손", + "item.create.crafter_slot_cover": "작업대 슬롯 덮개", + "item.create.zinc_handle": "아연 도구 손잡이", + "item.create.extendo_grip": "외장형 연장 팔 ", + + "item.create.wheat_flour": "밀가루", + "item.create.dough": "반죽", + "item.create.wrench": "렌치", + "item.create.deforester": "산림파괴자", + "item.create.sand_paper": "사포", + "item.create.red_sand_paper": "붉은 사포", + "item.create.super_glue": "강력 접착제", + "item.create.minecart_contraption": "장치가 실린 광산 수레", + "item.create.crushed_brass": "분쇄된 황동", + "item.create.crushed_copper_ore": "분쇄된 구리 광석", + "item.create.crushed_gold_ore": "분쇄된 금 광석", + "item.create.crushed_iron_ore": "분쇄된 철 광석", + "item.create.crushed_zinc_ore": "분쇄된 아연 광석", + + "item.create.brass_ingot": "황동 주괴", + "item.create.brass_sheet": "황동 판", + "item.create.brass_nugget": "황동 조각", + "item.create.zinc_ingot": "아연 주괴", + "item.create.zinc_nugget": "아연 조각", + "item.create.copper_sheet": "구리 판", + "item.create.copper_ingot": "구리 주괴", + "item.create.copper_nugget": "구리 조각", + + "item.create.electron_tube": "전지 튜브", + "item.create.integrated_circuit": "집적 회로", + + "block.create.copper_ore": "구리 광석", + "block.create.copper_block": "구리 블럭", + "block.create.copper_shingles": "구리 판자", + "block.create.zinc_ore": "아연 광석", + "block.create.zinc_block": "아연 블럭", + "block.create.brass_block": "황동 블럭", + + "block.create.andesite_casing": "안산암 케이스", + "block.create.brass_casing": "황동 케이스", + "block.create.copper_casing": "구리 케이스", + + "block.create.cogwheel": "톱나바퀴", + "block.create.large_cogwheel": "큰 톱니바퀴", + "block.create.turntable": "돌림판", + "block.create.gearbox": "수평 기어박스", + "item.create.vertical_gearbox": "수직 기어박스", + "block.create.gearshift": "기어쉬프트", + "block.create.clutch": "클러치", + "block.create.shaft": "축", + "block.create.encased_belt": "덮힌 벨트", + "block.create.encased_shaft": "덮힌 축", + "block.create.encased_fan": "덮힌 환풍기", + "block.create.adjustable_pulley": "덮힌 벨트 변속기", + "block.create.nozzle": "노즐", + "block.create.hand_crank": "핸드 크랭크", + "block.create.cuckoo_clock": "뻐꾸기 시계", + "block.create.creative_motor": "모터", + "block.create.belt": "컨베이어 벨트", + "block.create.millstone": "맷돌", + "block.create.crushing_wheel": "분쇄 휠", + "block.create.mechanical_drill": "드릴", + "block.create.portable_storage_interface": "이동식 저장소 인터페이스", + "block.create.mechanical_harvester": "수확기", + "block.create.mechanical_plough": "쟁기", + "block.create.mechanical_saw": "톱", + "block.create.water_wheel": "물레방아", + "block.create.mechanical_press": "프레스", + "block.create.mechanical_mixer": "믹서", + "block.create.deployer": "배포기", + "block.create.basin": "대야", + "block.create.mechanical_crafter": "기계식 조합기", + "block.create.flywheel": "플라이휠", + "block.create.furnace_engine": "화로 엔진", + "block.create.speedometer": "속도 계측기", + "block.create.stressometer": "피로도 계측기", + "block.create.cart_assembler": "카트 조립기", + "block.create.analog_lever": "아날로그 레버", + "block.create.rotation_speed_controller": "회전 속도 컨트롤러", + "block.create.nixie_tube": "디지털 표시등", + + "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", + "block.create.mechanical_piston": "기계식 피스톤", + "block.create.mechanical_piston_head": "기계식 피스톤 머리", + "block.create.piston_extension_pole": "피스톤 연장 축", + "block.create.mechanical_bearing": "베어링", + "block.create.clockwork_bearing": "시계 베어링", + "block.create.rope_pulley": "밧줄 도르래", + "block.create.rope": "밧줄", + "block.create.pulley_magnet": "도르래 자석", + "block.create.linear_chassis": "어두운 직선 섀시", + "block.create.secondary_linear_chassis": "밝은 직선 섀시", + "block.create.radial_chassis": "원형 섀시", + + "block.create.redstone_contact": "동형 감지기", + "block.create.redstone_link": "레드스톤 링크", + "block.create.stockpile_switch": "수량 스위치", + "block.create.adjustable_crate": "가변 창고", + "block.create.creative_crate": "크리에이티브 창고", + "block.create.extractor": "추출기", + "block.create.funnel": "깔대기", + "block.create.linked_extractor": "무선 추출기", + "block.create.transposer": "트랜스포저", + "block.create.linked_transposer": "무선 트랜스포저", + "block.create.pulse_repeater": "펄스 리피터", + "block.create.adjustable_pulse_repeater": "가변 펄스 리피터", + "block.create.powered_latch": "레드스톤 걸쇠", + "block.create.powered_toggle_latch": "레드스톤 토글 걸쇠", + "block.create.adjustable_repeater": "가변 리피터", + "block.create.belt_observer": "벨트 감지기", + "block.create.belt_tunnel": "컨베이어 벨트 터널", + "block.create.sequenced_gearshift": "순서 기어쉬프트", + + "block.create.tiled_glass": "타일 유리", + "block.create.framed_glass": "큰 유리", + "block.create.vertical_framed_glass": "수직 유리", + "block.create.horizontal_framed_glass": "수평 유리", + "block.create.oak_window": "참나무 유리창", + "block.create.spruce_window": "가문비나무 유리창", + "block.create.birch_window": "자작나무 유리창", + "block.create.jungle_window": "정글나무 유리창", + "block.create.dark_oak_window": "짙은 참나무 유리창", + "block.create.acacia_window": "아카시아 유리창", + "block.create.ornate_iron_window": "장식된 철 유리창", + + + "block.create.tiled_glass_pane": "타일 유리판", + "block.create.framed_glass_pane": "큰 유리판", + "block.create.vertical_framed_glass_pane": "수직 유리판", + "block.create.horizontal_framed_glass_pane": "수평 유리판", + "block.create.oak_window_pane": "참나무 유리판", + "block.create.spruce_window_pane": "가문비나무 유리판", + "block.create.birch_window_pane": "자작나무 유리판", + "block.create.jungle_window_pane": "정글나무 유리판", + "block.create.dark_oak_window_pane": "짙은 참나무 유리판", + "block.create.acacia_window_pane": "아카시아나무 유리판 ", + "block.create.ornate_iron_window_pane": "장식된 철 유리판", + + "block.create.window_in_a_block": "유리판이 낀 블럭", + + "block.create.andesite_bricks": "안산안 벽돌", + "block.create.layered_andesite": "층이있는 안산암", + "block.create.andesite_bricks": "안산암 벽돌", + "block.create.andesite_bricks_slab": "안산암 벽돌 반 블록", + "block.create.andesite_bricks_stairs": "안산암 벽돌 계단", + "block.create.andesite_bricks_wall": "안산암 벽돌 담장", + "block.create.andesite_cobblestone": "안산암 조약돌", + "block.create.andesite_cobblestone_slab": "안산암 조약돌 반 블록", + "block.create.andesite_cobblestone_stairs": "안산암 조약돌 계단", + "block.create.andesite_cobblestone_wall": "안산암 조약돌 담장", + "block.create.andesite_pillar": "안산암 기둥", + "block.create.fancy_andesite_bricks": "장식된 안산암 벽돌", + "block.create.fancy_andesite_bricks_slab": "장식된 안산암 벽돌 반 블록", + "block.create.fancy_andesite_bricks_stairs": "장식된 안산암 벽돌 계단", + "block.create.fancy_andesite_bricks_wall": "장식된 안산암 벽돌 담장", + "block.create.mossy_andesite": "이끼낀 안산암", + "block.create.overgrown_andesite": "이끼로 뒤덮힌 안산암", + "block.create.paved_andesite": "포장된 안산암", + "block.create.paved_andesite_slab": "포장된 안산암 반 블록", + "block.create.paved_andesite_stairs": "포장된 안산암 계단", + "block.create.paved_andesite_wall": "포장된 안산암 담장", + + "block.create.diorite_bricks": "섬록암 벽돌", + "block.create.diorite_bricks_slab": "섬록암 벽돌 반 블록", + "block.create.diorite_bricks_stairs": "섬록암 벽돌 계단", + "block.create.diorite_bricks_wall": "섬록암 벽돌 담장", + "block.create.diorite_cobblestone": "섬록암 조약돌", + "block.create.diorite_cobblestone_slab": "섬록암 조약돌 반 블록", + "block.create.diorite_cobblestone_stairs": "섬록암 조약돌 계단", + "block.create.diorite_cobblestone_wall": "섬록암 조약돌 담장", + "block.create.diorite_pillar": "섬록암 기둥", + "block.create.fancy_diorite_bricks": "장식된 섬록암 벽돌", + "block.create.fancy_diorite_bricks_slab": "장식된 섬록암 벽돌 반 블록", + "block.create.fancy_diorite_bricks_stairs": "장식된 섬록암 벽돌 계단", + "block.create.fancy_diorite_bricks_wall": "장식된 섬록암 벽돌 담장", + "block.create.layered_diorite": "층이 있는 섬록암", + "block.create.mossy_diorite": "이끼 낀 섬록암", + "block.create.overgrown_diorite": "이끼로 뒤덮힌 섬록암", + "block.create.paved_diorite": "포장된 섬록암", + "block.create.paved_diorite_slab": "포장된 섬록암 반 블록", + "block.create.paved_diorite_stairs": "포장된 섬록암 계단", + "block.create.paved_diorite_wall": "포장된 섬록암 담장", + + "block.create.granite_bricks": "화강암 벽돌", + "block.create.layered_granite": "층이 있는 화강암", + "block.create.fancy_granite_bricks": "장식된 화강암 벽돌", + "block.create.fancy_granite_bricks_slab": "장식된 화강암 벽돌 반 블록", + "block.create.fancy_granite_bricks_stairs": "장식된 화강암 벽돌 계단", + "block.create.fancy_granite_bricks_wall": "장식된 화강암 벽돌 담장", + "block.create.granite_bricks_slab": "화강함 벽돌 반 블록", + "block.create.granite_bricks_stairs": "화강함 벽돌 계단", + "block.create.granite_bricks_wall": "화강함 벽돌 담장", + "block.create.granite_cobblestone": "화강암 조약돌", + "block.create.granite_cobblestone_slab": "화강암 조약돌 반 블록", + "block.create.granite_cobblestone_stairs": "화강암 조약돌 계단", + "block.create.granite_cobblestone_wall": "화강암 조약돌 담장", + "block.create.granite_pillar": "화강암 기둥", + "block.create.mossy_granite": "이끼 낀 화강암 벽돌", + "block.create.overgrown_granite": "이끼로 뒤덮힌 화강암 벽돌", + "block.create.paved_granite": "포장된 화강암", + "block.create.paved_granite_slab": "포장된 화강암 반 블록", + "block.create.paved_granite_stairs": "포장된 화강암 계단", + "block.create.paved_granite_wall": "포장된 화강암 담장", + + "block.create.gabbro": "반려암", + "block.create.gabbro_stairs": "반려암 계단", + "block.create.gabbro_slab": "반려암 반 블록", + "block.create.gabbro_wall": "반려암 담장", + "block.create.polished_gabbro": "윤나는 반려암", + "block.create.gabbro_bricks": "반려암 벽돌", + "block.create.gabbro_bricks_stairs": "반려암 벽돌 계단", + "block.create.gabbro_bricks_wall": "반려암 벽돌 담장", + "block.create.paved_gabbro_bricks": "포장된 반려암 벽돌", + "block.create.paved_gabbro_bricks_slab": "포장된 반려암 벽돌 반 블록", + "block.create.indented_gabbro": "반려암 겹 타일", + "block.create.indented_gabbro_slab": "반려암 겹 반 블록", + "block.create.slightly_mossy_gabbro_bricks": "이끼 낀 반려암 벽돌", + "block.create.mossy_gabbro_bricks": "이끼로 뒤덮힌 반려암 벽돌", + "block.create.chiseled_gabbro": "조각된 반려암", + "block.create.fancy_gabbro_bricks": "장식된 반려암 벽돌", + "block.create.fancy_gabbro_bricks_slab": "장식된 반려암 벽돌 반 블록", + "block.create.fancy_gabbro_bricks_stairs": "장식된 반려암 벽돌 계단", + "block.create.fancy_gabbro_bricks_wall": "장식된 반려암 벽돌 담장", + "block.create.gabbro_cobblestone": "반려암 조약돌", + "block.create.gabbro_cobblestone_slab": "반려암 조약돌 반 블록", + "block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단", + "block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장", + "block.create.layered_gabbro": "층이 있는 반려암", + "block.create.mossy_gabbro": "이끼낀 반려암", + "block.create.overgrown_gabbro": "이끼로 뒤덮힌 반려암", + "block.create.paved_gabbro": "포장된 반려암", + "block.create.paved_gabbro_slab": "포장된 반려암 반 블록", + "block.create.paved_gabbro_stairs": "포장된 반려암 계단", + "block.create.paved_gabbro_wall": "포장된 반려암 담장", + "block.create.polished_gabbro": "윤나는 반려암", + "block.create.polished_gabbro_slab": "윤나는 반려암 반 블록", + "block.create.polished_gabbro_stairs": "윤나는 반려암 계단", + "block.create.polished_gabbro_wall": "윤나는 반려암 담장", + "block.create.gabbro_bricks_slab": "반려암 벽돌 반 블록", + "block.create.gabbro_pillar": "반려암 기둥", + + "block.create.weathered_limestone": "풍화된 석회암", + "block.create.weathered_limestone_stairs": "풍화된 석회암 계단", + "block.create.weathered_limestone_wall": "풍화된 석회암 담장", + "block.create.weathered_limestone_slab": "풍화된 석회암 반 블록", + "block.create.polished_weathered_limestone": "윤나는 풍화된 석회암", + "block.create.polished_weathered_limestone_slab": "윤나는 풍화된 석회암 반 블록", + "block.create.weathered_limestone_bricks": "풍화된 석회암 벽돌", + "block.create.weathered_limestone_bricks_stairs": "풍화된 석회암 벽돌 계단", + "block.create.weathered_limestone_bricks_wall": "풍화된 석회암 벽돌 담장", + "block.create.weathered_limestone_bricks_slab": "풍화된 석회암 벽돌 반 블록", + "block.create.weathered_limestone_pillar": "풍화된 석회암 기둥", + "block.create.layered_weathered_limestone": "층이 있는 풍화된 석회암", + "block.create.chiseled_weathered_limestone": "조각된 풍화된 석회암", + "block.create.fancy_weathered_limestone_bricks": "장식된 풍화된 석회암 벽돌", + "block.create.fancy_weathered_limestone_bricks_slab": "장식된 풍화된 석회암 벽돌 반 블록", + "block.create.fancy_weathered_limestone_bricks_stairs": "장식된 풍화된 석회암 벽돌 계단", + "block.create.fancy_weathered_limestone_bricks_wall": "장식된 풍화된 석회암 벽돌 담장", + "block.create.mossy_weathered_limestone": "이끼 낀 풍화된 석회암", + "block.create.overgrown_weathered_limestone": "이끼로 뒤덮힌 풍화된 석회암", + "block.create.paved_weathered_limestone": "포장된 풍화된 석회암", + "block.create.paved_weathered_limestone_slab": "포장된 풍화된 석회암 반 블록", + "block.create.paved_weathered_limestone_stairs": "포장된 풍화된 석회암 계단", + "block.create.paved_weathered_limestone_wall": "포장된 풍화된 석회암 담장", + "block.create.polished_weathered_limestone_stairs": "윤나는 풍화된 석회암 계단", + "block.create.polished_weathered_limestone_wall": "윤나는 풍화된 석회암 담장", + "block.create.weathered_limestone_cobblestone": "풍화된 석회암 조약돌", + "block.create.weathered_limestone_cobblestone_slab": "풍화된 석회암 조약돌 반 블록", + "block.create.weathered_limestone_cobblestone_stairs": "풍화된 석회암 조약돌 계단", + "block.create.weathered_limestone_cobblestone_wall": "풍화된 석회암 조약돌 담장", + + "block.create.dolomite_pillar": "백운암 기둥", + "block.create.dolomite": "백운암", + "block.create.dolomite_stairs": "백운암 계단", + "block.create.dolomite_wall": "백운암 담장", + "block.create.dolomite_slab": "백운암 반 블록", + "block.create.dolomite_bricks": "백운암 벽돌", + "block.create.dolomite_bricks_wall": "백운암 벽돌 담장", + "block.create.dolomite_bricks_stairs": "백운암 벽돌 계단", + "block.create.dolomite_bricks_slab": "백운암 벽돌 반 블록", + "block.create.polished_dolomite": "윤나는 백운암", + "block.create.layered_dolomite": "층이 있는 백운암", + "block.create.dolomite_cobblestone": "백운암 조약돌", + "block.create.dolomite_cobblestone_slab": "백운암 조약돌 반 블록", + "block.create.dolomite_cobblestone_stairs": "백운암 조약돌 계단", + "block.create.dolomite_cobblestone_wall": "백운암 조약돌 담장", + "block.create.fancy_dolomite_bricks": "장식된 백운암 벽돌", + "block.create.fancy_dolomite_bricks_slab": "장식된 백운암 벽돌 반 블록", + "block.create.fancy_dolomite_bricks_stairs": "장식된 백운암 벽돌 계단", + "block.create.fancy_dolomite_bricks_wall": "장식된 백운암 벽돌 담장", + "block.create.paved_dolomite": "포장된 백운암", + "block.create.paved_dolomite_slab": "포장된 백운암 반 블록", + "block.create.paved_dolomite_stairs": "포장된 백운암 계단", + "block.create.paved_dolomite_wall": "포장된 백운암 담장", + "block.create.polished_dolomite_slab": "윤나는 백운암 반 블록", + "block.create.polished_dolomite_stairs": "윤나는 백운암 계단", + "block.create.polished_dolomite_wall": "윤나는 백운암 담장", + "block.create.chiseled_dolomite": "조각된 백운암", + "block.create.mossy_dolomite": "이끼낀 백운암", + "block.create.overgrown_dolomite": "이끼로 뒤덮힌 백운암", + + "block.create.limesand": "석회모래", + "block.create.limestone": "석회암", + "block.create.limestone_stairs": "석회암 계단", + "block.create.limestone_slab": "석회암 반 블록", + "block.create.limestone_wall": "석회암 담장", + "block.create.limestone_bricks": "석회암 벽돌", + "block.create.limestone_bricks_stairs": "석회암 벽돌 계단", + "block.create.limestone_bricks_slab": "석회암 벽돌 반 블록", + "block.create.limestone_bricks_wall": "석회암 벽돌 담장", + "block.create.polished_limestone": "윤나는 석회암", + "block.create.polished_limestone_slab": "윤나는 석회암 반 블록", + "block.create.limestone_pillar": "석회암 기둥", + "block.create.layered_limestone": "층이 있는 석회암", + "block.create.chiseled_limestone": "조각된 석회암", + "block.create.fancy_limestone_bricks": "장식된 석회암 벽돌", + "block.create.fancy_limestone_bricks_slab": "장식된 석회암 벽돌 반 블록", + "block.create.fancy_limestone_bricks_stairs": "장식된 석회암 벽돌 계단", + "block.create.fancy_limestone_bricks_wall": "장식된 석회암 벽돌 담장", + "block.create.mossy_limestone": "이끼 낀 석회암", + "block.create.overgrown_limestone": "이끼로 뒤덮힌 석회암", + "block.create.paved_limestone": "포장된 석회암", + "block.create.paved_limestone_slab": "포장된 석회암 반 블록", + "block.create.paved_limestone_stairs": "포장된 석회암 계단", + "block.create.paved_limestone_wall": "포장된 석회암 담장", + "block.create.polished_limestone_stairs": "윤나는 석회암 계단", + "block.create.polished_limestone_wall": "윤나는 석회암 담장", + "block.create.limestone_cobblestone": "석회암 조약돌", + "block.create.limestone_cobblestone_slab": "석회암 조약돌 반 블록", + "block.create.limestone_cobblestone_stairs": "석회암 조약돌 계단", + "block.create.limestone_cobblestone_wall": "석회암 조약돌 담장", + + + "block.create.natural_scoria": "자연 스코리아", + "block.create.scoria": "스코리아", + "block.create.scoria_stairs": "스코리아 계단", + "block.create.scoria_slab": "스코리아 반 블록", + "block.create.scoria_wall": "스코리아 담장", + "block.create.scoria_bricks": "스코리아 벽돌", + "block.create.polished_scoria": "윤나는 스코리아", + "block.create.polished_scoria_slab": "윤나는 스코리아 반 블록", + "block.create.scoria_pillar": "스코리아 기둥", + "block.create.layered_scoria": "층이 있는 스코리아", + "block.create.chiseled_scoria": "조각된 스코리아", + "block.create.fancy_scoria_bricks": "장식된 스코리아 벽돌", + "block.create.fancy_scoria_bricks_slab": "장식된 스코리아 벽돌 반 블록", + "block.create.fancy_scoria_bricks_stairs": "장식된 스코리아 벽돌 계단", + "block.create.fancy_scoria_bricks_wall": "장식된 스코리아 벽돌 담장", + "block.create.mossy_scoria": "이끼 낀 스코리아", + "block.create.overgrown_scoria": "이끼로 뒤덮힌 스코리아", + "block.create.paved_scoria": "포장된 스코리아", + "block.create.paved_scoria_slab": "포장된 스코리아 반 블록", + "block.create.paved_scoria_stairs": "포장된 스코리아 계단", + "block.create.paved_scoria_wall": "포장된 스코리아 담장", + "block.create.polished_scoria_stairs": "윤나는 스코리아 계단", + "block.create.polished_scoria_wall": "윤나는 스코리아 담장", + "block.create.scoria_cobblestone": "스코리아 조약돌", + "block.create.scoria_cobblestone_slab": "스코리아 조약돌 반 블록", + "block.create.scoria_cobblestone_stairs": "스코리아 조약돌 계단", + "block.create.scoria_cobblestone_wall": "스코리아 조약돌 담장", + "block.create.scoria_bricks_slab": "스코리아 벽돌 반 블록", + "block.create.scoria_bricks_stairs": "스코리아 벽돌 계단", + "block.create.scoria_bricks_wall": "스코리아 벽돌 담장", + + "block.create.dark_scoria": "짙은 스코리아", + "block.create.polished_dark_scoria": "윤나는 짙은 스코리아", + "block.create.dark_scoria_tiles": "짙은 스코리아 타일", + "block.create.dark_scoria_tiles_stairs": "짙은 스코리아 타일 계단", + "block.create.dark_scoria_tiles_slab": "짙은 스코리아 타일 반 블록", + "block.create.dark_scoria_bricks": "짙은 스코리아 벽돌", + "block.create.dark_scoria_bricks_stairs": "짙은 스코리아 벽돌 계단", + "block.create.dark_scoria_bricks_slab": "짙은 스코리아 벽돌 반 블록", + "block.create.dark_scoria_bricks_wall": "짙은 스코리아 벽돌 담장", + "block.create.chiseled_dark_scoria": "조각된 짙은 스코리아", + "block.create.dark_scoria_cobblestone": "짙은 스코리아 조약돌", + "block.create.dark_scoria_cobblestone_slab": "짙은 스코리아 조약돌 반 블록", + "block.create.dark_scoria_cobblestone_stairs": "짙은 스코리아 조약돌 계단", + "block.create.dark_scoria_cobblestone_wall": "짙은 스코리아 조약돌 담장", + "block.create.fancy_dark_scoria_bricks": "장식된 짙은 스코리아 벽돌", + "block.create.fancy_dark_scoria_bricks_slab": "장식된 짙은 스코리아 벽돌 반 블록", + "block.create.fancy_dark_scoria_bricks_stairs": "장식된 짙은 스코리아 벽돌 계단", + "block.create.fancy_dark_scoria_bricks_wall": "장식된 짙은 스코리아 벽돌 담장", + "block.create.layered_dark_scoria": "층이 있는 짙은 스코리아", + "block.create.mossy_dark_scoria": "이끼 낀 짙은 스코리아", + "block.create.overgrown_dark_scoria": "이끼가 뒤덮힌 짙은 스코리아", + "block.create.paved_dark_scoria": "포장된 짙은 스코리아", + "block.create.paved_dark_scoria_slab": "포장된 스코리아 반 블록", + "block.create.paved_dark_scoria_stairs": "포장된 짙은 스코리 계단", + "block.create.paved_dark_scoria_wall": "포장된 짙은 스코리아 담장", + "block.create.polished_dark_scoria": "윤나는 짙은 스코리아", + "block.create.polished_dark_scoria_slab": "윤나는 짙은 스코리아 반 블록", + "block.create.polished_dark_scoria_stairs": "윤나는 짙은 스코리아 계단", + "block.create.polished_dark_scoria_wall": "윤나는 짙은 스코리아 담장", + "block.create.dark_scoria_pillar": "짙은 스코리아 기둥", + + "block.create.schematicannon": "청사진 대포", + "block.create.schematic_table": "청사진 테이블", + + "block.create.cocoa_log": "코코아 정글 나무 원목", + + "entity.create.contraption": "움직이는 장치", + "entity.create.stationary_contraption": "고정된 장치", + "entity.create.super_glue": "강력 접착제", + + "_comment": "-------------------------] UI & MESSAGES [------------------------------------------------", + + "death.attack.create.crush": "%1$s이(가) 분쇄 휠에 의해 가공되었습니다", + "death.attack.create.fan_fire": "%1$s이(가) 뜨거운 바람에 의해 익었습니다", + "death.attack.create.fan_lava": "%1$s이(가) 용암 바람에 의해 구워졌습니다", + "death.attack.create.mechanical_drill": "%1$s이(가) 드릴에 관통당했습니다", + "death.attack.create.mechanical_saw": "%1$s이(가) 톱날에 반으로 갈라져 죽었습니다", + "create.block.deployer.damage_source_name": "순수한 배포기", + "death.attack.create.cuckoo_clock_explosion": "%1$s이(가) 조작된 뻐꾸기 시계에 의해 폭파당했습니다", + + "create.recipe.crushing": "분쇄", + "create.recipe.milling": "맷돌질", + "create.recipe.splashing": "세척", + "create.recipe.splashing.fan": "물과 환풍기", + "create.recipe.smokingViaFan": "훈연", + "create.recipe.smokingViaFan.fan": "불과 환풍기", + "create.recipe.blastingViaFan": "제련", + "create.recipe.blastingViaFan.fan": "용암과 환풍기", + "create.recipe.pressing": "압착", + "create.recipe.mixing": "혼합", + "create.recipe.packing": "압축", + "create.recipe.mechanical_sawing": "제재", + "create.recipe.mechanical_crafting": "기계 조합", + "create.recipe.block_cutting": "블럭 절단", + "create.recipe.blockzapperUpgrade": "휴대용 블럭발사기 업그레이드", + "create.recipe.sandpaper_polishing": "사포 연마", + "create.recipe.mystery_conversion": "?", + "create.recipe.processing.catalyst": "촉매", + "create.recipe.processing.chance": "%1$s%% 확률", + "create.recipe.processing.chanceToReturn": "%1$s%% 확률로 반환", + + "create.generic.range": "범위", + "create.generic.radius": "반지름", + "create.generic.width": "폭", + "create.generic.height": "높이", + "create.generic.length": "길이", + "create.generic.speed": "속도", + "create.generic.delay": "딜레이", + "create.generic.unit.ticks": "틱", + "create.generic.unit.seconds": "초", + "create.generic.unit.minutes": "분", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "°", + + "create.action.scroll": "스크롤하세요", + "create.action.confirm": "확인", + "create.action.abort": "중단", + "create.action.saveToFile": "저장", + "create.action.discard": "삭제", + + "create.keyinfo.toolmenu": "메뉴 세부정보 보기", + "create.keyinfo.scrollup": "Simulate Mousewheel Up (inworld)", + "create.keyinfo.scrolldown": "Simulate Mousewheel Down (inworld)", + + "create.gui.scrollInput.defaultTitle": "옵션을 선택하세요:", + "create.gui.scrollInput.scrollToModify": "스크롤로 수정하기", + "create.gui.scrollInput.scrollToAdjustAmount": "스크롤로 수량 조절하기", + "create.gui.scrollInput.scrollToSelect": "스크롤로 선택", + "create.gui.scrollInput.shiftScrollsFaster": "쉬프트-스크롤로 빨리 수정하기", + + "create.gui.toolmenu.focusKey": "[%1$s]를 눌러 세부정보 보기", + "create.gui.toolmenu.cycle": "스크롤로 순환", + + "create.gui.symmetryWand.mirrorType": "반사", + "create.gui.symmetryWand.orientation": "방위", + "create.symmetry.mirror.plane": "거울 모드", + "create.symmetry.mirror.doublePlane": "사각형 모드", + "create.symmetry.mirror.triplePlane": "팔각형 모드", + "create.orientation.orthogonal": "수직으로", + "create.orientation.diagonal": "대각선으로", + "create.orientation.horizontal": "수평으로", + "create.orientation.alongZ": "Z좌표를 따라", + "create.orientation.alongX": "X좌표를 따라", + + "create.gui.blockzapper.title": "휴대용 블럭발사기", + "create.gui.blockzapper.replaceMode": "대체 모드", + "create.gui.blockzapper.searchDiagonal": "대각선을 따라", + "create.gui.blockzapper.searchFuzzy": "물질 경계 무시", + "create.gui.blockzapper.range": "범위", + "create.gui.blockzapper.needsUpgradedAmplifier": "업그레이드가 필요합니다", + "create.gui.blockzapper.patternSection": "패턴 설정", + "create.gui.blockzapper.pattern.solid": "원형", + "create.gui.blockzapper.pattern.checkered": "체스판", + "create.gui.blockzapper.pattern.inversecheckered": "반전된 체스판", + "create.gui.blockzapper.pattern.chance25": "램덤으로 25% 채우기", + "create.gui.blockzapper.pattern.chance50": "램덤으로 50% 채우기", + "create.gui.blockzapper.pattern.chance75": "랜덤으로 75% 채우기", + + "create.gui.terrainzapper.title": "휴대용 세계편집기", + "create.gui.terrainzapper.placement": "설치방식", + "create.gui.terrainzapper.placement.merged": "선택한 블럭에", + "create.gui.terrainzapper.placement.attached": "선택한 블럭 옆에", + "create.gui.terrainzapper.placement.inserted": "선택한 블럭 안에", + "create.gui.terrainzapper.brush": "브러쉬", + "create.gui.terrainzapper.brush.cuboid": "정육면체", + "create.gui.terrainzapper.brush.sphere": "구", + "create.gui.terrainzapper.brush.cylinder": "원통", + "create.gui.terrainzapper.tool": "도구", + "create.gui.terrainzapper.tool.fill": "채우기", + "create.gui.terrainzapper.tool.place": "설치", + "create.gui.terrainzapper.tool.replace": "대체", + "create.gui.terrainzapper.tool.clear": "지우기", + "create.gui.terrainzapper.tool.overlay": "덮어씌우기", + "create.gui.terrainzapper.tool.flatten": "평탄화", + "create.terrainzapper.shiftRightClickToSet": "쉬프트-우클릭으로 모양 설정하기", + + "create.blockzapper.usingBlock": "현재 블럭: %1$s", + "create.blockzapper.componentUpgrades": "부품 업그레이드:", + "create.blockzapper.component.body": "몸통", + "create.blockzapper.component.amplifier": "증폭기", + "create.blockzapper.component.accelerator": "가속기", + "create.blockzapper.component.retriever": "회수기", + "create.blockzapper.component.scope": "스코프", + "create.blockzapper.componentTier.none": "없음", + "create.blockzapper.componentTier.brass": "황동", + "create.blockzapper.componentTier.chromatic": "혼돈의 결정체", + "create.blockzapper.leftClickToSet": "좌클릭으로 블럭 설정하기", + "create.blockzapper.empty": "블럭이 없습니다!", + + "create.contraptions.movement_mode": "이동 설정", + "create.contraptions.movement_mode.move_place": "멈췄을때 항상 블럭을 설치함", + "create.contraptions.movement_mode.move_place_returned": "멈췄을떄 최초 위치에서만 블럭을 설치함", + "create.contraptions.movement_mode.move_never_place": "멈춰도 블럭을 설치하지 않음", + "create.contraptions.movement_mode.rotate_place": "멈췄을때 항상 블럭을 설치함", + "create.contraptions.movement_mode.rotate_place_returned": "멈췄을떄 최초 위치에서만 블럭을 설치함", + "create.contraptions.movement_mode.rotate_never_place": "멈춰도 블럭을 설치하지 않음", + "create.contraptions.cart_movement_mode": "수레 장치 이동 설정", + "create.contraptions.cart_movement_mode.rotate": "장치가 항상 전방을 향함", + "create.contraptions.cart_movement_mode.rotate_paused": "수레가 회전할때 장치 행동을 멈춤", + "create.contraptions.cart_movement_mode.rotation_locked": "장치가 회전하지 않음", + + "create.logistics.filter": "필터", + "create.logistics.firstFrequency": "주파수. #1", + "create.logistics.secondFrequency": "주파수. #2", + + "create.gui.goggles.generator_stats": "발전 상태:", + "create.gui.goggles.kinetic_stats": "가동 상태:", + "create.gui.goggles.at_current_speed": "현재 속도", + "create.gui.goggles.base_value": "기본 수치", + + "create.gui.gauge.info_header": "게이지 정보:", + "create.gui.speedometer.title": "회전 속도", + "create.gui.stressometer.title": "네트워크 부하", + "create.gui.stressometer.capacity": "용량", + "create.gui.stressometer.overstressed": "과부하됨", + "create.gui.stressometer.no_rotation": "회전없음", + + "create.gui.contraptions.not_fast_enough": "이 %1$s은(는) 작동하기에 _회전 속도_가 _부족합니다_", + "create.gui.contraptions.network_overstressed": "이 장치는 _과부하_되었습니다. _높은 피로도_ 용량을 가진 발전기를 추가로 설치하거나 장치 _속도_를 _늦추세요_.", + + "create.gui.adjustable_crate.title": "가변 창고 ", + "create.gui.adjustable_crate.storageSpace": "저장 공간", + + "create.gui.stockpile_switch.title": "수량 스위치", + "create.gui.stockpile_switch.lowerLimit": "최소 신호 유지수량", + "create.gui.stockpile_switch.upperLimit": "최초 신호 발동수량", + "create.gui.stockpile_switch.startAt": "다음 수량에 신호 주기", + "create.gui.stockpile_switch.startAbove": "다음 수량이상일떄 신호 주기", + "create.gui.stockpile_switch.stopAt": "다음 수량에 신호 멈추기", + "create.gui.stockpile_switch.stopBelow": "다음 수량이하일때 신호 멈추기", + + "create.gui.sequenced_gearshift.title": "순서 기어쉬프트", + "create.gui.sequenced_gearshift.instruction": "설명", + "create.gui.sequenced_gearshift.instruction.turn_angle": "회전", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "각도", + "create.gui.sequenced_gearshift.instruction.turn_distance": "피스톤", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "거리", + "create.gui.sequenced_gearshift.instruction.wait": "정지", + "create.gui.sequenced_gearshift.instruction.wait.duration": "지속시간", + "create.gui.sequenced_gearshift.instruction.end": "마침", + "create.gui.sequenced_gearshift.speed": "속도, 방향", + "create.gui.sequenced_gearshift.speed.forward": "입력된 속도, 그대로 회전", + "create.gui.sequenced_gearshift.speed.forward_fast": "입력된 속도의 2배, 그대로 회전", + "create.gui.sequenced_gearshift.speed.back": "입력된 속도, 반대로 회전", + "create.gui.sequenced_gearshift.speed.back_fast": "입력된 속도의 2배, 반대로 회전", + + "create.schematicAndQuill.dimensions": "청사진 크기: %1$sx%2$sx%3$s", + "create.schematicAndQuill.firstPos": "첫번쨰 위치 지정됨.", + "create.schematicAndQuill.secondPos": "두번째 위치 지정됨.", + "create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블럭을 선택하기.", + "create.schematicAndQuill.abort": "위치 제거됨.", + "create.schematicAndQuill.prompt": "청사진의 제목을 작성하기:", + "create.schematicAndQuill.fallbackName": "내 청사진", + "create.schematicAndQuill.saved": "%1$s로 저장됨", + + "create.schematic.invalid": "[!] 없는 아이템 - 청사진 테이블을 이용하세요", + "create.schematic.position": "위치", + "create.schematic.rotation": "회전", + "create.schematic.rotation.none": "없음", + "create.schematic.rotation.cw90": "90도 시계방향 회전", + "create.schematic.rotation.cw180": "180도 시계방향 회전", + "create.schematic.rotation.cw270": "270도 시계방향 회전", + "create.schematic.mirror": "거울", + "create.schematic.mirror.none": "없음", + "create.schematic.mirror.frontBack": "전-후", + "create.schematic.mirror.leftRight": "좌-우", + + "create.schematic.tool.deploy": "전개", + "create.schematic.tool.move": "X/Z좌표 이동", + "create.schematic.tool.movey": "Y좌표 이동", + "create.schematic.tool.rotate": "회전", + "create.schematic.tool.print": "설치", + "create.schematic.tool.flip": "뒤집기", + + "create.schematic.tool.deploy.description.0": "구조물을 해당 위치로 고정합니다.", + "create.schematic.tool.deploy.description.1": "땅에다 우클릭으로 설치합니다.", + "create.schematic.tool.deploy.description.2": "[Ctrl]을 눌러 플레이어-청사진의 거리를 설정합니다.", + "create.schematic.tool.deploy.description.3": "[Ctrl]-스크롤로 거리를 조정합니다.", + "create.schematic.tool.move.description.0": "청사진을 수평 이동시킵니다.", + "create.schematic.tool.move.description.1": "청사진을 보고 [CTRL]-스크롤로 밉니다.", + "create.schematic.tool.move.description.2": "", + "create.schematic.tool.move.description.3": "", + "create.schematic.tool.movey.description.0": "청사진을 수직 이동시킵니다.", + "create.schematic.tool.movey.description.1": "청사진을 보고 [CTRL]-스크롤로 밉니다.", + "create.schematic.tool.movey.description.2": "", + "create.schematic.tool.movey.description.3": "", + "create.schematic.tool.rotate.description.0": "청사진을 돌립니다.", + "create.schematic.tool.rotate.description.1": "[CTRL]-스크롤로 90도 돌립니다.", + "create.schematic.tool.rotate.description.2": "", + "create.schematic.tool.rotate.description.3": "", + "create.schematic.tool.print.description.0": "구조물을 즉시 설치합니다.", + "create.schematic.tool.print.description.1": "[우클릭]으로 현재 지점에 설치를 허가합니다.", + "create.schematic.tool.print.description.2": "이 도구는 크리에이티브 모드 전용입니다.", + "create.schematic.tool.print.description.3": "", + "create.schematic.tool.flip.description.0": "당신이 보는 면으로 청사진을 뒤집습니다.", + "create.schematic.tool.flip.description.1": "청사진을 보고 [CTRL]-스크롤로 뒤집습니다.", + "create.schematic.tool.flip.description.2": "", + "create.schematic.tool.flip.description.3": "", + + "create.schematics.synchronizing": "동기화 중...", + "create.schematics.uploadTooLarge": "청사진이 너무 큽니다!.", + "create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:", + + "create.gui.schematicTable.title": "청사진 테이블", + "create.gui.schematicTable.availableSchematics": "이용가능한 청사진", + "create.gui.schematicTable.noSchematics": "저장된 청사진 없음", + "create.gui.schematicTable.uploading": "업로딩 중...", + "create.gui.schematicTable.finished": "업로드 완료!", + + "create.gui.schematicannon.title": "청사진 대포", + "create.gui.schematicannon.settingsTitle": "설치 설정", + "create.gui.schematicannon.listPrinter": "재료 목록 프린터", + "create.gui.schematicannon.gunpowderLevel": "화약 용량 %1$s%%", + "create.gui.schematicannon.shotsRemaining": "남은 발포 수 : %1$s", + "create.gui.schematicannon.shotsRemainingWithBackup": "화약 여분: %1$s", + "create.gui.schematicannon.optionEnabled": "현재 활성화 됨", + "create.gui.schematicannon.optionDisabled": "현재 비활성화 됨", + "create.gui.schematicannon.option.dontReplaceSolid": "온전한 블럭을 대체하지 않음", + "create.gui.schematicannon.option.replaceWithSolid": "온전한 블럭을 재료로 대체함", + "create.gui.schematicannon.option.replaceWithAny": "온전한 블럭을 아무 재료로 대체함", + "create.gui.schematicannon.option.replaceWithEmpty": "온전한 블럭을 공기로 채움", + "create.gui.schematicannon.option.skipMissing": "부족한 블럭을 무시하고 진행", + "create.gui.schematicannon.option.skipTileEntities": "타일 엔티티를 보호", + + "create.gui.schematicannon.option.skipMissing.description": "만약 대포가 설치에 필요한 블럭을 찾지 못할 경우,건너뛰고 다음 블럭 설치를 진행합니다.", + "create.gui.schematicannon.option.skipTileEntities.description": "대포가 상자같은 타일 엔티티 설치를 무시합니다.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "대포가 작업구역의 온전한 블럭을 대체하지 않습니다.", + "create.gui.schematicannon.option.replaceWithSolid.description": "대포가 작업구역의 온전한 블럭을 대포가 가진 재료로 대체합니다.", + "create.gui.schematicannon.option.replaceWithAny.description": "대포가 작업구역의 온전한 블럭을 대포가 가진 어떠한 재료로든 대체합니다.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "대포가 작업구역의 블럭들을 제거하고 공기로 채웁니다.", + + "create.schematicannon.status.idle": "휴식", + "create.schematicannon.status.ready": "준비됨", + "create.schematicannon.status.running": "가동 중", + "create.schematicannon.status.finished": "완료", + "create.schematicannon.status.paused": "멈춤", + "create.schematicannon.status.stopped": "중단됨", + "create.schematicannon.status.noGunpowder": "화약이 부족함", + "create.schematicannon.status.targetNotLoaded": "블럭이 준비되지 않음", + "create.schematicannon.status.targetOutsideRange": "목표가 너무 멀리 떨어져 있습니다.", + "create.schematicannon.status.searching": "검색 중", + "create.schematicannon.status.skipping": "건너뛰는 중", + "create.schematicannon.status.missingBlock": "부족한 블럭:", + "create.schematicannon.status.placing": "설치 중", + "create.schematicannon.status.clearing": "블럭을 제거하는 중", + "create.schematicannon.status.schematicInvalid": "청사진 없음", + "create.schematicannon.status.schematicNotPlaced": "청사진이 전개되지 않음", + "create.schematicannon.status.schematicExpired": "청사진 파일이 제거됨", + + "create.gui.filter.blacklist": "블랙리스트", + "create.gui.filter.blacklist.description": "위 목록에 맞지 않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", + "create.gui.filter.whitelist": "화이트리스트", + "create.gui.filter.whitelist.description": "위 목록에 맞는 아이템이면 통과합니다. 빈 화이트리스트는 모두 통과시키지 않습니다.", + "create.gui.filter.respect_data": "상세정보 일치", + "create.gui.filter.respect_data.description": "위 목록 아이템의 내구도, 마법부여, 그리고 다른 NBT와 일치할 때 통과시킵니다.", + "create.gui.filter.ignore_data": "상세정보 무시", + "create.gui.filter.ignore_data.description": "상세정보와 상관없이 아이템 종류만 일치한다면 통과시킵니다.", + + "create.item_attributes.placeable": "설치할 수 있음", + "create.item_attributes.consumable": "먹을 수 있음", + "create.item_attributes.smeltable": "구워질 수 있음", + "create.item_attributes.washable": "세척될 수 있음", + "create.item_attributes.smokable": "훈연될 수 있음", + "create.item_attributes.blastable": "용광로에 녹일 수 있음", + "create.item_attributes.enchanted": "마법부여됨", + "create.item_attributes.damaged": "내구도가 닮", + "create.item_attributes.badly_damaged": "심각하게 내구도가 닮", + "create.item_attributes.not_stackable": "겹쳐질 수 없음", + "create.item_attributes.equipable": "장착할 수 있음", + "create.item_attributes.furnace_fuel": "화로 연료로 쓸 수 있음", + "create.item_attributes.in_tag": "%1$s로 등록됨", + "create.item_attributes.in_item_group": "%1$s탭에 속함", + "create.item_attributes.added_by": "%1$s가 추가함", + + "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", + "create.gui.attribute_filter.selected_attributes": "선택된 속성:", + "create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)", + "create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", + "create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)", + "create.gui.attribute_filter.whitelist_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", + "create.gui.attribute_filter.blacklist": "블랙리스트", + "create.gui.attribute_filter.blacklist.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", + "create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기", + + "create.tooltip.holdKey": "[%1$s]를 눌러 설명보기", + "create.tooltip.holdKeyOrKey": "[%1$s] 또는 [%2$s]를 눌러 설명보기", + "create.tooltip.keyShift": "Shift", + "create.tooltip.keyCtrl": "Ctrl", + + "create.tooltip.speedRequirement": "회전속도 요구: %1$s", + "create.tooltip.speedRequirement.none": "없음", + "create.tooltip.speedRequirement.medium": "보통", + "create.tooltip.speedRequirement.high": "빠름", + + "create.tooltip.stressImpact": "피로도 부하: %1$s", + "create.tooltip.stressImpact.low": "낮음", + "create.tooltip.stressImpact.medium": "보통", + "create.tooltip.stressImpact.high": "높음", + "create.tooltip.stressImpact.overstressed": "과부하됨", + + "create.tooltip.capacityProvided": "피로도 용량: %1$s", + "create.tooltip.capacityProvided.low": "적음", + "create.tooltip.capacityProvided.medium": "보통", + "create.tooltip.capacityProvided.high": "큼", + "create.tooltip.capacityProvided.asGenerator": "(발전기로써)", + "create.tooltip.generationSpeed" : "%1$s %2$s만큼 발전함", + + "create.tooltip.analogStrength": "레드스톤 출력: %1$s/15", + + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Work in progress!", + + "create.tooltip.randomWipDescription0": "Please keep this item away from children.", + "create.tooltip.randomWipDescription1": "A baby panda dies every time you use this item. Every. Time.", + "create.tooltip.randomWipDescription2": "Use at your own risk.", + "create.tooltip.randomWipDescription3": "This is not the item you are looking for, *finger-wiggles* please disperse.", + "create.tooltip.randomWipDescription4": "This item will self-destruct in 10 seconds. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Believe me, it's useless.", + "create.tooltip.randomWipDescription6": "By using this item, you hereby consent to our disclaimer and agree to its terms.", + "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", + "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + + "create.mechanical_mixer.min_ingredients": "최소 재료 종류", + + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Server tick is currently slowed by %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Server tick is slowed by %s ms now >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Server tick is back to regular speed :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: use /killtps stop to bring back server tick to regular speed", + "create.command.killTPSCommand.status.usage.1": "[Create]: use /killtps start to artificially slow down the server tick", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "advancement.create.root": "Create모드에 어서오세요", + "advancement.create.root.desc": "멋진 장치들을 만들 시간입니다!", + "advancement.create.andesite_alloy": "이게.. 합금..?", + "advancement.create.andesite_alloy.desc": "합금이라 볼 수 있나..?.", + + "advancement.create.its_alive": "움직인다!", + "advancement.create.its_alive.desc": "당신의 첫 장치가 움직이는 것을 보세요.", + "advancement.create.shifting_gears": "기어 변환", + "advancement.create.shifting_gears.desc": "크기가 다른 톱니바퀴를 이음으로써 장치의 속도를 바꿀 수 있습니다.", + "advancement.create.overstressed": "과부화", + "advancement.create.overstressed.desc": "직접 물리법칙을 경험해보세요.", + "advancement.create.belt": "공장 가동", + "advancement.create.belt.desc": "두 축에 컨베이어 벨트를 이으세요.", + "advancement.create.wrench": "제 3의 팔", + "advancement.create.wrench.desc": "당신의 장치 건설을 도와줄 렌치를 만드세요.", + "advancement.create.goggles": "피로돋보기", + "advancement.create.goggles.desc": "부품들에 대한 자세한 정보를 가져다 줄 고글울 만드세요.", + "advancement.create.speedometer": "근데 얼마나 빨라?", + "advancement.create.speedometer.desc": "속도 계측기를 가동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", + "advancement.create.stressometer": "근데 얼마나 피로해?", + "advancement.create.stressometer.desc": "피로도 계측기를 가동하세요. 고글을 통해 수치가 얼마나 되는지 보세요.", + + "advancement.create.water_wheel": "수력 동력화", + "advancement.create.water_wheel.desc": "물레방아를 설치하고 회전하게 만드세요!", + "advancement.create.lava_wheel": "불레방아", + "advancement.create.lava_wheel.desc": "이건 일어나지 않아야 하는데...", + "advancement.create.millstone": "나만의 작은 분쇄기", + "advancement.create.millstone.desc": "멧돌을 설치하고 가동시키세요.", + "advancement.create.andesite_casing": "안산암 시대", + "advancement.create.andesite_casing.desc": "안산암, 나무를 이용하여 기본 케이스를 만드세요.", + "advancement.create.mechanical_drill": "굴착기 가동", + "advancement.create.mechanical_drill.desc": "드릴을 설치하고 가동시키세요.", + "advancement.create.press": "'깡!'", + "advancement.create.press.desc": "프레스를 만들고 금속 판을 만들어보세요.", + "advancement.create.polished_rose_quartz": "분홍빛 다이아몬드", + "advancement.create.polished_rose_quartz.desc": "장밋빛 석영을 반대편까지 보이도록 열심히 사포질하세요.", + "advancement.create.electron_tube": "삐-뿌", + "advancement.create.electron_tube.desc": "전지 튜브를 만드세요. 다른 장치들에 유용할겁니다.", + "advancement.create.mechanical_saw": "벌목기 가동", + "advancement.create.mechanical_saw.desc": "톱을 설치하고 가동시키세요.", + "advancement.create.basin": "대야 시스템", + "advancement.create.basin.desc": "대야를 설치하고 아이템을 던져보세요.", + "advancement.create.mixer": "섞고 돌리고 섞고", + "advancement.create.mixer.desc": "대야 위에 믹서를 설치하고, 가동시켜 재료를 만드세요.", + "advancement.create.compact": "자동 압축", + "advancement.create.compact.desc": "대야와 프레스를 이용하서 아이템을 압축시키세요.", + + "advancement.create.expert_lane_1": "고급 안산암 테크", + "advancement.create.expert_lane_1.desc": "현재 제작 중", + + "advancement.create.brass": "진짜 합금", + "advancement.create.brass.desc": "구리와 아연을 가지고 황동을 만드세요.", + "advancement.create.brass_casing": "황동기 시대", + "advancement.create.brass_casing.desc": "새롭게 얻은 황동과 나무를 가지고 업그레이드된 케이스를 만드세요.", + "advancement.create.copper_casing": "구리 시대", + "advancement.create.copper_casing.desc": "구리 판을 이용해 구리 케이스를 만드세요.", + + "advancement.create.crafter": "자동 조합", + "advancement.create.crafter.desc": "기계식 조합기를 설치하고 가동시키세요.", + "advancement.create.deployer": "찌르고, 설치하고, 공격!", + "advancement.create.deployer.desc": "당신의 분신, 배포기를 설치하고 가동시키세요.", + "advancement.create.fist_bump": "하이파이브!", + "advancement.create.fist_bump.desc": "두 배포기를 서로 부딫치게 하세요.", + "advancement.create.crushing_wheel": "한 쌍의 거인들", + "advancement.create.crushing_wheel.desc": "더 많은 재료를 더 효율적으로 갈 분쇄 휠을 만드세요.", + + "advancement.create.chromatic_compound": "양극성 재료", + "advancement.create.chromatic_compound.desc": "색채 혼합물를 만드세요.", + "advancement.create.shadow_steel": "공허를 받아들여라", + "advancement.create.shadow_steel.desc": "무의 금속, 그림자 강철을 생성하세요.", + "advancement.create.refined_radiance": "빛과 질서", + "advancement.create.refined_radiance.desc": "강력한 색채 물질, 정제된 빛을 생성하세요.", + + "advancement.create.extendo_grip": "띠요오옹!", + "advancement.create.extendo_grip.desc": "외장형 연장 팔을 드세요.", + "advancement.create.dual_extendo_grip": "궁극의 띠용!", + "advancement.create.dual_extendo_grip.desc": "쌍으로 외장형 연장 팔을 들어 인간을 뛰어넘은 사거리를 가지세요.", + + "advancement.create.zapper": "나는 스타일있게 건축해", + "advancement.create.zapper.desc": "당신의 건축을 도와줄 멋진 레이저 건, 휴대용 블럭발사기를 만드세요.", + "advancement.create.upgraded_zapper": "화려한 빛이 날 감싸네", + "advancement.create.upgraded_zapper.desc": "완전히 업그레이드된 휴대용 블럭발사기를 만들고 써보세요.", + "advancement.create.symmetry_wand": "빛나는 거울", + "advancement.create.symmetry_wand.desc": "대칭의 지팡이를 만드세요.", + "advancement.create.deforester": "빛나는 벌목", + "advancement.create.deforester.desc": "산림파괴자를 만들고, 숲에게 작별인사를 하세요.", + + "advancement.create.eob": "End of Beta", + "advancement.create.eob.desc": "이후 업데이트를 기다려주세요. 번역:qkrehf2 <3", + + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", + "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", + "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.mechanical_press_activation": "프레스가 가동됨", + "create.subtitle.mechanical_press_item_break": "금속이 부딫힘", + "create.subtitle.blockzapper_place": "블럭이 순간이동됨", + "create.subtitle.blockzapper_confirm": "확인 효과음", + "create.subtitle.blockzapper_deny": "취소 효과음", + "create.subtitle.block_funnel_eat": "깔때기가 흡입함", + + "_comment": "-------------------------] ITEM DESCRIPTIONS [------------------------------------------------", + + "item.create.example_item.tooltip": "EXAMPLE ITEM (just a marker that this tooltip exists)", + "item.create.example_item.tooltip.summary": "A brief description of the item. _Underscores_ highlight a term.", + "item.create.example_item.tooltip.condition1": "When this", + "item.create.example_item.tooltip.behaviour1": "Then this item does this. (behaviours show on shift)", + "item.create.example_item.tooltip.condition2": "And When this", + "item.create.example_item.tooltip.behaviour2": "You can add as many behaviours as you like", + "item.create.example_item.tooltip.control1": "When Ctrl pressed", + "item.create.example_item.tooltip.action1": "These controls are displayed.", + + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", + "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블럭 설치를 똑같이 재현합니다.", + "item.create.wand_of_symmetry.tooltip.condition1": "단축바에 있을 때", + "item.create.wand_of_symmetry.tooltip.behaviour1": "활성화 유지", + "item.create.wand_of_symmetry.tooltip.control1": "땅에다 우클릭", + "item.create.wand_of_symmetry.tooltip.action1": "거울을 _생성하거나_ _옮깁니다_.", + "item.create.wand_of_symmetry.tooltip.control2": "공중에 우클릭", + "item.create.wand_of_symmetry.tooltip.action2": "활성화된 거을을 _제거합니다_.", + "item.create.wand_of_symmetry.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.wand_of_symmetry.tooltip.action3": "_설정_ _창_을 엽니다.", + + "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", + "item.create.handheld_blockzapper.tooltip.summary": "멀리있는 블럭을 교체, 설치하는 놀라운 도구입니다.", + "item.create.handheld_blockzapper.tooltip.control1": "블럭을 보고 좌클릭", + "item.create.handheld_blockzapper.tooltip.action1": "이 도구로 설치할 블럭을 설정합니다.", + "item.create.handheld_blockzapper.tooltip.control2": "블럭을 보고 우클릭", + "item.create.handheld_blockzapper.tooltip.action2": "해당 위치에 설정된 블럭으로 설치하거나 교체합니다.", + "item.create.handheld_blockzapper.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.handheld_blockzapper.tooltip.action3": "_설정_ _창_을 엽니다.", + + "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "_지형경관_을 만들 때 좋은 간편한 도구입니다.", + "item.create.handheld_worldshaper.tooltip.control1": "블럭을 보고 좌클릭", + "item.create.handheld_worldshaper.tooltip.action1": "이 도구로 설치할 블럭을 설정합니다.", + "item.create.handheld_worldshaper.tooltip.control2": "블럭을 보고 우클릭", + "item.create.handheld_worldshaper.tooltip.action2": "해당 위치에 설정된 _브러쉬_ 와 _도구_를 적용합니다.", + "item.create.handheld_worldshaper.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.handheld_worldshaper.tooltip.action3": "_설정_ _창_을 엽니다.", + + "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", + "item.create.tree_fertilizer.tooltip.summary": "일반적인 나무 종류들의 성장을 촉진시킬 강력한 미네랄의 혼합물입니다.", + "item.create.tree_fertilizer.tooltip.condition1": "묘목에 사용했을 때", + "item.create.tree_fertilizer.tooltip.behaviour1": "묘목을 주위 공간과 _상관없이_ 성장시킵니다.", + + "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip.summary": "수 초 만에 나무를 쓰러뜨리는 _경이로운_ _도끼_입니다.", + + "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "띠용! 사용자의 사용 사거리를 크게 증가 시킵니다.", + "item.create.extendo_grip.tooltip.condition1": "다른 손에 있을 때", + "item.create.extendo_grip.tooltip.behaviour1": "반대 손의 아이템의 사용 사거리를 늘립니다.", + + "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _아이템_ 목록에 따라 정확하게 _조정_합니다.", + "item.create.filter.tooltip.condition1": "필터 슬롯에 있을 때", + "item.create.filter.tooltip.behaviour1": "필터 _설정_에 따라 아이템 흐름을 _조정_합니다.", + "item.create.filter.tooltip.condition2": "우클릭", + "item.create.filter.tooltip.behaviour2": "_설정_ _창_을 엽니다.", + + "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "장치의 _입력_과 _출력_을 필터 _속성_ 목록에 따라 정확하게 _조정_합니다.", + "item.create.attribute_filter.tooltip.condition1": "필터 슬롯에 있을 때", + "item.create.attribute_filter.tooltip.behaviour1": "필터 _설정_에 따라 아이템 흐름을 _조정_합니다.", + "item.create.attribute_filter.tooltip.condition2": "우클릭", + "item.create.attribute_filter.tooltip.behaviour2": "_설정_ _창_을 엽니다.", + + "block.create.cocoa_log.tooltip": "COCOA LOG", + "block.create.cocoa_log.tooltip.summary": "코코아 콩 _자동화_를 더 쉽게 해줄 정글 나무 원목입니다.", + "block.create.cocoa_log.tooltip.condition1": "성장했을 때", + "block.create.cocoa_log.tooltip.behaviour1": "모든 면에 코코아 콩을 생성합니다.", + + "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", + "item.create.empty_schematic.tooltip.summary": "조합 재료로 쓰이거나 청사진 테이블에서 청사진을 불러올 때 쓰입니다.", + + "item.create.schematic.tooltip": "SCHEMATIC", + "item.create.schematic.tooltip.summary": "세계에 구조물을 홀로그램으로 불러와 지정하고 설치합니다. 지정된 홀로그램은 청사진 대포의 작업 영역이 됩니다.", + "item.create.schematic.tooltip.condition1": "들고 있을 떄", + "item.create.schematic.tooltip.behaviour1": "UI의 도구로 변경/설치 할 수 있습니다.", + "item.create.schematic.tooltip.control1": "웅크린 상태에서 우클릭", + "item.create.schematic.tooltip.action1": "정확한 _좌표_ 입력을 위한 창을 엽니다.", + + "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", + "item.create.schematic_and_quill.tooltip.summary": "세계에 있는 구조물을 .nbt 파일로 저장할 때 쓰입니다.", + "item.create.schematic_and_quill.tooltip.condition1": "1단계", + "item.create.schematic_and_quill.tooltip.behaviour1": "두 모서리를 우클릭으로 선택하세요.", + "item.create.schematic_and_quill.tooltip.condition2": "2단계", + "item.create.schematic_and_quill.tooltip.behaviour2": "면을 바라보고 _Ctrl-스크롤_하여 크기를 조정하세요. 우클릭을 다시 하면 저장됩니다.", + "item.create.schematic_and_quill.tooltip.control1": "우클릭", + "item.create.schematic_and_quill.tooltip.action1": "모서리 선택 / 저장 확인", + "item.create.schematic_and_quill.tooltip.control2": "Ctrl를 누르고 있을 때", + "item.create.schematic_and_quill.tooltip.action2": "_Scroll_를 이용하여 거리를 조정합니다.", + "item.create.schematic_and_quill.tooltip.control3": "웅크린 상태에서 우클릭", + "item.create.schematic_and_quill.tooltip.action3": "선택 영역을 리셋하고 _삭제_합니다.", + + "block.create.schematicannon.tooltip": "SCHEMATICANNON", + "block.create.schematicannon.tooltip.summary": "장착된 청사진을 바탕으로 블럭들을 발포합니다. 화약을 연료로 사용하고 주변 인벤토리 공간에서 아이템을 사용합니다.", + "block.create.schematicannon.tooltip.control1": "우클릭", + "block.create.schematicannon.tooltip.action1": "창을 엽니다.", + + "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", + "block.create.schematic_table.tooltip.summary": "_빈_ _청사진_에 저장된 청사진을 불러옵니다.", + "block.create.schematic_table.tooltip.condition1": "빈 청사진을 넣을 때", + "block.create.schematic_table.tooltip.behaviour1": "Schematics 폴더에서 선택한 파일을 업로드합니다.", + + "block.create.shaft.tooltip": "SHAFT", + "block.create.shaft.tooltip.summary": "_일직선_으로 _회전_을 전달합니다.", + + "block.create.cogwheel.tooltip": "COGWHEEL", + "block.create.cogwheel.tooltip.summary": " _일직선_이나 _옆_ _톱니바퀴_로 _회전_을 _전달_합니다.", + + "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", + "block.create.large_cogwheel.tooltip.summary": "큰 톱니바퀴입니다. 작은 톱니바퀴와 맞물렸을때, _회전 속도_가 _변합니다_.", + + "block.create.encased_shaft.tooltip": "ENCASED SHAFT", + "block.create.encased_shaft.tooltip.summary": "_일직선_으로 _회전_을 전달합니다. _벽을_ _넘어_ 회전을 보낼 때 유용합니다.", + + "block.create.gearbox.tooltip": "GEARBOX", + "block.create.gearbox.tooltip.summary": "_전후좌우_로 회전을 보냅니다. 한번 더 조합해서 설정을 바꿀 수 있습니다.", + + "item.create.vertical_gearbox.tooltip": " VERTICAL GEARBOX", + "item.create.vertical_gearbox.tooltip.summary": "_상하좌우_로 회전을 보냅니다. 한번 더 조합해서 설정을 바꿀 수 있습니다.", + + "block.create.gearshift.tooltip": "GEARSHIFT", + "block.create.gearshift.tooltip.summary": "연결된 축의 회전 방향을 _변경_합니다.", + "block.create.gearshift.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.gearshift.tooltip.behaviour1": "_출력_ 회전 방향을 _반전_시킵니다.", + + "block.create.clutch.tooltip": "CLUTCH", + "block.create.clutch.tooltip.summary": "연결된 축의 회전을 끄고 킬 수 있습니다.", + "block.create.clutch.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.clutch.tooltip.behaviour1": "출력 방향 회전을 멈춥니다.", + + "block.create.encased_belt.tooltip": "ENCASED_BELT", + "block.create.encased_belt.tooltip.summary": "연결된 다른 _덮힌 벨트_에 회전을 _연결_합니다.", + "block.create.encased_belt.tooltip.condition1": "축에 연결 되었을 때", + "block.create.encased_belt.tooltip.behaviour1": "연결된 축, 기어, 장치들은 _같은_ _회전_ _속도_와 _방향_을 가집니다. 같은 방향으로 _맞대지_ _않아도_ _됩니다_.", + + "block.create.adjustable_pulley.tooltip": "ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "덮힌 벨트와 같은 역할을 가집니다. 또한 입/출력 부분에 설치하고 레드스톤 신호 세기에 따라 _회전_ _속도_를 _조정_할 수 있습니다.", + "block.create.adjustable_pulley.tooltip.condition1": "레드스톤 신호 설정", + "block.create.adjustable_pulley.tooltip.behaviour1": "_입력_ 부분에 설치하면 출력 회전 속도를 _낮추고_ (최대 0.5배), _출력_ 부분에 설치하면 출력 회전 속도를 _증가시킵니다_ (최대 2배).", + + "item.create.belt_connector.tooltip": "BELT CONNECTOR", + "item.create.belt_connector.tooltip.summary": "두 개 이상의 _축_을 벨트로 연결할 수 있습니다. 연결된 축들은 _모두_ _같은_ _속도_와 _방향_을 가집니다. 벨트는 _아이템_이나 _엔티티_를 _옮길_ _수_ _있습니다_.", + "item.create.belt_connector.tooltip.control1": "축에다 우클릭", + "item.create.belt_connector.tooltip.action1": "첫번째 벨트 끝부분을 설정합니다. 두번째 축은 반드시 _수평_이나 _수직_, _대각선_ 방향에 있는 축에 연결해야합니다.", + "item.create.belt_connector.tooltip.control2": "웅크린 상태에서 우클릭", + "item.create.belt_connector.tooltip.action2": "첫번째 벨트 설정을 초기화합니다.", + + "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip.summary": "장치 정보를 착용자의 시야에 띄어주는 안경입니다.", + "item.create.goggles.tooltip.condition1": "장착했을 때", + "item.create.goggles.tooltip.behaviour1": "해당 장치의 _속도_, _피로도_, _용량_을 레벨에 따라 에 따라 색상 UI를 보여줍니다.", + "item.create.goggles.tooltip.condition2": "계측기를 바라볼 때", + "item.create.goggles.tooltip.behaviour2": "계측기가 연결된 네트워크의 _속도_나 _스트레스_의 자세한 정보를 보여줍니다.", + + "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip.summary": "장치 구성에 유용한 도구입니다. 장치를 _회전_, _설정_, _해체_하는 데 쓰입니다.", + "item.create.wrench.tooltip.control1": "장치에 우클릭", + "item.create.wrench.tooltip.action1": "사용자가 바라보는 _면으로_ 혹은 _반대로_ 장치를 돌립니다.", + "item.create.wrench.tooltip.control2": "웅크린 상태에서 우클릭", + "item.create.wrench.tooltip.action2": "_장치_를 _해체_하고 _즉시_ _인벤토리_로 넣습니다.", + + "block.create.creative_motor.tooltip": "CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "회전 속도를 _조정_할 수 있는 장치입니다.", + + "block.create.water_wheel.tooltip": "WATER WHEEL", + "block.create.water_wheel.tooltip.summary": "인접한 _물의_ _흐름_에서 얻은 회전을 제공합니다.", + + "block.create.encased_fan.tooltip": "ENCASED FAN", + "block.create.encased_fan.tooltip.summary": "회전력을 바람으로 전환합니다. 다양한 용도로 사용 가능합니다.", + "block.create.encased_fan.tooltip.condition1": "레드스톤 신호를 받을 때", + "block.create.encased_fan.tooltip.behaviour1": "장치 아래의 _열_을 _회전력_으로 _바꾸어_ 제공합니다. 날개가 아래를 바라보아야 합니다.", + "block.create.encased_fan.tooltip.condition2": "돌려질 때", + "block.create.encased_fan.tooltip.behaviour2": "들어오는 회적 속도에 따라 엔티티를 밀거나 당깁니다.", + "block.create.encased_fan.tooltip.condition3": "특정 블럭을 통해 바람을 보낼 때", + "block.create.encased_fan.tooltip.behaviour3": "공기 흐름에 _액체_ 혹은 _불꽃_ 효과가 _추가_됩니다. 이는 아이템을 _공정_하는데 쓰일 수 있습니다.", + + "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip.summary": "덮힌 환풍기 _앞_에 붙여 환풍기의 효과를 _전방_으로 _확대_합니다.", + + "block.create.hand_crank.tooltip": "HAND CRANK", + "block.create.hand_crank.tooltip.summary": "간단한 회전력의 원천입니다. 플레이어의 _상호작용_이 필요합니다.", + "block.create.hand_crank.tooltip.condition1": "사용될 때", + "block.create.hand_crank.tooltip.behaviour1": "연결된 장치에 _회전력_을 _제공_합니다. 웅크리면 _반대로_ 회전시킵니다.", + + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "_시간의_ _흐름_을 알고 공간을 _꾸미는_ 데 좋은 공예품입니다.", + "block.create.cuckoo_clock.tooltip.condition1": "회전할 때", + "block.create.cuckoo_clock.tooltip.behaviour1": "현재 시각을 보여주고 하루에 두 번 울립니다. 점심과 플레이어가 바로 잘 수 있는 저녁에 울립니다.", + + "block.create.turntable.tooltip": "TURNTABLE", + "block.create.turntable.tooltip.summary": "_회전력_으로 _멀미_를 일으킵니다.", + + "block.create.millstone.tooltip": "MILLSTONE", + "block.create.millstone.tooltip.summary": "투입된 _재료_를 _가는_ 데 좋은 장치입니다. 측면 톱니바퀴나 바닥에 축을 이어 작동합니다. 결과물은 직접 빼내야 합니다.", + "block.create.millstone.tooltip.condition1": "회전 할 때", + "block.create.millstone.tooltip.behaviour1": "옆이나 위에서 투입된 아이템을 _맷돌질_합니다.", + "block.create.millstone.tooltip.condition2": "우클릭할때", + "block.create.millstone.tooltip.behaviour2": "결과물을 직접 꺼냅니다.", + + "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", + "block.create.crushing_wheel.tooltip.summary": "모든 것을 _부숴버리는_ 큰 바퀴입니다.", + "block.create.crushing_wheel.tooltip.condition1": "다른 분쇄 휠과 붙어있을 때", + "block.create.crushing_wheel.tooltip.behaviour1": "다양한 것을 _분쇄_하는 분쇄 기계를 형성합니다. 휠의 이빨이 _같은_ _속력_으로, _반대_ _방향_으로 맞물려야합니다.", + + "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", + "block.create.mechanical_press.tooltip.summary": "아래있는 아이템을 _눌러버리는_ 힘센 피스톤입니다. _지속적인_ _회전력_이 필요합니다.", + "block.create.mechanical_press.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.mechanical_press.tooltip.behaviour1": "_아래 있는_ 아이템을 누르기 시작합니다.", + "block.create.mechanical_press.tooltip.condition2": "컨베이어 벨트 위에 있을 때", + "block.create.mechanical_press.tooltip.behaviour2": "_자동으로_ 벨트 위를 지나가는 아이템을 누릅니다.", + "block.create.mechanical_press.tooltip.condition3": "대야 위에 있을 때", + "block.create.mechanical_press.tooltip.behaviour3": "필요한 재료들이 _들어올_ _때마다_ 아이템을 _압축_시킵니다.", + + "block.create.basin.tooltip": "BASIN", + "block.create.basin.tooltip.summary": "믹서나 프레스와 같이 쓰이는 간편한 _아이템_ _저장소_입니다. 레드스톤 비교기와 호환됩니다.", + + "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", + "block.create.mechanical_mixer.tooltip.summary": "아래있는 아이템을 조합할 혼합기입니다. _지속적인_ _회전력_과 한 칸 아래에 _대야_가 필요합니다.", + "block.create.mechanical_mixer.tooltip.condition1": "대야 위에 있을 때", + "block.create.mechanical_mixer.tooltip.behaviour1": "모든 필요한 아이템이 준비될 때마다 대야 안의 아이템을 섞기 시작합니다.", + "block.create.mechanical_mixer.tooltip.condition2": "렌치를 사용할 때", + "block.create.mechanical_mixer.tooltip.behaviour2": "필요한 조합법의 _최소_ _재료_ _종류_를 설정합니다. 이는 적은 재료로 _원치_ _않은_ _조합법_이 작동되는 것을 막습니다.", + + "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "모든 조합법을 _자동화_할 장치입니다. 조합법대로 여러개를 _격자_로 설치하고, 화살표를 돌려 _한_ _곳으로_ _모이게_ 설정해야합니다.", + "block.create.mechanical_crafter.tooltip.condition1": "회전할 때", + "block.create.mechanical_crafter.tooltip.behaviour1": "모든 조합칸에 있는 아이템들을 조합하기 시작합니다.", + "block.create.mechanical_crafter.tooltip.control1": "전면을 렌치로 조정할 때", + "block.create.mechanical_crafter.tooltip.action1": "각 기계식 조합기의 아이템 이동 방향을 설정합니다. 모든 조합기의 방향은 _하나의_ _최종_ _조합기_로 이동해야하며, 최종 조합기는 조합기 _바깥으로_ 아이템을 운송해야합니다.", + "block.create.mechanical_crafter.tooltip.control2": "측면/후면에서 렌치로 조정할 때", + "block.create.mechanical_crafter.tooltip.action2": "인접한 조합기와 입력 공간을 _연결_합니다. 이를 통해 일일히 아이템을 넣는 노력을 줄일 수 있습니다.", + + "block.create.furnace_engine.tooltip": "FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "_화로의_ _작동_을 필요로 하는 강력한 회전 동력원입니다.", + "block.create.furnace_engine.tooltip.condition1": "작동하는 화로에 붙였을 때", + "block.create.furnace_engine.tooltip.behaviour1": "붙어있는(한칸 띄어져있는) _플라이휠_에 동력을 공급합니다. _용광로_는 _두_ _배_의 화력을 냅니다.", + + "block.create.flywheel.tooltip": "FLYWHEEL", + "block.create.flywheel.tooltip.summary": "붙어있는 _화로_ _엔진_에서 생산된 힘을 안정시키고 _동력화_하는 거대한 금속 바퀴입니다. 화로 엔진으로부터 _한_ _칸_ _떨어져_ 설치해야 합니다.", + "block.create.flywheel.tooltip.condition1": "작동하는 엔진에 붙었을 때", + "block.create.flywheel.tooltip.behaviour1": "엔진의 힘에 따라 연결된 장치에 _회전력_을 제공합니다.", + + "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "움직이는 피스톤, 베어링, 수레, 밧줄 도르래의 인벤토리에서 _아이템을_ _교환하는_ 휴대용 장치입니다.", + "block.create.portable_storage_interface.tooltip.condition1": "움직일 때", + "block.create.portable_storage_interface.tooltip.behaviour1": "고정된 트랜스포저의 _방향에_ _따라_ 아이템을 _주거나_ _받습니다_. 아이템이 이동하는 동안 움직이는 기기는 _멈춥니다_.", + + "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "해당 톱니바퀴의 속도를 _변경_할 수 있는 컨트롤러입니다.", + "block.create.rotation_speed_controller.tooltip.condition1": "큰 톱니바퀴와 연결되었을 때", + "block.create.rotation_speed_controller.tooltip.behaviour1": "들어오는 회전력을 받아, 대상의 속도를 변경합니다. _큰_ _톱니바퀴_가 컨트롤러 위에 있어야합니다.", + + "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", + "block.create.mechanical_piston.tooltip.summary": "피스톤의 업그레이드 버전입니다. 회전력을 사용해 연결된 구조물을 옮깁니다. _피스톤_ _연장_ _축_을 후면에 붙여 이 장치의 사거리를 늘이거나 줄일 수 있습니다. 축이 없다면 움직이지 않습니다. _섀시_나 _슬라임_ _블럭_을 붙여 일직선의 블럭들을 움직일 수 있습니다.", + "block.create.mechanical_piston.tooltip.condition1": "회전될 때", + "block.create.mechanical_piston.tooltip.behaviour1": "붙어있는 구조물을 움직이기 시작합니다. 속도와 방향은 들어오는 회전 속도와 방향에 따라 달라집니다.", + + "block.create.sticky_mechanical_piston.tooltip": "STICKY MECHANICAL PISTON", + "block.create.sticky_mechanical_piston.tooltip.summary": "끈끈이 피스톤의 업그레이드 버전입니다. 회전력을 사용해 연결된 구조물을 옮깁니다. _피스톤_ _연장_ _축_을 후면에 붙여 이 장치의 사거리를 늘이거나 줄일 수 있습니다. 축이 없다면 움직이지 않습니다. _섀시_나 _슬라임_ _블럭_을 붙여 일직선의 블럭들을 움직일 수 있습니다.", + "block.create.sticky_mechanical_piston.tooltip.condition1": "회전될 때", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "붙어있는 구조물을 움직이기 시작합니다. 속도와 방향은 들어오는 회전 속도와 방향에 따라 달라집니다.", + + "block.create.piston_extension_pole.tooltip": "PISTON POLE", + "block.create.piston_extension_pole.tooltip.summary": "기계식 피스톤의 _사거리_를 늘려줍니다.", + "block.create.piston_extension_pole.tooltip.condition1": "기계식 피스톤에 연결했을 때", + "block.create.piston_extension_pole.tooltip.behaviour1": "피스톤의 사거리를 한 블럭 늘립니다.", + + "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", + "block.create.mechanical_bearing.tooltip.summary": "큰 구조물을 _회전_시키거나 _바람으로부터_ 회전력을 얻습니다.", + "block.create.mechanical_bearing.tooltip.condition1": "회전될 때", + "block.create.mechanical_bearing.tooltip.behaviour1": "연결된 블럭들을 돌리기 시작합니다. _섀시_나 _슬라임_ _블럭_을 이용해 더 많은 블럭을 움직이세요.", + "block.create.mechanical_bearing.tooltip.condition2": "레드스톤 신호를 받을 때", + "block.create.mechanical_bearing.tooltip.behaviour2": "붙어있는 구조물의 회전을 이용하여 회전력을 제공합니다. 구조물은 _날개_에 적합한 블럭이 포함되어야합니다. (현재는 _아무_ _양털_이나 가능합니다).", + + "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "현재 _인게임_ _시간_을 알려주는 _시침_, _분침_을 돌리는 업그레이드된 베어링입니다.", + "block.create.clockwork_bearing.tooltip.condition1": "회전될 때", + "block.create.clockwork_bearing.tooltip.behaviour1": "현재 시간에 맞춰 연결된 구조물을 _시침_으로써 돌리기 시작합니다. _다른_ _종류의_ _섀시_가 있다면, _분침_처럼 돌립니다.", + + "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "연속으로 5개의 회전 명령을 내릴 수 있는 _프로그램이_ _가능한_ 장치입니다. 이것으로 베어링, 피스톤, 도르래의 움직임과 타이밍을 정할 수 있습니다. 빠른 속력에는 부정확해질 수 있습니다.", + "block.create.sequenced_gearshift.tooltip.condition1": "레드스톤 신호를 받을 때", + "block.create.sequenced_gearshift.tooltip.behaviour1": "입력 속도에 따른 프로그램된 명령들을 수행하기 시작합니다.", + "block.create.sequenced_gearshift.tooltip.condition2": "우클릭했을 때", + "block.create.sequenced_gearshift.tooltip.behaviour2": "설정 창을 엽니다.", + + "block.create.cart_assembler.tooltip": "CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "레일 위에 설치되었을 때, 지나가는 _광산_ _수레_에 연결된 구조물을 _설치/해체_합니다.", + "block.create.cart_assembler.tooltip.condition1": "레일 위에 설치되었을 때", + "block.create.cart_assembler.tooltip.behaviour1": "신호를 받았을 때 _조립_하고, 그렇지 않으면 _해체_합니다.", + "block.create.cart_assembler.tooltip.condition2": "전동 레일 위에 설치되었을 때", + "block.create.cart_assembler.tooltip.behaviour2": "신호를 받았을 때 _조립_하고 _가속_하지만, 그렇지 않으면 _해체_하고 _멈춥니다_.", + "block.create.cart_assembler.tooltip.condition3": "탐지 레일 위에 설치되었을 때", + "block.create.cart_assembler.tooltip.behaviour3": "해체된 수레를 _조립_하고, 조립된 수레를 _해체_합니다.", + "block.create.cart_assembler.tooltip.condition4": "활성화 레일 위에 설치되었을 때", + "block.create.cart_assembler.tooltip.behaviour4": "신호를 받았을 때 _해체_합니다.", + + "block.create.rope_pulley.tooltip": "ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "_수직으로_ 붙은 구조물을 움직입니다. _섀시_나 _슬라임_ _블럭_을 붙여 일직선의 블럭들을 움직일 수 있습니다.", + "block.create.rope_pulley.tooltip.condition1": "회전될 때", + "block.create.rope_pulley.tooltip.behaviour1": "연결된 구조물을 움직이기 시작합니다. 속도와 방향은 들어오는 회전 속도, 방향에 따라 다릅니다.", + + "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", + "block.create.linear_chassis.tooltip.summary": "연결된 구조물의 이동을 위한 베이스 블럭입니다.", + "block.create.linear_chassis.tooltip.condition1": "움직일 때", + "block.create.linear_chassis.tooltip.behaviour1": "섀시의 _기둥_ _방향_으로 붙어있는 모든 블럭들을 같은 방향으로 옮깁니다. 블럭들은 섀시가 끈끈할 때만 당겨집니다 ([Ctrl]를 누르세요).", + "block.create.linear_chassis.tooltip.condition2": "렌치로 조정할 때", + "block.create.linear_chassis.tooltip.behaviour2": "대상 섀시의 사거리를 조정합니다. 또는 CTRL을 눌러 인접한 모든 섀시의 사거리를 조정합니다.", + "block.create.linear_chassis.tooltip.control1": "슬라임 볼로 우클릭", + "block.create.linear_chassis.tooltip.action1": "대상 면을 끈끈하게 만듭니다. 당겨질 때, 섀시는 연결된 _모든_ _블럭_을 움직이는 방향에 상관없이 당깁니다.", + + "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", + "block.create.radial_chassis.tooltip.summary": "연결된 구조물의 이동을 위한 베이스 블럭입니다.", + "block.create.radial_chassis.tooltip.condition1": "움직일 때", + "block.create.radial_chassis.tooltip.behaviour1": "섀시의 _원_ _방향_으로 붙어있는 모든 블럭들을 같은 방향으로 옮깁니다. 블럭들이 섀시가 끈끈한 면에 붙어있을 때만 움직입니다 ([Ctrl]를 누르세요).", + "block.create.radial_chassis.tooltip.condition2": "렌치로 조정할 때", + "block.create.radial_chassis.tooltip.behaviour2": "대상 섀시의 사거리를 조정합니다. 또는 CTRL을 눌러 인접한 모든 섀시의 사거리를 조정합니다.", + "block.create.radial_chassis.tooltip.control1": "슬라임 볼로 우클릭", + "block.create.radial_chassis.tooltip.action1": "대상 면을 끈끈하게 만듭니다. 당겨질 때, 끈끈한 면에 붙은 _모든_ _블럭_을 움직이게 합니다", + + "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", + "block.create.mechanical_drill.tooltip.summary": "블럭을 _파괴하는_ 데 적합한 장치입니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_drill.tooltip.condition1": "회전될 때", + "block.create.mechanical_drill.tooltip.behaviour1": "고정되어 블럭을 부숩니다. 또한 해당영역의 엔티티에게 피해를 줍니다.", + "block.create.mechanical_drill.tooltip.condition2": "움직일 때", + "block.create.mechanical_drill.tooltip.behaviour2": "드릴이 부딫히는 모든 블럭을 부숩니다.", + + "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", + "block.create.mechanical_harvester.tooltip.summary": "중간 크기의 작물 자동화에 적합한 _작물_ _수확기_입니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_harvester.tooltip.condition1": "움직일 때", + "block.create.mechanical_harvester.tooltip.behaviour1": "칼날에 닿는 모두 자란 작물을 수확하고 _최초_ _성장_ 상태로 변경합니다.", + + "block.create.mechanical_plough.tooltip": "MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "다양한 용도로 쓸 수 있는 쟁기입니다. 기계식 피스톤, 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_plough.tooltip.condition1": "움직일 때", + "block.create.mechanical_plough.tooltip.behaviour1": "횃불, 눈, 레일 등 _통과되는_ 블럭들을 부숩니다. 엔티티를 _해치지_ _않습니다_. _괭이_를 사용한 것처럼 땅도 갑니다.", + + "block.create.mechanical_saw.tooltip": "MECHANICAL mechanical_saw", + "block.create.mechanical_saw.tooltip.summary": "효율적인 _벌목_과 블럭을 _제재_하는데 적합합니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.mechanical_saw.tooltip.condition1": "위를 바라볼 때", + "block.create.mechanical_saw.tooltip.behaviour1": "_제재_와 _석재_ _절단_ 조합법을 떨어진/투입된 아이템에 적용합니다. 결과물이 여러 종류고 필터가 적용이 되지 않았다면, 결과물은 _목록_ _순서_대로 배출됩니다.", + "block.create.mechanical_saw.tooltip.condition2": "옆을 바라볼 때", + "block.create.mechanical_saw.tooltip.behaviour2": "앞에 있는 원목을 자릅니다. 나무의 원목이라면, 나무가 쓰러지면서 아이템을 떨굽니다.", + "block.create.mechanical_saw.tooltip.condition3": "움직일 때", + "block.create.mechanical_saw.tooltip.behaviour3": "톱이 만나는 모든 나무를 벱니다.", + + "block.create.stockpile_switch.tooltip": "stockpile_switch", + "block.create.stockpile_switch.tooltip.summary": "붙어있는 _저장소_에 _여유_ _공간_을 기반으로 레드스톤 신호를 보냅니다.", + "block.create.stockpile_switch.tooltip.condition1": "_최소_ _경계_보다 낮을 경우", + "block.create.stockpile_switch.tooltip.behaviour1": "레드스톤 신호를 보내지 않습니다.", + "block.create.stockpile_switch.tooltip.condition2": "_최초_ _경계_보다 높을 경우", + "block.create.stockpile_switch.tooltip.behaviour2": "최소 경계에 다시 도달할 때까지 레드스톤 신호를 보냅니다.", + "block.create.stockpile_switch.tooltip.control1": "우클릭했을 때", + "block.create.stockpile_switch.tooltip.action1": "설정 창을 엽니다.", + + "block.create.redstone_link.tooltip": "REDSTONE LINK", + "block.create.redstone_link.tooltip.summary": "_무선_ 레드스톤 단말기입니다. 아무 아이템으로 두 개의 _주파수_를 설정할 수 있습니다. 통신거리는 제한되어 있지만, 그래도 충분히 넓습니다.", + "block.create.redstone_link.tooltip.condition1": "신호를 줄 때", + "block.create.redstone_link.tooltip.behaviour1": "같은 주파주의 다른 단말기에서 레드스톤 신호를 받습니다.", + "block.create.redstone_link.tooltip.control1": "아이템을 들고 우클릭", + "block.create.redstone_link.tooltip.action1": "그 아이템으로 주파수를 설정합니다. 주파수는 최대 두가지 아이템 조합으로 이룰 수 있습니다.", + "block.create.redstone_link.tooltip.control2": "웅크린 상태에서 우클릭", + "block.create.redstone_link.tooltip.action2": "수신/발신 모드로 바꿉니다.", + + "block.create.nixie_tube.tooltip": "NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "0에서 15 사이의 _레드스톤_ _신호_를 나타내는 멋진 표시등입니다.", + "block.create.nixie_tube.tooltip.condition1": "레드스톤 신호를 받을 때", + "block.create.nixie_tube.tooltip.behaviour1": "_현재_ 레드스톤 _신호_ _세기_를 표시합니다.", + + "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", + "block.create.redstone_contact.tooltip.summary": "_한_ _쌍_이 _서로_ _바라보고_ 있을 때 레드스톤 신호를 보냅니다. 베어링이나 기계식 피스톤으로 움직여집니다.", + "block.create.redstone_contact.tooltip.condition1": "다른 동형 감지기를 맞댈 때", + "block.create.redstone_contact.tooltip.behaviour1": "레드스톤 신호를 보냅니다.", + "block.create.redstone_contact.tooltip.condition2": "움직일 때", + "block.create.redstone_contact.tooltip.behaviour2": "지나가는 모든 고정된 동형 감지기를 작동시킵니다.", + + "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", + "block.create.adjustable_crate.tooltip.summary": "이 저장소는 용량을 _직접_ _정할_ 수 있습니다. 아무아이템이나 최대 16스택씩 담을 수 있습니다. 레드스톤 비교기와 호환됩니다.", + "block.create.adjustable_crate.tooltip.control1": "우클릭 했을 때", + "block.create.adjustable_crate.tooltip.action1": "창을 엽니다.", + + "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip.summary": "이 상자는 아무 아이템을 _무한히_ 저장합니다. 청사진 대포 옆에 놓을 시 준비물을 _모두_ 공급합니다.", + "block.create.creative_crate.tooltip.condition1": "필터에 아이템을 설정할 시", + "block.create.creative_crate.tooltip.behaviour1": "선택된 아이템을 _무한정_으로 _빼낼_ 수 있습니다. 대신 _들어간_ 아이템은 _삭제_됩니다.", + + "block.create.extractor.tooltip": "EXTRACTOR", + "block.create.extractor.tooltip.summary": "_연결된_ _인벤토리_로부터 아이템을 꺼내 땅에 떨어뜨립니다. 공간이 비지 않았다면 아이템을 떨어뜨리지 않습니다. 개수/필터를 설정 가능합니다.", + "block.create.extractor.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.extractor.tooltip.behaviour1": "추출기를 _멈춥니다_.", + "block.create.extractor.tooltip.condition2": "움직이는 벨트에 연결되었을 때", + "block.create.extractor.tooltip.behaviour2": "추출기는 _황동_ _케이스_가 장착된 _벨트_에서 아이템을 빼낼 수 있습니다. 추출기가 막혔을 때는, 벨트가 _멈춥니다_.", + "block.create.extractor.tooltip.control1": "필터 슬롯을 우클릭할 때", + "block.create.extractor.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 추출기는 필터 설정에 맞춰 아이템을 빼낼 것입니다.", + + "block.create.transposer.tooltip": "TRANSPOSER", + "block.create.transposer.tooltip.summary": "연결된 인벤토리로부터 대상 인벤토리로 아이템을 _바로_ _이동_시킵니다. 개수/필터를 설정 가능합니다.", + "block.create.transposer.tooltip.condition1": "레드스톤 신호를 받았을 때", + "block.create.transposer.tooltip.behaviour1": "트랜스포저를 _멈춥니다_.", + "block.create.transposer.tooltip.condition2": "움직이는 벨트에 연결되었을 때", + "block.create.transposer.tooltip.behaviour2": "트랜스포저는 _황동_ _케이스_가 장착된 _벨트_에서 아이템을 빼낼 수 있습니다. 추출기가 막혔을 때는, 벨트가 _멈춥니다_.", + "block.create.transposer.tooltip.control1": "필터 슬롯을 우클릭할 때", + "block.create.transposer.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 트랜스포저는 필터 설정에 맞춰 아이템을 빼낼 것입니다.", + + "block.create.deployer.tooltip": "DEPLOYER", + "block.create.deployer.tooltip.summary": " _때리고_, _사용하고_ _작동시킵니다_. 이 장치는 _플레이어_를 가능한 한 _흉내내려할_ _것입니다_. 주변 인벤토리에서 아이템을 쓰거나 넣을 수 있습니다. 필터로 사용하는 아이템을 설정할 수 있습니다.", + "block.create.deployer.tooltip.condition1": "회전될 때", + "block.create.deployer.tooltip.behaviour1": "팔을 늘려 한 칸앞에 있는 공간에서 행동합니다.", + "block.create.deployer.tooltip.condition2": "렌치로 우클릭", + "block.create.deployer.tooltip.behaviour2": "_펀치_ _모드_로 바꿉니다. 이 상태에서는 배포기가 아이템을 가지고 _부수거나_ _때리려고_ 할 것입니다.", + + "block.create.linked_extractor.tooltip": "LINKED EXTRACTOR", + "block.create.linked_extractor.tooltip.summary": "_연결된_ _인벤토리_로부터 아이템을 꺼내 땅에 떨어뜨립니다. 공간이 비지 않았다면 아이템을 떨어뜨리지 않습니다. 개수/필터를 설정 가능합니다. 레드스톤 링크를 통해 _무선으로_ 컨트롤 될 수 있습니다.", + "block.create.linked_extractor.tooltip.condition1": "레드스톤 링크 신호를 받았을 때", + "block.create.linked_extractor.tooltip.behaviour1": "추출기를 _멈춥니다_.", + "block.create.linked_extractor.tooltip.control1": "필터 슬롯을 우클릭할 때", + "block.create.linked_extractor.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 추출기는 필터 설정에 맞춰 아이템을 빼낼 것입니다.", + "block.create.linked_extractor.tooltip.control2": "아이템을 들고 주파수 슬롯을 우클릭", + "block.create.linked_extractor.tooltip.action2": "그 아이템으로 주파수를 설정합니다. _같은_ _주파수_의 레드스톤 링크가 신호를 보낸다면, 추출기는 멈출 것입니다.", + + "block.create.linked_transposer.tooltip": "LINKED TRANSPOSER", + "block.create.linked_transposer.tooltip.summary": "연결된 인벤토리로부터 대상 인벤토리로 아이템을 _바로_ _이동_시킵니다. 개수/필터를 설정 가능합니다. 레드스톤 링크를 통해 _무선으로_ 컨트롤 될 수 있습니다.", + "block.create.linked_transposer.tooltip.condition1": "레드스톤 링크 신호를 받았을 때", + "block.create.linked_transposer.tooltip.behaviour1": "트랜스포저를 _멈춥니다_.", + "block.create.linked_transposer.tooltip.control1": "필터 슬롯을 우클릭할 때", + "block.create.linked_transposer.tooltip.action1": "현재 들고있는 아이템의 개수 혹은 필터 틀로 필터를 정합니다. 트랜스포저는 필터 설정에 맞춰 아이템을 빼낼 것입니다.", + "block.create.linked_transposer.tooltip.control2": "아이템을 들고 주파수 슬롯을 우클릭", + "block.create.linked_transposer.tooltip.action2": "그 아이템으로 주파수를 설정합니다. _같은_ _주파수_의 레드스톤 링크가 신호를 보낸다면, 트랜스포저는 멈출 것입니다.", + + "block.create.funnel.tooltip": "FUNNEL", + "block.create.funnel.tooltip.summary": "들어오는 아이템을 가능하면 _연결된_ _인벤토리_에 넣습니다. _벨트_ _위_의 아이템도 끌어올 수 있습니다.", + "block.create.funnel.tooltip.condition1": "움직이는 벨트위에 있을 때", + "block.create.funnel.tooltip.behaviour1": "_벨트_의 _중간_, _끝부분_에서 아이템을 끌어올 수 있습니다. 중간에 설치된 깔때기가 _정체_되었을 땐, 벨트가 _멈춥니다_.", + + "block.create.belt_tunnel.tooltip": "BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "벽을 통과하는 컨베이어 벨트를 _꾸미는_ 옵션 중 하나입니다. 벨트는 _황동_ _케이스_가 장착되어 있어야합니다. 터널은 다른 벨트 라인의 터널과 _동기화_되어 모든 터널이 _같은_ _타이밍_에 아이템을 들어오게 만들 수 있습니다. [Ctrl를 누르세요]", + "block.create.belt_tunnel.tooltip.control1": "전면에 렌치로 우클릭", + "block.create.belt_tunnel.tooltip.action1": "동기화 모드를 킵니다. 동기화된 터널은 다른 동기화된 터널들이 아이템을 인식할 때까지 아이템을 통과시키지 않습니다.", + "block.create.belt_tunnel.tooltip.control2": "륵면을 우클릭", + "block.create.belt_tunnel.tooltip.action2": "터널 측면에 창문이 있다면 창문 셔터를 조절합니다.", + + "block.create.brass_casing.tooltip": "BRASS CASING", + "block.create.brass_casing.tooltip.summary": "다양한 용도가 있는 단단한 기계 케이스입니다. 꾸미는 용도로도 사용 가능합니다.", + "block.create.brass_casing.tooltip.condition1": "컨베이어 벨트에 사용할 때", + "block.create.brass_casing.tooltip.behaviour1": "벨트 밑 부분에 황동 케이스를 씌웁니다. 이 상태에선 _벨트_ _터널_, _추출기_, _깔대기_, _트랜스포저_를 벨트 _측면_, _바닥면_에 연결할 수 있습니다.", + + "block.create.belt_observer.tooltip": "BELT OBSERVER", + "block.create.belt_observer.tooltip.summary": "컨베이어 벨트위를 _지나가는_ _엔티티_나 _아이템_을 감지합니다. 렌치를 이용해 _감지시_ _행동_을 바꿉니다. 필터를 설정할 수 있습니다.", + "block.create.belt_observer.tooltip.condition1": "감지 모드", + "block.create.belt_observer.tooltip.behaviour1": "감지기 앞에 아이템이 _지나가는_ _동안_ 레드스톤 신호를 줍니다.", + "block.create.belt_observer.tooltip.condition2": "펄스 모드", + "block.create.belt_observer.tooltip.behaviour2": "감지기 앞에 아이템이 _지나갈_ _때_ 레드스톤 신호를 _1틱_ 줍니다.", + "block.create.belt_observer.tooltip.condition3": "사출 모드", + "block.create.belt_observer.tooltip.behaviour3": "옆으로 아이템을 _밀어냅니다_. 벨트나 밀어내는 공간이 _정체_되어 있다면, 아이템은 감지기 앞에서 _멈춥니다_.", + "block.create.belt_observer.tooltip.condition4": "분리 모드", + "block.create.belt_observer.tooltip.behaviour4": "아이템의 _수_를 _반으로_ _나누어_ 반은 벨트 옆으로 내보냅니다.", + + "block.create.pulse_repeater.tooltip": "PULSE REPEATER", + "block.create.pulse_repeater.tooltip.summary": "_1틱_의 레드스톤 신호를 보내는 간단한 리피터입니다.", + + "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", + "block.create.adjustable_repeater.tooltip.summary": "최대 30분까지 _딜레이_를 설정할 수 있는 업그레이드된 _레드스톤_ _리피터_입니다.", + + "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "최대 30분까지 _딜레이_를 설정할 수 있는 _펄스_ _리피터_입니다.", + + "block.create.analog_lever.tooltip": "ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "레드스톤 _신호_ _세기_를 자세히 _조정_할 수 있는 레버입니다.", + + "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "레드스톤 신호로 끄고 켤 수 있는 _레버_입니다.", + + "block.create.powered_latch.tooltip": "POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "레드스톤 신호로 컨트롤 할 수 있는 _레버_입니다. 후면에서 들어오는 신호는 레버를 키고, 측면에서 들어오는 신호는 레버를 초기화합니다.", + + "block.create.speedometer.tooltip": "SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "연결된 장치의 _회전_ _속도_를 _계측_하고 _나타냅니다_. 레드스톤 비교기와 호환됩니다.", + "block.create.speedometer.tooltip.condition1": "회전될 때", + "block.create.speedometer.tooltip.behaviour1": "속도에 따라 색깔을 나타냅니다. _초록색_은 _느림_을, _파랑색_은 _보통_, _보라색_은 _빠른_ _속도_를 나타냅니다. 몇몇 장치들은 작동하기 위해 일정수준 이상의 속도가 필요합니다.", + + "block.create.stressometer.tooltip": "STRESSOMETER", + "block.create.stressometer.tooltip.summary": "연결된 네트워크의 _전체_ _피로도_ _수치_를 _계측_하고 _나타냅니다_. 레드스톤 비교기와 호환됩니다.", + "block.create.stressometer.tooltip.condition1": "회전될 때", + "block.create.stressometer.tooltip.behaviour1": "피로도에 따라 색깔을 나타냅니다. _과부화된_ _네트워크_는 움직이는 것을 멈춥니다. 과부하는 네트워크에 _추가_ _피로도_ _용량_을 가진 장치를 설치하면 해결됩니다. ", + + "tool.create.sand_paper.tooltip": "SAND PAPER", + "tool.create.sand_paper.tooltip.summary": "재료를 _사포질_ 하기위한 거친 종이입니다. 배포기를 통해 자동으로 쓰일 수 있습니다.", + "tool.create.sand_paper.tooltip.condition1": "사용할 때", + "tool.create.sand_paper.tooltip.behaviour1": "_반대_ _손_에 있는, 혹은 _바닥에_ _있는_ 아이템을 사포질 합니다.", + + "item.create.super_glue.tooltip": "SUPER GLUE", + "item.create.super_glue.tooltip.summary": "블럭 사이에 풀칠하면, 절대 떨어지지 않습니다.", + "item.create.super_glue.tooltip.condition1": "사용했을 때", + "item.create.super_glue.tooltip.behaviour1": "선택한 블럭의 면을 _끈끈하게_ 만듭니다. 끈끈한 면에 붙은 다른 블럭은 기계식 피스톤, 베어링 등에 _같이_ _움직이게_ 됩니다.", + "item.create.super_glue.tooltip.condition2": "다른 손에 들고 있을 때", + "item.create.super_glue.tooltip.behaviour2": "블럭을 설치할 때 그것이 _설치된_ _곳_에 _자동으로_ 풀칠합니다.", + + "item.create.refined_radiance.tooltip": "REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "_흡수된_ _빛_으로 제련된 색채 혼합물입니다.", + + "item.create.shadow_steel.tooltip": "SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "_공허_에서 제련된 색채 혼합물입니다.", + + "item.create.crafter_slot_cover.tooltip": "SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "기계 조합기에서 _빈_ _슬롯_을 표시하기 위해 쓰입니다. 조합기들은 정사각형 모양을 형성할 필요는 없습니다. 재료가 서로 대각선인 조합법이있을 때 유용합니다.", + + "tool.create.shadow_steel.tooltip": "SHADOW STEEL TOOLS", + "tool.create.shadow_steel.tooltip.summary": "블럭, 엔티티에서 나오는 아이템을 _없애버리는_ 빠르고 강력한 도구입니다. _약탈_ 마법부여에 따라 몬스터은 _더_ _많은_ _경험치_를 줍니다.", + + "tool.create.blazing.tooltip": "BLAZING TOOLS", + "tool.create.blazing.tooltip.summary": "이 도구는 블럭을 _녹이고_ 몬스터에게 _불_을 붙입니다. _지옥_에서는 내구도가 닳지 않습니다.", + + "tool.create.rose_quartz.tooltip": "ROSE QUARTZ TOOLS", + "tool.create.rose_quartz.tooltip.summary": "이 도구를 사용하면 _도구의_ _사거리_와 _다른_ _손_ _사거리_가 증가합니다.", + + "itemGroup.create": "Create" +} From a28b6bbdc3d932a82ccb5be15f23f03b47c5a64e Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Fri, 11 Sep 2020 23:50:34 -0400 Subject: [PATCH 04/36] Overhaul mechanical saw rendering - Saws no longer use "RUNNING" blockstate - Sawblade animates based on input speed - Saws properly stop animating when inactive --- .../create/blockstates/mechanical_saw.json | 70 +++---------- .../create/models/item/mechanical_saw.json | 2 +- .../com/simibubi/create/AllBlockPartials.java | 9 +- .../jei/category/animations/AnimatedSaw.java | 9 +- .../actors/SawMovementBehaviour.java | 12 +++ .../contraptions/components/saw/SawBlock.java | 9 -- .../components/saw/SawGenerator.java | 3 +- .../components/saw/SawRenderer.java | 67 +++++++++++- .../components/saw/SawTileEntity.java | 11 -- .../structureMovement/Contraption.java | 5 - .../mechanicalArm/ArmInteractionPoint.java | 5 +- .../blade_horizontal_active.json | 19 ++++ .../blade_horizontal_inactive.json | 7 ++ .../blade_horizontal_reversed.json | 7 ++ .../mechanical_saw/blade_vertical_active.json | 18 ++++ .../blade_vertical_inactive.json | 7 ++ .../blade_vertical_reversed.json | 7 ++ .../block/mechanical_saw/horizontal.json | 10 -- .../mechanical_saw/horizontal_inactive.json | 6 -- .../models/block/mechanical_saw/item.json | 98 ++++++++++++++++++ .../models/block/mechanical_saw/vertical.json | 10 -- .../mechanical_saw/vertical_inactive.json | 6 -- .../create/textures/block/saw_reversed.png | Bin 0 -> 4854 bytes .../textures/block/saw_reversed.png.mcmeta | 6 ++ 24 files changed, 279 insertions(+), 124 deletions(-) create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_active.json create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_inactive.json create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_reversed.json create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_active.json create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_inactive.json create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_reversed.json delete mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/horizontal_inactive.json create mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/item.json delete mode 100644 src/main/resources/assets/create/models/block/mechanical_saw/vertical_inactive.json create mode 100644 src/main/resources/assets/create/textures/block/saw_reversed.png create mode 100644 src/main/resources/assets/create/textures/block/saw_reversed.png.mcmeta diff --git a/src/generated/resources/assets/create/blockstates/mechanical_saw.json b/src/generated/resources/assets/create/blockstates/mechanical_saw.json index 8dc2adc8f..bad1bc6d7 100644 --- a/src/generated/resources/assets/create/blockstates/mechanical_saw.json +++ b/src/generated/resources/assets/create/blockstates/mechanical_saw.json @@ -1,94 +1,48 @@ { "variants": { - "axis_along_first=false,facing=down,running=false": { - "model": "create:block/mechanical_saw/vertical_inactive", - "x": 180 - }, - "axis_along_first=true,facing=down,running=false": { - "model": "create:block/mechanical_saw/vertical_inactive", - "x": 180, - "y": 90 - }, - "axis_along_first=false,facing=up,running=false": { - "model": "create:block/mechanical_saw/vertical_inactive" - }, - "axis_along_first=true,facing=up,running=false": { - "model": "create:block/mechanical_saw/vertical_inactive", - "y": 90 - }, - "axis_along_first=false,facing=north,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive", - "y": 180 - }, - "axis_along_first=true,facing=north,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive", - "y": 180 - }, - "axis_along_first=false,facing=south,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive" - }, - "axis_along_first=true,facing=south,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive" - }, - "axis_along_first=false,facing=west,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive", - "y": 90 - }, - "axis_along_first=true,facing=west,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive", - "y": 90 - }, - "axis_along_first=false,facing=east,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive", - "y": 270 - }, - "axis_along_first=true,facing=east,running=false": { - "model": "create:block/mechanical_saw/horizontal_inactive", - "y": 270 - }, - "axis_along_first=false,facing=down,running=true": { + "axis_along_first=false,facing=down": { "model": "create:block/mechanical_saw/vertical", "x": 180 }, - "axis_along_first=true,facing=down,running=true": { + "axis_along_first=true,facing=down": { "model": "create:block/mechanical_saw/vertical", "x": 180, "y": 90 }, - "axis_along_first=false,facing=up,running=true": { + "axis_along_first=false,facing=up": { "model": "create:block/mechanical_saw/vertical" }, - "axis_along_first=true,facing=up,running=true": { + "axis_along_first=true,facing=up": { "model": "create:block/mechanical_saw/vertical", "y": 90 }, - "axis_along_first=false,facing=north,running=true": { + "axis_along_first=false,facing=north": { "model": "create:block/mechanical_saw/horizontal", "y": 180 }, - "axis_along_first=true,facing=north,running=true": { + "axis_along_first=true,facing=north": { "model": "create:block/mechanical_saw/horizontal", "y": 180 }, - "axis_along_first=false,facing=south,running=true": { + "axis_along_first=false,facing=south": { "model": "create:block/mechanical_saw/horizontal" }, - "axis_along_first=true,facing=south,running=true": { + "axis_along_first=true,facing=south": { "model": "create:block/mechanical_saw/horizontal" }, - "axis_along_first=false,facing=west,running=true": { + "axis_along_first=false,facing=west": { "model": "create:block/mechanical_saw/horizontal", "y": 90 }, - "axis_along_first=true,facing=west,running=true": { + "axis_along_first=true,facing=west": { "model": "create:block/mechanical_saw/horizontal", "y": 90 }, - "axis_along_first=false,facing=east,running=true": { + "axis_along_first=false,facing=east": { "model": "create:block/mechanical_saw/horizontal", "y": 270 }, - "axis_along_first=true,facing=east,running=true": { + "axis_along_first=true,facing=east": { "model": "create:block/mechanical_saw/horizontal", "y": 270 } diff --git a/src/generated/resources/assets/create/models/item/mechanical_saw.json b/src/generated/resources/assets/create/models/item/mechanical_saw.json index 1f3cf51dd..2811abfa3 100644 --- a/src/generated/resources/assets/create/models/item/mechanical_saw.json +++ b/src/generated/resources/assets/create/models/item/mechanical_saw.json @@ -1,3 +1,3 @@ { - "parent": "create:block/mechanical_saw/horizontal" + "parent": "create:block/mechanical_saw/item" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 9bbae39ee..a04c4a9eb 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -45,7 +45,14 @@ public class AllBlockPartials { MECHANICAL_MIXER_HEAD = get("mechanical_mixer/head"), MECHANICAL_CRAFTER_LID = get("mechanical_crafter/lid"), MECHANICAL_CRAFTER_ARROW = get("mechanical_crafter/arrow"), MECHANICAL_CRAFTER_BELT_FRAME = get("mechanical_crafter/belt"), - MECHANICAL_CRAFTER_BELT = get("mechanical_crafter/belt_animated"), GAUGE_DIAL = get("gauge/dial"), + MECHANICAL_CRAFTER_BELT = get("mechanical_crafter/belt_animated"), + SAW_BLADE_HORIZONTAL_ACTIVE = get("mechanical_saw/blade_horizontal_active"), + SAW_BLADE_HORIZONTAL_INACTIVE = get("mechanical_saw/blade_horizontal_inactive"), + SAW_BLADE_HORIZONTAL_REVERSED = get("mechanical_saw/blade_horizontal_reversed"), + SAW_BLADE_VERTICAL_ACTIVE = get("mechanical_saw/blade_vertical_active"), + SAW_BLADE_VERTICAL_INACTIVE = get("mechanical_saw/blade_vertical_inactive"), + SAW_BLADE_VERTICAL_REVERSED = get("mechanical_saw/blade_vertical_reversed"), + GAUGE_DIAL = get("gauge/dial"), GAUGE_INDICATOR = get("gauge/indicator"), GAUGE_HEAD_SPEED = get("gauge/speedometer/head"), GAUGE_HEAD_STRESS = get("gauge/stressometer/head"), BEARING_TOP = get("bearing/top"), DRILL_HEAD = get("mechanical_drill/head"), HARVESTER_BLADE = get("mechanical_harvester/blade"), diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java index be4b7a1f3..12d0f3469 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSaw.java @@ -1,6 +1,7 @@ package com.simibubi.create.compat.jei.category.animations; import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -29,12 +30,16 @@ public class AnimatedSaw extends AnimatedKinetics { .render(); GuiGameElement.of(AllBlocks.MECHANICAL_SAW.getDefaultState() - .with(SawBlock.FACING, Direction.UP) - .with(SawBlock.RUNNING, true)) + .with(SawBlock.FACING, Direction.UP)) .rotateBlock(0, 0, 0) .scale(scale) .render(); + GuiGameElement.of(AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE) + .rotateBlock(0, -90, -90) + .scale(scale) + .render(); + RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java index 39e060e39..7f0e1a778 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.contraptions.components.actors; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.saw.SawBlock; +import com.simibubi.create.content.contraptions.components.saw.SawRenderer; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.utility.BlockHelper; @@ -9,6 +11,7 @@ import com.simibubi.create.foundation.utility.TreeCutter.Tree; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.tags.BlockTags; @@ -16,6 +19,8 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { @@ -62,6 +67,13 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { world.addEntity(entity); } + @Override + @OnlyIn(value = Dist.CLIENT) + public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + SawRenderer.renderInContraption(context, ms, msLocal, buffer); + } + @Override protected DamageSource getDamageSource() { return SawBlock.damageSourceSaw; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java index 56bbebc51..c7dade697 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java @@ -35,13 +35,10 @@ import net.minecraft.world.World; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SawBlock extends DirectionalAxisKineticBlock implements ITE { - - public static final BooleanProperty RUNNING = BooleanProperty.create("running"); public static DamageSource damageSourceSaw = new DamageSource("create.mechanical_saw").setDamageBypassesArmor(); public SawBlock(Properties properties) { super(properties); - setDefaultState(getDefaultState().with(RUNNING, false)); } @Override @@ -53,12 +50,6 @@ public class SawBlock extends DirectionalAxisKineticBlock implements ITE builder) { - builder.add(RUNNING); - super.fillStateContainer(builder); - } - @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.SAW.create(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawGenerator.java index d369bec96..3883a3787 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawGenerator.java @@ -33,10 +33,9 @@ public class SawGenerator extends SpecialBlockStateGen { String orientation = state.get(SawBlock.FACING) .getAxis() .isVertical() ? "vertical" : "horizontal"; - String active = state.get(SawBlock.RUNNING) ? "" : "_inactive"; return prov.models() - .getExistingFile(prov.modLoc(path + orientation + active)); + .getExistingFile(prov.modLoc(path + orientation)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index daf43ee93..e467d3c2e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -7,9 +7,10 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.*; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -34,11 +35,46 @@ public class SawRenderer extends SafeTileEntityRenderer { @Override protected void renderSafe(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + renderBlade(te, ms, buffer, light); renderItems(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); renderShaft(te, ms, buffer, light, overlay); } + protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){ + BlockState blockState = te.getBlockState(); + SuperByteBuffer superBuffer; + AllBlockPartials partial; + float speed = te.getSpeed(); + + ms.push(); + + if(SawBlock.isHorizontal(blockState)) { + if(speed > 0) { + partial = AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE; + } else if(speed < 0) { + partial = AllBlockPartials.SAW_BLADE_HORIZONTAL_REVERSED; + } else { + partial = AllBlockPartials.SAW_BLADE_HORIZONTAL_INACTIVE; + } + } else { + if(te.getSpeed() > 0) { + partial = AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE; + } else if(speed < 0) { + partial = AllBlockPartials.SAW_BLADE_VERTICAL_REVERSED; + } else { + partial = AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE; + } + + if(!blockState.get(SawBlock.AXIS_ALONG_FIRST_COORDINATE)) + MatrixStacker.of(ms).centre().rotateY(90).unCentre(); + } + superBuffer = partial.renderOnDirectional(blockState); + superBuffer.light(light).renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); + + ms.pop(); + } + protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), ms, buffer.getBuffer(RenderType.getSolid()), light); @@ -96,4 +132,33 @@ public class SawRenderer extends SafeTileEntityRenderer { return KineticTileEntityRenderer.shaft(KineticTileEntityRenderer.getRotationAxisOf(te)); } + public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, + IRenderTypeBuffer buffer) { + MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; + BlockState state = context.state; + SuperByteBuffer superBuffer; + Direction facing = state.get(SawBlock.FACING); + + if(SawBlock.isHorizontal(state)) { + superBuffer = AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE.renderOn(state); + } else { + superBuffer = AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE.renderOn(state); + } + + for (MatrixStack m : matrixStacks) { + MatrixStacker.of(m) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)); + if(!SawBlock.isHorizontal(state)) + MatrixStacker.of(m).rotateZ(state.get(SawBlock.AXIS_ALONG_FIRST_COORDINATE) ? 0 : 90); + MatrixStacker.of(m).unCentre(); + } + + superBuffer + .light(msLocal.peek() + .getModel()) + .renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index e824c1ebc..70b3cce8a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.contraptions.components.saw; -import static com.simibubi.create.content.contraptions.components.saw.SawBlock.RUNNING; - import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -86,15 +84,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return false; } - @Override - public void onSpeedChanged(float prevSpeed) { - super.onSpeedChanged(prevSpeed); - boolean shouldRun = Math.abs(getSpeed()) > 1 / 64f; - boolean running = getBlockState().get(RUNNING); - if (shouldRun != running && !destroyed) - world.setBlockState(pos, getBlockState().with(RUNNING, shouldRun), 2 | 16); - } - @Override public void write(CompoundNBT compound, boolean clientPacket) { compound.put("Inventory", inventory.serializeNBT()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index fadd0ef75..4c1169d55 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -394,8 +394,6 @@ public abstract class Contraption { protected Pair capture(World world, BlockPos pos) { BlockState blockstate = world.getBlockState(pos); - if (AllBlocks.MECHANICAL_SAW.has(blockstate)) - blockstate = blockstate.with(SawBlock.RUNNING, true); if (blockstate.getBlock() instanceof ChestBlock) blockstate = blockstate.with(ChestBlock.TYPE, ChestType.SINGLE); if (AllBlocks.ADJUSTABLE_CRATE.has(blockstate)) @@ -657,9 +655,6 @@ public abstract class Contraption { state = state.updatePostPlacement(face, world.getBlockState(targetPos.offset(face)), world, targetPos, targetPos.offset(face)); - if (AllBlocks.MECHANICAL_SAW.has(state)) - state = state.with(SawBlock.RUNNING, false); - BlockState blockState = world.getBlockState(targetPos); if (blockState.getBlockHardness(world, targetPos) == -1 || (state.getCollisionShape(world, targetPos) .isEmpty() diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 451537bee..5e139d946 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.components.crafter.MechanicalCra import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; @@ -217,8 +218,8 @@ public abstract class ArmInteractionPoint { @Override boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { - return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.RUNNING) - && state.get(SawBlock.FACING) == Direction.UP; + return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP + && ((KineticTileEntity)reader.getTileEntity(pos)).getSpeed() != 0; } } diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_active.json b/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_active.json new file mode 100644 index 000000000..bcd0eedb6 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_active.json @@ -0,0 +1,19 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", + "textures": { + "stonecutter_saw": "minecraft:block/stonecutter_saw", + "stonecutter_saw_reversed" : "create:block/saw_reversed" + }, + "parent": "create:block/block", + "elements": [ + { + "name": "Blade", + "from": [ 1, 8, 11 ], + "to": [ 15, 8.062, 18 ], + "faces": { + "up": { "texture": "#stonecutter_saw", "uv": [ 1, 9, 15, 16 ], "rotation": 180 }, + "down": { "texture": "#stonecutter_saw_reversed", "uv": [ 1, 9, 15, 16 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_inactive.json b/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_inactive.json new file mode 100644 index 000000000..d51cbecbe --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_inactive.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/mechanical_saw/blade_horizontal_active", + "textures": { + "stonecutter_saw": "create:block/static_saw", + "stonecutter_saw_reversed": "create:block/static_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_reversed.json b/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_reversed.json new file mode 100644 index 000000000..02382bef0 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/blade_horizontal_reversed.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/mechanical_saw/blade_horizontal_active", + "textures": { + "stonecutter_saw": "create:block/saw_reversed", + "stonecutter_saw": "minecraft:block/stonecutter_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_active.json b/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_active.json new file mode 100644 index 000000000..b540ed652 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_active.json @@ -0,0 +1,18 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", + "textures": { + "stonecutter_saw": "minecraft:block/stonecutter_saw", + "stonecutter_saw_reversed" : "create:block/saw_reversed" + }, + "elements": [ + { + "name": "Saw", + "from": [ 0, 8, 11 ], + "to": [ 16, 8, 19 ], + "faces": { + "up": { "texture": "#stonecutter_saw", "uv": [ 0, 8, 16, 16 ], "rotation": 180 }, + "down": { "texture": "#stonecutter_saw_reversed", "uv": [ 0, 8, 16, 16 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_inactive.json b/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_inactive.json new file mode 100644 index 000000000..627943027 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_inactive.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/mechanical_saw/blade_vertical_active", + "textures": { + "stonecutter_saw": "create:block/static_saw", + "stonecutter_saw_reversed": "create:block/static_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_reversed.json b/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_reversed.json new file mode 100644 index 000000000..56a353a4f --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/blade_vertical_reversed.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/mechanical_saw/blade_vertical_active", + "textures": { + "stonecutter_saw": "create:block/saw_reversed", + "stonecutter_saw_reversed": "minecraft:block/stonecutter_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/horizontal.json b/src/main/resources/assets/create/models/block/mechanical_saw/horizontal.json index 7750da4cb..a21d7706b 100644 --- a/src/main/resources/assets/create/models/block/mechanical_saw/horizontal.json +++ b/src/main/resources/assets/create/models/block/mechanical_saw/horizontal.json @@ -5,7 +5,6 @@ "slit": "create:block/mechanical_saw_top", "gearbox_top": "create:block/gearbox_top", "encased_belt": "create:block/encased_belt", - "stonecutter_saw": "minecraft:block/stonecutter_saw", "gearbox": "create:block/gearbox", "andesite_casing_short": "create:block/andesite_casing_short" }, @@ -66,15 +65,6 @@ "south": { "texture": "#slit", "uv": [ 1, 7, 15, 9 ] } } }, - { - "name": "Blade", - "from": [ 1, 8, 11 ], - "to": [ 15, 8.062, 18 ], - "faces": { - "up": { "texture": "#stonecutter_saw", "uv": [ 1, 9, 15, 16 ], "rotation": 180 }, - "down": { "texture": "#stonecutter_saw", "uv": [ 1, 9, 15, 16 ] } - } - }, { "name": "Back", "from": [ 14, 2, 0 ], diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/horizontal_inactive.json b/src/main/resources/assets/create/models/block/mechanical_saw/horizontal_inactive.json deleted file mode 100644 index d776f1cd9..000000000 --- a/src/main/resources/assets/create/models/block/mechanical_saw/horizontal_inactive.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/mechanical_saw/horizontal", - "textures": { - "stonecutter_saw": "create:block/static_saw" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/item.json b/src/main/resources/assets/create/models/block/mechanical_saw/item.json new file mode 100644 index 000000000..79d79bb00 --- /dev/null +++ b/src/main/resources/assets/create/models/block/mechanical_saw/item.json @@ -0,0 +1,98 @@ +{ + "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", + "textures": { + "particle": "create:block/gearbox_top", + "slit": "create:block/mechanical_saw_top", + "stonecutter_saw": "create:block/static_saw", + "gearbox_top": "create:block/gearbox_top", + "encased_belt": "create:block/encased_belt", + "gearbox": "create:block/gearbox", + "andesite_casing_short": "create:block/andesite_casing_short" + }, + "parent": "create:block/block", + "elements": [ + { + "name": "Bottom", + "from": [ 0, 0, 0 ], + "to": [ 16, 2, 12 ], + "faces": { + "north": { "texture": "#andesite_casing_short", "uv": [ 0, 14, 16, 16 ] }, + "east": { "texture": "#andesite_casing_short", "uv": [ 4, 14, 16, 16 ] }, + "south": { "texture": "#encased_belt", "uv": [ 0, 14, 16, 16 ] }, + "west": { "texture": "#andesite_casing_short", "uv": [ 0, 14, 12, 16 ] }, + "up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }, + "down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] } + } + }, + { + "name": "Top", + "from": [ 0, 14, 0 ], + "to": [ 16, 16, 12 ], + "faces": { + "north": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 6 ] }, + "east": { "texture": "#andesite_casing_short", "uv": [ 4, 4, 16, 6 ] }, + "south": { "texture": "#encased_belt", "uv": [ 0, 0, 16, 2 ] }, + "west": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 12, 6 ] }, + "up": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] }, + "down": { "texture": "#andesite_casing_short", "uv": [ 0, 4, 16, 16 ] } + } + }, + { + "name": "Back", + "from": [ 0, 2, 0 ], + "to": [ 2, 14, 2 ], + "faces": { + "north": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] }, + "east": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] }, + "south": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] }, + "west": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] } + } + }, + { + "name": "Inner", + "from": [ 0, 2, 2 ], + "to": [ 16, 14, 11 ], + "faces": { + "east": { "texture": "#andesite_casing_short", "uv": [ 2, 6, 14, 15 ], "rotation": 90 }, + "south": { "texture": "#gearbox_top", "uv": [ 0, 2, 16, 14 ] }, + "west": { "texture": "#andesite_casing_short", "uv": [ 2, 6, 14, 15 ], "rotation": 270 } + } + }, + { + "name": "SawSlit", + "from": [ 1, 7, 11.062 ], + "to": [ 15, 9, 11.062 ], + "faces": { + "south": { "texture": "#slit", "uv": [ 1, 7, 15, 9 ] } + } + }, + { + "name": "Blade", + "from": [ 1, 8, 11 ], + "to": [ 15, 8.062, 18 ], + "faces": { + "up": { "texture": "#stonecutter_saw", "uv": [ 1, 9, 15, 16 ], "rotation": 180 }, + "down": { "texture": "#stonecutter_saw", "uv": [ 1, 9, 15, 16 ] } + } + }, + { + "name": "Back", + "from": [ 14, 2, 0 ], + "to": [ 16, 14, 2 ], + "faces": { + "north": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] }, + "east": { "texture": "#gearbox_top", "uv": [ 14, 2, 16, 14 ] }, + "south": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] }, + "west": { "texture": "#gearbox_top", "uv": [ 0, 2, 2, 14 ] } + } + }, + { + "name": "Back", + "from": [ 2, 2, 1 ], + "to": [ 14, 14, 2 ], + "faces": { + "north": { "texture": "#gearbox", "uv": [ 2, 2, 14, 14 ] } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/vertical.json b/src/main/resources/assets/create/models/block/mechanical_saw/vertical.json index 931155c43..f63bcea80 100644 --- a/src/main/resources/assets/create/models/block/mechanical_saw/vertical.json +++ b/src/main/resources/assets/create/models/block/mechanical_saw/vertical.json @@ -3,7 +3,6 @@ "textures": { "gearbox_top": "create:block/gearbox_top", "gearbox": "create:block/gearbox", - "stonecutter_saw": "minecraft:block/stonecutter_saw", "andesite_casing_short": "create:block/andesite_casing_short", "mechanical_saw_top": "create:block/mechanical_saw_top", "particle": "create:block/mechanical_saw_top" @@ -57,15 +56,6 @@ "up": { "texture": "#gearbox_top", "uv": [ 0, 14, 16, 16 ], "rotation": 270 } } }, - { - "name": "Saw", - "from": [ 0, 11, 8 ], - "to": [ 16, 19, 8 ], - "faces": { - "north": { "texture": "#stonecutter_saw", "uv": [ 0, 8, 16, 16 ] }, - "south": { "texture": "#stonecutter_saw", "uv": [ 0, 8, 16, 16 ] } - } - }, { "name": "Top", "from": [ 0, 12, 2 ], diff --git a/src/main/resources/assets/create/models/block/mechanical_saw/vertical_inactive.json b/src/main/resources/assets/create/models/block/mechanical_saw/vertical_inactive.json deleted file mode 100644 index 2260d2c6c..000000000 --- a/src/main/resources/assets/create/models/block/mechanical_saw/vertical_inactive.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "create:block/mechanical_saw/vertical", - "textures": { - "stonecutter_saw": "create:block/static_saw" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/saw_reversed.png b/src/main/resources/assets/create/textures/block/saw_reversed.png new file mode 100644 index 0000000000000000000000000000000000000000..eef262f2ab7e62fc1ef1535a9c19293a5318c3ca GIT binary patch literal 4854 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3&sb|kqCg#YstJ_1*OJPsG|J>S5`_lL}qrn_fs z&peN+rINBTxd4HP06W;f{&~Yc_$s6IP@8rcB9X5;>d2E{dVIge^E1Wz{QUe8zkd1Y zdMIBXWG?w1p9?xa_fM|3-yZmyBdwpWhyM8__s>A-d*J7*_{{$M`Eik4&+qkAKLZVW zf05Dk$EB{%K>Ks!vy{(w{a)7l=6{EuE+|ntjfqOmR#J)l%;mF!@_tXg2R{?{um#>{ zX+^_(=`$Ds`DuIKk&QnF=%*mJ_SxF6(f|JKm*D65xn6#WrF;z}fBZpezg#ch)8ro~ zE}!25mw)`F!7d`n~q^QWELDG{o0aUH(#hq{7E0lA z{$5LZ<{i&`J9TD0iCc4GFtYofU*W%f_*Y)x-t8euvA=Nw7pyBgvRH;^&VO-9;0`~g1>)yi!i=FSFZT<;L8rQfhso;(-sYrMZDl!Bhm0ECFS8;ePW3`9w# zB}q|p)|7~2Cqa{y=Th?`1F5xqSY)oHNDi8N_PKdR({pcbS+ZY-n@B_}Qk2|KUnHy6 z27a`5Ff?0fwY4TqA+|Q!lpd+XA*_dfa@c@#LX4H-K6 z7-P;HCKFA@n%qCRvhpgcuC`?9>T9gIfzPhHZP~i}9($gA%7G@196kMvGc5&!DXdyE zF|}^P<^^lF+8|OLA zY^AAsruc`$a??u$Dr5-=07&c6=H?;;?REmsMglRk)is0yUUqULlW~oF^M<^UJ(9Wa zJi6-LrCu^QmqNe03}rr{I|%x_8q9nsbM* zZqLmH+qzj9JbV*2vIC$gi(ik<{)@*oKD~B6=SL z1|%O~PV&=p9qG2nt`n3p5OX3*E=h3MQ^=7&EP7U2a%$PS^rUvGn&e0Ta4!X_WYa4} zJGag2)YA{!mAlI6J=_c#rp1iMOs5c?J0a^hAwD^_rLEETnvXv;(jXw{_b>}zIGbiw zSMu6`yd<-r4N00JDzmwnXL}1g#*X|_jMXmG+!G9T7A4X&AIVhfA?0jjq(PY4G2$U>9YW3VRPnn7;9bZji74Ul-b$m zROfa}YbmIk*``Sgh!0$O`#SDuKmm9gJ^~{xAp92aDSB7e3+rEJo!M?Q6rZJ71`%fl z7Rn?Yp#jTfxv~&LhM$?*PL(2wR3hZPR;PrB9{Y=@8`=Qkl+sWe4Oc7uNEZf4i0=S;@ zt?v`F2PhG4zmHp>lqt{ac*d8*g-~L{R3{sY4b*nLw&1AMuC{%1Cr!IGAI;qeb;f$h z&bV;Ty$cE;k8|Gg#se0|SN8?`*-+?#x)dm&WO&fQ3c&=o-BF1$n@2w&ZDAfbEy*5~ zo@dpK#{tqX+%-aqDjaw@;y zs?Q#dau?PQf&5!!Hvj2?*!3{P1;>(78nRbCYdbBlP|VhjVS_hAPjL_2f!aqZZpQ8nAAz7YTKH0s0{A;VFiI}I5SP)IG2o22gojnh zqWC-MZ(hQOnE{+mJ=DFd3|o%6jTk`kQZo>Fh5$ld!Bb%?D5T;CRfN)w!CN05np*cM zV$d@6l%}iAU3blz(L4+bf?&sEPZ+5v)NfoI1c*#t}7)!El54idU35o%`< zT#ySQnAzk&Z>tYXQJ^KkAqaS&mr^O;8xS1kRWx}J!3A~03cED$O>I98%hj5O14p#` z4P}bBgTRho?77C0U9cOIVy4D9LeT1Uqs$o8{l<3aZiR9MdQTe~Z$^%Ivr@gkOw~Dq z{DGGp?}-9xDhVZ(7d?t|PJ`=vMcvrb2FDjr9we3(!OP%k799OzBBfj>mS!<~b`9cb zHdW~WkQG>WLKZU>w` z$9=Yk5TZhW_9S<&$Gpwp;t5(#hUrH<8>R)}x1w^xN(aU0wp~ar0SuZN)`4_VY%rEB za0@98qz+dx5=|4}!~rBi1S(0zo}EIbCN(35G+gvrViG9GObef(PDL`=g1b)|Hfq*; za&uz>Egvb^PQ}hv+VJKk6jOzY7W4qX5lMLKMq@ZbTk(v_L}Y=+>;PV{*KpYO9!?-x>H zK!NMrIpdh#S(w8G+YbqqPbaD_QL@8%^=&QOZ|A_uux0H8ZU`u4G+QQIQcL+ zo7|_-fb=MnK9IrVoPdd%xLEJRqGtzzA&mqIZED`9jzDFiapq>RgS@^(z3+e}gy{xd zJ-dL2-C-!&0M-kvhzUIiA56yL@Np$X_LUy+&ho-U85CAk=NAh;Uc0 zi`HC$2k_U~vCfi%S7@OW=pKnWWV7CG=zeFx&&74Hkan=6806guTn>TuId$8bj}aNs!uMm-26L~FDZ)SEl#>RMov6+w&? z0~(z-l+WrTj6ye=R%bn=4prw4dN*%8T+!JJ;}<`?0L2ho0!P4bQN{}y9M*u=Hu2`T zHdOa?QmSu@+uL+E{J0r*thr0G?AgVu_Qh|1952ixH%c(6&}4OZKBQp_v58Q zbfBxn;?qA#7*2N-1~`I;FHRrdNQ~}gbUJ}CHcg6X@qU+<-wBol()^HXn|^YZrngy} zjnP@I9lR>2Rt!4EQZ#yZh^Zb=Yei>9<0g;_JGr#Er;>*;aP>%`ZgW2J)-2Z`+fOHO zm*;6+byC#{r(n=a!cozTd8>!0CB`mjaN%h=*in>nxuv6%GYi-WIK{hDs2HGSqwdQ> zdyr&e<9(Ij>ckIq`oIa{l2Pfq>cSj0Ka0e~?vTw-bWS_iHuw`pgUr?iInart9RG>8 zVv!0To#VE;5XD|C+Tnutsi;Gk9YkZ_XsPhUXV81kfx-f8qH&y6X-&@}CD|#B)*iNy z?1!xbvjV~(+S<{zO{76J9b;xo^7NehT+8$J42>o)4v4Z%@0^@Jg$msCt<=UPz3fOz z(C9{Rbc%4`wy5Lc{sE8ej}ZwH!D@&r%1A8eCZ|*@lYg)ttqH77{sS|ZpW>}VHPZ2! zc}!5=_rS-)gWP7Cu#Iajg`$DgYC7a#WiPd%8CMeAK+z6p9)4tmBiZ)Y7h2YjsifzD zE+F~E0stt(W0r-o#+zYyXj9-F$e$S~C^iCSt;hu&bcBpYc9EKiB+$dgChq|Ug#i$- z1}sQ1(fasv4H!{?lfJG{;2}?)*Cf4d;SOkNJLZSKZaf`82)Cu#7^B2LUyL*7V+{cj2 z=Ku4v`cvPG)e#IoMjN9nO=~3BS5@$Jaf4e7}qGEbqEMN1u{68Q>F%=a_C-#2dsjo0iUb zpE%4)l0tk=JZ{hhi66NxyZpwv=&-;u!$u}GPaGx|iybU?Fe@1<@icKnQ8mgJvMwu} zw>Ybn8f)E?zc7^7R?=LjHG(*nkU$b5WYkbb1s0;TYowS+(Rs|nKkWFEw3ovD zX(FP7h|*aWD|VH}oLLsX75I%g#+a_L@5Q6bV#XMR5MYc+*Vc8#wr!`^1pvj}LkK4` z0C?|Vt%cS)nPqXMlzQhn1Hd#**!LaFvY_ia^nHK2-_-QHt}G}fuoUSM52|31o&L>( z7-N+OGX5_fT^9R%J_sQ|Yn|o6Fbv7_=G^BZJF1MfY?aa8S_ZF+V; zkSwVF)=P^;DbhtA)b<08cXb-3%{TLPKe%<5Fv*$avk53NrVJD20iUn?12aVN_}1D# c@qibMA9^5m0}P2U3jhEB07*qoM6N<$g72?E#{d8T literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/saw_reversed.png.mcmeta b/src/main/resources/assets/create/textures/block/saw_reversed.png.mcmeta new file mode 100644 index 000000000..a328ca58d --- /dev/null +++ b/src/main/resources/assets/create/textures/block/saw_reversed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} From 5342beacaf0868bcd71b08f8ae4007e5dc4dadb3 Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 12 Sep 2020 15:47:27 -0400 Subject: [PATCH 05/36] Conditional moving saw operation - Saws are inactive while moving backwards - Vertical moving saws can now damage entities --- .../components/actors/SawMovementBehaviour.java | 12 +++++++++++- .../contraptions/components/saw/SawRenderer.java | 16 ++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java index 7f0e1a778..fea857ff2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java @@ -27,7 +27,8 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { @Override public boolean isActive(MovementContext context) { - return SawBlock.isHorizontal(context.state); + return !VecHelper.isVecPointingTowards(context.relativeMotion, context.state.get(SawBlock.FACING) + .getOpposite()); } @Override @@ -35,6 +36,15 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { return new Vec3d(context.state.get(SawBlock.FACING).getDirectionVec()).scale(.65f); } + @Override + public void visitNewPosition(MovementContext context, BlockPos pos) { + super.visitNewPosition(context, pos); + if(!SawBlock.isHorizontal(context.state) && context.data.contains("BreakingPos")) { + context.data.remove("BreakingPos"); + context.stall = false; + } + } + @Override public boolean canBreak(World world, BlockPos breakingPos, BlockState state) { return super.canBreak(world, breakingPos, state) && SawTileEntity.isSawable(state); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index e467d3c2e..3d7e5ab7b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -139,10 +139,22 @@ public class SawRenderer extends SafeTileEntityRenderer { SuperByteBuffer superBuffer; Direction facing = state.get(SawBlock.FACING); + boolean horizontal = SawBlock.isHorizontal(state); + boolean backwards = VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()); + boolean moving = context.getAnimationSpeed() != 0; + boolean shouldAnimate = (context.contraption.stalled && horizontal) + || (!context.contraption.stalled && !backwards && moving); + if(SawBlock.isHorizontal(state)) { - superBuffer = AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE.renderOn(state); + if(shouldAnimate) + superBuffer = AllBlockPartials.SAW_BLADE_HORIZONTAL_ACTIVE.renderOn(state); + else + superBuffer = AllBlockPartials.SAW_BLADE_HORIZONTAL_INACTIVE.renderOn(state); } else { - superBuffer = AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE.renderOn(state); + if(shouldAnimate) + superBuffer = AllBlockPartials.SAW_BLADE_VERTICAL_ACTIVE.renderOn(state); + else + superBuffer = AllBlockPartials.SAW_BLADE_VERTICAL_INACTIVE.renderOn(state); } for (MatrixStack m : matrixStacks) { From b89710237db5cd0edc020fd1fe0e273ff34adbf3 Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 12 Sep 2020 18:44:53 -0400 Subject: [PATCH 06/36] Saws check actual verticality in contraptions --- .../components/actors/SawMovementBehaviour.java | 8 +++++++- .../content/contraptions/components/saw/SawRenderer.java | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java index fea857ff2..d4a36f042 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java @@ -16,6 +16,7 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.tags.BlockTags; import net.minecraft.util.DamageSource; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -39,7 +40,12 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { @Override public void visitNewPosition(MovementContext context, BlockPos pos) { super.visitNewPosition(context, pos); - if(!SawBlock.isHorizontal(context.state) && context.data.contains("BreakingPos")) { + Vec3d facingVec = new Vec3d(context.state.get(SawBlock.FACING).getDirectionVec()); + facingVec = VecHelper.rotate(facingVec, context.rotation.x, context.rotation.y, context.rotation.z); + facingVec.normalize(); + + Direction closestToFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); + if(closestToFacing.getAxis().isVertical() && context.data.contains("BreakingPos")) { context.data.remove("BreakingPos"); context.stall = false; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 3d7e5ab7b..078863d50 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -25,6 +25,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.Rotation; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; public class SawRenderer extends SafeTileEntityRenderer { @@ -139,7 +140,13 @@ public class SawRenderer extends SafeTileEntityRenderer { SuperByteBuffer superBuffer; Direction facing = state.get(SawBlock.FACING); - boolean horizontal = SawBlock.isHorizontal(state); + Vec3d facingVec = new Vec3d(context.state.get(SawBlock.FACING).getDirectionVec()); + facingVec = VecHelper.rotate(facingVec, context.rotation.x, context.rotation.y, context.rotation.z); + facingVec.normalize(); + + Direction closestToFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); + + boolean horizontal = closestToFacing.getAxis().isHorizontal(); boolean backwards = VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()); boolean moving = context.getAnimationSpeed() != 0; boolean shouldAnimate = (context.contraption.stalled && horizontal) From 677363f1b82a0867d476597680e1f145479d70a7 Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Tue, 13 Oct 2020 00:10:23 -0400 Subject: [PATCH 07/36] Update rendering --- .../contraptions/components/actors/SawMovementBehaviour.java | 3 +-- .../content/contraptions/components/saw/SawRenderer.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java index d4a36f042..9add6f26f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SawMovementBehaviour.java @@ -41,8 +41,7 @@ public class SawMovementBehaviour extends BlockBreakingMovementBehaviour { public void visitNewPosition(MovementContext context, BlockPos pos) { super.visitNewPosition(context, pos); Vec3d facingVec = new Vec3d(context.state.get(SawBlock.FACING).getDirectionVec()); - facingVec = VecHelper.rotate(facingVec, context.rotation.x, context.rotation.y, context.rotation.z); - facingVec.normalize(); + facingVec = context.rotation.apply(facingVec); Direction closestToFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); if(closestToFacing.getAxis().isVertical() && context.data.contains("BreakingPos")) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 078863d50..5c6478a38 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -70,7 +70,7 @@ public class SawRenderer extends SafeTileEntityRenderer { if(!blockState.get(SawBlock.AXIS_ALONG_FIRST_COORDINATE)) MatrixStacker.of(ms).centre().rotateY(90).unCentre(); } - superBuffer = partial.renderOnDirectional(blockState); + superBuffer = partial.renderOnDirectionalSouth(blockState); superBuffer.light(light).renderInto(ms, buffer.getBuffer(RenderType.getCutoutMipped())); ms.pop(); @@ -141,8 +141,7 @@ public class SawRenderer extends SafeTileEntityRenderer { Direction facing = state.get(SawBlock.FACING); Vec3d facingVec = new Vec3d(context.state.get(SawBlock.FACING).getDirectionVec()); - facingVec = VecHelper.rotate(facingVec, context.rotation.x, context.rotation.y, context.rotation.z); - facingVec.normalize(); + facingVec = context.rotation.apply(facingVec); Direction closestToFacing = Direction.getFacingFromVector(facingVec.x, facingVec.y, facingVec.z); From a7e2d842afa41c52849946408774feac0094876f Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 00:04:23 -0400 Subject: [PATCH 08/36] Specific Enchantment Attribute --- .../logistics/item/filter/ItemAttribute.java | 2 + .../filter/attribute/EnchantAttribute.java | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index fe8dca539..a3283eb3e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -9,6 +9,7 @@ import java.util.function.BiPredicate; import java.util.function.Predicate; import java.util.stream.Collectors; +import com.simibubi.create.content.logistics.item.filter.attribute.EnchantAttribute; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicates; @@ -43,6 +44,7 @@ public interface ItemAttribute { static ItemAttribute standard = register(StandardTraits.DUMMY); static ItemAttribute inTag = register(new InTag(new ResourceLocation("dummy"))); static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); + static ItemAttribute hasEnchant = register(new EnchantAttribute("dummy")); static ItemAttribute addedBy = register(new AddedBy("dummy")); static ItemAttribute register(ItemAttribute attributeType) { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java new file mode 100644 index 000000000..a30548862 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java @@ -0,0 +1,71 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantAttribute implements ItemAttribute { + String enchantName; + + public EnchantAttribute(String enchantName) { + this.enchantName = enchantName; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + ListNBT enchants = extractEnchants(itemStack); + for (int i = 0; i < enchants.size(); i++) { + if(enchants.getCompound(i).getString("id").equals(this.enchantName)) + return true; + } + return false; + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + ListNBT enchants = extractEnchants(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < enchants.size(); i++) { + atts.add(new EnchantAttribute(enchants.getCompound(i).getString("id"))); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "has_enchant"; + } + + @Override + public Object[] getTranslationParameters() { + String something = ""; + Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(enchantName)); + if(enchant != null) { + something = new TranslationTextComponent(enchant.getName()).getString(); + } + return new Object[] { something }; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("id", this.enchantName); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new EnchantAttribute(nbt.getString("id")); + } + + private ListNBT extractEnchants(ItemStack stack) { + CompoundNBT tag = stack.getTag() != null ? stack.getTag() : new CompoundNBT(); + return tag.contains("Enchantments") ? stack.getEnchantmentTagList() : tag.getList("StoredEnchantments", 10); + } +} From 6ff57ca65c85c9cce8875e31c19fe4a7532adb5d Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 00:26:16 -0400 Subject: [PATCH 09/36] Fluid Container Attributes --- .../logistics/item/filter/ItemAttribute.java | 4 + .../attribute/FluidContentsAttribute.java | 83 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index a3283eb3e..3170f104e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -10,6 +10,8 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import com.simibubi.create.content.logistics.item.filter.attribute.EnchantAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.FluidContentsAttribute; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicates; @@ -45,6 +47,7 @@ public interface ItemAttribute { static ItemAttribute inTag = register(new InTag(new ResourceLocation("dummy"))); static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); static ItemAttribute hasEnchant = register(new EnchantAttribute("dummy")); + static ItemAttribute hasFluid = register(new FluidContentsAttribute("dummy")); static ItemAttribute addedBy = register(new AddedBy("dummy")); static ItemAttribute register(ItemAttribute attributeType) { @@ -108,6 +111,7 @@ public interface ItemAttribute { DUMMY(s -> false), PLACEABLE(s -> s.getItem() instanceof BlockItem), CONSUMABLE(ItemStack::isFood), + FLUID_CONTAINER(s -> s.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY).isPresent()), ENCHANTED(ItemStack::isEnchanted), DAMAGED(ItemStack::isDamaged), BADLY_DAMAGED(s -> s.isDamaged() && s.getDamage() / s.getMaxDamage() > 3 / 4f), diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java new file mode 100644 index 000000000..421282b9b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java @@ -0,0 +1,83 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.BucketItem; +import net.minecraft.item.GlassBottleItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; + +public class FluidContentsAttribute implements ItemAttribute { + String fluidName; + + public FluidContentsAttribute(String fluidName) { + this.fluidName = fluidName; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + return extractFluidNames(itemStack).contains(fluidName); + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + List names = extractFluidNames(itemStack); + + List atts = new ArrayList<>(); + for(String name : names) { + atts.add(new FluidContentsAttribute(name)); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "has_fluid"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation fluidResource = new ResourceLocation(fluidName); + Fluid fluid = ForgeRegistries.FLUIDS.getValue(fluidResource); + String trans = ""; + if(fluid != null) + trans = new TranslationTextComponent(fluid.getAttributes().getTranslationKey()).getString(); + return new Object[] {trans}; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("fluidName", this.fluidName); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new FluidContentsAttribute(nbt.getString("fluidName")); + } + + private List extractFluidNames(ItemStack stack) { + List fluids = new ArrayList<>(); + + LazyOptional capability = + stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + + capability.ifPresent((cap) -> { + for(int i = 0; i < cap.getTanks(); i++) { + fluids.add(cap.getFluidInTank(i).getFluid().getRegistryName().toString()); + } + }); + + return fluids; + } +} From c1bb1e64c9b3611a3bd362c5aac9b8ad9e9a55ed Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 00:58:49 -0400 Subject: [PATCH 10/36] Custom Name Attributes --- .../logistics/item/filter/ItemAttribute.java | 3 + .../filter/attribute/ItemNameAttribute.java | 71 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index 3170f104e..8b2bd991c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -11,6 +11,7 @@ import java.util.stream.Collectors; import com.simibubi.create.content.logistics.item.filter.attribute.EnchantAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.FluidContentsAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.ItemNameAttribute; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import org.apache.commons.lang3.StringUtils; @@ -48,6 +49,7 @@ public interface ItemAttribute { static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); static ItemAttribute hasEnchant = register(new EnchantAttribute("dummy")); static ItemAttribute hasFluid = register(new FluidContentsAttribute("dummy")); + static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); static ItemAttribute addedBy = register(new AddedBy("dummy")); static ItemAttribute register(ItemAttribute attributeType) { @@ -113,6 +115,7 @@ public interface ItemAttribute { CONSUMABLE(ItemStack::isFood), FLUID_CONTAINER(s -> s.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY).isPresent()), ENCHANTED(ItemStack::isEnchanted), + RENAMED(ItemStack::hasDisplayName), DAMAGED(ItemStack::isDamaged), BADLY_DAMAGED(s -> s.isDamaged() && s.getDamage() / s.getMaxDamage() > 3 / 4f), NOT_STACKABLE(Predicates.not(ItemStack::isStackable)), diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java new file mode 100644 index 000000000..2f83e648a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/ItemNameAttribute.java @@ -0,0 +1,71 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import com.google.gson.JsonParseException; +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TranslationTextComponent; + +import java.util.ArrayList; +import java.util.List; + +public class ItemNameAttribute implements ItemAttribute { + String itemName; + + public ItemNameAttribute(String itemName) { + this.itemName = itemName; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + return extractCustomName(itemStack).equals(itemName); + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + String name = extractCustomName(itemStack); + + List atts = new ArrayList<>(); + if(name.length() > 0) { + atts.add(new ItemNameAttribute(name)); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "has_name"; + } + + @Override + public Object[] getTranslationParameters() { + return new Object[] { itemName }; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("name", this.itemName); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new ItemNameAttribute(nbt.getString("name")); + } + + private String extractCustomName(ItemStack stack) { + CompoundNBT compoundnbt = stack.getChildTag("display"); + if (compoundnbt != null && compoundnbt.contains("Name", 8)) { + try { + ITextComponent itextcomponent = ITextComponent.Serializer.fromJson(compoundnbt.getString("Name")); + if (itextcomponent != null) { + return itextcomponent.getString(); + } + } catch (JsonParseException ignored) { + } + } + return ""; + } +} From 562abdea3139bbf23f784e4c35a55970ecee54ef Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 01:16:32 -0400 Subject: [PATCH 11/36] Written Book Attributes --- .../logistics/item/filter/ItemAttribute.java | 6 +- .../filter/attribute/BookAuthorAttribute.java | 63 ++++++++++++++++++ .../filter/attribute/BookCopyAttribute.java | 66 +++++++++++++++++++ 3 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookAuthorAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookCopyAttribute.java diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index 8b2bd991c..aee1da7d9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -9,9 +9,7 @@ import java.util.function.BiPredicate; import java.util.function.Predicate; import java.util.stream.Collectors; -import com.simibubi.create.content.logistics.item.filter.attribute.EnchantAttribute; -import com.simibubi.create.content.logistics.item.filter.attribute.FluidContentsAttribute; -import com.simibubi.create.content.logistics.item.filter.attribute.ItemNameAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.*; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import org.apache.commons.lang3.StringUtils; @@ -50,6 +48,8 @@ public interface ItemAttribute { static ItemAttribute hasEnchant = register(new EnchantAttribute("dummy")); static ItemAttribute hasFluid = register(new FluidContentsAttribute("dummy")); static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); + static ItemAttribute bookAuthor = register(new BookAuthorAttribute("dummy")); + static ItemAttribute bookCopy = register(new BookCopyAttribute(-1)); static ItemAttribute addedBy = register(new AddedBy("dummy")); static ItemAttribute register(ItemAttribute attributeType) { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookAuthorAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookAuthorAttribute.java new file mode 100644 index 000000000..44c97ed28 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookAuthorAttribute.java @@ -0,0 +1,63 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import com.google.gson.JsonParseException; +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.item.ItemStack; +import net.minecraft.item.WrittenBookItem; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.text.ITextComponent; + +import java.util.ArrayList; +import java.util.List; + +public class BookAuthorAttribute implements ItemAttribute { + String author; + + public BookAuthorAttribute(String author) { + this.author = author; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + return extractAuthor(itemStack).equals(author); + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + String name = extractAuthor(itemStack); + + List atts = new ArrayList<>(); + if(name.length() > 0) { + atts.add(new BookAuthorAttribute(name)); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "book_author"; + } + + @Override + public Object[] getTranslationParameters() { + return new Object[] {author}; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("author", this.author); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new BookAuthorAttribute(nbt.getString("author")); + } + + private String extractAuthor(ItemStack stack) { + CompoundNBT nbt = stack.getTag(); + if (nbt != null && nbt.contains("author")) { + return nbt.getString("author"); + } + return ""; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookCopyAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookCopyAttribute.java new file mode 100644 index 000000000..e379a3bdc --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/BookCopyAttribute.java @@ -0,0 +1,66 @@ +package com.simibubi.create.content.logistics.item.filter.attribute; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.item.WrittenBookItem; +import net.minecraft.nbt.CompoundNBT; + +import java.util.ArrayList; +import java.util.List; + +public class BookCopyAttribute implements ItemAttribute { + int generation; + + public BookCopyAttribute(int generation) { + this.generation = generation; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + return extractGeneration(itemStack) == generation; + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + int generation = extractGeneration(itemStack); + + List atts = new ArrayList<>(); + if(generation >= 0) { + atts.add(new BookCopyAttribute(generation)); + } + return atts; + } + + @Override + public String getTranslationKey() { + switch(generation){ + case 0: + return "book_copy_original"; + case 1: + return "book_copy_first"; + case 2: + return "book_copy_second"; + default: + return "book_copy_tattered"; + } + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putInt("generation", this.generation); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new BookCopyAttribute(nbt.getInt("generation")); + } + + private int extractGeneration(ItemStack stack) { + CompoundNBT nbt = stack.getTag(); + if (nbt != null && stack.getItem() instanceof WrittenBookItem) { + return nbt.getInt("generation"); + } + return -1; + } +} From 822ca6dad69ea08da1ba8a13153caedb43935b30 Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 01:17:25 -0400 Subject: [PATCH 12/36] Lang --- .../resources/assets/create/lang/en_us.json | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 622a30a18..1cae0dc94 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -840,6 +840,10 @@ "create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "is enchanted", "create.item_attributes.enchanted.inverted": "is unenchanted", + "create.item_attributes.renamed": "has a custom name", + "create.item_attributes.renamed.inverted": "does not have a custom name", + "create.item_attributes.fluid_container": "can hold fluid", + "create.item_attributes.fluid_container.inverted": "cannot hold fluid", "create.item_attributes.damaged": "is damaged", "create.item_attributes.damaged.inverted": "is not damaged", "create.item_attributes.badly_damaged": "is heavily damaged", @@ -856,6 +860,23 @@ "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s", + "create.item_attributes.has_enchant": "is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", + "create.item_attributes.has_fluid": "contains %1$s", + "create.item_attributes.has_fluid.inverted": "does not contain %1$s", + "create.item_attributes.has_name": "has the custom name %1$s", + "create.item_attributes.has_name.inverted": "does not have the custom name %1$s", + "create.item_attributes.book_author": "was authored by %1$s", + "create.item_attributes.book_author.inverted": "was not authored by %1$s", + "create.item_attributes.book_copy_original": "is an original", + "create.item_attributes.book_copy_original.inverted": "is not an original", + "create.item_attributes.book_copy_first": "is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "is not a first-generation copy", + "create.item_attributes.book_copy_second": "is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", + "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", From 6d51a6c7305723e690e45d9c9cca703d7e2f481b Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 01:25:29 -0400 Subject: [PATCH 13/36] Astral Sorcery Attributes --- .../resources/assets/create/lang/en_us.json | 9 ++- .../logistics/item/filter/ItemAttribute.java | 8 ++ .../AstralSorceryAmuletAttribute.java | 81 +++++++++++++++++++ .../AstralSorceryAttunementAttribute.java | 76 +++++++++++++++++ .../AstralSorceryCrystalAttribute.java | 65 +++++++++++++++ .../AstralSorceryPerkGemAttribute.java | 65 +++++++++++++++ 6 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 1cae0dc94..4b9cb7861 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -876,7 +876,14 @@ "create.item_attributes.book_copy_second.inverted": "is not a second-generation copy", "create.item_attributes.book_copy_tattered": "is a tattered mess", "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", - + "create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index aee1da7d9..8c369cbc7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -10,6 +10,10 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import com.simibubi.create.content.logistics.item.filter.attribute.*; +import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAmuletAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryAttunementAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryCrystalAttribute; +import com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery.AstralSorceryPerkGemAttribute; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import org.apache.commons.lang3.StringUtils; @@ -48,6 +52,10 @@ public interface ItemAttribute { static ItemAttribute hasEnchant = register(new EnchantAttribute("dummy")); static ItemAttribute hasFluid = register(new FluidContentsAttribute("dummy")); static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); + static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1)); + static ItemAttribute astralAttunement = register(new AstralSorceryAttunementAttribute("dummy")); + static ItemAttribute astralCrystal = register(new AstralSorceryCrystalAttribute("dummy")); + static ItemAttribute astralPerkGem = register(new AstralSorceryPerkGemAttribute("dummy")); static ItemAttribute bookAuthor = register(new BookAuthorAttribute("dummy")); static ItemAttribute bookCopy = register(new BookCopyAttribute(-1)); static ItemAttribute addedBy = register(new AddedBy("dummy")); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java new file mode 100644 index 000000000..f2e8ab062 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAmuletAttribute.java @@ -0,0 +1,81 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; + +public class AstralSorceryAmuletAttribute implements ItemAttribute { + String enchName; + int enchType; + + public AstralSorceryAmuletAttribute(String enchName, int enchType) { + this.enchName = enchName; + this.enchType = enchType; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + for (INBT trait : extractTraitList(itemStack)) { + if(((CompoundNBT) trait).getString("ench").equals(this.enchName) + && ((CompoundNBT)trait).getInt("type") == this.enchType) + return true; + } + return false; + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + ListNBT traits = extractTraitList(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < traits.size(); i++) { + atts.add(new AstralSorceryAmuletAttribute( + traits.getCompound(i).getString("ench"), + traits.getCompound(i).getInt("type"))); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_amulet"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation traitResource = new ResourceLocation(enchName); + String something = ""; + + Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(enchName)); + if(enchant != null) { + something = new TranslationTextComponent(enchant.getName()).getString(); + } + + if(enchType == 1) something = "existing " + something; + + return new Object[] { something }; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("enchName", this.enchName); + nbt.putInt("enchType", this.enchType); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new AstralSorceryAmuletAttribute(nbt.getString("enchName"), nbt.getInt("enchType")); + } + + private ListNBT extractTraitList(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getList("amuletEnchantments", 10) : new ListNBT(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java new file mode 100644 index 000000000..3a621969a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryAttunementAttribute.java @@ -0,0 +1,76 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; + +import java.util.ArrayList; +import java.util.List; + +public class AstralSorceryAttunementAttribute implements ItemAttribute { + String constellationName; + + public AstralSorceryAttunementAttribute(String constellationName) { + this.constellationName = constellationName; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + CompoundNBT nbt = extractAstralNBT(itemStack); + String constellation = nbt.contains("constellation") ? nbt.getString("constellation") : nbt.getString("constellationName"); + + // Special handling for shifting stars + ResourceLocation itemResource = itemStack.getItem().getRegistryName(); + if(itemResource != null && itemResource.toString().contains("shifting_star_")) { + constellation = itemResource.toString().replace("shifting_star_", ""); + } + + return constellation.equals(constellationName); + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + CompoundNBT nbt = extractAstralNBT(itemStack); + String constellation = nbt.contains("constellation") ? nbt.getString("constellation") : nbt.getString("constellationName"); + + // Special handling for shifting stars + ResourceLocation itemResource = itemStack.getItem().getRegistryName(); + if(itemResource != null && itemResource.toString().contains("shifting_star_")) { + constellation = itemResource.toString().replace("shifting_star_", ""); + } + + List atts = new ArrayList<>(); + if(constellation.length() > 0) { + atts.add(new AstralSorceryAttunementAttribute(constellation)); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_constellation"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation constResource = new ResourceLocation(constellationName); + String something = new TranslationTextComponent(String.format("%s.constellation.%s", constResource.getNamespace(), constResource.getPath())).getString(); + return new Object[] { something }; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("constellation", this.constellationName); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new AstralSorceryAttunementAttribute(nbt.getString("constellation")); + } + + private CompoundNBT extractAstralNBT(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery") : new CompoundNBT(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java new file mode 100644 index 000000000..0500eea82 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryCrystalAttribute.java @@ -0,0 +1,65 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; + +import java.util.ArrayList; +import java.util.List; + +public class AstralSorceryCrystalAttribute implements ItemAttribute { + String traitName; + + public AstralSorceryCrystalAttribute(String traitName) { + this.traitName = traitName; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + for (INBT trait : extractTraitList(itemStack)) { + if(((CompoundNBT) trait).getString("property").equals(this.traitName)) + return true; + } + return false; + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + ListNBT traits = extractTraitList(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < traits.size(); i++) { + atts.add(new AstralSorceryCrystalAttribute(traits.getCompound(i).getString("property"))); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_crystal"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation traitResource = new ResourceLocation(traitName); + String something = new TranslationTextComponent(String.format("crystal.property.%s.%s.name", traitResource.getNamespace(), traitResource.getPath())).getString(); + return new Object[] { something }; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("property", this.traitName); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new AstralSorceryCrystalAttribute(nbt.getString("property")); + } + + private ListNBT extractTraitList(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getCompound("crystalProperties").getList("attributes", 10) : new ListNBT(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java new file mode 100644 index 000000000..ab4671c1f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/astralsorcery/AstralSorceryPerkGemAttribute.java @@ -0,0 +1,65 @@ +package com.simibubi.create.content.logistics.item.filter.attribute.astralsorcery; + +import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.INBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; + +import java.util.ArrayList; +import java.util.List; + +public class AstralSorceryPerkGemAttribute implements ItemAttribute { + String traitName; + + public AstralSorceryPerkGemAttribute(String traitName) { + this.traitName = traitName; + } + + @Override + public boolean appliesTo(ItemStack itemStack) { + for (INBT trait : extractTraitList(itemStack)) { + if(((CompoundNBT) trait).getString("type").equals(this.traitName)) + return true; + } + return false; + } + + @Override + public List listAttributesOf(ItemStack itemStack) { + ListNBT traits = extractTraitList(itemStack); + List atts = new ArrayList<>(); + for (int i = 0; i < traits.size(); i++) { + atts.add(new AstralSorceryPerkGemAttribute(traits.getCompound(i).getString("type"))); + } + return atts; + } + + @Override + public String getTranslationKey() { + return "astralsorcery_perk_gem"; + } + + @Override + public Object[] getTranslationParameters() { + ResourceLocation traitResource = new ResourceLocation(traitName); + String something = new TranslationTextComponent(String.format("perk.attribute.%s.%s.name", traitResource.getNamespace(), traitResource.getPath())).getString(); + return new Object[] { something }; + } + + @Override + public void writeNBT(CompoundNBT nbt) { + nbt.putString("type", this.traitName); + } + + @Override + public ItemAttribute readNBT(CompoundNBT nbt) { + return new AstralSorceryPerkGemAttribute(nbt.getString("type")); + } + + private ListNBT extractTraitList(ItemStack stack) { + return stack.getTag() != null ? stack.getTag().getCompound("astralsorcery").getList("attribute_modifiers", 10) : new ListNBT(); + } +} From 42ef3796a27879218a8031f8a5938c2fc6a24576 Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 11:23:38 -0400 Subject: [PATCH 14/36] Refactor EnchantAttribute --- .../logistics/item/filter/ItemAttribute.java | 2 +- .../filter/attribute/EnchantAttribute.java | 51 ++++++++----------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index 8c369cbc7..de66e9d59 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -49,7 +49,7 @@ public interface ItemAttribute { static ItemAttribute standard = register(StandardTraits.DUMMY); static ItemAttribute inTag = register(new InTag(new ResourceLocation("dummy"))); static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); - static ItemAttribute hasEnchant = register(new EnchantAttribute("dummy")); + static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY); static ItemAttribute hasFluid = register(new FluidContentsAttribute("dummy")); static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1)); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java index a30548862..26d4586f8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/EnchantAttribute.java @@ -2,41 +2,34 @@ package com.simibubi.create.content.logistics.item.filter.attribute; import com.simibubi.create.content.logistics.item.filter.ItemAttribute; import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.registries.ForgeRegistries; -import java.util.ArrayList; +import javax.annotation.Nullable; import java.util.List; +import java.util.stream.Collectors; public class EnchantAttribute implements ItemAttribute { - String enchantName; + public static final EnchantAttribute EMPTY = new EnchantAttribute(null); - public EnchantAttribute(String enchantName) { - this.enchantName = enchantName; + private final Enchantment enchantment; + + public EnchantAttribute(@Nullable Enchantment enchantment) { + this.enchantment = enchantment; } @Override public boolean appliesTo(ItemStack itemStack) { - ListNBT enchants = extractEnchants(itemStack); - for (int i = 0; i < enchants.size(); i++) { - if(enchants.getCompound(i).getString("id").equals(this.enchantName)) - return true; - } - return false; + return EnchantmentHelper.getEnchantments(itemStack).containsKey(enchantment); } @Override public List listAttributesOf(ItemStack itemStack) { - ListNBT enchants = extractEnchants(itemStack); - List atts = new ArrayList<>(); - for (int i = 0; i < enchants.size(); i++) { - atts.add(new EnchantAttribute(enchants.getCompound(i).getString("id"))); - } - return atts; + return EnchantmentHelper.getEnchantments(itemStack).keySet().stream().map(EnchantAttribute::new).collect(Collectors.toList()); } @Override @@ -46,26 +39,24 @@ public class EnchantAttribute implements ItemAttribute { @Override public Object[] getTranslationParameters() { - String something = ""; - Enchantment enchant = ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(enchantName)); - if(enchant != null) { - something = new TranslationTextComponent(enchant.getName()).getString(); - } - return new Object[] { something }; + String parameter = ""; + if(enchantment != null) + parameter = new TranslationTextComponent(enchantment.getName()).getString(); + return new Object[] { parameter }; } @Override public void writeNBT(CompoundNBT nbt) { - nbt.putString("id", this.enchantName); + if (enchantment == null) + return; + ResourceLocation id = ForgeRegistries.ENCHANTMENTS.getKey(enchantment); + if (id == null) + return; + nbt.putString("id", id.toString()); } @Override public ItemAttribute readNBT(CompoundNBT nbt) { - return new EnchantAttribute(nbt.getString("id")); - } - - private ListNBT extractEnchants(ItemStack stack) { - CompoundNBT tag = stack.getTag() != null ? stack.getTag() : new CompoundNBT(); - return tag.contains("Enchantments") ? stack.getEnchantmentTagList() : tag.getList("StoredEnchantments", 10); + return nbt.contains("id") ? new EnchantAttribute(ForgeRegistries.ENCHANTMENTS.getValue(ResourceLocation.tryCreate(nbt.getString("id")))) : EMPTY; } } From 083a9c1140da263c2c7496a9c5db3b2b77b1b97c Mon Sep 17 00:00:00 2001 From: Colman Davenport Date: Sat, 17 Oct 2020 11:24:15 -0400 Subject: [PATCH 15/36] Refactor FluidContentsAttribute --- .../logistics/item/filter/ItemAttribute.java | 2 +- .../attribute/FluidContentsAttribute.java | 47 +++++++++---------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java index de66e9d59..a07a82ca2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/ItemAttribute.java @@ -50,7 +50,7 @@ public interface ItemAttribute { static ItemAttribute inTag = register(new InTag(new ResourceLocation("dummy"))); static ItemAttribute inItemGroup = register(new InItemGroup(ItemGroup.MISC)); static ItemAttribute hasEnchant = register(EnchantAttribute.EMPTY); - static ItemAttribute hasFluid = register(new FluidContentsAttribute("dummy")); + static ItemAttribute hasFluid = register(FluidContentsAttribute.EMPTY); static ItemAttribute hasName = register(new ItemNameAttribute("dummy")); static ItemAttribute astralAmulet = register(new AstralSorceryAmuletAttribute("dummy", -1)); static ItemAttribute astralAttunement = register(new AstralSorceryAttunementAttribute("dummy")); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java index 421282b9b..94aa9ed1f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/attribute/FluidContentsAttribute.java @@ -2,12 +2,8 @@ package com.simibubi.create.content.logistics.item.filter.attribute; import com.simibubi.create.content.logistics.item.filter.ItemAttribute; import net.minecraft.fluid.Fluid; -import net.minecraft.item.BucketItem; -import net.minecraft.item.GlassBottleItem; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.common.util.LazyOptional; @@ -15,30 +11,28 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.registries.ForgeRegistries; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class FluidContentsAttribute implements ItemAttribute { - String fluidName; + public static final FluidContentsAttribute EMPTY = new FluidContentsAttribute(null); - public FluidContentsAttribute(String fluidName) { - this.fluidName = fluidName; + private final Fluid fluid; + + public FluidContentsAttribute(@Nullable Fluid fluid) { + this.fluid = fluid; } @Override public boolean appliesTo(ItemStack itemStack) { - return extractFluidNames(itemStack).contains(fluidName); + return extractFluids(itemStack).contains(fluid); } @Override public List listAttributesOf(ItemStack itemStack) { - List names = extractFluidNames(itemStack); - - List atts = new ArrayList<>(); - for(String name : names) { - atts.add(new FluidContentsAttribute(name)); - } - return atts; + return extractFluids(itemStack).stream().map(FluidContentsAttribute::new).collect(Collectors.toList()); } @Override @@ -48,33 +42,36 @@ public class FluidContentsAttribute implements ItemAttribute { @Override public Object[] getTranslationParameters() { - ResourceLocation fluidResource = new ResourceLocation(fluidName); - Fluid fluid = ForgeRegistries.FLUIDS.getValue(fluidResource); - String trans = ""; + String parameter = ""; if(fluid != null) - trans = new TranslationTextComponent(fluid.getAttributes().getTranslationKey()).getString(); - return new Object[] {trans}; + parameter = new TranslationTextComponent(fluid.getAttributes().getTranslationKey()).getString(); + return new Object[] { parameter }; } @Override public void writeNBT(CompoundNBT nbt) { - nbt.putString("fluidName", this.fluidName); + if (fluid == null) + return; + ResourceLocation id = ForgeRegistries.FLUIDS.getKey(fluid); + if (id == null) + return; + nbt.putString("id", id.toString()); } @Override public ItemAttribute readNBT(CompoundNBT nbt) { - return new FluidContentsAttribute(nbt.getString("fluidName")); + return nbt.contains("id") ? new FluidContentsAttribute(ForgeRegistries.FLUIDS.getValue(ResourceLocation.tryCreate(nbt.getString("id")))) : EMPTY; } - private List extractFluidNames(ItemStack stack) { - List fluids = new ArrayList<>(); + private List extractFluids(ItemStack stack) { + List fluids = new ArrayList<>(); LazyOptional capability = stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); capability.ifPresent((cap) -> { for(int i = 0; i < cap.getTanks(); i++) { - fluids.add(cap.getFluidInTank(i).getFluid().getRegistryName().toString()); + fluids.add(cap.getFluidInTank(i).getFluid()); } }); From a81a4110d49a7643590cb214879deab772735693 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Sun, 18 Oct 2020 00:10:10 +0100 Subject: [PATCH 16/36] Tools: the Tippening. Fixed an error in my previous commit. Introduced basic Tooltips for fluid items. I've left the smart pipe entries as placeholder as I've not tried them out yet. --- .../assets/create/lang/default/tooltips.json | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index 723199458..55f496a26 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -79,8 +79,46 @@ "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "A little iron home for your fiery friends. I'm sure you could put them to good use.", - "block.create.empty_blaze_burner.tooltip.condition1": "When used on a _Blaze_ or _Blaze_ _spawner_", - "block.create.empty_blaze_burner.tooltip.behaviour1": "_Captures_ a Blaze in the item", + "item.create.empty_blaze_burner.tooltip.condition1": "When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "_Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "changes the optional window", + + "block.create.fluid_valve.tooltip": "FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.condition1": " ~ ", + "block.create.smart_fluid_pipe.tooltip.behaviour1": " ~ ", + "block.create.smart_fluid_pipe.tooltip.control1": " ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": " ~ ", + + "block.create.spout.tooltip": "SPOUT", + "block.create.spout.tooltip.summary": "An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "Fluid Automation", + "block.create.spout.tooltip.behaviour2": "The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", From b7bed44a61b3635fe97237254d0a94a23f3fc008 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 19 Oct 2020 22:07:05 +0200 Subject: [PATCH 17/36] Basic Brewing - Refactored JEI plugin to use a builder for categories - The mixer can now process vanilla potion recipes - JEI support for fluid potion mixing - Refined some categories to not show obsolete information - Compacting and automatic vanilla packing are now in separate tabs - Fluids can now be manually picked up from a basin - Basins and Spouts can now extract from and fill vanilla potion items - Improved the filtering for fluid tests, such as the basin recipe and smart pipes - Fixed CombinedTankWrapper losing nbt data of transferred fluidstacks --- src/generated/resources/.cache/cache | 26 +- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 27 +- .../assets/create/lang/unfinished/de_de.json | 29 +- .../assets/create/lang/unfinished/fr_fr.json | 25 +- .../assets/create/lang/unfinished/it_it.json | 25 +- .../assets/create/lang/unfinished/ja_jp.json | 25 +- .../assets/create/lang/unfinished/ko_kr.json | 25 +- .../assets/create/lang/unfinished/nl_nl.json | 29 +- .../assets/create/lang/unfinished/pt_br.json | 29 +- .../assets/create/lang/unfinished/ru_ru.json | 29 +- .../assets/create/lang/unfinished/zh_cn.json | 25 +- .../create/recipes/emptying/water_bottle.json | 18 - .../create/recipes/filling/water_bottle.json | 21 - .../create/recipes/mixing/temp_cobble.json | 6 +- .../java/com/simibubi/create/AllFluids.java | 21 + src/main/java/com/simibubi/create/Create.java | 1 + .../simibubi/create/compat/jei/CreateJEI.java | 408 +++++++++++------- .../compat/jei/category/BasinCategory.java | 34 +- .../jei/category/BlockCuttingCategory.java | 2 +- .../category/BlockzapperUpgradeCategory.java | 27 +- .../jei/category/CreateRecipeCategory.java | 42 +- .../compat/jei/category/CrushingCategory.java | 10 +- ...Category.java => FanBlastingCategory.java} | 12 +- ...nCategory.java => FanSmokingCategory.java} | 6 +- ...gCategory.java => FanWashingCategory.java} | 6 +- .../category/MechanicalCraftingCategory.java | 218 +++++----- .../compat/jei/category/MillingCategory.java | 3 +- .../compat/jei/category/MixingCategory.java | 32 +- .../MysteriousItemConversionCategory.java | 4 +- .../compat/jei/category/PackingCategory.java | 35 +- .../jei/category/PolishingCategory.java | 15 +- .../compat/jei/category/PressingCategory.java | 13 +- .../category/ProcessingViaFanCategory.java | 14 +- .../compat/jei/category/SawingCategory.java | 2 +- .../mixer/MechanicalMixerTileEntity.java | 35 +- .../fluids/CombinedFluidHandler.java | 138 ------ .../contraptions/fluids/FluidNetworkFlow.java | 2 +- .../fluids/actors/FillingBySpout.java | 46 +- .../fluids/actors/GenericItemFilling.java | 82 ++++ .../fluids/potion/PotionFluid.java | 111 +++++ .../fluids/potion/PotionFluidHandler.java | 171 ++++++++ .../potion/PotionMixingRecipeManager.java | 158 +++++++ .../contraptions/processing/BasinBlock.java | 66 ++- .../contraptions/processing/BasinRecipe.java | 25 +- .../processing/EmptyingByBasin.java | 8 + .../processing/ProcessingRecipeBuilder.java | 6 +- .../logistics/item/filter/FilterItem.java | 20 +- .../simibubi/create/events/CommonEvents.java | 15 +- .../foundation/data/CreateRegistrate.java | 23 +- .../foundation/data/VirtualFluidBuilder.java | 35 ++ .../data/recipe/EmptyingRecipeGen.java | 26 +- .../data/recipe/FillingRecipeGen.java | 21 +- .../data/recipe/MixingRecipeGen.java | 5 +- .../foundation/fluid/CombinedTankWrapper.java | 45 +- .../foundation/fluid/FluidIngredient.java | 19 +- .../resources/META-INF/accesstransformer.cfg | 5 +- .../assets/create/lang/default/messages.json | 31 +- .../create/textures/fluid/potion_flow.png | Bin 0 -> 133632 bytes .../textures/fluid/potion_flow.png.mcmeta | 3 + .../create/textures/fluid/potion_still.png | Bin 0 -> 66280 bytes .../textures/fluid/potion_still.png.mcmeta | 5 + 62 files changed, 1533 insertions(+), 813 deletions(-) delete mode 100644 src/generated/resources/data/create/recipes/emptying/water_bottle.json delete mode 100644 src/generated/resources/data/create/recipes/filling/water_bottle.json create mode 100644 src/main/java/com/simibubi/create/AllFluids.java rename src/main/java/com/simibubi/create/compat/jei/category/{BlastingViaFanCategory.java => FanBlastingCategory.java} (68%) rename src/main/java/com/simibubi/create/compat/jei/category/{SmokingViaFanCategory.java => FanSmokingCategory.java} (71%) rename src/main/java/com/simibubi/create/compat/jei/category/{SplashingCategory.java => FanWashingCategory.java} (93%) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionMixingRecipeManager.java create mode 100644 src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java create mode 100644 src/main/resources/assets/create/textures/fluid/potion_flow.png create mode 100644 src/main/resources/assets/create/textures/fluid/potion_flow.png.mcmeta create mode 100644 src/main/resources/assets/create/textures/fluid/potion_still.png create mode 100644 src/main/resources/assets/create/textures/fluid/potion_still.png.mcmeta diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 3c3ebbe8e..c2daa081e 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -368,17 +368,17 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -ec6eb28b76106e24adb255e49943da3f53196bfb assets/create/lang/en_ud.json -f719ad41c8be237bbbafa8fabd8fda2b47288a31 assets/create/lang/en_us.json -5f8522c527cbbe50e33a7774316988fa6077d78d assets/create/lang/unfinished/de_de.json -0473893175500c6fd3f5410b575fc6ffc3abbb28 assets/create/lang/unfinished/fr_fr.json -c9fb5f2769f3e9be347bcd34b21a6c961e9a2324 assets/create/lang/unfinished/it_it.json -9bf0b4231a4f3d58b31fdb8d9876c8fdb40c5df5 assets/create/lang/unfinished/ja_jp.json -d7bd07920ecca15c2fe0728b141b3a9230ab545f assets/create/lang/unfinished/ko_kr.json -71c6d13fd8b300c851a591b76b32eff442acf586 assets/create/lang/unfinished/nl_nl.json -1668581de8b7ff54bb8cf2d705faa07936d2d8fd assets/create/lang/unfinished/pt_br.json -891d5a4abd250d7901a3a3df4907722e8ef864e9 assets/create/lang/unfinished/ru_ru.json -ef6159365f4746e8cc979527801893c92f19e6da assets/create/lang/unfinished/zh_cn.json +33f621fe1a09a46426af59c9352c33e97c2bc00d assets/create/lang/en_ud.json +f68da0c370026f416745b46445b53c63457cdeac assets/create/lang/en_us.json +1fa1a84b7dae8c7636a667e094883646ad6fa1e2 assets/create/lang/unfinished/de_de.json +4b2501a9d7730b4fb469d241afd72483171ce36b assets/create/lang/unfinished/fr_fr.json +efff9eee3f434fa04b3a688e8e861ab7d36fb45f assets/create/lang/unfinished/it_it.json +6db6ebd43ec38e11ad81f4b997b5765857bdf8da assets/create/lang/unfinished/ja_jp.json +3975b1184f38e7d7150ba2be0179bd3cf36ed7ca assets/create/lang/unfinished/ko_kr.json +84c44b3b4805925d0b489e295b38a72dbf2703e1 assets/create/lang/unfinished/nl_nl.json +f82f1e6250dd9a5ca9a7b92078bf1f7429d14d00 assets/create/lang/unfinished/pt_br.json +72d5dcbaa454de0ff33ff0cb2108938c2a5e677a assets/create/lang/unfinished/ru_ru.json +fdc2007ea9e3f8d8b2a6f8dedc434b591a0bbf0a assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2723,7 +2723,6 @@ ddda28bb6efc43b7e3149756daf53e1664187283 data/create/recipes/dolomite_cobbleston 500ecdfdcf34e9d26256948e206aab4f0b79e659 data/create/recipes/dolomite_cobblestone_wall_from_dolomite_cobblestone_stonecutting.json ff39e629b242ae91e23aec86b0a1f757dd938305 data/create/recipes/dolomite_pillar.json b4a8d14d9a20e812e0acb691b5b511a87e8b0576 data/create/recipes/dolomite_pillar_from_dolomite_stonecutting.json -ae6698363e49f7cb5f2ed52c6b8805bebed31fa2 data/create/recipes/emptying/water_bottle.json 0e11aa1accb71ed62e212f23a7069b7b7b4e8119 data/create/recipes/fancy_andesite_bricks_from_andesite_stonecutting.json 8b86fc9a9416adeaab3f26192a73a481887675c3 data/create/recipes/fancy_andesite_bricks_slab.json c7b762b25c7a6705dba3e922e981be851ac4f36b data/create/recipes/fancy_andesite_bricks_slab_from_fancy_andesite_bricks_stonecutting.json @@ -2787,7 +2786,6 @@ bd355332d17adcb0460b1d43146ca288efb78395 data/create/recipes/fancy_weathered_lim d2ab9ce73636773165564506580f2ec13bd1fc50 data/create/recipes/fancy_weathered_limestone_bricks_stairs_from_fancy_weathered_limestone_bricks_stonecutting.json 36947f27d2b2e57b00440fd5acd06a7554e5a387 data/create/recipes/fancy_weathered_limestone_bricks_wall.json 1d0e41ca98e48073c72adf4077610c96e592f9a5 data/create/recipes/fancy_weathered_limestone_bricks_wall_from_fancy_weathered_limestone_bricks_stonecutting.json -3196d3eda9e67771e86e9af7026d4388765a8a73 data/create/recipes/filling/water_bottle.json 5b8bbde7f8b270ab75fac18d6858f2fadbc0efa3 data/create/recipes/framed_glass_from_glass_colorless_stonecutting.json d697de0c9b706ca4e18da7a2d769e7e5fe8d769d data/create/recipes/framed_glass_pane.json a0dae50faaa1b7142bb4309675e3084c68daa547 data/create/recipes/gabbro_bricks_from_gabbro_stonecutting.json @@ -2909,7 +2907,7 @@ e7bfaa806d57573d060fac0a5e7a84f345b8bb85 data/create/recipes/mixing/andesite_all 76939e4d3e5b615ae21d14c0ff7b917a622bcf80 data/create/recipes/mixing/chromatic_compound.json d9a3dff1288d675ab812eef1eb73cb27dcc71bd2 data/create/recipes/mixing/crushed_brass.json 00b165ea38d834c7955440e87062004a8182c3f8 data/create/recipes/mixing/gunpowder.json -743c2d62c94a4989b88046c9cdf0fa024cd09fa8 data/create/recipes/mixing/temp_cobble.json +cf2a741be46fd2069f242afe74eb7c11f3139c46 data/create/recipes/mixing/temp_cobble.json 3295a2195707f952a83deb3bed10b43570b215e5 data/create/recipes/mixing/temp_lava.json 1998c6f84f871d6da58ec29d729401d18f8f1aa1 data/create/recipes/mossy_andesite_from_andesite_stonecutting.json 89929d9cb11b5c589b2ecfa821c61add1ef7b62b data/create/recipes/mossy_dark_scoria_from_dark_scoria_stonecutting.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 49e40242a..90d627d05 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -373,6 +373,7 @@ "entity.create.seat": "\u0287\u0250\u01DDS", "entity.create.stationary_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u028E\u0279\u0250uo\u0131\u0287\u0250\u0287S", "entity.create.super_glue": "\u01DDn\u05DF\u2141 \u0279\u01DDdnS", + "fluid.create.flowing_potion": "uo\u0131\u0287o\u0500", "item.create.andesite_alloy": "\u028Eo\u05DF\u05DF\u2C6F \u01DD\u0287\u0131s\u01DDpu\u2C6F", "item.create.attribute_filter": "\u0279\u01DD\u0287\u05DF\u0131\u2132 \u01DD\u0287nq\u0131\u0279\u0287\u0287\u2C6F", "item.create.belt_connector": "\u0287\u05DF\u01DD\u15FA \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index a178af162..0c3d53528 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -378,6 +378,8 @@ "entity.create.stationary_contraption": "Stationary Contraption", "entity.create.super_glue": "Super Glue", + "fluid.create.flowing_potion": "Potion", + "item.create.andesite_alloy": "Andesite Alloy", "item.create.attribute_filter": "Attribute Filter", "item.create.belt_connector": "Mechanical Belt", @@ -540,26 +542,26 @@ "create.recipe.crushing": "Crushing", "create.recipe.milling": "Milling", - "create.recipe.splashing": "Bulk Washing", - "create.recipe.splashing.fan": "Fan behind Flowing Water", - "create.recipe.smoking_via_fan": "Bulk Smoking", - "create.recipe.smoking_via_fan.fan": "Fan behind Fire", - "create.recipe.blasting_via_fan": "Bulk Smelting", - "create.recipe.blasting_via_fan.fan": "Fan behind Lava", + "create.recipe.fan_washing": "Bulk Washing", + "create.recipe.fan_washing.fan": "Fan behind Flowing Water", + "create.recipe.fan_smoking": "Bulk Smoking", + "create.recipe.fan_smoking.fan": "Fan behind Fire", + "create.recipe.fan_blasting": "Bulk Blasting", + "create.recipe.fan_blasting.fan": "Fan behind Lava", "create.recipe.pressing": "Pressing", "create.recipe.mixing": "Mixing", - "create.recipe.shapeless_mixing": "Shapeless Crafting", + "create.recipe.automatic_shapeless": "Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "Automated Brewing", "create.recipe.packing": "Compacting", + "create.recipe.automatic_packing": "Automated Packing", "create.recipe.sawing": "Sawing", - "create.recipe.mechanical_crafting": "Crafting", - "create.recipe.mechanical_crafting_exclusive": "Mechanical Crafting", + "create.recipe.mechanical_crafting": "Mechanical Crafting", + "create.recipe.automatic_shaped": "Automated Shaped Crafting", "create.recipe.block_cutting": "Block Cutting", "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Sandpaper Polishing", - "create.recipe.mystery_conversion": "Chromatic Metamorphosis", - "create.recipe.processing.catalyst": "Catalyst", + "create.recipe.mystery_conversion": "Mysterious Conversion", "create.recipe.processing.chance": "%1$s%% Chance", - "create.recipe.processing.chanceToReturn": "%1$s%% Chance to Return", "create.recipe.heat_requirement.none": "No Heating Required", "create.recipe.heat_requirement.heated": "Heated", "create.recipe.heat_requirement.superheated": "Super-Heated", @@ -577,7 +579,6 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", - "create.generic.unit.bucket": "1 Bucket", "create.generic.unit.millibuckets": "%1$smB", "create.action.scroll": "Scroll", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 4f0561656..e8f05621e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 922", + "_": "Missing Localizations: 928", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.belt_connector": "Mechanischer Riemen", @@ -541,26 +543,26 @@ "create.recipe.crushing": "Mahlen", "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.splashing": "Waschen", - "create.recipe.splashing.fan": "Propeller hinter fließendem Wasser", - "create.recipe.smoking_via_fan": "Räuchern", - "create.recipe.smoking_via_fan.fan": "Propeller hinter Feuer", - "create.recipe.blasting_via_fan": "Schmelzen", - "create.recipe.blasting_via_fan.fan": "Propeller hinter Lava", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Mechanische Presse", "create.recipe.mixing": "UNLOCALIZED: Mixing", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", - "create.recipe.mechanical_crafting": "UNLOCALIZED: Crafting", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.blockzapper_upgrade": "Blockpistole", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", - "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", - "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.processing.chance": "Chance: %1$s%%", - "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "UNLOCALIZED: RPM", "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "Wechseln", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index cb26a7b57..274921286 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 547", + "_": "Missing Localizations: 555", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "Alliage d'andésite", "item.create.attribute_filter": "Filtre d'attribut", "item.create.belt_connector": "Tapis roulant", @@ -541,26 +543,26 @@ "create.recipe.crushing": "Ecrasement", "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.splashing": "Lavage en vrac", - "create.recipe.splashing.fan": "Ventilateur derrière de l'eau qui coule", - "create.recipe.smoking_via_fan": "Fumer en vrac", - "create.recipe.smoking_via_fan.fan": "Fan behind Fire", - "create.recipe.blasting_via_fan": "Ventilateur derrière du feu", - "create.recipe.blasting_via_fan.fan": "Ventilateur derrière de la lave", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Pressage", "create.recipe.mixing": "Mixage", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "Compactage", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "Fabrication mécanique", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Coupe de bloc", "create.recipe.blockzapper_upgrade": "Blockzappeur portable", "create.recipe.sandpaper_polishing": "Polissage au papier de verre", "create.recipe.mystery_conversion": "Métamorphose chromatique", - "create.recipe.processing.catalyst": "Catalyseur", "create.recipe.processing.chance": "%1$s%% de chance", - "create.recipe.processing.chanceToReturn": "%1$s%% de chance de retour", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "tr/min", "create.generic.unit.stress": "us", "create.generic.unit.degrees": "°", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "Faire défiler", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 9efa7360c..f5730a023 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 535", + "_": "Missing Localizations: 539", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "Lega di Andesite", "item.create.attribute_filter": "Filtro Attributi", "item.create.belt_connector": "Nastro Meccanico", @@ -541,26 +543,26 @@ "create.recipe.crushing": "Frantumazione", "create.recipe.milling": "Fresatura", - "create.recipe.splashing": "Lavaggio alla Rinfusa", - "create.recipe.splashing.fan": "Ventilatore Dietro l'Acqua Corrente", - "create.recipe.smoking_via_fan": "UNLOCALIZED: Bulk Smoking", - "create.recipe.smoking_via_fan.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.blasting_via_fan": "UNLOCALIZED: Bulk Smelting", - "create.recipe.blasting_via_fan.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Pressatura", "create.recipe.mixing": "Mescolamento", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "Compattazione", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "Creazione Meccanico", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Taglio Blocco", "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Carta Vetrata Levigata", "create.recipe.mystery_conversion": "Metamorfosi Cromatica", - "create.recipe.processing.catalyst": "Catalizzatore", "create.recipe.processing.chance": "%1$s%% Possibilità", - "create.recipe.processing.chanceToReturn": "%1$s%% Possibilità di Ritorno", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "Scorri", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index f0976e969..72ed9f0d7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 530", + "_": "Missing Localizations: 538", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "安山岩合金", "item.create.attribute_filter": "属性フィルター", "item.create.belt_connector": "メカニカルベルト", @@ -541,26 +543,26 @@ "create.recipe.crushing": "粉砕", "create.recipe.milling": "製粉", - "create.recipe.splashing": "一括洗浄", - "create.recipe.splashing.fan": "流れる水の後ろにファンを置く", - "create.recipe.smoking_via_fan": "一括燻製", - "create.recipe.smoking_via_fan.fan": "炎の後ろにファンを置く", - "create.recipe.blasting_via_fan": "一括製錬", - "create.recipe.blasting_via_fan.fan": "溶岩の後ろにファンを置く", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "押しつぶし", "create.recipe.mixing": "混合", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "圧縮", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "メカニカルクラフト", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "ブロックカット", "create.recipe.blockzapper_upgrade": "携帯型ブロックザッパー", "create.recipe.sandpaper_polishing": "紙やすりでの研磨", "create.recipe.mystery_conversion": "色彩変態", - "create.recipe.processing.catalyst": "触媒", "create.recipe.processing.chance": "%1$s%%チャンス", - "create.recipe.processing.chanceToReturn": "%1$s%%チャンスで戻る", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "スクロール", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 887eb9a0e..1159a98f7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 535", + "_": "Missing Localizations: 539", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "안산암 합금", "item.create.attribute_filter": "속성 필터 틀", "item.create.belt_connector": "기계식 벨트", @@ -541,26 +543,26 @@ "create.recipe.crushing": "분쇄", "create.recipe.milling": "맷돌질", - "create.recipe.splashing": "세척", - "create.recipe.splashing.fan": "물과 환풍기", - "create.recipe.smoking_via_fan": "UNLOCALIZED: Bulk Smoking", - "create.recipe.smoking_via_fan.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.blasting_via_fan": "UNLOCALIZED: Bulk Smelting", - "create.recipe.blasting_via_fan.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "압착", "create.recipe.mixing": "혼합", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "압축", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "기계 조합", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "블럭 절단", "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", "create.recipe.sandpaper_polishing": "사포 연마", "create.recipe.mystery_conversion": "?", - "create.recipe.processing.catalyst": "촉매", "create.recipe.processing.chance": "%1$s%% 확률", - "create.recipe.processing.chanceToReturn": "%1$s%% 확률로 반환", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "스크롤하세요", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 87943968c..82fca5cd5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 861", + "_": "Missing Localizations: 867", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.belt_connector": "Mechanische Transportband", @@ -541,26 +543,26 @@ "create.recipe.crushing": "Verpulveren", "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.splashing": "Bulk Wassen", - "create.recipe.splashing.fan": "Ventilator achter vloeiend water", - "create.recipe.smoking_via_fan": "Bulk Rook", - "create.recipe.smoking_via_fan.fan": "Ventilator achter vuur", - "create.recipe.blasting_via_fan": "Bulk Smelten", - "create.recipe.blasting_via_fan.fan": "Ventilator achter Lava", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Persen", "create.recipe.mixing": "Mengen", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "Compressen", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", - "create.recipe.mechanical_crafting": "UNLOCALIZED: Crafting", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "Blok Zagen", "create.recipe.blockzapper_upgrade": "Blokzapper", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", - "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", - "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.processing.chance": "%1$s%% Kans", - "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "UNLOCALIZED: RPM", "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "Scroll", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index be9d0d07d..477382187 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 929", + "_": "Missing Localizations: 935", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.belt_connector": "Esteira Mecânica", @@ -541,26 +543,26 @@ "create.recipe.crushing": "Moendo", "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.splashing": "Lavando em Massa", - "create.recipe.splashing.fan": "Ventilador atras de Água corrente", - "create.recipe.smoking_via_fan": "Fumaceando em Massa", - "create.recipe.smoking_via_fan.fan": "Ventilador atras de Fogo", - "create.recipe.blasting_via_fan": "Fundindo em Massa", - "create.recipe.blasting_via_fan.fan": "Ventilador atras de Lava", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Prensa Mecânica", "create.recipe.mixing": "UNLOCALIZED: Mixing", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", - "create.recipe.mechanical_crafting": "UNLOCALIZED: Crafting", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.blockzapper_upgrade": "Blockzapper Portátil", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", - "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", - "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.processing.chance": "%1$s%% de chance", - "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "UNLOCALIZED: RPM", "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "Rolar", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index c9e93e431..d31f1b1ef 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 923", + "_": "Missing Localizations: 929", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", "item.create.belt_connector": "Механическая лента", @@ -541,26 +543,26 @@ "create.recipe.crushing": "Дробление", "create.recipe.milling": "UNLOCALIZED: Milling", - "create.recipe.splashing": "Промывка вентилятором", - "create.recipe.splashing.fan": "Вентилятор за проточной водой", - "create.recipe.smoking_via_fan": "Копчение вентилятором", - "create.recipe.smoking_via_fan.fan": "Вентилятор за огнём", - "create.recipe.blasting_via_fan": "Плавление вентилятором", - "create.recipe.blasting_via_fan.fan": "Вентелятор за лавой", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "Механический пресс", "create.recipe.mixing": "UNLOCALIZED: Mixing", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", - "create.recipe.mechanical_crafting": "UNLOCALIZED: Crafting", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", "create.recipe.blockzapper_upgrade": "Портативный размещатель блоков", "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", - "create.recipe.mystery_conversion": "UNLOCALIZED: Chromatic Metamorphosis", - "create.recipe.processing.catalyst": "UNLOCALIZED: Catalyst", + "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", "create.recipe.processing.chance": "%1$s%% шанс выпадения", - "create.recipe.processing.chanceToReturn": "UNLOCALIZED: %1$s%% Chance to Return", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "UNLOCALIZED: RPM", "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "КолМыши", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index abc133ef5..1a3be748a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 217", + "_": "Missing Localizations: 221", "_": "->------------------------] Game Elements [------------------------<-", @@ -379,6 +379,8 @@ "entity.create.stationary_contraption": "固定结构", "entity.create.super_glue": "强力胶", + "fluid.create.flowing_potion": "UNLOCALIZED: Potion", + "item.create.andesite_alloy": "安山合金", "item.create.attribute_filter": "属性过滤器", "item.create.belt_connector": "传送带", @@ -541,26 +543,26 @@ "create.recipe.crushing": "粉碎", "create.recipe.milling": "研磨", - "create.recipe.splashing": "洗涤", - "create.recipe.splashing.fan": "在鼓风机前方倒水", - "create.recipe.smoking_via_fan": "UNLOCALIZED: Bulk Smoking", - "create.recipe.smoking_via_fan.fan": "UNLOCALIZED: Fan behind Fire", - "create.recipe.blasting_via_fan": "UNLOCALIZED: Bulk Smelting", - "create.recipe.blasting_via_fan.fan": "UNLOCALIZED: Fan behind Lava", + "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", + "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", + "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", + "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", + "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", + "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", "create.recipe.pressing": "金属压片", "create.recipe.mixing": "混合搅拌", - "create.recipe.shapeless_mixing": "UNLOCALIZED: Shapeless Crafting", + "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", "create.recipe.packing": "压块塑形", + "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", "create.recipe.mechanical_crafting": "自动合成", - "create.recipe.mechanical_crafting_exclusive": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", "create.recipe.block_cutting": "方块切割", "create.recipe.blockzapper_upgrade": "UNLOCALIZED: Handheld Blockzapper", "create.recipe.sandpaper_polishing": "砂纸抛光", "create.recipe.mystery_conversion": "化合物变异", - "create.recipe.processing.catalyst": "催化剂", "create.recipe.processing.chance": "%1$s%% 概率", - "create.recipe.processing.chanceToReturn": "%1$s%% 概率返还", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", @@ -578,7 +580,6 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", - "create.generic.unit.bucket": "UNLOCALIZED: 1 Bucket", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", "create.action.scroll": "滚轮", diff --git a/src/generated/resources/data/create/recipes/emptying/water_bottle.json b/src/generated/resources/data/create/recipes/emptying/water_bottle.json deleted file mode 100644 index 1a34fd570..000000000 --- a/src/generated/resources/data/create/recipes/emptying/water_bottle.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "type": "create:emptying", - "ingredients": [ - { - "item": "minecraft:potion" - } - ], - "results": [ - { - "item": "minecraft:glass_bottle", - "count": 1 - }, - { - "fluid": "minecraft:water", - "amount": 250 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/filling/water_bottle.json b/src/generated/resources/data/create/recipes/filling/water_bottle.json deleted file mode 100644 index 4f99990bd..000000000 --- a/src/generated/resources/data/create/recipes/filling/water_bottle.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "create:filling", - "ingredients": [ - { - "item": "minecraft:glass_bottle" - }, - { - "fluidTag": "minecraft:water", - "amount": 250 - } - ], - "results": [ - { - "item": "minecraft:potion", - "count": 1, - "nbt": { - "Potion": "minecraft:water" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/mixing/temp_cobble.json b/src/generated/resources/data/create/recipes/mixing/temp_cobble.json index 897f6d99c..def4cc8c2 100644 --- a/src/generated/resources/data/create/recipes/mixing/temp_cobble.json +++ b/src/generated/resources/data/create/recipes/mixing/temp_cobble.json @@ -2,11 +2,13 @@ "type": "create:mixing", "ingredients": [ { - "fluidTag": "minecraft:water", + "fluid": "minecraft:water", + "nbt": {}, "amount": 250 }, { - "fluidTag": "minecraft:lava", + "fluid": "minecraft:lava", + "nbt": {}, "amount": 25 } ], diff --git a/src/main/java/com/simibubi/create/AllFluids.java b/src/main/java/com/simibubi/create/AllFluids.java new file mode 100644 index 000000000..dba2a7919 --- /dev/null +++ b/src/main/java/com/simibubi/create/AllFluids.java @@ -0,0 +1,21 @@ +package com.simibubi.create; + +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid.PotionFluidAttributes; +import com.simibubi.create.foundation.data.CreateRegistrate; +import com.tterrag.registrate.util.entry.RegistryEntry; + +public class AllFluids { + + private static final CreateRegistrate REGISTRATE = Create.registrate(); + + public static RegistryEntry POTION = + REGISTRATE.virtualFluid("potion", PotionFluidAttributes::new, PotionFluid::new) + .lang(f -> "fluid.create.flowing_potion", "Potion") + .register(); + + // Load this class + + public static void register() {} + +} diff --git a/src/main/java/com/simibubi/create/Create.java b/src/main/java/com/simibubi/create/Create.java index e9e9f5753..26e6eb038 100644 --- a/src/main/java/com/simibubi/create/Create.java +++ b/src/main/java/com/simibubi/create/Create.java @@ -75,6 +75,7 @@ public class Create { AllBlocks.register(); AllItems.register(); + AllFluids.register(); AllTags.register(); AllPaletteBlocks.register(); AllEntityTypes.register(); diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 5f8bf6fb0..a90208b6a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -1,91 +1,178 @@ package com.simibubi.create.compat.jei; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; + +import com.google.common.base.Predicates; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.Create; -import com.simibubi.create.compat.jei.category.*; +import com.simibubi.create.compat.jei.category.BlockCuttingCategory; import com.simibubi.create.compat.jei.category.BlockCuttingCategory.CondensedBlockCuttingRecipe; +import com.simibubi.create.compat.jei.category.BlockzapperUpgradeCategory; +import com.simibubi.create.compat.jei.category.CreateRecipeCategory; +import com.simibubi.create.compat.jei.category.CrushingCategory; +import com.simibubi.create.compat.jei.category.FanBlastingCategory; +import com.simibubi.create.compat.jei.category.FanSmokingCategory; +import com.simibubi.create.compat.jei.category.FanWashingCategory; +import com.simibubi.create.compat.jei.category.MechanicalCraftingCategory; +import com.simibubi.create.compat.jei.category.MillingCategory; +import com.simibubi.create.compat.jei.category.MixingCategory; +import com.simibubi.create.compat.jei.category.MysteriousItemConversionCategory; +import com.simibubi.create.compat.jei.category.PackingCategory; +import com.simibubi.create.compat.jei.category.PolishingCategory; +import com.simibubi.create.compat.jei.category.PressingCategory; +import com.simibubi.create.compat.jei.category.ProcessingViaFanCategory; +import com.simibubi.create.compat.jei.category.SawingCategory; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.content.contraptions.fluids.potion.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.processing.BasinRecipe; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; import com.simibubi.create.content.schematics.block.SchematicannonScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CRecipes; -import com.simibubi.create.foundation.fluid.FluidIngredient; -import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.config.ConfigBase.ConfigBool; + import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; -import mezz.jei.api.ingredients.IIngredientType; -import mezz.jei.api.registration.*; -import net.minecraft.block.Blocks; +import mezz.jei.api.registration.IGuiHandlerRegistration; +import mezz.jei.api.registration.IRecipeCatalystRegistration; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; +import mezz.jei.api.registration.ISubtypeRegistration; import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.*; +import net.minecraft.item.crafting.ICraftingRecipe; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.IRecipeType; +import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.StringTextComponent; -import net.minecraft.util.text.TextFormatting; - -import javax.annotation.Nonnull; -import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Collectors; @JeiPlugin public class CreateJEI implements IModPlugin { private static final ResourceLocation ID = new ResourceLocation(Create.ID, "jei_plugin"); - public static final IIngredientType FLUIDS = new IIngredientType() { - - @Override - @Nonnull - public Class getIngredientClass() { - return FluidIngredient.class; - } - }; - - private final MillingCategory millingCategory; - private final CrushingCategory crushingCategory; - private final SplashingCategory splashingCategory; - private final SmokingViaFanCategory smokingCategory; - private final PressingCategory pressingCategory; - private final BlastingViaFanCategory blastingCategory; - private final BlockzapperUpgradeCategory blockzapperCategory; - private final MixingCategory shapelessMixingCategory; - private final MixingCategory mixingCategory; - private final SawingCategory sawingCategory; - private final BlockCuttingCategory blockCuttingCategory; - private final PackingCategory packingCategory; - private final PolishingCategory polishingCategory; - private final MysteriousItemConversionCategory mysteryConversionCategory; - private final MechanicalCraftingCategory mechanicalCraftingCategory; - private final MechanicalCraftingCategory mechanicalCraftingExclusiveCategory; - @Override @Nonnull public ResourceLocation getPluginUid() { return ID; } - public CreateJEI() { - millingCategory = new MillingCategory(); - crushingCategory = new CrushingCategory(); - splashingCategory = new SplashingCategory(); - pressingCategory = new PressingCategory(); - smokingCategory = new SmokingViaFanCategory(); - blastingCategory = new BlastingViaFanCategory(); - blockzapperCategory = new BlockzapperUpgradeCategory(); - shapelessMixingCategory = new MixingCategory(true); - mixingCategory = new MixingCategory(false); - sawingCategory = new SawingCategory(); - blockCuttingCategory = new BlockCuttingCategory(); - packingCategory = new PackingCategory(); - polishingCategory = new PolishingCategory(); - mysteryConversionCategory = new MysteriousItemConversionCategory(); - mechanicalCraftingCategory = new MechanicalCraftingCategory(true); - mechanicalCraftingExclusiveCategory = new MechanicalCraftingCategory(false); + final List> ALL = new ArrayList<>(); + final CreateRecipeCategory + + milling = register("milling", MillingCategory::new).recipes(AllRecipeTypes.MILLING) + .catalyst(AllBlocks.MILLSTONE::get) + .build(), + + crushing = register("crushing", CrushingCategory::new).recipes(AllRecipeTypes.CRUSHING) + .recipesExcluding(AllRecipeTypes.MILLING::getType, AllRecipeTypes.CRUSHING::getType) + .catalyst(AllBlocks.CRUSHING_WHEEL::get) + .build(), + + pressing = register("pressing", PressingCategory::new).recipes(AllRecipeTypes.PRESSING) + .catalyst(AllBlocks.MECHANICAL_PRESS::get) + .build(), + + washing = register("fan_washing", FanWashingCategory::new).recipes(AllRecipeTypes.SPLASHING) + .catalystStack(ProcessingViaFanCategory.getFan("fan_washing")) + .build(), + + smoking = register("fan_smoking", FanSmokingCategory::new).recipes(() -> IRecipeType.SMOKING) + .catalystStack(ProcessingViaFanCategory.getFan("fan_smoking")) + .build(), + + blasting = register("fan_blasting", FanBlastingCategory::new) + .recipesExcluding(() -> IRecipeType.SMELTING, () -> IRecipeType.SMOKING) + .catalystStack(ProcessingViaFanCategory.getFan("fan_blasting")) + .build(), + + blockzapper = register("blockzapper_upgrade", BlockzapperUpgradeCategory::new) + .recipes(AllRecipeTypes.BLOCKZAPPER_UPGRADE.serializer.getRegistryName()) + .catalyst(AllItems.BLOCKZAPPER::get) + .build(), + + mixing = register("mixing", MixingCategory::standard).recipes(AllRecipeTypes.MIXING::getType) + .catalyst(AllBlocks.MECHANICAL_MIXER::get) + .catalyst(AllBlocks.BASIN::get) + .build(), + + autoShapeless = register("automatic_shapeless", MixingCategory::autoShapeless) + .recipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS + && !MechanicalPressTileEntity.canCompress(r.getIngredients()), BasinRecipe::convertShapeless) + .catalyst(AllBlocks.MECHANICAL_MIXER::get) + .catalyst(AllBlocks.BASIN::get) + .enableWhen(c -> c.allowShapelessInMixer) + .build(), + + brewing = register("automatic_brewing", MixingCategory::autoBrewing) + .recipeList(PotionMixingRecipeManager::getAllBrewingRecipes) + .catalyst(AllBlocks.MECHANICAL_MIXER::get) + .catalyst(AllBlocks.BASIN::get) + .build(), + + sawing = register("sawing", SawingCategory::new).recipes(AllRecipeTypes.CUTTING) + .catalyst(AllBlocks.MECHANICAL_SAW::get) + .build(), + + blockCutting = register("block_cutting", BlockCuttingCategory::new) + .recipeList(() -> CondensedBlockCuttingRecipe.condenseRecipes(findRecipesByType(IRecipeType.STONECUTTING))) + .catalyst(AllBlocks.MECHANICAL_SAW::get) + .enableWhen(c -> c.allowStonecuttingOnSaw) + .build(), + + packing = register("packing", PackingCategory::standard).recipes(AllRecipeTypes.COMPACTING) + .catalyst(AllBlocks.MECHANICAL_PRESS::get) + .catalyst(AllBlocks.BASIN::get) + .build(), + + autoSquare = register("automatic_packing", PackingCategory::autoSquare) + .recipes(r -> (r instanceof ICraftingRecipe) && MechanicalPressTileEntity.canCompress(r.getIngredients()), + BasinRecipe::convertShapeless) + .catalyst(AllBlocks.MECHANICAL_PRESS::get) + .catalyst(AllBlocks.BASIN::get) + .enableWhen(c -> c.allowShapedSquareInPress) + .build(), + + polishing = register("sandpaper_polishing", PolishingCategory::new).recipes(AllRecipeTypes.SANDPAPER_POLISHING) + .catalyst(AllItems.SAND_PAPER::get) + .catalyst(AllItems.RED_SAND_PAPER::get) + .build(), + + mysteryConversion = register("mystery_conversion", MysteriousItemConversionCategory::new) + .recipeList(MysteriousItemConversionCategory::getRecipes) + .build(), + + autoShaped = register("automatic_shaped", MechanicalCraftingCategory::new) + .recipes( + r -> (r.getType() == IRecipeType.CRAFTING && r.getType() != AllRecipeTypes.MECHANICAL_CRAFTING.type) + && (r instanceof ShapedRecipe)) + .catalyst(AllBlocks.MECHANICAL_CRAFTER::get) + .enableWhen(c -> c.allowRegularCraftingInCrafter) + .build(), + + mechanicalCrafting = + register("mechanical_crafting", MechanicalCraftingCategory::new).recipes(AllRecipeTypes.MECHANICAL_CRAFTING) + .catalyst(AllBlocks.MECHANICAL_CRAFTER::get) + .build() + + ; + + private > CategoryBuilder register(String name, + Supplier> supplier) { + return new CategoryBuilder(name, supplier); } @Override @@ -95,136 +182,135 @@ public class CreateJEI implements IModPlugin { @Override public void registerCategories(IRecipeCategoryRegistration registration) { - registration.addRecipeCategories(millingCategory, crushingCategory, splashingCategory, pressingCategory, smokingCategory, blastingCategory, blockzapperCategory, mixingCategory, shapelessMixingCategory, sawingCategory, blockCuttingCategory, packingCategory, polishingCategory, mysteryConversionCategory, mechanicalCraftingCategory, mechanicalCraftingExclusiveCategory); + ALL.forEach(registration::addRecipeCategories); } @Override public void registerRecipes(IRecipeRegistration registration) { - CRecipes recipeConfig = AllConfigs.SERVER.recipes; - - registration.addRecipes(findRecipes(AllRecipeTypes.MILLING), millingCategory.getUid()); - registration.addRecipes(findRecipes(AllRecipeTypes.CRUSHING), crushingCategory.getUid()); - registration.addRecipes(findRecipesByTypeExcluding(AllRecipeTypes.MILLING.getType(), AllRecipeTypes.CRUSHING.getType()), crushingCategory.getUid()); - registration.addRecipes(findRecipes(AllRecipeTypes.SPLASHING), splashingCategory.getUid()); - registration.addRecipes(findRecipes(AllRecipeTypes.PRESSING), pressingCategory.getUid()); - registration.addRecipes(findRecipesById(AllRecipeTypes.BLOCKZAPPER_UPGRADE.serializer.getRegistryName()), blockzapperCategory.getUid()); - registration.addRecipes(findRecipesByType(IRecipeType.SMOKING), smokingCategory.getUid()); - registration.addRecipes(findRecipesByTypeExcluding(IRecipeType.SMELTING, IRecipeType.SMOKING), blastingCategory.getUid()); - registration.addRecipes(findRecipes(AllRecipeTypes.MIXING), mixingCategory.getUid()); - - if (recipeConfig.allowShapelessInMixer.get()) - registration.addRecipes( - findRecipes(r -> r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS && !MechanicalPressTileEntity.canCompress(r.getIngredients())) - .stream() - .map(BasinRecipe::convert) - .collect(Collectors.toList()), - shapelessMixingCategory.getUid()); - - registration.addRecipes(findRecipes(AllRecipeTypes.CUTTING), sawingCategory.getUid()); - - if (recipeConfig.allowStonecuttingOnSaw.get()) - registration.addRecipes(CondensedBlockCuttingRecipe.condenseRecipes(findRecipesByType(IRecipeType.STONECUTTING)), blockCuttingCategory.getUid()); - - registration.addRecipes(findRecipes(AllRecipeTypes.COMPACTING), packingCategory.getUid()); - - if (recipeConfig.allowShapedSquareInPress.get()) - registration.addRecipes( - findRecipes(r -> (r instanceof ICraftingRecipe) && MechanicalPressTileEntity.canCompress(r.getIngredients())) - .stream() - .map(BasinRecipe::convert) - .collect(Collectors.toList()), - packingCategory.getUid()); - - registration.addRecipes(findRecipes(AllRecipeTypes.SANDPAPER_POLISHING), polishingCategory.getUid()); - registration.addRecipes(MysteriousItemConversionCategory.getRecipes(), mysteryConversionCategory.getUid()); - registration.addRecipes(findRecipes(r -> (r.getType() == AllRecipeTypes.MECHANICAL_CRAFTING.type)), mechanicalCraftingExclusiveCategory.getUid()); - - if (recipeConfig.allowRegularCraftingInCrafter.get()) - registration.addRecipes( - findRecipes(r -> (r.getType() == IRecipeType.CRAFTING && r.getType() != AllRecipeTypes.MECHANICAL_CRAFTING.type) && (r instanceof ShapedRecipe)), - mechanicalCraftingCategory.getUid()); + ALL.forEach(c -> c.recipes.forEach(s -> registration.addRecipes(s.get(), c.getUid()))); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - ItemStack fan = new ItemStack(AllBlocks.ENCASED_FAN.get()); - - ItemStack splashingFan = fan.copy().setDisplayName(new StringTextComponent(TextFormatting.RESET + Lang.translate("recipe.splashing.fan"))); - ItemStack smokingFan = fan.copy().setDisplayName(new StringTextComponent(TextFormatting.RESET + Lang.translate("recipe.smokingViaFan.fan"))); - ItemStack blastingFan = fan.copy().setDisplayName(new StringTextComponent(TextFormatting.RESET + Lang.translate("recipe.blastingViaFan.fan"))); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MILLSTONE.get()), millingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.CRUSHING_WHEEL.get()), crushingCategory.getUid()); - - registration.addRecipeCatalyst(splashingFan, splashingCategory.getUid()); - - registration.addRecipeCatalyst(smokingFan, smokingCategory.getUid()); - - registration.addRecipeCatalyst(blastingFan, blastingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_PRESS.get()), pressingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllItems.BLOCKZAPPER.get()), blockzapperCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_MIXER.get()), shapelessMixingCategory.getUid()); - registration.addRecipeCatalyst(new ItemStack(AllBlocks.BASIN.get()), shapelessMixingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_MIXER.get()), mixingCategory.getUid()); - registration.addRecipeCatalyst(new ItemStack(AllBlocks.BASIN.get()), mixingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_SAW.get()), sawingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_SAW.get()), blockCuttingCategory.getUid()); - registration.addRecipeCatalyst(new ItemStack(Blocks.STONECUTTER), blockCuttingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_PRESS.get()), packingCategory.getUid()); - registration.addRecipeCatalyst(new ItemStack(AllBlocks.BASIN.get()), packingCategory.getUid()); - - registration.addRecipeCatalyst(AllItems.SAND_PAPER.asStack(), polishingCategory.getUid()); - registration.addRecipeCatalyst(AllItems.RED_SAND_PAPER.asStack(), polishingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_CRAFTER.get()), mechanicalCraftingCategory.getUid()); - - registration.addRecipeCatalyst(new ItemStack(AllBlocks.MECHANICAL_CRAFTER.get()), mechanicalCraftingExclusiveCategory.getUid()); + ALL.forEach(c -> c.recipeCatalysts.forEach(s -> registration.addRecipeCatalyst(s.get(), c.getUid()))); } @Override public void registerGuiHandlers(IGuiHandlerRegistration registration) { registration.addGuiContainerHandler(AdjustableCrateScreen.class, new SlotMover<>()); registration.addGuiContainerHandler(SchematicannonScreen.class, new SlotMover<>()); - registration.addGhostIngredientHandler(AbstractFilterScreen.class, new FilterGhostIngredientHandler()); } - private static List> findRecipes(AllRecipeTypes recipe) { - return findRecipesByType(recipe.type); + private class CategoryBuilder> { + CreateRecipeCategory category; + private Predicate pred; + + CategoryBuilder(String name, Supplier> category) { + this.category = category.get(); + this.category.setCategoryId(name); + this.pred = Predicates.alwaysTrue(); + } + + CategoryBuilder catalyst(Supplier supplier) { + return catalystStack(() -> new ItemStack(supplier.get().asItem())); + } + + CategoryBuilder catalystStack(Supplier supplier) { + category.recipeCatalysts.add(supplier); + return this; + } + + CategoryBuilder recipes(AllRecipeTypes recipeTypeEntry) { + return recipes(recipeTypeEntry::getType); + } + + CategoryBuilder recipes(Supplier> recipeType) { + return recipes(r -> r.getType() == recipeType.get()); + } + + CategoryBuilder recipes(ResourceLocation serializer) { + return recipes(r -> r.getSerializer() + .getRegistryName() + .equals(serializer)); + } + + CategoryBuilder recipes(Predicate> pred) { + return recipeList(() -> findRecipes(pred)); + } + + CategoryBuilder recipes(Predicate> pred, Function, T> converter) { + return recipeList(() -> findRecipes(pred), converter); + } + + CategoryBuilder recipeList(Supplier>> list) { + return recipeList(list, null); + } + + CategoryBuilder recipeList(Supplier>> list, Function, T> converter) { + category.recipes.add(() -> { + if (!this.pred.test(AllConfigs.SERVER.recipes)) + return Collections.emptyList(); + if (converter != null) + return list.get() + .stream() + .map(converter) + .collect(Collectors.toList()); + return list.get(); + }); + return this; + } + + CategoryBuilder recipesExcluding(Supplier> recipeType, + Supplier> excluded) { + category.recipes.add(() -> { + if (!this.pred.test(AllConfigs.SERVER.recipes)) + return Collections.emptyList(); + return findRecipesByTypeExcluding(recipeType.get(), excluded.get()); + }); + return this; + } + + CategoryBuilder enableWhen(Function configValue) { + this.pred = c -> configValue.apply(c) + .get() + .booleanValue(); + return this; + } + + CreateRecipeCategory build() { + ALL.add(category); + return category; + } + } - private static List> findRecipes(Predicate> predicate) { - return Minecraft.getInstance().world.getRecipeManager() - .getRecipes() - .stream() - .filter(predicate) - .collect(Collectors.toList()); - } - - private static List> findRecipesByType(IRecipeType type) { + static List> findRecipesByType(IRecipeType type) { return findRecipes(r -> r.getType() == type); } - private static List> findRecipesById(ResourceLocation id) { - return findRecipes(r -> r.getSerializer().getRegistryName().equals(id)); + static List> findRecipes(Predicate> predicate) { + return Minecraft.getInstance().world.getRecipeManager() + .getRecipes() + .stream() + .filter(predicate) + .collect(Collectors.toList()); } - private static List> findRecipesByTypeExcluding(IRecipeType type, IRecipeType excludingType) { - List> byType = findRecipesByType(type); - List> byExcludingType = findRecipesByType(excludingType); + static List> findRecipesByTypeExcluding(IRecipeType type, IRecipeType excludingType) { + List> byType = findRecipes(r -> r.getType() == type); + List> byExcludingType = findRecipes(r -> r.getType() == excludingType); byType.removeIf(recipe -> { for (IRecipe r : byExcludingType) { - ItemStack[] matchingStacks = recipe.getIngredients().get(0).getMatchingStacks(); - if (matchingStacks.length == 0) return true; - if (r.getIngredients().get(0).test(matchingStacks[0])) return true; + ItemStack[] matchingStacks = recipe.getIngredients() + .get(0) + .getMatchingStacks(); + if (matchingStacks.length == 0) + return true; + if (r.getIngredients() + .get(0) + .test(matchingStacks[0])) + return true; } return false; }); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java index af117b494..3f82a09a3 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java @@ -32,8 +32,11 @@ import net.minecraftforge.fluids.FluidStack; public class BasinCategory extends CreateRecipeCategory { - public BasinCategory(String id, IDrawable icon, IDrawable background) { - super(id, icon, background); + private boolean needsHeating; + + public BasinCategory(boolean needsHeating, IDrawable icon, IDrawable background) { + super(icon, background); + this.needsHeating = needsHeating; } @Override @@ -44,13 +47,13 @@ public class BasinCategory extends CreateRecipeCategory { @Override public void setIngredients(BasinRecipe recipe, IIngredients ingredients) { List itemIngredients = new ArrayList<>(recipe.getIngredients()); - + HeatCondition requiredHeat = recipe.getRequiredHeat(); if (!requiredHeat.testBlazeBurner(HeatLevel.NONE)) itemIngredients.add(Ingredient.fromItems(AllBlocks.BLAZE_BURNER.get())); if (!requiredHeat.testBlazeBurner(HeatLevel.KINDLED)) itemIngredients.add(Ingredient.fromItems(AllItems.BLAZE_CAKE.get())); - + ingredients.setInputIngredients(itemIngredients); ingredients.setInputLists(VanillaTypes.FLUID, recipe.getFluidIngredients() .stream() @@ -108,7 +111,7 @@ public class BasinCategory extends CreateRecipeCategory { fluidStacks.init(j, true, 17 + xOffset + (i2 % 3) * 19, 51 - (i2 / 3) * 19 + yOffset); List stacks = fluidIngredients.get(j) .getMatchingFluidStacks(); - fluidStacks.set(j, stacks); + fluidStacks.set(j, withImprovedVisibility(stacks)); } if (!itemOutput.isEmpty()) { @@ -120,11 +123,11 @@ public class BasinCategory extends CreateRecipeCategory { if (!fluidOutput.isEmpty()) { fluidStacks.init(j, false, 142, 51 + yOffset); - fluidStacks.set(j, fluidOutput); + fluidStacks.set(j, withImprovedVisibility(fluidOutput)); } addFluidTooltip(fluidStacks, fluidIngredients, ImmutableList.of(fluidOutput)); - + HeatCondition requiredHeat = recipe.getRequiredHeat(); if (!requiredHeat.testBlazeBurner(HeatLevel.NONE)) { itemStacks.init(++i, true, 133, 80); @@ -136,6 +139,19 @@ public class BasinCategory extends CreateRecipeCategory { } } + public List withImprovedVisibility(List stacks) { + return stacks.stream() + .map(this::withImprovedVisibility) + .collect(Collectors.toList()); + } + + public FluidStack withImprovedVisibility(FluidStack stack) { + FluidStack display = stack.copy(); + int displayedAmount = (int) (stack.getAmount() * .75f) + 250; + display.setAmount(displayedAmount); + return display; + } + @Override public void draw(BasinRecipe recipe, double mouseX, double mouseY) { List> actualIngredients = ItemHelper.condenseIngredients(recipe.getIngredients()); @@ -156,9 +172,11 @@ public class BasinCategory extends CreateRecipeCategory { AllGuiTextures shadow = noHeat ? AllGuiTextures.JEI_SHADOW : AllGuiTextures.JEI_LIGHT; shadow.draw(81, 58 + (noHeat ? 10 : 30)); + if (!needsHeating) + return; + AllGuiTextures heatBar = noHeat ? AllGuiTextures.JEI_NO_HEAT_BAR : AllGuiTextures.JEI_HEAT_BAR; heatBar.draw(4, 80); - Minecraft.getInstance().fontRenderer.drawStringWithShadow(Lang.translate(requiredHeat.getTranslationKey()), 9, 85, requiredHeat.getColor()); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java index bb181f51f..6326ed9ab 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java @@ -26,7 +26,7 @@ public class BlockCuttingCategory extends CreateRecipeCategory { public BlockzapperUpgradeCategory() { - super("blockzapper_upgrade", itemIcon(AllItems.BLOCKZAPPER.get()), - new ScreenResourceWrapper(BLOCKZAPPER_UPGRADE_RECIPE)); + super(itemIcon(AllItems.BLOCKZAPPER.get()), new ScreenResourceWrapper(BLOCKZAPPER_UPGRADE_RECIPE)); } @Override @@ -57,7 +56,8 @@ public class BlockzapperUpgradeCategory extends CreateRecipeCategory 91 + 52 || mouseY < 1 || mouseY > 53) return list; list.addAll(recipe.getRecipeOutput() - .getTooltip(Minecraft.getInstance().player, - Minecraft.getInstance().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED - : ITooltipFlag.TooltipFlags.NORMAL) - .stream().map(ITextComponent::getFormattedText).collect(Collectors.toList())); + .getTooltip(Minecraft.getInstance().player, + Minecraft.getInstance().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED + : ITooltipFlag.TooltipFlags.NORMAL) + .stream() + .map(ITextComponent::getFormattedText) + .collect(Collectors.toList())); return list; } @Override public void draw(BlockzapperUpgradeRecipe recipe, double mouseX, double mouseY) { FontRenderer font = Minecraft.getInstance().fontRenderer; - String componentName = - Lang.translate("blockzapper.component." + Lang.asId(recipe.getUpgradedComponent().name())); + String componentName = Lang.translate("blockzapper.component." + Lang.asId(recipe.getUpgradedComponent() + .name())); String text = "+ " + recipe.getTier().color + componentName; font.drawStringWithShadow(text, (BLOCKZAPPER_UPGRADE_RECIPE.width - font.getStringWidth(text)) / 2, 57, - 0x8B8B8B); - + 0x8B8B8B); + RenderSystem.pushMatrix(); RenderSystem.translated(126, 0, 0); RenderSystem.scaled(3.5, 3.5, 3.5); RenderSystem.translated(-10, 0, 0); RenderSystem.color3f(1, 1, 1); - GuiGameElement.of(recipe.getRecipeOutput()).render(); + GuiGameElement.of(recipe.getRecipeOutput()) + .render(); RenderSystem.popMatrix(); } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java index 7ae9784f8..60eaa0855 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java @@ -3,10 +3,14 @@ package com.simibubi.create.compat.jei.category; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import com.simibubi.create.AllFluids; import com.simibubi.create.Create; import com.simibubi.create.compat.jei.DoubleItemIcon; import com.simibubi.create.compat.jei.EmptyBackground; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.processing.ProcessingOutput; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.foundation.fluid.FluidIngredient; @@ -21,23 +25,30 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; public abstract class CreateRecipeCategory> implements IRecipeCategory { - private ResourceLocation uid; - private String name; + public List> recipeCatalysts = new ArrayList<>(); + public List>>> recipes = new ArrayList<>(); + public ResourceLocation uid; + + protected String name; private IDrawable icon; private IDrawable background; - public CreateRecipeCategory(String id, IDrawable icon, IDrawable background) { - uid = new ResourceLocation(Create.ID, id); - name = id; + public CreateRecipeCategory(IDrawable icon, IDrawable background) { this.background = background; this.icon = icon; } + public void setCategoryId(String name) { + this.uid = new ResourceLocation(Create.ID, name); + this.name = name; + } + @Override public IDrawable getIcon() { return icon; @@ -102,10 +113,25 @@ public abstract class CreateRecipeCategory> implements IRec inputs.forEach(f -> amounts.add(f.getRequiredAmount())); outputs.forEach(f -> amounts.add(f.getAmount())); - fluidStacks.addTooltipCallback((slotIndex, input, ingredient, tooltip) -> { + fluidStacks.addTooltipCallback((slotIndex, input, fluid, tooltip) -> { + if (fluid.getFluid() + .isEquivalentTo(AllFluids.POTION.get())) { + String name = PotionFluidHandler.getPotionName(fluid) + .getFormattedText(); + if (tooltip.isEmpty()) + tooltip.add(0, name); + else + tooltip.set(0, name); + + ArrayList potionTooltip = new ArrayList<>(); + PotionFluidHandler.addPotionTooltip(fluid, potionTooltip, 1); + tooltip.addAll(1, potionTooltip.stream() + .map(ITextComponent::getFormattedText) + .collect(Collectors.toList())); + } + int amount = amounts.get(slotIndex); - String text = TextFormatting.GOLD + (amount == 1000 ? Lang.translate("generic.unit.bucket") - : Lang.translate("generic.unit.millibuckets", amount)); + String text = TextFormatting.GOLD + Lang.translate("generic.unit.millibuckets", amount); if (tooltip.isEmpty()) tooltip.add(0, text); else diff --git a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java index 64129fc4c..b4ceb8ad4 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CrushingCategory.java @@ -20,8 +20,7 @@ public class CrushingCategory extends CreateRecipeCategory results = recipe.getRollableResults(); int size = results.size(); int offset = -size * 19 / 2; for (int outputIndex = 0; outputIndex < size; outputIndex++) { itemStacks.init(outputIndex + 1, false, getBackground().getWidth() / 2 + offset + 19 * outputIndex, 78); - itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack()); + itemStacks.set(outputIndex + 1, results.get(outputIndex) + .getStack()); } addStochasticTooltip(itemStacks, results); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlastingViaFanCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java similarity index 68% rename from src/main/java/com/simibubi/create/compat/jei/category/BlastingViaFanCategory.java rename to src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java index 96b526d40..4e48ac500 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlastingViaFanCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanBlastingCategory.java @@ -8,10 +8,10 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.Items; import net.minecraft.item.crafting.AbstractCookingRecipe; -public class BlastingViaFanCategory extends ProcessingViaFanCategory { +public class FanBlastingCategory extends ProcessingViaFanCategory { - public BlastingViaFanCategory() { - super("blasting_via_fan", doubleItemIcon(AllItems.PROPELLER.get(), Items.LAVA_BUCKET)); + public FanBlastingCategory() { + super(doubleItemIcon(AllItems.PROPELLER.get(), Items.LAVA_BUCKET)); } @Override @@ -24,9 +24,9 @@ public class BlastingViaFanCategory extends ProcessingViaFanCategory { +public class FanSmokingCategory extends ProcessingViaFanCategory { - public SmokingViaFanCategory() { - super("smoking_via_fan", doubleItemIcon(AllItems.PROPELLER.get(), Items.BLAZE_POWDER)); + public FanSmokingCategory() { + super(doubleItemIcon(AllItems.PROPELLER.get(), Items.BLAZE_POWDER)); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java similarity index 93% rename from src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java rename to src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java index c986affbd..7779b3047 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SplashingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/FanWashingCategory.java @@ -17,10 +17,10 @@ import mezz.jei.api.ingredients.IIngredients; import net.minecraft.fluid.Fluids; import net.minecraft.item.Items; -public class SplashingCategory extends ProcessingViaFanCategory { +public class FanWashingCategory extends ProcessingViaFanCategory { - public SplashingCategory() { - super("splashing", doubleItemIcon(AllItems.PROPELLER.get(), Items.WATER_BUCKET)); + public FanWashingCategory() { + super(doubleItemIcon(AllItems.PROPELLER.get(), Items.WATER_BUCKET)); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java index 3b38e6d70..7b731b1e4 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MechanicalCraftingCategory.java @@ -1,9 +1,15 @@ package com.simibubi.create.compat.jei.category; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.compat.jei.category.animations.AnimatedCrafter; import com.simibubi.create.foundation.gui.AllGuiTextures; + import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; @@ -23,13 +29,107 @@ import net.minecraft.util.NonNullList; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - public class MechanicalCraftingCategory extends CreateRecipeCategory { + private final AnimatedCrafter crafter = new AnimatedCrafter(); + + public MechanicalCraftingCategory() { + super(itemIcon(AllBlocks.MECHANICAL_CRAFTER.get()), emptyBackground(177, 107)); + } + + @Override + public void setIngredients(ShapedRecipe recipe, IIngredients ingredients) { + ingredients.setInputIngredients(recipe.getIngredients()); + ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); + } + + @Override + public void setRecipe(IRecipeLayout recipeLayout, ShapedRecipe recipe, IIngredients ingredients) { + IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); + NonNullList recipeIngredients = recipe.getIngredients(); + + itemStacks.init(0, false, 133, 80); + itemStacks.set(0, recipe.getRecipeOutput() + .getStack()); + + int x = getXPadding(recipe); + int y = getYPadding(recipe); + float scale = getScale(recipe); + int size = recipeIngredients.size(); + IIngredientRenderer renderer = new CrafterIngredientRenderer(recipe); + + for (int i = 0; i < size; i++) { + float f = 19 * scale; + int slotSize = (int) (16 * scale); + int xPosition = (int) (x + 1 + (i % recipe.getWidth()) * f); + int yPosition = (int) (y + 1 + (i / recipe.getWidth()) * f); + itemStacks.init(i + 1, true, renderer, xPosition, yPosition, slotSize, slotSize, 0, 0); + itemStacks.set(i + 1, Arrays.asList(recipeIngredients.get(i) + .getMatchingStacks())); + } + + } + + static int maxSize = 100; + + public static float getScale(ShapedRecipe recipe) { + int w = recipe.getWidth(); + int h = recipe.getHeight(); + return Math.min(1, maxSize / (19f * Math.max(w, h))); + } + + public static int getYPadding(ShapedRecipe recipe) { + return 3 + 50 - (int) (getScale(recipe) * recipe.getHeight() * 19 * .5); + } + + public static int getXPadding(ShapedRecipe recipe) { + return 3 + 50 - (int) (getScale(recipe) * recipe.getWidth() * 19 * .5); + } + + @Override + public void draw(ShapedRecipe recipe, double mouseX, double mouseY) { + RenderSystem.pushMatrix(); + float scale = getScale(recipe); + RenderSystem.translated(getXPadding(recipe), getYPadding(recipe), 0); + + for (int row = 0; row < recipe.getHeight(); row++) + for (int col = 0; col < recipe.getWidth(); col++) + if (!recipe.getIngredients() + .get(row * recipe.getWidth() + col) + .hasNoMatchingItems()) { + RenderSystem.pushMatrix(); + RenderSystem.translated(col * 19 * scale, row * 19 * scale, 0); + RenderSystem.scaled(scale, scale, scale); + AllGuiTextures.JEI_SLOT.draw(0, 0); + RenderSystem.popMatrix(); + } + + RenderSystem.popMatrix(); + + AllGuiTextures.JEI_SLOT.draw(133, 80); + AllGuiTextures.JEI_DOWN_ARROW.draw(128, 59); + crafter.draw(129, 25); + + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 300); + + RenderHelper.disableStandardItemLighting(); + int amount = 0; + for (Ingredient ingredient : recipe.getIngredients()) { + if (Ingredient.EMPTY == ingredient) + continue; + amount++; + } + + Minecraft.getInstance().fontRenderer.drawStringWithShadow(amount + "", 142, 39, 0xFFFFFF); + RenderSystem.popMatrix(); + } + + @Override + public Class getRecipeClass() { + return ShapedRecipe.class; + } + private static final class CrafterIngredientRenderer implements IIngredientRenderer { private final ShapedRecipe recipe; @@ -66,11 +166,10 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory list; try { - list = ingredient - .getTooltip(player, tooltipFlag) - .stream() - .map(ITextComponent::getFormattedText) - .collect(Collectors.toList()); + list = ingredient.getTooltip(player, tooltipFlag) + .stream() + .map(ITextComponent::getFormattedText) + .collect(Collectors.toList()); } catch (RuntimeException | LinkageError e) { return new ArrayList<>(); } @@ -94,103 +193,4 @@ public class MechanicalCraftingCategory extends CreateRecipeCategory recipeIngredients = recipe.getIngredients(); - - itemStacks.init(0, false, 133, 80); - itemStacks.set(0, recipe.getRecipeOutput().getStack()); - - int x = getXPadding(recipe); - int y = getYPadding(recipe); - float scale = getScale(recipe); - int size = recipeIngredients.size(); - IIngredientRenderer renderer = new CrafterIngredientRenderer(recipe); - - for (int i = 0; i < size; i++) { - float f = 19 * scale; - int slotSize = (int) (16 * scale); - int xPosition = (int) (x + 1 + (i % recipe.getWidth()) * f); - int yPosition = (int) (y + 1 + (i / recipe.getWidth()) * f); - itemStacks.init(i + 1, true, renderer, xPosition, yPosition, slotSize, slotSize, 0, 0); - itemStacks.set(i + 1, Arrays.asList(recipeIngredients.get(i).getMatchingStacks())); - } - - } - - static int maxSize = 100; - - public static float getScale(ShapedRecipe recipe) { - int w = recipe.getWidth(); - int h = recipe.getHeight(); - return Math.min(1, maxSize / (19f * Math.max(w, h))); - } - - public static int getYPadding(ShapedRecipe recipe) { - return 3 + 50 - (int) (getScale(recipe) * recipe.getHeight() * 19 * .5); - } - - public static int getXPadding(ShapedRecipe recipe) { - return 3 + 50 - (int) (getScale(recipe) * recipe.getWidth() * 19 * .5); - } - - @Override - public void draw(ShapedRecipe recipe, double mouseX, double mouseY) { - RenderSystem.pushMatrix(); - float scale = getScale(recipe); - RenderSystem.translated(getXPadding(recipe), getYPadding(recipe), 0); - - for (int row = 0; row < recipe.getHeight(); row++) - for (int col = 0; col < recipe.getWidth(); col++) - if (!recipe.getIngredients().get(row * recipe.getWidth() + col).hasNoMatchingItems()) { - RenderSystem.pushMatrix(); - RenderSystem.translated(col * 19 * scale, row * 19 * scale, 0); - RenderSystem.scaled(scale, scale, scale); - AllGuiTextures.JEI_SLOT.draw(0, 0); - RenderSystem.popMatrix(); - } - - RenderSystem.popMatrix(); - - AllGuiTextures.JEI_SLOT.draw(133, 80); - AllGuiTextures.JEI_DOWN_ARROW.draw(128, 59); - crafter.draw(129, 25); - - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 300); - - RenderHelper.disableStandardItemLighting(); - int amount = 0; - for (Ingredient ingredient : recipe.getIngredients()) { - if (Ingredient.EMPTY == ingredient) - continue; - amount++; - } - - Minecraft.getInstance().fontRenderer - .drawStringWithShadow(amount + "", 142, 39, 0xFFFFFF); - RenderSystem.popMatrix(); - } - - @Override - public Class getRecipeClass() { - return ShapedRecipe.class; - } - } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java index 78be3a3ca..a3dc27e04 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MillingCategory.java @@ -20,8 +20,7 @@ public class MillingCategory extends CreateRecipeCategory getRecipes() { List recipes = new ArrayList<>(); + recipes.add(ConversionRecipe.create(AllItems.EMPTY_BLAZE_BURNER.asStack(), AllBlocks.BLAZE_BURNER.asStack())); recipes.add(ConversionRecipe.create(AllItems.CHROMATIC_COMPOUND.asStack(), AllItems.SHADOW_STEEL.asStack())); recipes.add(ConversionRecipe.create(AllItems.CHROMATIC_COMPOUND.asStack(), AllItems.REFINED_RADIANCE.asStack())); return recipes; } public MysteriousItemConversionCategory() { - super("mystery_conversion", itemIcon(AllItems.CHROMATIC_COMPOUND.get()), emptyBackground(177, 50)); + super(itemIcon(AllItems.CHROMATIC_COMPOUND.get()), emptyBackground(177, 50)); } @Override diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java index e3b4b24a9..e4c654888 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PackingCategory.java @@ -10,25 +10,41 @@ import com.simibubi.create.foundation.gui.AllGuiTextures; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; import mezz.jei.api.ingredients.IIngredients; +import net.minecraft.block.Blocks; import net.minecraft.item.crafting.Ingredient; +import net.minecraft.util.IItemProvider; import net.minecraft.util.NonNullList; public class PackingCategory extends BasinCategory { private AnimatedPress press = new AnimatedPress(true); + private PackingType type; - public PackingCategory() { - super("packing", doubleItemIcon(AllBlocks.MECHANICAL_PRESS.get(), AllBlocks.BASIN.get()), - emptyBackground(177, 103)); + enum PackingType { + AUTO_SQUARE, COMPACTING; + } + + public static PackingCategory standard() { + return new PackingCategory(PackingType.COMPACTING, AllBlocks.BASIN.get(), 103); + } + + public static PackingCategory autoSquare() { + return new PackingCategory(PackingType.AUTO_SQUARE, Blocks.CRAFTING_TABLE, 85); + } + + protected PackingCategory(PackingType type, IItemProvider icon, int height) { + super(type != PackingType.AUTO_SQUARE, doubleItemIcon(AllBlocks.MECHANICAL_PRESS.get(), icon), + emptyBackground(177, height)); + this.type = type; } @Override public void setRecipe(IRecipeLayout recipeLayout, BasinRecipe recipe, IIngredients ingredients) { - if (!recipe.convertedRecipe) { + if (type == PackingType.COMPACTING) { super.setRecipe(recipeLayout, recipe, ingredients); return; } - + IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); int i = 0; @@ -48,21 +64,20 @@ public class PackingCategory extends BasinCategory { @Override public void draw(BasinRecipe recipe, double mouseX, double mouseY) { - if (!recipe.convertedRecipe) { + if (type == PackingType.COMPACTING) { super.draw(recipe, mouseX, mouseY); - + } else { NonNullList ingredients2 = recipe.getIngredients(); int size = ingredients2.size(); int rows = size == 4 ? 2 : 3; - for (int i = 0; i < size; i++) + for (int i = 0; i < size; i++) AllGuiTextures.JEI_SLOT.draw((rows == 2 ? 26 : 17) + (i % rows) * 19, 50 - (i / rows) * 19); AllGuiTextures.JEI_SLOT.draw(141, 50); AllGuiTextures.JEI_DOWN_ARROW.draw(136, 32); AllGuiTextures.JEI_SHADOW.draw(81, 68); - AllGuiTextures.JEI_NO_HEAT_BAR.draw(4, 80); } - + press.draw(getBackground().getWidth() / 2 + 6, 40); } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java index 9f78bd908..5ca1af5de 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/PolishingCategory.java @@ -25,7 +25,7 @@ public class PolishingCategory extends CreateRecipeCategory results = recipe.getRollableResults(); itemStacks.init(0, true, 26, 28); - itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); + itemStacks.set(0, Arrays.asList(recipe.getIngredients() + .get(0) + .getMatchingStacks())); itemStacks.init(1, false, 131, 28); - itemStacks.set(1, results.get(0).getStack()); + itemStacks.set(1, results.get(0) + .getStack()); addStochasticTooltip(itemStacks, results); } @@ -61,7 +64,8 @@ public class PolishingCategory extends CreateRecipeCategory ingredients = recipe.getIngredients(); - ItemStack[] matchingStacks = ingredients.get(0).getMatchingStacks(); + ItemStack[] matchingStacks = ingredients.get(0) + .getMatchingStacks(); if (matchingStacks.length == 0) return; @@ -69,7 +73,8 @@ public class PolishingCategory extends CreateRecipeCategory { private AnimatedPress press = new AnimatedPress(false); public PressingCategory() { - super("pressing", doubleItemIcon(AllBlocks.MECHANICAL_PRESS.get(), AllItems.IRON_SHEET.get()), - emptyBackground(177, 70)); + super(doubleItemIcon(AllBlocks.MECHANICAL_PRESS.get(), AllItems.IRON_SHEET.get()), emptyBackground(177, 70)); } @Override @@ -39,12 +38,15 @@ public class PressingCategory extends CreateRecipeCategory { public void setRecipe(IRecipeLayout recipeLayout, PressingRecipe recipe, IIngredients ingredients) { IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); itemStacks.init(0, true, 26, 50); - itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks())); + itemStacks.set(0, Arrays.asList(recipe.getIngredients() + .get(0) + .getMatchingStacks())); List results = recipe.getRollableResults(); for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) { itemStacks.init(outputIndex + 1, false, 131 + 19 * outputIndex, 50); - itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack()); + itemStacks.set(outputIndex + 1, results.get(outputIndex) + .getStack()); } addStochasticTooltip(itemStacks, results); @@ -54,7 +56,8 @@ public class PressingCategory extends CreateRecipeCategory { public void draw(PressingRecipe recipe, double mouseX, double mouseY) { AllGuiTextures.JEI_SLOT.draw(26, 50); getRenderedSlot(recipe, 0).draw(131, 50); - if (recipe.getRollableResults().size() > 1) + if (recipe.getRollableResults() + .size() > 1) getRenderedSlot(recipe, 1).draw(131 + 19, 50); AllGuiTextures.JEI_SHADOW.draw(61, 41); AllGuiTextures.JEI_LONG_ARROW.draw(52, 54); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java index 4778bf058..ea6afdac2 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/ProcessingViaFanCategory.java @@ -1,6 +1,7 @@ package com.simibubi.create.compat.jei.category; import java.util.Arrays; +import java.util.function.Supplier; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlockPartials; @@ -8,18 +9,22 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.utility.Lang; import mezz.jei.api.constants.VanillaTypes; import mezz.jei.api.gui.IRecipeLayout; import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.ingredient.IGuiItemStackGroup; import mezz.jei.api.ingredients.IIngredients; +import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; public abstract class ProcessingViaFanCategory> extends CreateRecipeCategory { - public ProcessingViaFanCategory(String name, IDrawable icon) { - super(name, icon, emptyBackground(177, 70)); + public ProcessingViaFanCategory(IDrawable icon) { + super(icon, emptyBackground(177, 70)); } @Override @@ -28,6 +33,11 @@ public abstract class ProcessingViaFanCategory> extends Cre ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()); } + public static Supplier getFan(String name) { + return () -> AllBlocks.ENCASED_FAN.asStack() + .setDisplayName(new StringTextComponent(TextFormatting.RESET + Lang.translate("recipe." + name + ".fan"))); + } + @Override public void setRecipe(IRecipeLayout recipeLayout, T recipe, IIngredients ingredients) { IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java index e80686a35..86b8785f6 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/SawingCategory.java @@ -20,7 +20,7 @@ public class SawingCategory extends CreateRecipeCategory { private AnimatedSaw saw = new AnimatedSaw(); public SawingCategory() { - super("sawing", doubleItemIcon(AllBlocks.MECHANICAL_SAW.get(), Items.OAK_LOG), emptyBackground(177, 70)); + super(doubleItemIcon(AllBlocks.MECHANICAL_SAW.get(), Items.OAK_LOG), emptyBackground(177, 70)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index 17bbf9fce..7177d4fac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -1,9 +1,11 @@ package com.simibubi.create.content.contraptions.components.mixer; +import java.util.List; import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.content.contraptions.fluids.potion.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; import com.simibubi.create.foundation.advancement.AllTriggers; @@ -24,6 +26,8 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { @@ -151,6 +155,35 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { } } + @Override + protected List> getMatchingRecipes() { + List> matchingRecipes = super.getMatchingRecipes(); + + Optional basin = getBasin(); + if (!basin.isPresent()) + return matchingRecipes; + IItemHandler availableItems = basin.get() + .getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + .orElse(null); + if (availableItems == null) + return matchingRecipes; + + for (int i = 0; i < availableItems.getSlots(); i++) { + ItemStack stack = availableItems.getStackInSlot(i); + if (stack.isEmpty()) + continue; + + List list = PotionMixingRecipeManager.ALL.get(stack.getItem()); + if (list == null) + continue; + for (MixingRecipe mixingRecipe : list) + if (matchBasinRecipe(mixingRecipe)) + matchingRecipes.add(mixingRecipe); + } + + return matchingRecipes; + } + @Override protected boolean matchStaticFilters(IRecipe r) { return ((r.getSerializer() == IRecipeSerializer.CRAFTING_SHAPELESS @@ -190,7 +223,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { protected boolean isRunning() { return running; } - + @Override protected Optional getProcessedRecipeTrigger() { return Optional.of(AllTriggers.MIXER_MIX); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java deleted file mode 100644 index 9b03c90d2..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/CombinedFluidHandler.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.simibubi.create.content.contraptions.fluids; - -import java.util.Arrays; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import javax.annotation.Nonnull; - -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.nbt.ListNBT; -import net.minecraft.util.math.MathHelper; -import net.minecraftforge.common.util.NonNullConsumer; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.IFluidHandler; - -public class CombinedFluidHandler implements IFluidHandler { - private final int capacity; - private final FluidStack[] tanks; - - public CombinedFluidHandler(int tankNumber, int capacity) { - this.capacity = capacity; - this.tanks = new FluidStack[tankNumber]; - Arrays.fill(tanks, FluidStack.EMPTY); - } - - @Override - public int getTanks() { - return tanks.length; - } - - @Nonnull - @Override - public FluidStack getFluidInTank(int tank) { - if (tank < 0 || tank >= tanks.length) - return FluidStack.EMPTY; - return tanks[tank]; - } - - @Override - public int getTankCapacity(int tank) { - return capacity; - } - - @Override - public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { - return (!stack.isEmpty()) && (tanks[tank].isEmpty() || tanks[tank].isFluidEqual(stack)) - && tanks[tank].getAmount() < capacity; - } - - @Override - public int fill(FluidStack resource, FluidAction action) { - int tankIndex; - int amount = resource.getAmount(); - while ((tankIndex = getFittingFluidSlot(resource)) != -1) { - int newAmount = MathHelper.clamp(amount - capacity - tanks[tankIndex].getAmount(), 0, Integer.MAX_VALUE); - if (action == FluidAction.EXECUTE) - if (tanks[tankIndex].isEmpty()) - tanks[tankIndex] = new FluidStack(resource.getFluid(), amount - newAmount); - else - tanks[tankIndex].grow(amount - newAmount); - amount = newAmount; - if (amount == 0) - return 0; - } - return amount; - } - - @Nonnull - @Override - public FluidStack drain(FluidStack resource, FluidAction action) { - if (resource.isEmpty()) - return FluidStack.EMPTY; - - FluidStack stack = new FluidStack(resource, 0); - - for (int i = 0; i < tanks.length; i++) { - if (tanks[i].isFluidEqual(resource)) { - stack.grow(tanks[i].getAmount()); - if (action == FluidAction.EXECUTE) - tanks[i] = FluidStack.EMPTY; - } - } - - return stack.isEmpty() ? FluidStack.EMPTY : stack; - } - - @Nonnull - @Override - public FluidStack drain(int maxDrain, FluidAction action) { - FluidStack stack = new FluidStack(tanks[0].getFluid(), 0); - - for (int i = 0; i < tanks.length; i++) { - if (stack.isEmpty() || tanks[i].isFluidEqual(stack)) { - int newDrainAmount = MathHelper.clamp(stack.getAmount() + tanks[i].getAmount(), 0, maxDrain); - if (action == FluidAction.EXECUTE) { - tanks[i].shrink(newDrainAmount - stack.getAmount()); - if (tanks[i].isEmpty()) - tanks[i] = FluidStack.EMPTY; - } - if (stack.isEmpty()) - stack = tanks[i].copy(); - if (stack.isEmpty()) - continue; - stack.setAmount(newDrainAmount); - } - } - - return stack.isEmpty() ? FluidStack.EMPTY : stack; - } - - private int getFittingFluidSlot(FluidStack fluidStack) { - return IntStream.range(0, tanks.length) - .filter(i -> isFluidValid(i, fluidStack)) - .findFirst() - .orElse(-1); - } - - private void setFluid(FluidStack fluid, int tank) { - tanks[tank] = fluid; - } - - public CombinedFluidHandler readFromNBT(ListNBT fluidNBTs) { - for (int i = 0; i < Math.min(tanks.length, fluidNBTs.size()); i++) - setFluid(FluidStack.loadFluidStackFromNBT(fluidNBTs.getCompound(i)), i); - return this; - } - - public ListNBT getListNBT() { - return Arrays.stream(tanks) - .map(fluid -> fluid.writeToNBT(new CompoundNBT())) - .collect(Collectors.toCollection(ListNBT::new)); - } - - public void forEachTank(NonNullConsumer fluidStackConsumer) { - Arrays.stream(tanks) - .forEach(fluidStackConsumer::accept); - } -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java index 7e630a56f..1324ee41c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidNetworkFlow.java @@ -114,7 +114,7 @@ class FluidNetworkFlow { return; } - fluidStack = provideFluid; + fluidStack = provideFluid.copy(); // There is currently no unfinished flow being followed if (flowPointers.isEmpty()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java index 4afe6f0d6..799fef49f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FillingBySpout.java @@ -9,12 +9,7 @@ import com.simibubi.create.foundation.fluid.FluidIngredient; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; -import net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.wrapper.RecipeWrapper; @@ -27,18 +22,7 @@ public class FillingBySpout { if (AllRecipeTypes.FILLING.find(wrapper, world) .isPresent()) return true; - - LazyOptional capability = - stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); - IFluidHandlerItem tank = capability.orElse(null); - if (tank == null) - return false; - for (int i = 0; i < tank.getTanks(); i++) { - if (tank.getFluidInTank(i) - .getAmount() < tank.getTankCapacity(i)) - return true; - } - return false; + return GenericItemFilling.canItemBeFilled(world, stack); } public static int getRequiredAmountForItem(World world, ItemStack stack, FluidStack availableFluid) { @@ -50,23 +34,12 @@ public class FillingBySpout { if (requiredFluid.test(availableFluid)) return requiredFluid.getRequiredAmount(); } - - LazyOptional capability = - stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); - IFluidHandlerItem tank = capability.orElse(null); - if (tank == null) - return -1; - if (tank instanceof FluidBucketWrapper) - return 1000; - - int filled = tank.fill(availableFluid, FluidAction.SIMULATE); - return filled == 0 ? -1 : filled; + return GenericItemFilling.getRequiredAmountForItem(world, stack, availableFluid); } public static ItemStack fillItem(World world, int requiredAmount, ItemStack stack, FluidStack availableFluid) { FluidStack toFill = availableFluid.copy(); toFill.setAmount(requiredAmount); - availableFluid.shrink(requiredAmount); wrapper.setInventorySlotContents(0, stack); Optional> recipe = AllRecipeTypes.FILLING.find(wrapper, world); @@ -75,23 +48,12 @@ public class FillingBySpout { FluidIngredient requiredFluid = fillingRecipe.getRequiredFluid(); if (requiredFluid.test(toFill)) { List results = fillingRecipe.rollResults(); + availableFluid.shrink(requiredAmount); stack.shrink(1); return results.isEmpty() ? ItemStack.EMPTY : results.get(0); } } - - ItemStack split = stack.copy(); - split.setCount(1); - LazyOptional capability = - split.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); - IFluidHandlerItem tank = capability.orElse(null); - if (tank == null) - return ItemStack.EMPTY; - tank.fill(toFill, FluidAction.EXECUTE); - ItemStack container = tank.getContainer() - .copy(); - stack.shrink(1); - return container; + return GenericItemFilling.fillItem(world, requiredAmount, stack, availableFluid); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java new file mode 100644 index 000000000..e6b030e59 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java @@ -0,0 +1,82 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; +import com.simibubi.create.foundation.fluid.FluidHelper; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.fluids.capability.wrappers.FluidBucketWrapper; + +public class GenericItemFilling { + + public static boolean canItemBeFilled(World world, ItemStack stack) { + if (stack.getItem() == Items.GLASS_BOTTLE) + return true; + + LazyOptional capability = + stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + IFluidHandlerItem tank = capability.orElse(null); + if (tank == null) + return false; + for (int i = 0; i < tank.getTanks(); i++) { + if (tank.getFluidInTank(i) + .getAmount() < tank.getTankCapacity(i)) + return true; + } + return false; + } + + public static int getRequiredAmountForItem(World world, ItemStack stack, FluidStack availableFluid) { + if (stack.getItem() == Items.GLASS_BOTTLE) + return PotionFluidHandler.getRequiredAmountForFilledBottle(stack, availableFluid); + + LazyOptional capability = + stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + IFluidHandlerItem tank = capability.orElse(null); + if (tank == null) + return -1; + if (tank instanceof FluidBucketWrapper) + return 1000; + + int filled = tank.fill(availableFluid, FluidAction.SIMULATE); + return filled == 0 ? -1 : filled; + } + + public static ItemStack fillItem(World world, int requiredAmount, ItemStack stack, FluidStack availableFluid) { + FluidStack toFill = availableFluid.copy(); + toFill.setAmount(requiredAmount); + availableFluid.shrink(requiredAmount); + + if (stack.getItem() == Items.GLASS_BOTTLE) { + ItemStack fillBottle = ItemStack.EMPTY; + if (FluidHelper.isWater(toFill.getFluid())) + fillBottle = PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER); + else + fillBottle = PotionFluidHandler.fillBottle(stack, toFill); + stack.shrink(1); + return fillBottle; + } + + ItemStack split = stack.copy(); + split.setCount(1); + LazyOptional capability = + split.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); + IFluidHandlerItem tank = capability.orElse(null); + if (tank == null) + return ItemStack.EMPTY; + tank.fill(toFill, FluidAction.EXECUTE); + ItemStack container = tank.getContainer() + .copy(); + stack.shrink(1); + return container; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java new file mode 100644 index 000000000..d1d54ff75 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java @@ -0,0 +1,111 @@ +package com.simibubi.create.content.contraptions.fluids.potion; + +import java.util.Collection; +import java.util.List; + +import com.simibubi.create.AllFluids; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.ListNBT; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.registries.ForgeRegistries; + +public class PotionFluid extends ForgeFlowingFluid { + + public enum BottleType { + REGULAR, SPLASH, LINGERING; + } + + public PotionFluid(Properties properties) { + super(properties); + } + + public static FluidStack withEffects(int amount, Potion potion, List customEffects) { + FluidStack fluidStack = new FluidStack(AllFluids.POTION.get() + .getStillFluid(), amount); + addPotionToFluidStack(fluidStack, potion); + appendEffects(fluidStack, customEffects); + return fluidStack; + } + + @Override + public Fluid getStillFluid() { + return this; + } + + @Override + public Fluid getFlowingFluid() { + return this; + } + + @Override + public Item getFilledBucket() { + return Items.AIR; + } + + @Override + protected BlockState getBlockState(IFluidState state) { + return Blocks.AIR.getDefaultState(); + } + + @Override + public boolean isSource(IFluidState p_207193_1_) { + return false; + } + + @Override + public int getLevel(IFluidState p_207192_1_) { + return 0; + } + + public static class PotionFluidAttributes extends FluidAttributes { + + public PotionFluidAttributes(Builder builder, Fluid fluid) { + super(builder, fluid); + } + + @Override + public int getColor(FluidStack stack) { + CompoundNBT tag = stack.getOrCreateTag(); + int color = PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromTag(tag)) | 0xff000000; + return color; + } + + } + + public static FluidStack addPotionToFluidStack(FluidStack fs, Potion potion) { + ResourceLocation resourcelocation = ForgeRegistries.POTION_TYPES.getKey(potion); + if (potion == Potions.EMPTY) { + fs.removeChildTag("Potion"); + return fs; + } + fs.getOrCreateTag() + .putString("Potion", resourcelocation.toString()); + return fs; + } + + public static FluidStack appendEffects(FluidStack fs, Collection customEffects) { + if (customEffects.isEmpty()) + return fs; + CompoundNBT compoundnbt = fs.getOrCreateTag(); + ListNBT listnbt = compoundnbt.getList("CustomPotionEffects", 9); + for (EffectInstance effectinstance : customEffects) + listnbt.add(effectinstance.write(new CompoundNBT())); + compoundnbt.put("CustomPotionEffects", listnbt); + return fs; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java new file mode 100644 index 000000000..aea7da59d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java @@ -0,0 +1,171 @@ +package com.simibubi.create.content.contraptions.fluids.potion; + +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import com.google.common.collect.Lists; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid.BottleType; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pair; + +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.ai.attributes.IAttribute; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.potion.Effect; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.EffectUtils; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.util.IItemProvider; +import net.minecraft.util.Tuple; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; + +public class PotionFluidHandler { + + public static Pair emptyPotion(ItemStack stack, boolean simulate) { + FluidStack fluid = getFluidFromPotionItem(stack); + if (!simulate) + stack.shrink(1); + return Pair.of(fluid, new ItemStack(Items.GLASS_BOTTLE)); + } + + public static FluidStack getFluidFromPotionItem(ItemStack stack) { + Potion potion = PotionUtils.getPotionFromItem(stack); + List list = PotionUtils.getFullEffectsFromItem(stack); + FluidStack fluid = PotionFluid.withEffects(250, potion, list); + BottleType bottleTypeFromItem = bottleTypeFromItem(stack); + if (potion == Potions.WATER && list.isEmpty() && bottleTypeFromItem == BottleType.REGULAR) + return new FluidStack(Fluids.WATER, fluid.getAmount()); + NBTHelper.writeEnum(fluid.getOrCreateTag(), "Bottle", bottleTypeFromItem); + return fluid; + } + + public static BottleType bottleTypeFromItem(ItemStack stack) { + Item item = stack.getItem(); + if (item == Items.LINGERING_POTION) + return BottleType.LINGERING; + if (item == Items.SPLASH_POTION) + return BottleType.SPLASH; + return BottleType.REGULAR; + } + + public static IItemProvider itemFromBottleType(BottleType type) { + switch (type) { + case LINGERING: + return Items.LINGERING_POTION; + case SPLASH: + return Items.SPLASH_POTION; + case REGULAR: + default: + return Items.POTION; + } + } + + public static int getRequiredAmountForFilledBottle(ItemStack stack, FluidStack availableFluid) { + return 250; + } + + public static ItemStack fillBottle(ItemStack stack, FluidStack availableFluid) { + CompoundNBT tag = availableFluid.getOrCreateTag(); + ItemStack potionStack = new ItemStack(itemFromBottleType(NBTHelper.readEnum(tag, "Bottle", BottleType.class))); + PotionUtils.addPotionToItemStack(potionStack, PotionUtils.getPotionTypeFromNBT(tag)); + PotionUtils.appendEffects(potionStack, PotionUtils.getFullEffectsFromTag(tag)); + return potionStack; + } + + public static ITextComponent getPotionName(FluidStack fs) { + CompoundNBT tag = fs.getOrCreateTag(); + IItemProvider itemFromBottleType = itemFromBottleType(NBTHelper.readEnum(tag, "Bottle", BottleType.class)); + return new TranslationTextComponent(PotionUtils.getPotionTypeFromNBT(tag) + .getNamePrefixed(itemFromBottleType.asItem() + .getTranslationKey() + ".effect.")); + } + + // Modified version of PotionUtils#addPotionTooltip + @OnlyIn(Dist.CLIENT) + public static void addPotionTooltip(FluidStack fs, List tooltip, float p_185182_2_) { + List list = PotionUtils.getEffectsFromTag(fs.getOrCreateTag()); + List> list1 = Lists.newArrayList(); + if (list.isEmpty()) { + tooltip.add((new TranslationTextComponent("effect.none")).applyTextStyle(TextFormatting.GRAY)); + } else { + for (EffectInstance effectinstance : list) { + ITextComponent itextcomponent = new TranslationTextComponent(effectinstance.getEffectName()); + Effect effect = effectinstance.getPotion(); + Map map = effect.getAttributeModifierMap(); + if (!map.isEmpty()) { + for (Entry entry : map.entrySet()) { + AttributeModifier attributemodifier = entry.getValue(); + AttributeModifier attributemodifier1 = new AttributeModifier(attributemodifier.getName(), + effect.getAttributeModifierAmount(effectinstance.getAmplifier(), attributemodifier), + attributemodifier.getOperation()); + list1.add(new Tuple<>(entry.getKey() + .getName(), attributemodifier1)); + } + } + + if (effectinstance.getAmplifier() > 0) { + itextcomponent.appendText(" ") + .appendSibling(new TranslationTextComponent("potion.potency." + effectinstance.getAmplifier())); + } + + if (effectinstance.getDuration() > 20) { + itextcomponent.appendText(" (") + .appendText(EffectUtils.getPotionDurationString(effectinstance, p_185182_2_)) + .appendText(")"); + } + + tooltip.add(itextcomponent.applyTextStyle(effect.getEffectType() + .getColor())); + } + } + + if (!list1.isEmpty()) { + tooltip.add(new StringTextComponent("")); + tooltip.add((new TranslationTextComponent("potion.whenDrank")).applyTextStyle(TextFormatting.DARK_PURPLE)); + + for (Tuple tuple : list1) { + AttributeModifier attributemodifier2 = tuple.getB(); + double d0 = attributemodifier2.getAmount(); + double d1; + if (attributemodifier2.getOperation() != AttributeModifier.Operation.MULTIPLY_BASE + && attributemodifier2.getOperation() != AttributeModifier.Operation.MULTIPLY_TOTAL) { + d1 = attributemodifier2.getAmount(); + } else { + d1 = attributemodifier2.getAmount() * 100.0D; + } + + if (d0 > 0.0D) { + tooltip.add((new TranslationTextComponent( + "attribute.modifier.plus." + attributemodifier2.getOperation() + .getId(), + ItemStack.DECIMALFORMAT.format(d1), + new TranslationTextComponent("attribute.name." + (String) tuple.getA()))) + .applyTextStyle(TextFormatting.BLUE)); + } else if (d0 < 0.0D) { + d1 = d1 * -1.0D; + tooltip.add((new TranslationTextComponent( + "attribute.modifier.take." + attributemodifier2.getOperation() + .getId(), + ItemStack.DECIMALFORMAT.format(d1), + new TranslationTextComponent("attribute.name." + (String) tuple.getA()))) + .applyTextStyle(TextFormatting.RED)); + } + } + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionMixingRecipeManager.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionMixingRecipeManager.java new file mode 100644 index 000000000..2fac429f0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionMixingRecipeManager.java @@ -0,0 +1,158 @@ +package com.simibubi.create.content.contraptions.fluids.potion; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.components.mixer.MixingRecipe; +import com.simibubi.create.content.contraptions.processing.HeatCondition; +import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder; +import com.simibubi.create.foundation.fluid.FluidIngredient; + +import net.minecraft.client.resources.ReloadListener; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.Ingredient; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionBrewing; +import net.minecraft.potion.PotionUtils; +import net.minecraft.potion.Potions; +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IResourceManager; +import net.minecraftforge.common.brewing.BrewingRecipeRegistry; +import net.minecraftforge.common.brewing.IBrewingRecipe; +import net.minecraftforge.common.brewing.VanillaBrewingRecipe; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; + +public class PotionMixingRecipeManager { + + public static Map> ALL = new HashMap<>(); + + public static List getAllBrewingRecipes() { + List mixingRecipes = new ArrayList<>(); + + // Vanilla + for (IBrewingRecipe iBrewingRecipe : BrewingRecipeRegistry.getRecipes()) { + if (!(iBrewingRecipe instanceof VanillaBrewingRecipe)) + continue; + + List bottles = new ArrayList<>(); + PotionBrewing.POTION_ITEMS.forEach(i -> { + for (ItemStack itemStack : i.getMatchingStacks()) + bottles.add(itemStack); + }); + + Collection reagents = getAllReagents(iBrewingRecipe); + + Set basicPotions = new HashSet<>(); + for (Potion potion : ForgeRegistries.POTION_TYPES.getValues()) { + if (potion == Potions.EMPTY) + continue; + for (ItemStack stack : bottles) + basicPotions.add(PotionUtils.addPotionToItemStack(stack.copy(), potion)); + } + + Set uniqueKeys = new HashSet<>(); + List potionFrontier = new ArrayList<>(); + List newPotions = new ArrayList<>(); + potionFrontier.addAll(basicPotions); + + int recipeIndex = 0; + + while (!potionFrontier.isEmpty()) { + newPotions.clear(); + + for (ItemStack inputPotionStack : potionFrontier) { + Potion inputPotion = PotionUtils.getPotionFromItem(inputPotionStack); + + for (ItemStack potionReagent : reagents) { + ItemStack outputPotionStack = iBrewingRecipe.getOutput(inputPotionStack.copy(), potionReagent); + if (outputPotionStack.isEmpty()) + continue; + + String uniqueKey = potionReagent.getItem() + .getRegistryName() + .toString() + "_" + + inputPotion.getRegistryName() + .toString() + + "_" + inputPotionStack.getItem() + .getRegistryName() + .toString(); + + if (!uniqueKeys.add(uniqueKey)) + continue; + + if (inputPotionStack.getItem() == outputPotionStack.getItem()) { + Potion outputPotion = PotionUtils.getPotionFromItem(outputPotionStack); + if (outputPotion == Potions.WATER) + continue; + } + + FluidStack fluidFromPotionItem = PotionFluidHandler.getFluidFromPotionItem(inputPotionStack); + FluidStack fluidFromPotionItem2 = PotionFluidHandler.getFluidFromPotionItem(outputPotionStack); + fluidFromPotionItem.setAmount(1000); + fluidFromPotionItem2.setAmount(1000); + + MixingRecipe mixingRecipe = new ProcessingRecipeBuilder<>(MixingRecipe::new, + Create.asResource("potion_" + recipeIndex++)).require(Ingredient.fromStacks(potionReagent)) + .require(FluidIngredient.fromFluidStack(fluidFromPotionItem)) + .output(fluidFromPotionItem2) + .requiresHeat(HeatCondition.HEATED) + .build(); + + mixingRecipes.add(mixingRecipe); + newPotions.add(outputPotionStack); + } + } + + potionFrontier.clear(); + potionFrontier.addAll(newPotions); + } + + break; + } + + // TODO Modded brewing recipes? + + return mixingRecipes; + } + + public static Collection getAllReagents(IBrewingRecipe recipe) { + return ForgeRegistries.ITEMS.getValues() + .stream() + .map(ItemStack::new) + .filter(recipe::isIngredient) + .collect(Collectors.toList()); + } + + public static final ReloadListener LISTENER = new ReloadListener() { + + @Override + protected Object prepare(IResourceManager p_212854_1_, IProfiler p_212854_2_) { + return new Object(); + } + + @Override + protected void apply(Object p_212853_1_, IResourceManager p_212853_2_, IProfiler p_212853_3_) { + ALL.clear(); + getAllBrewingRecipes().forEach(recipe -> { + for (Ingredient ingredient : recipe.getIngredients()) { + for (ItemStack itemStack : ingredient.getMatchingStacks()) { + ALL.computeIfAbsent(itemStack.getItem(), t -> new ArrayList<>()) + .add(recipe); + return; + } + } + }); + } + + }; + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 6a57ebbb1..6925f7c67 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.processing; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.block.ITE; @@ -81,7 +82,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab if (!heldItem.isEmpty()) { if (tryEmptyItemIntoBasin(worldIn, player, handIn, heldItem, te)) return ActionResultType.SUCCESS; - return ActionResultType.PASS; + if (tryFillItemFromBasin(worldIn, player, handIn, heldItem, te)) + return ActionResultType.SUCCESS; + return ActionResultType.SUCCESS; } IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1)); @@ -101,25 +104,72 @@ public class BasinBlock extends Block implements ITE, IWrenchab if (!EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)) return false; - Pair emptyItem = EmptyingByBasin.emptyItem(worldIn, heldItem, true); + Pair emptyingResult = EmptyingByBasin.emptyItem(worldIn, heldItem, true); LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); IFluidHandler tank = capability.orElse(null); - FluidStack fluidStack = emptyItem.getFirst(); + FluidStack fluidStack = emptyingResult.getFirst(); if (tank == null || fluidStack.getAmount() != tank.fill(fluidStack, FluidAction.SIMULATE)) return false; if (worldIn.isRemote) return true; - EmptyingByBasin.emptyItem(worldIn, heldItem, false); + ItemStack copyOfHeld = heldItem.copy(); + emptyingResult = EmptyingByBasin.emptyItem(worldIn, copyOfHeld, false); tank.fill(fluidStack, FluidAction.EXECUTE); - if (heldItem.isEmpty()) - player.setHeldItem(handIn, emptyItem.getSecond()); - else - player.inventory.placeItemBackInInventory(worldIn, emptyItem.getSecond()); + + if (!player.isCreative()) { + if (copyOfHeld.isEmpty()) + player.setHeldItem(handIn, emptyingResult.getSecond()); + else { + player.setHeldItem(handIn, copyOfHeld); + player.inventory.placeItemBackInInventory(worldIn, emptyingResult.getSecond()); + } + } return true; } + protected boolean tryFillItemFromBasin(World world, PlayerEntity player, Hand handIn, ItemStack heldItem, + BasinTileEntity te) { + if (!GenericItemFilling.canItemBeFilled(world, heldItem)) + return false; + + LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); + IFluidHandler tank = capability.orElse(null); + + if (tank == null) + return false; + + for (int i = 0; i < tank.getTanks(); i++) { + FluidStack fluid = tank.getFluidInTank(i); + if (fluid.isEmpty()) + continue; + int requiredAmountForItem = GenericItemFilling.getRequiredAmountForItem(world, heldItem, fluid.copy()); + if (requiredAmountForItem == -1) + continue; + if (requiredAmountForItem > fluid.getAmount()) + continue; + + if (world.isRemote) + return true; + + if (player.isCreative()) + heldItem = heldItem.copy(); + ItemStack out = GenericItemFilling.fillItem(world, requiredAmountForItem, heldItem, fluid.copy()); + + FluidStack copy = fluid.copy(); + copy.setAmount(requiredAmountForItem); + tank.drain(copy, FluidAction.EXECUTE); + + if (!player.isCreative()) + player.inventory.placeItemBackInInventory(world, out); + te.notifyUpdate(); + return true; + } + + return false; + } + @Override public void onLanded(IBlockReader worldIn, Entity entityIn) { super.onLanded(worldIn, entityIn); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java index d258d6adc..32ed3a75a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRecipe.java @@ -32,8 +32,23 @@ public class BasinRecipe extends ProcessingRecipe { public static boolean match(BasinTileEntity basin, IRecipe recipe) { FilteringBehaviour filter = basin.getFilter(); - if (filter == null || !filter.test(recipe.getRecipeOutput())) + if (filter == null) return false; + + boolean filterTest = filter.test(recipe.getRecipeOutput()); + if (recipe instanceof BasinRecipe) { + BasinRecipe basinRecipe = (BasinRecipe) recipe; + if (basinRecipe.getRollableResults() + .isEmpty() + && !basinRecipe.getFluidResults() + .isEmpty()) + filterTest = filter.test(basinRecipe.getFluidResults() + .get(0)); + } + + if (!filterTest) + return false; + return apply(basin, recipe, true); } @@ -146,17 +161,11 @@ public class BasinRecipe extends ProcessingRecipe { return true; } - /** - * For JEI purposes only - */ - public boolean convertedRecipe; - - public static BasinRecipe convert(IRecipe recipe) { + public static BasinRecipe convertShapeless(IRecipe recipe) { BasinRecipe basinRecipe = new ProcessingRecipeBuilder<>(BasinRecipe::new, recipe.getId()).withItemIngredients(recipe.getIngredients()) .withSingleItemOutput(recipe.getRecipeOutput()) .build(); - basinRecipe.convertedRecipe = true; return basinRecipe; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java index 041647651..8545a81d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/EmptyingByBasin.java @@ -4,9 +4,11 @@ import java.util.List; import java.util.Optional; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.foundation.utility.Pair; import net.minecraft.item.ItemStack; +import net.minecraft.item.PotionItem; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; import net.minecraftforge.common.util.LazyOptional; @@ -22,6 +24,9 @@ public class EmptyingByBasin { static RecipeWrapper wrapper = new RecipeWrapper(new ItemStackHandler(1)); public static boolean canItemBeEmptied(World world, ItemStack stack) { + if (stack.getItem() instanceof PotionItem) + return true; + wrapper.setInventorySlotContents(0, stack); if (AllRecipeTypes.EMPTYING.find(wrapper, world) .isPresent()) @@ -44,6 +49,9 @@ public class EmptyingByBasin { FluidStack resultingFluid = FluidStack.EMPTY; ItemStack resultingItem = ItemStack.EMPTY; + if (stack.getItem() instanceof PotionItem) + return PotionFluidHandler.emptyPotion(stack, simulate); + wrapper.setInventorySlotContents(0, stack); Optional> recipe = AllRecipeTypes.EMPTYING.find(wrapper, world); if (recipe.isPresent()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java index d33278705..c0b1deb2e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipeBuilder.java @@ -155,7 +155,11 @@ public class ProcessingRecipeBuilder> { } public ProcessingRecipeBuilder output(Fluid fluid, int amount) { - params.fluidResults.add(new FluidStack(fluid, amount)); + return output(new FluidStack(fluid, amount)); + } + + public ProcessingRecipeBuilder output(FluidStack fluidStack) { + params.fluidResults.add(fluidStack); return this; } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java index d66741e7c..abc56ce43 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java @@ -8,6 +8,7 @@ import javax.annotation.Nonnull; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode; import com.simibubi.create.foundation.item.ItemDescription; import com.simibubi.create.foundation.utility.Lang; @@ -35,7 +36,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; @@ -185,7 +185,7 @@ public class FilterItem extends Item implements INamedContainerProvider { } public static boolean test(World world, FluidStack stack, ItemStack filter) { - return test(world, stack, filter, false); + return test(world, stack, filter, true); } private static boolean test(World world, ItemStack stack, ItemStack filter, boolean matchNBT) { @@ -264,13 +264,17 @@ public class FilterItem extends Item implements INamedContainerProvider { return false; if (!(filter.getItem() instanceof FilterItem)) { + if (!EmptyingByBasin.canItemBeEmptied(world, filter)) + return false; + FluidStack fluidInFilter = EmptyingByBasin.emptyItem(world, filter, true) + .getFirst(); + if (fluidInFilter == null) + return false; if (!matchNBT) - return filter.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY) - .filter(ifh -> ifh.getTanks() > 0) - .map(ifh -> ifh.getFluidInTank(0) - .getFluid() == stack.getFluid()) - .orElse(false); - return stack.isFluidEqual(filter); + return fluidInFilter.getFluid() + .isEquivalentTo(stack.getFluid()); + boolean fluidEqual = fluidInFilter.isFluidEqual(stack); + return fluidEqual; } if (AllItems.FILTER.get() == filter.getItem()) { diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index 03f1f59e2..d99961017 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -4,6 +4,7 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingPhysics; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; +import com.simibubi.create.content.contraptions.fluids.potion.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.wrench.WrenchItem; import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.foundation.command.AllCommands; @@ -13,6 +14,7 @@ import com.simibubi.create.foundation.utility.recipe.RecipeFinder; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; +import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraftforge.event.AttachCapabilitiesEvent; @@ -43,7 +45,7 @@ public class CommonEvents { Create.lagger.tick(); ServerSpeedProvider.serverTick(); } - + @SubscribeEvent public static void onChunkUnloaded(ChunkEvent.Unload event) { CapabilityMinecartController.onChunkUnloaded(event); @@ -74,7 +76,7 @@ public class CommonEvents { World world = event.getWorld(); ContraptionHandler.addSpawnedContraptionsToCollisionList(entity, world); } - + @SubscribeEvent public static void onEntityAttackedByPlayer(AttackEntityEvent event) { WrenchItem.wrenchInstaKillsMinecarts(event); @@ -87,9 +89,10 @@ public class CommonEvents { @SubscribeEvent public static void serverAboutToStart(FMLServerAboutToStartEvent event) { - event.getServer() - .getResourceManager() - .addReloadListener(RecipeFinder.LISTENER); + IReloadableResourceManager resourceManager = event.getServer() + .getResourceManager(); + resourceManager.addReloadListener(RecipeFinder.LISTENER); + resourceManager.addReloadListener(PotionMixingRecipeManager.LISTENER); } @SubscribeEvent @@ -111,7 +114,7 @@ public class CommonEvents { Create.torquePropagator.onUnloadWorld(world); WorldAttached.invalidateWorld(world); } - + @SubscribeEvent public static void attachCapabilities(AttachCapabilitiesEvent event) { CapabilityMinecartController.attach(event); diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index 47390a57f..f30e4c089 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -4,9 +4,11 @@ import java.util.Collection; import java.util.IdentityHashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.function.BiFunction; import java.util.function.Supplier; import java.util.stream.Collectors; +import com.simibubi.create.Create; import com.simibubi.create.CreateClient; import com.simibubi.create.content.AllSections; import com.simibubi.create.foundation.block.IBlockVertexColor; @@ -16,6 +18,7 @@ import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; import com.tterrag.registrate.AbstractRegistrate; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.Builder; +import com.tterrag.registrate.builders.FluidBuilder; import com.tterrag.registrate.builders.ItemBuilder; import com.tterrag.registrate.util.NonNullLazyValue; import com.tterrag.registrate.util.entry.RegistryEntry; @@ -29,10 +32,13 @@ import net.minecraft.block.Block.Properties; import net.minecraft.client.renderer.color.IBlockColor; import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; import net.minecraft.util.IItemProvider; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.ForgeFlowingFluid; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -114,11 +120,24 @@ public class CreateRegistrate extends AbstractRegistrate { .simpleItem(); } + /* Fluids */ + + public FluidBuilder virtualFluid(String name, + BiFunction attributesFactory, + NonNullFunction factory) { + return entry(name, + c -> new VirtualFluidBuilder<>(self(), self(), name, c, Create.asResource("fluid/" + name + "_still"), + Create.asResource("fluid/" + name + "_flow"), attributesFactory, factory)); + } + + /* Util */ + public static NonNullConsumer connectedTextures(ConnectedTextureBehaviour behavior) { return entry -> onClient(() -> () -> registerCTBehviour(entry, behavior)); } - - public static NonNullConsumer blockModel(Supplier> func) { + + public static NonNullConsumer blockModel( + Supplier> func) { return entry -> onClient(() -> () -> registerBlockModel(entry, func)); } diff --git a/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java b/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java new file mode 100644 index 000000000..916f3eeb9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/VirtualFluidBuilder.java @@ -0,0 +1,35 @@ +package com.simibubi.create.foundation.data; + +import java.util.function.BiFunction; + +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.builders.FluidBuilder; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; + +import net.minecraft.fluid.Fluid; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fluids.FluidAttributes; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.fluids.ForgeFlowingFluid.Properties; + +/** + * For registering fluids with no buckets/blocks + */ +public class VirtualFluidBuilder extends FluidBuilder { + + public VirtualFluidBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, + ResourceLocation stillTexture, ResourceLocation flowingTexture, + BiFunction attributesFactory, + NonNullFunction factory) { + super(owner, parent, name, callback, stillTexture, flowingTexture, attributesFactory, factory); + source(factory); + } + + @Override + public NonNullSupplier asSupplier() { + return this::getEntry; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/EmptyingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/EmptyingRecipeGen.java index 9106e54a8..e49369f0e 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/EmptyingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/EmptyingRecipeGen.java @@ -3,23 +3,21 @@ package com.simibubi.create.foundation.data.recipe; import com.simibubi.create.AllRecipeTypes; import net.minecraft.data.DataGenerator; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtils; -import net.minecraft.potion.Potions; -import net.minecraftforge.common.crafting.NBTIngredient; public class EmptyingRecipeGen extends ProcessingRecipeGen { - GeneratedRecipe - - WATER_BOTTLE = create("water_bottle", b -> b - .require(NBTIngredient.fromStacks(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER))) - .output(Fluids.WATER, 250) - .output(Items.GLASS_BOTTLE)) - - ; + /* + * potion/bottles are handled internally now. keeping this builder for reference + */ + +// GeneratedRecipe +// +// WATER_BOTTLE = create("water_bottle", b -> b +// .require(NBTIngredient.fromStacks(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER))) +// .output(Fluids.WATER, 250) +// .output(Items.GLASS_BOTTLE)) +// +// ; public EmptyingRecipeGen(DataGenerator p_i48262_1_) { super(p_i48262_1_); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java index 1f2a26e01..480d741ec 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java @@ -3,21 +3,20 @@ package com.simibubi.create.foundation.data.recipe; import com.simibubi.create.AllRecipeTypes; import net.minecraft.data.DataGenerator; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.PotionUtils; -import net.minecraft.potion.Potions; -import net.minecraft.tags.FluidTags; public class FillingRecipeGen extends ProcessingRecipeGen { - GeneratedRecipe + /* + * potion/bottles are handled internally now. keeping this builder for reference + */ - WATER_BOTTLE = create("water_bottle", b -> b.require(Items.GLASS_BOTTLE) - .require(FluidTags.WATER, 250) - .output(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER))) - - ; +// GeneratedRecipe +// +// WATER_BOTTLE = create("water_bottle", b -> b.require(Items.GLASS_BOTTLE) +// .require(FluidTags.WATER, 250) +// .output(PotionUtils.addPotionToItemStack(new ItemStack(Items.POTION), Potions.WATER))) +// +// ; public FillingRecipeGen(DataGenerator p_i48262_1_) { super(p_i48262_1_); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java index 4b0e3a7de..39fb993cf 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/MixingRecipeGen.java @@ -9,7 +9,6 @@ import net.minecraft.block.Blocks; import net.minecraft.data.DataGenerator; import net.minecraft.fluid.Fluids; import net.minecraft.item.Items; -import net.minecraft.tags.FluidTags; import net.minecraft.tags.ItemTags; import net.minecraftforge.common.Tags; @@ -17,8 +16,8 @@ public class MixingRecipeGen extends ProcessingRecipeGen { GeneratedRecipe - TEMPCOBBLE = create("temp_cobble", b -> b.require(FluidTags.WATER, 250) - .require(FluidTags.LAVA, 25) + TEMPCOBBLE = create("temp_cobble", b -> b.require(Fluids.WATER, 250) + .require(Fluids.LAVA, 25) .output(Blocks.COBBLESTONE, 1)), TEMP_LAVA = create("temp_lava", b -> b.require(Tags.Items.COBBLESTONE) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java index 67fce3854..7429764d7 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/CombinedTankWrapper.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.fluid; +import com.simibubi.create.foundation.utility.Iterate; + import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.wrapper.EmptyHandler; @@ -64,23 +66,29 @@ public class CombinedTankWrapper implements IFluidHandler { public int fill(FluidStack resource, FluidAction action) { if (resource.isEmpty()) return 0; - + int filled = 0; resource = resource.copy(); - for (IFluidHandler iFluidHandler : itemHandler) { - boolean skipRest = false; - int filledIntoCurrent = iFluidHandler.fill(resource, action); - - for (int i = 0; i < iFluidHandler.getTanks(); i++) - if (iFluidHandler.getFluidInTank(i).isFluidEqual(resource) && enforceVariety) - skipRest = true; - - resource.shrink(filledIntoCurrent); - filled += filledIntoCurrent; + boolean fittingHandlerFound = false; + Outer: for (boolean searchPass : Iterate.trueAndFalse) { + for (IFluidHandler iFluidHandler : itemHandler) { - if (resource.isEmpty() || skipRest) - break; + for (int i = 0; i < iFluidHandler.getTanks(); i++) + if (searchPass && iFluidHandler.getFluidInTank(i) + .isFluidEqual(resource)) + fittingHandlerFound = true; + + if (searchPass && !fittingHandlerFound) + continue; + + int filledIntoCurrent = iFluidHandler.fill(resource, action); + resource.shrink(filledIntoCurrent); + filled += filledIntoCurrent; + + if (resource.isEmpty() || fittingHandlerFound || enforceVariety && filledIntoCurrent != 0) + break Outer; + } } return filled; @@ -90,7 +98,7 @@ public class CombinedTankWrapper implements IFluidHandler { public FluidStack drain(FluidStack resource, FluidAction action) { if (resource.isEmpty()) return resource; - + FluidStack drained = FluidStack.EMPTY; resource = resource.copy(); @@ -99,8 +107,8 @@ public class CombinedTankWrapper implements IFluidHandler { int amount = drainedFromCurrent.getAmount(); resource.shrink(amount); - if (!drainedFromCurrent.isEmpty()) - drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount()); + if (!drainedFromCurrent.isEmpty() && (drained.isEmpty() || drainedFromCurrent.isFluidEqual(drained))) + drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount(), drained.getTag()); if (resource.isEmpty()) break; } @@ -117,8 +125,9 @@ public class CombinedTankWrapper implements IFluidHandler { int amount = drainedFromCurrent.getAmount(); maxDrain -= amount; - if (!drainedFromCurrent.isEmpty()) - drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount()); + if (!drainedFromCurrent.isEmpty() && (drained.isEmpty() || drainedFromCurrent.isFluidEqual(drained))) + drained = new FluidStack(drainedFromCurrent.getFluid(), amount + drained.getAmount(), + drainedFromCurrent.getTag()); if (maxDrain == 0) break; } diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java index 2ca8293f1..d7b0e50fa 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -42,6 +42,15 @@ public abstract class FluidIngredient implements Predicate { return ingredient; } + public static FluidIngredient fromFluidStack(FluidStack fluidStack) { + FluidStackIngredient ingredient = new FluidStackIngredient(); + ingredient.fluid = fluidStack.getFluid(); + ingredient.amountRequired = fluidStack.getAmount(); + if (fluidStack.hasTag()) + ingredient.tagToMatch = fluidStack.getTag(); + return ingredient; + } + protected int amountRequired; protected abstract boolean testInternal(FluidStack t); @@ -135,10 +144,12 @@ public abstract class FluidIngredient implements Predicate { if (!t.getFluid() .isEquivalentTo(fluid)) return false; - CompoundNBT tag = t.getTag() - .copy(); - return tag.merge(tagToMatch) - .equals(t.getTag()); + if (tagToMatch.isEmpty()) + return true; + CompoundNBT tag = t.getOrCreateTag(); + return tag.copy() + .merge(tagToMatch) + .equals(tag); } @Override diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 549553b12..2069e9221 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -13,4 +13,7 @@ public net.minecraft.world.server.ChunkManager field_219253_g #chunksToUnload # ChunkStatus public-f net.minecraft.world.chunk.ChunkStatus field_222617_m #FULL public net.minecraft.world.chunk.ChunkStatus$IGenerationWorker -public net.minecraft.world.chunk.ChunkStatus$ILoadingWorker \ No newline at end of file +public net.minecraft.world.chunk.ChunkStatus$ILoadingWorker + +# PotionBrewing +public net.minecraft.potion.PotionBrewing field_185215_c # POTION_ITEMS diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index b61b73f9f..57d78d5bb 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -14,31 +14,31 @@ "create.recipe.crushing": "Crushing", "create.recipe.milling": "Milling", - "create.recipe.splashing": "Bulk Washing", - "create.recipe.splashing.fan": "Fan behind Flowing Water", - "create.recipe.smoking_via_fan": "Bulk Smoking", - "create.recipe.smoking_via_fan.fan": "Fan behind Fire", - "create.recipe.blasting_via_fan": "Bulk Smelting", - "create.recipe.blasting_via_fan.fan": "Fan behind Lava", + "create.recipe.fan_washing": "Bulk Washing", + "create.recipe.fan_washing.fan": "Fan behind Flowing Water", + "create.recipe.fan_smoking": "Bulk Smoking", + "create.recipe.fan_smoking.fan": "Fan behind Fire", + "create.recipe.fan_blasting": "Bulk Blasting", + "create.recipe.fan_blasting.fan": "Fan behind Lava", "create.recipe.pressing": "Pressing", "create.recipe.mixing": "Mixing", - "create.recipe.shapeless_mixing": "Shapeless Crafting", + "create.recipe.automatic_shapeless": "Automated Shapeless Crafting", + "create.recipe.automatic_brewing": "Automated Brewing", "create.recipe.packing": "Compacting", + "create.recipe.automatic_packing": "Automated Packing", "create.recipe.sawing": "Sawing", - "create.recipe.mechanical_crafting": "Crafting", - "create.recipe.mechanical_crafting_exclusive": "Mechanical Crafting", + "create.recipe.mechanical_crafting": "Mechanical Crafting", + "create.recipe.automatic_shaped": "Automated Shaped Crafting", "create.recipe.block_cutting": "Block Cutting", "create.recipe.blockzapper_upgrade": "Handheld Blockzapper", "create.recipe.sandpaper_polishing": "Sandpaper Polishing", - "create.recipe.mystery_conversion": "Chromatic Metamorphosis", - "create.recipe.processing.catalyst": "Catalyst", - "create.recipe.processing.chance": "%1$s%% Chance", - "create.recipe.processing.chanceToReturn": "%1$s%% Chance to Return", - + "create.recipe.mystery_conversion": "Mysterious Conversion", + + "create.recipe.processing.chance": "%1$s%% Chance", "create.recipe.heat_requirement.none": "No Heating Required", "create.recipe.heat_requirement.heated": "Heated", "create.recipe.heat_requirement.superheated": "Super-Heated", - + "create.generic.range": "Range", "create.generic.radius": "Radius", "create.generic.width": "Width", @@ -52,7 +52,6 @@ "create.generic.unit.rpm": "RPM", "create.generic.unit.stress": "su", "create.generic.unit.degrees": "\u00B0", - "create.generic.unit.bucket": "1 Bucket", "create.generic.unit.millibuckets": "%1$smB", "create.action.scroll": "Scroll", diff --git a/src/main/resources/assets/create/textures/fluid/potion_flow.png b/src/main/resources/assets/create/textures/fluid/potion_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..09184febb5adc99f4ad7d18418d88788864d20e1 GIT binary patch literal 133632 zcmeI53AmkAb@%T*_auZFQ4kOUgd!qVO|43`j^KdGAf=X~t;MP+2q++6RT8a=_AB7f z7DR-qC`I&BK^$t8I*^J3sSsiy5cDRH5T*cON=VZ6Tlf4o>+JiUbI*CV-xsUz`#k5a zJ^k0(d+llM^$zzVhaB{>EjQa~vyqXJEf0A4{)ZafZDgc9GGn@h=6>?Ezp%(>|L(BE zPdfC-Q+9j%3CF+rt#5nNZYRC#?Qh!cO{c!~%_AeH-tgsrIp)$kpSaZrH$3AXX0~2D z<0HRbb?BeZ|JT!Re&wPE|Ko&DeDT6J{PKaZZ9cwmuT=*vpR?iq)w}NeqiYV`?(&7N z{pr3(f91Pd{ORGRow@v=Z!fw1c|TeF!3U4ObMHHDe#}4Zc*<$dx#3;^we{D3deQq9 ze)GMj9e?n@|MkHS9JKo6N6!7|4^RBSJ!f8a%B-gz{M_%}eeo41f9|vcmalvG$=`hK zt=Hav-*=zYZxxe_zsZYFh@ilY4@>grNdEoR@ zcRlz8U;pXSW0&83=!G{f8NKuLmmdGztM0!1JDa`tj1NEmd2??6o2#BV=Xu{ddimlT z=YQg+f7|jEm#==}{rmj$+7G<%qnF+L%wzW5?gih!Y{_Ly|M+f9sFFz3n@n ze8}R9uld4@4qCqC@qhS%!+*N>KfHVIOI98GjD^?ybo_;fEd7J0{p8c9v_AcV%@^$O z^IP`V{@+hqd;d3o{Hu38_NCkZ;EnD7^MdnkJLQZG%N{xB$IpAk*-u)0$vM-0we2&{ zc>4Qa_qy4e&G_-_54>gNyXUX|{Bid_{;ONO`Ghw;>ksz5_dQ=Y=fxLXe&yNE_}iUl zT=e)qy6v>R=I+1h4`+O6hxQ3SeBz7Fxb$B>yZ?Xx;y;ht?cN_;{;F+u``D#>|H-1K zKl?www(a+h{M@`PRyZyTt9J26>pFQx;5B$zne|yOj7ryG}Us}B4^UwIk({KCoF)J6od)Kjp zHu=KLug=_I_PnQj;;2vm(c%Sfy=?y14tf41PyNedZ@cumUoLvnee>?U`PgG__{Q3q zr*HL&+ZOC`(Js$BdCiVz9&zFWE60C+-Os;s*49U_e(K`m7p&Oi+gE(yrBAzjx7Xag z@45>=^ycec|7VB1ZLe*A_QEe6)_TX5ttYM6_Gg#A`pbL%c-mz*Zod5oA9u(eo9_Fm z_wO)c;eIbU@A-?~`|-7}Jnn#%H;=z&{Xf2Lvy(PV|Mufn{PhWQmOb!8nk z3%|D6e%Jo&%rkyI?YV1Tee&VE{^90pZ#ev@;3LI?&Lq1cg|M(UpMQbe|*ZBZ@c@9 zg@+yR^&MwE=FLaGY>%(pcFog|Jm-!l&WYHP{$kNL#I@3?aAWuH0xV^9Ck=lK}dYg3*t@e%JeU{Lsq(UVqYpHM5rdVC=*PuHE9Fcf0x*?>yp$?SAza(~fPweZl6J ze(BF1{Qe~;Z8!Id&A#!#NwaR8cKnm}`_v0x_t2?l9dW>nPrmx&S5AM$J5N4rx0Ta& z{q&B1_m(Yoy!xB1)84uC1&99h?LQbh;rugy^{ek3dHR3+@yJnk&$#fjhrVaUjj!JH zyURYm+v%4dci=%!I`b8;|F^Ltes$@=^A6g6&AqQW`=UR6=Fx}WbpAazfBp?GUHQt} zzrWY1fA#r&U-l>Wzxb#(zT|{2yz6P_JpZr*w>{wl7kur#?Y$SA_2Ng~am=;vpZCC9 zpLN#q4_~y&w;ukdf8YBlyZrUn+Ls>xmiC9XXYY{u9&TW)rwTzv!@2M@Qz&ojYfAe0==8O*h?i1Ha8T z-+bo%_uoJM;DZm2KJIak+vT2n?is)L-g{ffsJeF9WtW|oE?v5;1mC{njyqbLZMNA4 zekORS{aOz^@BkGUx&Hd=+mAf*$Y_;t(yRg_rT8|C5SY{X^XK16+UnJ-CskmZZMIpz zYSpTwnG(ELfYyr%Lbupri}fbBrPf=wq)N0}t&!b#-@U5>CHT||m>^t~aIb6o?YCc_ z=Lsj8=f`-&dj-^bfoXjN*x>Zak+#Vun{3#6>#b)Jo;Ppaa%c&@&4_0diwO+5NS_Ez z{Ed}}>7{rd1Ce1Kw(*c!ue`;J7caB)F~$4QsqnrIhyj|&TTWiC9n#cYgmu-yw*iR( zG>`X6iiD_pQJn`*~vzM3v{^{~h+gmRoMQ z-VBP(M@L6DWC5*P zx6Tb1(yh!c9OFyyelC!c!A7)Oz>I7vuzdM)KcY*xDg&i*s$>a1?FIRC;^f|&n4X6R z!MjzQt1mhza=(Ba6tw(`E3R11SSZ2!7>J{tRuGSUoL53ErG-?e1fK?>m_iZ0-FDmg z`9SG$CQRj^7zW?vppdZtpEMaHv4y!xdsPUG%GSkKIw-`nmtdv$D%UGrI8n;EJ-|FR zpYND0sq5p2?qyKGAm)|eyUqn#QdPr2=esIh2cI-R>m?W}rZFuKs|*^bi}zWu(@s0# z@#w0+U3cBpwMzCIWF>g~0-rQLz!qwqEiS8xTOU8xRJv5@qSydz$;1iM`VxF&52U47 z14^oH>;W_}$bK%3RnbB4jXjVCVN~HT`+3AEJPf|E2O4{zu?Ong1JfUx^N5}W(EKx6 zWE27Vz!e2ku6XV%c+6uSv);OA?B<(qb`9FG zzBWE}fkw52ib{As4ss_&UHs^kS6+F6O|K1ldPagpHNq8-R6CZm*Cx5Vaw^HdA?@Nnh_nxdI?r~2|gJoQPrqc>P3haCkce+8mf!0ym^6egt8#z zU871=RZ4lo;L|J+IH&ytwo)K8La^=b~ zvuG-<8uko+rT8|^1+#u#s44-qiulPmreR*iO$$q?6yLu4?z<QyQSPcKX%f#I0m8S8EZ%shAUT3Es~I2oz%|$8R0I<1sy!A>AtANhNsi zzrFU_%iMpDsx}HDoL53|-DNGor<0NT4S}XoNY4w88GeInuDNEK3f0BC2J#1(@`u~i z#|$(CnsdUtNkU8TX#lAuP&=lf1s5ivngtrDsNXzkU1LW)hQYU)X1v~IG_40PV$|n1 zrzL<&&}wsTETdcr-YWnz8_DAmASxBdxHLi-~lKD2y-_kajxVR2x5f_0?CO zp9@f2&I-kI%J_)RiadW1e3!FA3}hk0JPx>+uYswu(gHO%pX+;r1TZM%(=T0?rgD9@3;6z_uvX9Erh{Sbt^ z21;729BIT!kIo8Vp_CaE?-c;h>(Y@u&qr&~S&`=}J{7)&*Q3hW5C>HZ!j;FH=T1MP4KmtfIYj5 z(}%$`3uaQ|$bc}dg1K6o=aWu;DZa4>8hfCz2O4{zYYEL48{%=7i}{T`(AWcv2R0*q zjXe-&2jOAt0qz5zCkEWW$gP{`BTzYP0ULzt>;%+x)2j}?rE|URo`_0Vq&w`e!#c%z z3X^atJ{csO=S;YtYN$lCk}${kEm^X}AApJGnbchu-$t1ImKsx6C(Iey*0}LbYrRsP za2EkfLJ7Xz>zxt|(oRJt9ZX~=%4&`pQ4I&h`?soMVHo`S*S{X)WF!ZJDkA2JgTn_< zf_E^CVIs-~6q%EbQ0|sh2^UUu7`!_u*x3Yz+Q3Q`%GIlil1`Z8cnQ9RgFz1?=!_rV zBS4UTyd0x2l**RkeJ-<>GZkZ@5dp)S#kAT4TZ z7`*!jU=W!RN1%k}d5W`6R8?jee5wG<0CGvdL~P=(rl0b8gu}|E)v_+WYde-eHX=3| zsI7GVR0S>N@o(O~Kr>rywbgptfczLQoaiw4GzbA}bI}ebD#r2E53?I4c}D8s8+)L! z2O4{zu?HG^AT7mp_j4`Nb@7coP+$+Nc>Z%&=~;l^5!=8wCRsjEEF&{6#-~r8j=`E- zGFU>L!Iy4g<5$2QD8aXMlLF>4%MeaF#t9Sw`Ohjh6HF=IjT13bOJJ-^77uYuGNs#L zW}GiRVv3dE@f&yDs8S`&_Dk*<(y$Nhm)tXG%gT(E;@x#G0cu@`w(L%6mNYpEwgm5A zW{{mP_QX5q15~cTr);Mk!5egVjhVyX-TwnK7@$^#iCZPo8Gv|xspZ1d!Fv~QB9?;z zAvXHmSAZv^m&XL5@|2X|{R0R%8}N9^S3o5QLu2=7n#Od>mEe76l(Paq0Y97-2$5=` z`7h>|;Jb_ynC2H6kQP*-m_~UyD{?IHShfnEY=bIrzcd>&X;JD|u2-J$$u^L2ApnDt zKG$(w>7qC*tpEK#!jM)MpWeVnAdH~A)D#C?UWpi2xw`oDKMur56d@9%G%6UcDrbet z4vMcdP7oqSQ6Pgz>HVA)!{GgC3XM()upMqg#~$$ifdoU9iOkuGd)Na5;~RURu?HG^ zps@!Ud!Vrg8hc>l+XIUhE&4QjyewbBvV`U?SlN zF_UW-d<5}`u8MFZ&rim6@IDA-W{Ej*eh4QG%LghyfZ}pal;GVWLIYAER2o4jS8jF@ zkCiLIx8j!-R0)K}N~p#5or3fR24%QP@xB`(Si(hNZmRXu50#0nB+oA8rJLI%4vY7j z7Xag>3aM|S@F)NbNA!p#JPba0!0aoFu6C)O7abJN1t?Cwes%Hwkh9(Q^#|MaH3s4w zwP*=i&`*LzrHvB2t8eF>cV5Sna`F#I090B~C1SUzTnXMa5N^xg22=BvIB#00g-OC9 zl?F=i6OxQ8|1`r$<$#Jp38NJWS6*Fw63C}MZKX>OGf34Ekkj~x7kPE@z7%uP<%1Uz zVuw=?_ESG@8S<%U3EnjTGd_61$mhqX*43{PDpP__4hk`Yn%m8t6KY}1BdqS}Rk>mC zqm4a)I;B#nT4{01C9kmu8he0okT1cFJ%Cmkd!Vrg7zh6w?SXk8KgKM;-9`@B|3!zn zZL!g9gONFN=g!&a20}6t>DY~NB{P{l8S^*atEp5>i*M|K)CF2r(P+QERVO$00Hzv)7R^a} zXfDQWU`}aIH1>cG!jk=*L0N)t?18i$*WJ&xF4V=R3e?@tRe`#AuRzIuP6bNvzdiOq z+;X)SKx4YpEvjzV{f=`=~?7k}IO6y1K;(aO38AoPnnJ5McPr-u0Ff}_dH9~xb z!Mi~+fByViO@Q!DQJ++a@aQM73Z#dODN};?K`240f#L{`!Z~JBMwP)?NL=L!b16Ou z-YcN(bOJv40IKvzIkLwyWX#L?#XNOh<2O%I@ zVa(i0#{BAdM#jlg7ckg*wRTXv`v(}=_OQ7B155gj%lb90SH%1J1z6UNxnVVxq_d%fYc%J=PzBF?$#bT1Qqi#ZGzR$h@CJ51RYGH$-L=9& zk)|-9y7(?8YDJ_BLd7-xh@%Ci_oGwcT>}^t*21KXoFPo?!dtpn6rKNS*H%@r4w28au*)~gJ(AHH%B0-_bh ztg#0gdw}6E$vDxX?} zi9X{vh_eE|{qSy{RXH0}p$KMA=fJAUs7whyjRDlHpBP7qaJE<(7UbD~?kvVTgV@(F z&f}!z7xxo6oRXfG&*M3kxbUe3RfUwMyQhjv3;DkeRDMqT;e8BfB|e-y)@<7|*zr|Qf2KSk_|i_1(a$x~*n z-%x`0E|9aqq^>}+j@w=f`$H>pHOHw~g7>{Z#)SmKoYqGns!XIRSAw79tdLNtU-4Wp z>1amfl&|tiS6ul}(u7abu(O)^{d$2ZtSKZ$P>${SRTrNskTX=A(~QEZ1V?pMOnJTN zRQPmMkFAd3INc;f6;T`-F)=(9zDold>7oKhK{1@?3n!ZAM=W9T({@~UKbNq&_*8*d zyS(P8TxxIZ0qulntg#0gdw_AkjA`tF#vWiS=+cU*4M}n3L$$Ipe$r-CcRv^7y7*K9 zG0N#w`*~hIk57g7f0E422m9Yqem_tu6Ycd8e7k$%viR(K3Es~II2g18MoO59(4Xql z7^Vi4DZ%?)R2XSrC#*|afFekhAWo~ToNJBpb@Bc_D7SEVYF2`wYN;v_^9XYTi+2MN zT!Qy+1?{uXK5Okr*7e9HEjH$^`d%NZup`e zm*CwhhOzn=<`SxIAdNB|Q+!+l&kT}f%Bzd_eve=n=5f-v;+&@chjma?;kyRjgqX>H zZL{(33F4$H#msdT=plYBE`~hYQj^UudCL~TiT~&&A4WLT?aRF~l=%)&V zzV{?Ks-y)HOYm)bD#jT{2L;D;1lU~nmf}#N5QERsJxrW@%S(;0r!h!&|H7d7bUbG{ zHS7urj{~u@CisyUwUZ|es9asV|HIP`*uRniW0*!EnwB|L*%G`jM6S2aAGHYPc`KDC z8q0`BRi4sv3O-H4&dY0)92A@d#k?P_i}#Ng>cc~wLFNM0`d;>ceK+(83{J|G;2V3O zu?HG^z}EpS5Sr(CTef9Z~Ngmc96eV9%vP$*C;(aNO%wa%0PsA71Jijj92T`0-@xL)j`10k; z$E>e;@XZ~Y8WZFbF2Seo3e!q?Mue$ig z9%$@=#vVx1kZBiJ!h9Oa4iJrtkIL4;H}*hd4>a~bV-KW-sP2BQMW`;mr6(mhjPlhj zsLuSotRYNsd-h;w@=Nip{G~><2rAn@ro}LK&r0#B3#uFx*mejMm2ky%i;wiW_;e)i z=b%6n5~@mc92BVmb@BecCSa;vj04wL#VZ2#11dX?<`EDgW!D(M1w*M zboQr}Xh7otN|}zssu=GlU44&I!bK4r)i2@X<0s&V&Pllh@1vL#t}P;?{4|ABiGI{H zSB&>oAOzvq`8F8)$()pj7E18mhn(~C_eeA@=mG{{J_zX!v}I$(-@K@cZ}Z|46~OH( zXM+YHEt7B^UU{nG)?07&jfo1B;@w%nS>IH-Os|2cwNNx*d86j6@ST!MQ5j43)e%jU z;N4jPQ?#JPNEOfwuohEf8GkyL8zd@6T3vi{R@ihJVTbBv4@j~oEtiH!tBY^!fv)XT zi;!qOCZzt@_ez5bCprk;*MZ1{FoO>!5~Ti)RfH1zlAdv60``K`|)4Z3mIm5(yNQQK5LGGAK&% zZ4RZj@T7N+%)aXy18RNj5~ijc6!uL++%&cE$-xj?hp!;UC0uKQ;+%{rr&F~s!{A#u z82Ir*0}O01icc4na8YHJ;(Z~KgCcKH=^B=im)hIS1hZ8cULWLQ<|KwXi@_$ud)Y}UxIJ! zfwUdh-Otqxb@8bJVg%KcV^Ap^^QQ_6GYG!12O4{zu?IGqJ+Q?de|CeO1z=jUsWrC2 z$eg)z=QIX_@6TrR`#-v4bjV1^O(F8~OPfFm-Ypbv1Y+h$coc+nV!zE}n!;u#JwUhw z@Aq=`sRiTZ_PGo|wb0VrhL&Zutj>M3-1+( zz85iwKn9|nTzNP>o#7a?_uhN&GRl|W-D80O39h2#N8u`;(<&@!{qSA)@p>_^!+#pA zDq|zR=Q&?xMEl{}Huonn7cdSsrHRsq_DDtg?2pnT9Rxpm)m2xW&-vQUVhNky5~=cB zP-getcYg$jK?&aNbdJgSL&GqQ$7l67wN%UaHVCvw#|2gn;H(Hlk-s@ozl@l$&w^5@pScCH@Kk&y&Nm!&*uoU0sa|~4nep9=D zs#DK{veeQIami)iG6qWUjXluV1C2e<*aM9{(AWcwJ1c*oC7Vu0C&mZ2$cSSX z${108v=!^((+jBxhoOXZn2*MDgDfKQFwMB7E}ueOygMk=BH4R9p&)HYnDRt<+SP1G ze?7MZ?*<94*2m{`P1SxoixyJ>eXvZzp*+`NK7(aewpD_6vmB$6{*6C`5T|trBhE#u z`I+hN7}84c$smDIybz8Cf_ha6z6mgDFD3h(FUm!n!h_<|vl{|J5zJ3%8V9tRH0zR- z7t5*qFnBl1t6Cw(2Mol6I%klS=UEwn=0z zb*q1s7yFqs1nZFsm4Oa}_Zt@c&lqcw&*{hr)v_J;x^Q4{^QQ!#o@lTSj*M#uMD@%B zesNH0c2FU83tC}KsEcpxfyN$a?19D}XzYPH_P~FA^1NQp- zUNLrn?)_=d$xculn^K>1u8U933PyBpj#(w#Vvgn(l~5e3NGGMbcz>@G>jo{Tg@j?K zRz>CtL&1sG#k+-UhYikuZjNDY$yot&dsJf`%(?X4NZ$KUnDi37FUttTSt0w+sNbTe z0%ieM9>o!is|Kx=;9Ceql|guyaT*;J2<76W%n#wE_(^8@gosD~%0KXE%5b5n@Rb#a zhmm+hr`3p;&!AUThQa$ZWDprB^|cr<1|$UG5=@wiS-xXR@b0ohNInH6xEHl4`kVQh zCW2{cY;CMi9Gt2Q8nOzcN|)f>Ss|56091mbW|U7F&I+4`zK)dO-8iv3;^LhsLbT?m z#4JF|IW3pqeHP@cjBy@P$mDvIGAbvkaxp#?-Ya0+Y8vfgGF9tU4qAdww{J{fS`#!N zsf5DX0TD<#)({Uf=y8s^_%;uR<9IetsPBMMUuO`ua9Ah};ks;vqyPQwsSa~b zV-KXcujvJiYkOl4M9su-V-Ga;02`DxDN&7)7;o%>sqBde_Fo#-|BdrcTeJ?74 zX*oX}6ndH>Y6oG8i`K<^7Xa2l1m<#3&^jCxVon*gSb`~Ef_Ddn`2f;M2!>oR<;xg6 zNnyhLW+AWQ>e3Sylqj>801XEoT(S5=tLE~d(y&Fg7^Q{4pa3ZVF`q)BBaO5 z9*|$h%n?qMGQ;5g9wK0YBt*hZNTq+k(%V|5OYr``CJ>glAhuja1s|`_O$u#Fwh?)Y z>*9S7s?|BA^%9=vse<;dLE0(vGK1jTwuo%te2?3m!35)=(iTn#y$pjtNP;Qb*%6EI zu7Q&Mys-zgeyD302U-^fu_wF>0LN+A*aP`=YU}}Nq_GF237cj`_P}3WFg8!m0z_Vo zZP3^Tzdg1A+p|Wz*#^E(*l6Xpz28T|NRe%TWrSV82811fZBZBR_YMGa!`kkUuQTUD zsz}_dRJlm);l@WWYD)0wl*A3|C>%l2=8J+Aj>ogQ_)1>^0#I+%fDBSmRf2MaqisNZ zP<*9rpg!%`iOB$kDT26T7VjJ8w#6{`zOw*K0L2+v^$x?-jrr(ky0wfz0vg)2DARI!?a2 zfOIQMQr9&MK0QqV2c}b%nn~}HU=cnGV*}4${ZL*Vd@@L25`{}BQ&7_|3b58MGwpcA zgcF6=p!mMe8%Mz~&HM%}i}zfv^NRPv`!uAmMll5?m@qAgf@4@MF2N^@2x0MpX%xR442haq+#vaf>glaK@+8&Xzrm`m*d!Vrg8hc>l+XEcEw6baP zS{w^0`3PA5+5fQ%pp*l{oaa}9_jQ2VaS|@(F-}-UiD=9(!TTK(4jS0{oB_m`Rw*o@ zx_6{FyC&sI@Gg)81~$HZ{4Cv`k#JFLLc*ei<)A3RCwm|_C=kG`Z}cVOp_ z(uEUMda6J)NaD>4zLu|nC&m~gdJ9_>sEhXsh;dHoU*4#R%vHwJKk+uS5-R8*c()0; zO=m*7KCceAGbq<E5lM(Bj1b6A zOv$5#wl?s*QR)_9A{_*uGyqe9C9Fy~Wjgu%-^zrki|=a>s6tR}K!oGUNG0P8AfJo$ ziO|H~UU)yAQ~THg0V5NH!Xyf(9KuWRz7Un{=TxEu-`E3bJJ!fYrSVd__Hj|AQ4(R;BQ{qI#$mDG`0Z)wy_ON3BMz@fxat1zv|L{ zAJ_WacA$*P2`8%bLGZpW01#L-?h~X<#Y{NSLGdkK@3#v0ZP{FqnDwKj_+*^WLTb%7 z2e_hE)Oy)?igO>4uHn2`7w-nD3GV5nkSZlyHlos@C3v?FReL*brFc}kgsbJe&=Ri_ zybBaF)J}^qPLw90#5EJJkVxk>FqMPW!KagQWW-6B!zTjui}{?8Oe-ywi+O~VF03l9 zauJ_yV3A4dHTVR=H_++lbm-ts3yx@9Do3~uzAXy~23#;?yX~ZNBBDFIt0bV~D;Q_= zm*Ts|Kx~cI#{Sr29chh_cE~fQm5L-<2hZnX&x3=}b@GC#^*Afg1_Mqbok}2xlMxz_ z^tyQ001gWYhaquj6i!^1W`@d@;M;OISZllfn}-QuNlYKgq5r9X#sT4uX1rWoeCkM3 zXBy=&=Tb`%s_;b4#Q!(3?nsY+)Wvr_&LQR!j$pMs<`ItRRfCTT4}$Mn2PA|YE;5Bt zj8l%mr~xUQ=rDNi0vHJ_8e2$O?1HMw2q!uyzOe@yd!TDCU@$Ux8he1Lq^Z`}1C2ev z5*(Ld#)smKJz(ob+9iLt?18ur5Y8`c-%za=d6{16l#BSTrMQYoES!V;385_cQ{mIw zw7GBrl`aEAROxxSUg^S#svQ1-?O?)B(@U9y&{BNMgx*fA^qtD8N~qS#Q=G#|Dc%hd z7~>nLQm2GTIF!CsIQB&Qaa0JUiLF>Vm;L{kecgvl5r$ydC^M<9CdP1K+b@8bJI3uEP zWSPomN+#;pkN^DH(Sox5yA^ftEwxf=7e~_Zlqn8X7buN*Dc%<%W5{hfANi5F)&U77 zu6$^S*TzrzGzC*D6P9*4xp^h}h)HBjIOeH*9lYN{fuX>nqz!U$!-z{b z(Lu13Y3UJ)egHAesomF~S&H{A$Qdh+YIF6*JXKn0IUNM=vw*2>g_Z%y^vnF?=*5#bI)h+p)%ek9mi@@X&XUE;Qvrk%mN2N|svv1~@$MRfAsUFnC5SwxA;RL1e4GKM zHLqY@{FDX>72t<(gmNJi&F~{UkvjP=n5poMJ)l|O>P1~BQtC#%y;L0YRK5;AEkpu~ zPVUj_6dQb=A)IJ+>B*^$J{%dH%#S|Znt(cbSuYn z+XqHV@ZJS_QqgN+fAYA}BkjD5;z@b=JRWfh3!kPTw@s7@HS^5BB}zD-I`ikxPu~kA zpQ|oDZAPq2^kuBQ{_h9^@=A~vue$g)^IZG6-v5BH=6@XRQJ|%dbp~b;zOe@ydmv3i z23Wt5uE8j({X7oLI`~upfknj_ffA}br8V}zMzIIJcA#kem1x5GBTrl%$B^|s=B3}(TG#H3ZJH&3PEAQ5A_r0?0_)+NaNxI70_JhF!Ywkb*G4JfNb} zGAAZlig2iyLwTCQETfUxvuE$5Sweapy#K#B`k0@Dv$0SqgyS=21&qJF_S)+aRSM5a z3BJXLC$*g-Si2gk*Op1^c&ftU`X_klrG!#^+6}3MwZuQ&h(No1h9KDHtow&z|Dz$C z6_)0O>*8IAeVQRL@j&N~-gJp0JmxFC1n(7yE_(#1f7ytLOAui$IV+@*61-l&Nd7qVTxDnq;%KJ5jxLO(Hx%n?euDB+kd zY}7`~7fw|8HWqIzNCr$$FOPdiyHMpML{#ZuxrV`~v*85v(Z6DjLD6BFPDc``=L#Q1 zJsKJm??!1HaAE-i+wI&zL7IdrA1a(^%o`M+tm4Q7aEwbhXFu)f8el3XN+pKD_p}FM zYZR7n#U)fUPgh*D3ZI^`R-s7s{{?9|>7puQhtwzJ!j%Ud1n=trDgyvBg^BCxSVmYx zSV(CwDqom7c=r#eKgAHLepg;>sRZh+43(*acMb3mL#|$04PyjLIB_bbmf9ro*F8$` z>C1U?PS6T`1PEiFfW~E%@Ux%&>^0Y2cil9~s#10F>ESib_t8N?D{a~2Q=MIJ*&tMp zdl04^m8gsNE`R~djJg@#iF=yfH$nBJYivL{rrUT($N4&VuYmfPN^oh5#zCRy2`D4s zlwlwWCrUckF!<4{ufFRm_y0m#KsIcS#WBHbF?<2!VOy#T)^FisLct0iO(+D9_CH*XBQMkqd zX(jlyHN!-|oT-GVB8unb^SCOk@>TeOoD~9!VID`Y^76_P&&$VnGSMRg!o2hz-#rJ! zX*z;2C~}U097C_6NTq_z3{F9 z7;=+}qdI4PC}tQS^{*&GY$5UkEL}jk5`22--TF5@_RoDGd+6OC=b{qvj7J4#&6@Sd zRaad#-74S@$Fo+{#k&R&(lI>Y&(l;h&0Twob%Dq8KOKX_4Bd&V1mAT?LCp*tYyB;R ztsnjVP_6;Q;>74YQ{YpO@^$d;E9f+&lBf$BdmyR@tq_MQOkDd%RUT=&gn>5pKw}Ry z_CR9~H1-dG z_%sG2C{mmd*3U7?!}bJriwaGp;z96jyAzr|Y)?yK%ehUe|@UZywcxTQ?acLwnCQaH=xn6WCd|HTlF{n~MX;y(s&q&T^D*Tic z$QkDGDgk+!e(|1n&~PwxJ`Fj>fQwxKLp|zKH5kbs6yLJ~>SGDdD}WH2K|AY_4dU?{ z6z{VD=J*H1fZOsm&wU0cO@m2sRR~&wPb;B>;)c<3i_m_3Y^&k8mGRS6UAzWii$^l# z16sa(InIe&tRLM0L962tefQmWe}os`@Q~m~uBGX^)` ze6ug(K|{6hX)oX=1A@3TvO5mxbgzIsx zK&Wt{qz!`i3P_CtD-IK`xD{)FPUKAdRrxyjGz-K;jPq$1E78~kXi4gp#-J=nQFB@i zbL~=A_{JWH3lW-`bWKvdeOCF6vabB_^C#PY-9-9D5$C4_jih^2Pr z%Q&F|q?O>4fhy)ugmZ@shm~x+Sc%}Qh_DnM20uDJK7L+8W&s%&S@OWqLGZ~qi7k{$ z<*eu>5sb>##iw;33K3J%VmOweb-cG8(-e-F7*;-1csEX%$9Cc!)4S)fU_Qc?XAIJ8 zDZzUSB!rVv)uJMyy=VzOX@J&80nynI(-mg1kzgua7w@xRr=511^r;`4ej~W+B(Q3b z$yrf?*DT;ei2g8x1VVAwDXt3G%II%fWa+i>ngwpv7;}!~I3Pw%rTptxU+EC0u#Nm> z7WH)eNtTY5YUA4)c=V$&;}H%%6~U`Jx8ky8Tc!f>vQ=^&>Cbu2b9P>`WC<@n_>Ncy zFAbzAg&-c+K!Dvh7}I(mD}Z2gR`}BtCN$l1P?=%yjXluV1C2ePl`vVmOeIaN#vVW$ z+VKd-tFZ?fdqCr%V<$BBz;DJLz_8G?V==O?aqVo!EH^l$awsoH%0$zm1+ET0?FE2g z4#gri#%>9jVd4)hkf%!)k>b$0_+<4)W(xoChd*4-Z5s}o@wexmd-~hDD%Xn+g6~@a zsaN-odI{>4J_x=|%W?)hClb@6e<+sy$xnWAtCgG7h+*()45+pUQ2!H_aF`O;#USKi z7sc!1+c{$~RJumH(nWD#M4?I-9Te|RQ)uc54ArQPX)zqnf+hH_ul7X&Yu2pcd-s#Z zM=Yaom6is@r-Mmkf@-6B2Weqlyg#fWfsrDV({GhLTYA}*tg6G4S=T4tK9jkbA)!Ni}zZ?{5 zL99qjv+1_J1n(NKhZ54GQ+66&ZI#)=Hl)W|g~l!1H51U3(xkN#e0$--h0|}3qEKA&=ta10kfOshL_>+V!=onUxKersWVOgw;*W zx7SzAEQjzdO;gKC5EMlXdf_k$GRb%j=Ku#d183U%?%&?ecb)w2`@H*rcJJq&-$(zf z@xPw+thN5XHSG1w`Q-U$_beM)=A7&K@#)h(m5~+B1+Jnf^RIV~JK^q(D7y08v!`Wb z=C5_?UvJBZ(yvdy^m^yY`{}=!d*GqL8PDQxef+$S6>lqvR}}X+Wx#c_og3*sK5fdy z--)@~ZomDu*xrG{8=ozY3w`dcpCIg&O(eS3q@cJ$sGgxcy24+yPw4L1q# z{mBmr=|4<5RTy{bu#v*R@wK~zT^04W35oeFuL!}OUekrt`P-_63t6q7b{akYXDjw=Y1`Bq8umMnQ;Z!#f@nVsi*Dsu$8FxUIC|iK~S4jS1dm@pD3Y ziB)7XYN`=}dDb7dRfIp1SLWtsQ5k!7qwq#~`CuV6m55QYPywRSMfu07KO(%^mk4G1 zh16^}C5z_fr9yBA;Yi{QK1=B3%6}q^yt-kzux@hAIYR4D;vchJ82=mG8^#OO55(S` zAS~F}K3Rx8ON8#q$^n{MnWY`iOW zwGdQnd_!owiGuLNxSM+kfe**O>_j1T3vQ&XN%D&=ULY)bf{0c!bT&L81m_nDFTYtx zf5pa&8nP1wTmAZ`4190R>!wi!vjvE9N7evOPQoZf#7p)S(z&KP#Wj--$t$om5#0+& z8Oo@4PBh;As6AO65j-aJym04qVfm=$u|n)?6ohoK^JmKK2 z`x}JRMfks8ndq}oNIqA-TIl`4p4md(xnw-#MWJfbhNpz;i|i8+ue*}g-*1;tyfE>` zK_T|h;)eZ3IM+XmgT#-Lm}|^(0%FkWgqU;B30=g5j8Kf*N;0ns!8*YGdI2M8arT&Nn=Izrg7I*$)DT`z2YAn{wF=(KI06zcziBKL9@nyh92s3Ar+ z+=LgBq>HqM*!ARQA$?X2vhxZ(Yu5-JyOxk=bDw~#d?AFD7bU99o@!hb!}Ia%oFWfS5~t`$ly z-LX>G^Bw%HjOs-Y5*y#MVt6{OnJ2L&hf+no8q!%sf zehq@VZs#5$c1g$w7W;VpD>LX^P<&DrKd3Dc+W#f0S71|^5_)Us`9Sf6490D1_@l6H z^7>gq`^EcGLNKxQW+C=S+YBMLecg*f(XHi6g!Gqk1uNPf7VtTSc!vC@%Z1oFc!4hf z)A2VJ3afq-w(6lhoZyD;b3%~EcH?&m?z*OL3z>}VUzUJmjNG@g_yX~Z<_qcm-WU}- zA?+up5mo5t1%qpZj_F&RkbJDIzYseZWfci`cjeGoFSwFKYM$UOYnmzqkA*8B_BkBZ ztf@kX{rkRULg3oA39$)Liphv@3gY}bQaAy+H%95*v;+OU;5Zaz29D5(NK0tUuJ^)eJbDYpMGwO3d=-+2oqfq};drFA? zl>#8^?i1oYaYspNkP*?FV;@jpfq|hoO2MJ}`+?|C6B3`H6?b>aMqhcaNq(Q3c^u+M2KhCZ0FP`xgr9 zU$zNxCwB-X*ERe~*xg7$2tQmI+tXKAJhqS-MFG^SeWVcctl9E_(f0}yzP{l)p;|i} zxxbKIGj4c3Ksda>n&+*r2+JP}9v0l9nrnslcgrsn(l?NvwIYZO{`M8@xkHGrPhi)J z<_hV`<97;e7dMlx_BN=>P&}N}WL%7<0pyn^aexGW96FU9+BLUs! z1ErgVk_&d9CA5wt1MI!!0}Ry+P?bLy`hIlR@xt!j#P>rn8QLM4om19)`>qxSys)je zP`?OVLMgFGdW_xSczo*dY=Y}lNqL>Wo4+!!7c4Q;mzH9t3zqpZpAnKeZ zxT^`UildAV3X!C@l5iy93Et7LZwXaj?`#$J&1pJKsQWz;-E5)hN_V1=x~0hpalfu; zGxq7sKbUidugb-CoGmOE$ud3fJawe7e{Zl+=+%d|(KI`YD+|2}qc_hJs`AT0Rxu1X<(6BAY% z5Y=oARQW_9bt`*~WQZL7YvGsy8$K_*U57ti7|PylZa@ZbguNdY;@>GcQb?Z;Cx|K# zV+1{k2aEmwLE()rGCZHOSZJSCT`welh+?Kya0&c-eojd3q{i@%k|^GFxe)*N1Z)2! z*fL9q4Xaooboyf&TW1K#JNGRSf*Y7{=1g(Ml7=hq83Zuolx=O43sR z+@8#^Y(hXGiDDZsN-^^b|2%F`cCwKEHW9*cVX9S7ewmQ| z3Nzke`-J{gq+@9wH!_@QAHeOWX?R4*_`eD6kFD7{qZHE!pCEE@Yw6MFv@Hq^dHh~;qv>;MJo-6(V}$umquz(AoG|3Zd|frj|V zyjK{WIq=*7g(R?w@rShFMn)+v6z&T^#Gc<2hUQb`FoGp5r0cF^qD%bPz6HYH=Ho$4 zblxg7w8du%6-Bm2>Yfssm(%DlGUP*zQ1vKghK*T{ZGTNzaAM0`A$A!V9I`ZgfCVge zVVF6inEYeA%7j;5XK5ZjKm?@a1F(rw`b!QW01k}qvLS4eyjYlXs5 zBZT&2wVW_Ub5&Wm z>W752*W?tHxT2Xt`ip&M37J{e%|g(1lqV#zv=ItOTM3QRRo)sB0prBde0GI?aN|=_Y&eG%bpTq&(bS$ix{0Qj}H)mgh)GrB~}XV8y({W_fz6Ur8fn13|xtk zoEcCc_ z_e;XQkI}8{gP@3l!w33q6ng$Pfnq=HKFXuIO7Qq-KmdSD3&V!fn;Fgq6c$ zZwT?5%1VUP_fUjlE8zq0>=If}^Xmgdv}PE8B;mO;NWm|8_XD01I%|nXBcrwBUw4rZ zA4H?|({s%3mT+r+$b~}3_?^EO5-Z4H(+xs$QhAM#zKnI@ysD2NB<`Xt?!%1x0$B4K zD)!ql6kyZ|Li<}Mj}ne=tR5EfC>6d1&P3`2sNQX8vyrMEE8rB;Bq}!rC4= za~z)<)&%7&DA^ha>~05&tRzPkB)ZE3NQb1&(AyGZ#9BTP=@qts#3vroju-eNnIAA; zz&}BWI8_NB;OI`nU?IMf1jIKAEgvAdm+e!8*t20lTzM}cy(mHV2{T+oiX26ACk%8# zC*CgX=Tl-Gg1ds_U+qrl`mF+uka2+lDD%@Tfqa^Sk>i9T=8u0(7`GcUi9GIYq4GuC zBP)av*OvAX(oc_=EexIEOK7HO6oiqILlcY>@0$-`mQh4^^92h3!7HOi23#bRRe5V@ ztsd6VT0!DrmaQV(^mp7*(ieaT#YYH5Q`&b5&QIGZNR(op+$zS+DNXi~(3c?N;>(2{ zF9fYQjHnf=MuibKQPpf>#Os9EQg><=%gL~i+7&+%`>cYsOwIOvr2;=lxPvzZXi_ zLBDMEL&DnrtRJ*LAq401O6XqnZ}LOJ3+S$x<-7t|`%ebQ?E{45vDgHrScD@7-yGSvve<>j3?drZ^GIR6ccV6dtMD- zhVA|V>j&GX3dykzEy9|q>MC-e?`B#csw zLMtf{1tC1vUM#F1kUCrF7+JG9izk^tpok2Hye?Fhwk#1E)?iD>5F=(4+3|sW>qPUP zg}qOb5edtj(Dfrmh(xH^|2#aWc>TkE@%lh>2EjzPGz-e**nx)!5a1hOuP23y(|A() zEfJBH4^VKz3rQP4z+>+sp>5PFtoe}>xV zrgHMF|01EY5d{<^{wX1Gjx9(bch>{_?U~lioCV0G%IlJaGGj1-S@Zg+#Y0^y2(bA~ z92pa=JmyP6+mPYE6gn1ij*tTX)3`x!y^wx<#8E=kM^G5W4R~$DL(;Wz!wvk;0PWBE zh=^oK|H#XQ_UHMvKCgm4PkSL9(uPw2-zABNq9}LN_73q;H2MNz-08e3+Y^ZI3&4aF zj*wT7@FXVl$de}v$6pH1BSYlQ9|T?%_M@A3`B*v zflY_OV+o(d3qKN)0Fr_miDKMzKipBW{AnS5ebc9e*iUS{*umk#s#P7A2yKfv6Tq^H zf70;AhVazHY5YC`8;^mr3as1456GydUD)5ukZKchT8j9#Uz4#-*S}mCdX5dp?YklU z6V6XYm{`J5Y^Uth0KEXYrBc{=6yfBH^rjguK!82if`3$hCLBqDaU&r&xD%LBxWKk2 zh2^!wiiN7*Y&}m{K7adjLgGI5i(3{7O&e1~1a|^YjACl8>??vh&>jeGz8x98F``7> zl_PHy+NaRJd5}Zp1F-#y9u9j!==cv#Q&^%w8z3Fh$NP{ITALpdg1Z7c!l8(S)(sIMyw9CN(Kq1% zC_?t#B6R)_ctP2dLi&Evdt-#LVXwdFDj|I%+c@kSjd)uq8eQ?4Fm^Y;+-f~es5_T} zpuioU1~hqyFzxx%>jq7;Qpck@d%2NU4c(NQ8a_klIfdO*rtp~8LRE%UWPWjn~-Pj1r+ z`M@0^AK13Fm#}>Px>}*=9yd!!-B3xALB-hswBT7BmVp{@1c5@G*u z8$Kd5wRmGxsMXu>fzyP}MQm)*s4%lUm_30{Z{dd%{>HY{48aY_ZBVDCQ-uSk2%S%d z=D2bD6~gjsDqj<-b{F6S{&Fq$4x6V4v9FcAETqc(vMp8*J^&FZJs_l?qd}t$&z}aE4^x3#eM2)N2m^ zLAdoVX4qq7Br4^*5a^nH!SnBd(HC>F;3CU^fp^@f4lg$bj{ zC_I=xmzoH>;i9shLf217-&^I*wKoa%HT<5jVY;yCUz&Rhv77uEV-$5)ay0me*+R$7 zq_eyr83^f*(MXB+?oC2smM0{vmfQ6K!v}s{S1znrJfKM!e+qnner}Bsl#hZ?0EkPM zIsTjz=I%L9h_5(qjL`OQ&q+eU-%EsI)(3K{XEA@#svRGi_|0nW7dHNgF9r4Hn1sAz zN{Xa0vck!-9pSA1<0c={;cpi>13Q-61lEmWMmjRaHh8z$=(gdc_v3(#fMVZG!|TH^ zD%f?p6N(GT((efAM~LSOfQOav05}|t4ZCiymdkq(bE9j^4~5tj=m}^HcodSvw{|`6 zRT{-Mob{{jnLs5osG#wS6+1 z&bnzctj_y^2qI#60H-X-s8B&@-NdJ{!Xc?S7R3`7A@@QSOT&Z}o)2W1kXz#8g%O%F z_vALa*bL7HLbHrw%rlKOcQhaq8XoLv+s@8(1;y&}g8 z(hkK$qy{Jm{z%^lQA~i9g~Dxo+=cjne+5OK71I7{NHSm?z#S#+liPTM)(NBj-ZWOI zd#PWA(0N~CNM9lSTa1ifANb6$461G+BYvoc+qs+8UC{B~vjC<6nj;_1@q5OQ8x)l^ z32mou7%S|2I*%Lh)2uF~xqsPBO}N3(>x7PzvHh%q)L$fQKgH(5V1yyd>ymvxDs+w~ z;h}N^($V$kG590l27Z=gM?nrR^m<+B@ovv`!stJdK@=&mqbKpB2C=-KeiX`pC!#Cz zq@=SC;tLRQGRt>KAJG^TN=`V6alc;~(2DK&j$-&7PfmQMU#uNa5Ic5QH}Q}GqZS^v zAh03(yeOH+4Y5} zl~)uMA1yR~X2UT;Nt}P``%=-Zpt(_+ycu?qEIQ$Hu>auXH;IFW$ z4U>iHyL1{Uj)Yv*AXLeqA_r_0Imn>c0|?ku6Fw>5+72 zMovEt5P|MwC5nj$AD}ytG2vFS1c*O1=dXydjfL)H{e1@EZC%s={zz&hs$kSW9v>is z?n<77__PJwNQPkCSW#a9GNQ5BMrae_wvv3TKjVe<_jj3Y-63=|VQg$f+*E1Q6A>>; z+ViOX_eUha-ZMku7Z`*i3#}Ot4@u4Nir@nYJMy`@EUu_+5E8#20~;^5)E{3$I1)v? zW88!zscAnoBj8XauY`2=)!@&Qdv|y@g+J6}Ga@3Aa3uckSH_kf6ke^g8TlW>nsaA1 z9tGmbse0nELdKO+`+qF#`)ZuA%DVs4Nw3Aq9hwsy?!l}UO_yz zgK=9)+hQ}6a9;y>AmIbJk<`G}YlXIzZ#M|-*DxLs&q}M9SKw>FCMe{#V|-Lwu=$`E z|NH`k8_bpu*w#x1-IcZxlg{%2?l$K{9TAYWitUqhw}9{gzI~Kf{2{@GH?<{QM~x7h z!^j99$bEhyzMcX#y(Fal37lL3V}oqLeEjgEt(zwaEprFV5;~XqQ`SUm|BDb?%Hbyb z`5iKDeyM4R3E@$aZpvnf=L4LUh)T$U1qy9E`-*HhZVG_gpRh#%0ailQxcl6OAFkW4 z4?wv%=8fb^xx-aJy2Q@~_bq-%&A^n{`zIlIWb!A4D|RiAX*`$*r_}fGJm5e<3vs zn_<=X-$YWN^06b-p6yw{L#ArPN0i1HCf+}s3d-P|6{r%%_96BhnQG4Hh6$YJ3jo9@8{0~+7UVt_1|AtVx*l)S4avAJ%xjn`jhc)zk;G(7sy8l&Z z3P_vrjEKfVL9mAP?+B}&+W%Lf^Tnpeh2UvxeEd5_Lxi;BMV>ik;el!SzMl!5Thng~ zncoeBf2<48z3`8cbUT)Si05kn4{BoMWZ{VB%?pKh%erfRqiVuFIr@A7P)tCSv;`ra zeI@u?$-Bqj-|!F9A>f0SmJbZtD-3AyOEmnX*KSlq6~sPCcWW?@4=jC4Sh=9nbpYH`6VjB3k(D4|TU1OB&jw%Jj zuH!~gl-tHXWLp43;>qb=EI6RJyV8FNGQve|bLD038vz+!(z!GNA3XVc!ttN%dB3ot1a9Cylf~(4HV8%ML0t8D z7JZ#pj03w(o*;xV zAqE_UuyZ*wJXGnARQMM3|LS9CG!A}pYoEl2hXD|THKz#e|Jl4-2>i!WY20|NjUAjkVAdQJ2a#YHE9pkeuVcMaGS)rA|nbzn9)lznJ~{*sXlI zD@rj6DG(BWG7caHT;WOp(ksRzlrRda?zAq9gk5mLX(;{#-f#O~WC#-BF8FJn-Mwe+*v zaM_H4vPczU;*LTqnYZK56&`&2Y|{jxc@F*F&UWDg)|!%^=L7HnmOT9LHpT`S#M|QA zg+3!l$P+Tf8nR62eRjtkLVFGItYql~|2$i8)SE)ZJieMnM0fyh%Li-?5Dy6vu_L4B z14MkkGHR%{<{UkTZH{T>WCW*-QWO>c1Fr!JL`_5$hFyH?--KjY6m2{r0Szi^gkHLZd%6XIr_=Fw(u>WssVkmp=E&?}<#C+V=_v8~pmc zU5~d4>^$3sqpV|$C!5bgpe9(B&->yE39PhcnSvbdC*b(uTL2G07E(-j zlvyU+N(LhM06Zj-yhKP>u}H8sDXf@O`~@Lh7hcg5$p) z5+U|y&j(m-AcH80Lihl!dBhYUy^V8!b{&v5Kzj1e;{*2i9A=s`8I}*Md|qf7&d^K7 zjEIbY^#6X32_=uS7o5ijlD`q$guc^-0dKa?7h1QZ?-f!9dfqFHz63tN_IvNNP_d}v zW}$r@1+mhu69nw3G}jBk%|nh8st)k+)7lG#16#H~B{V-x)k3wf^ZQ~#gP(vDQcTUf zZ)-@^Q{^bmvEF`fA3R!U{O0aGLhBzFyH19l(d z_GIx#e)*Q%Bc#vDrHi?)AEb6ya~LlqAU;)C6Myj@<{ucRru&4hJs-~ps1lPd&qR`9Me{K1*G@u19%)NFDUwmkRF_PL~wrjjr^>Ho)26l^xGFZ&_h@{r*@>!#Ro`8 z)!~kk)F4AH9MQ(-C%w!o{NXYtnKnU`8>Z}5WZh8T&+42Fdc_lvi__h#w_$#}(f{Tcl*x*bDj@iEXV)_?T-nq3sWa$QPcN%;n;bW55(6Bv6niJ7ShwmCrUCjdvi<) zd1u)Ds0{eM5BEjcU%5o3YdKeF>a(j#h)?y?bIx>aZxPm9;MNO1*ym^3%K729HRFJN;!YLbf)@<%no53P3bf$-LJ6d-w$_twl`?z?I=X91jp zE5H#*i?r>E_P~dApag!w%9>Wz_{p%kUP%0qr?S;+&wVgzR=g^t&f)0(=4*s%KCa~Q zMnya5PypNY_+}9eZ}88B&O5p0&)%#+!O0KlulMF&F9MjX^!bL6{9O5Dp?4keSUY&* z2SUpWq(kxw=*p~~a5Y5PHA2r7k=%eq1$UN^9u~z7C@6~>xG6{>>F0_3>H%(0-72gc z#MaB3=|XU^@p3 z>ANHeyDM4$*>h0XRd3T_A(4a+xkH%HAGa?6Pey>1HoTC*vgs+v&Rc|PU*H5YSD#^c zVX4i4D#zcO>~&7Khbl)A@uDQ@^SA*EQ8pn7tpA8v!q87|xmnoppElgO=`DV(0B*n> zflUSayX{tx7BaR26uDQqw(=V zFov<81dL={?G(igh;L0c{z$?T{*&J^mqCduuNP8NiHO|1Lr69xGWTI8{$Z=1uea^~ zs?hcQO4b6x^pnU3lg`?}--HzVC_lXXb z4?yF5FJS7;6Vv}0IPgan;seA(QX}vIHaYV609P`Tuy2u&{=vXaLf74r6qtgt*1(WX zO;NMtXKT11A0Q#TAZm?(c_8tlWUnbg?}zrkEbRNAelZ|#tst92yz64q?An2A4lg$L z`D27~9+?YE!@u|XKgMd@R@!iuTYQEl0scsWDH!Q}0f=A~SvT>b z79|L`l7b*fAF!2g8;ey;IE{$a4;1laxVtOgHy^Ny7%!|p1*coX2NLvW_<%i8%TBpGZEy2|COw zb3o1*kOAWd>jNl?qIMM2uEZ4N1HH4m6{)9(#DuEWg9%~VGLHUHV0c8-VkHIVRZ`== z0PRl+u{Z7d014p(e3hA3L^!XCSA;(jg+0y|+?LeOg!J!y0XWn^D<>h6#z*61VFDw> zyr1~(Hwx~_VJ``z&kODpdemYKiRaBRRf8fT;3gb@BpI@4fq!z2;678kRM_C}DW$-~ z3s`c;1BqhX-IcZ=xG5--{QP}U-F=6=d-wnu@?`c^pa@BU;E;KI0P{;@qVbSHlq7ys zIQ|eImI3_k3H_WSzI@cmt`k^Am}wd>{GVC09T!+Z^?L{0tjr-JN*X0m2p=FGyZ}Cc znf8<3Fd_w_pq>wqQPcIp<_GM}n5-i*(D1~JfG8v%%(UeL6bM3+U`>}+U;c)W&N~+p zrMRe3NcRbUqp+PV|J;Umk%JFlv|1{JnCsXfB5fA0OF)#JK+N~LVhrlJSe2k=I{gQp>V9A@BqFSu)k}~ zDr}fpF*RlR02GaPOLwDy6y&7ELi@D%6e00FZw;B>QvecRo^jg&iX(w-8->`b|K|w_ zshy(@VO9NAzC?k5;O1BcHN^KwEAAD_H^UG3Fd_=90Mvf7%^QKx^RmVcH9#6)4?7oA@z}x2ZZzknG9C@Cml+cwN@7l5&e1MEyWfmRH$@n@j2 z=T6`SjD*a3eY)@;@BmwY1OpB4hR=K23>XJO|NBtPl_?d$9o0Ke0B!>y<>25+6j-JtF8I6KMPUe-IDS#W0ZrMbk_-x!rj(~9EQr9#s zyg7{-GYW8X(Fhlmvx-8-)i(;ob*tA4MOUJTp1=y(iQg9vUUtl>?sJFR)nwH{c{DoB*OrIxA^2a0Ki_{MKIx zUw*oCnb7{J17n2L=UZEZ;Fr)bhU@fjp|Psy^eiq&y(+ZLPya=T{mvbe#SQJ1LTn|9 z8FR?5*DRrYvR^B(C8k?4arG9^L@dt!rQ3|Rr(xEA#NUM~-}?fl*qBPHhBXA-gxd^p zQ(&GHf82!cJXctL2H^o@fw?;Y_K9sc1&2#m!$m$w!ii6Qz84HXUl{!3Z3BgxkES0I z+(a^nl5|(Xu@|_Jv<2LJC?%2`5RukTTfm1<<7=)J;@`zoTZ@>-4Qkqj{mm$d zl2$Pnq3_%y#4cfx!ltJH`1_%ltJYvcv7tgx1UD#pK}a8;?jg7_EKxpxoYs0(^NBlO}<39H}HpKSnV3s7hmFDMu_Mh*B8 ziGC0F&$g+Z%jctru^+dU@Bua{xZ%O`ffJG$WcWbt?|E36F8~7sZ6f!BhprD_m5mir z{;NzBfT{QiV}#a+YqEb`Kc+S3Om+r41lKU|38CZs#6TyMSMGXQXxeLkqD4vhjTw`R z9AmCuv}ceIcZ=(VlGjQn3h9}=3TlQ`li}YNI$Zgmgp%j|G>wzcbTifrEFa)iap6(Z z5+Rt$9D!fuQbR~;if)Km&NIh-CJH^y@2nGAFRx!C?D|#fJwnZ;7^UVGp?%xFUP5r; zfqxM)KMV^07))jT^2WB|8uV(F_OlK0&gY54<(T?;dD>j zgtJjbdS3t^@uqB19;T|3twK?6tS0deSK5Kh^8uToePSCP<>pDPjEW!dq&7m-6Jy6) zZWdymSlIOT71(gPeS&}Fz7H~HO761C%{%u$D(w46RKn()gy0T4BoiOw#33mB{ny^V zQkH=`@PY9GdzzZ-hfqxS#0GdiaB#S=Y8B>}1O;U{kKinFcfabGR{;1xYLKvhX?wBI zSW1CP77OW(oo#~q1_k37Xw)kpo|QCCx?_URc$IxfNZ&((93SZVW=xPd{gdgl&(UVw z(kvW9b<=twaQ@wsQ7Bm_#+&XKFxTrhTo^os2vNP`$X^L#9wi=T6*r6siGP#~U_eC= z3WFYQc}|F(#FHY)pym|eojtgbJUI*qMnpKafEvT!({elp{Zi=BmiO!2DOu{`Nh{>k zF5%mKB=Ti;OmDy#`JtE$`I$eY6G=E3TFH-PF}n~G%<|T1A$g}w*To0+@5&%E&V}C; zwh{fAf`wX3Nq?*?C8Wx7Rhy{YRUst(K~}dci%EHW;7h|Z=ynP#Y;l*(G5L?J@@RLChWej z{Cwfy!@A};1IOZ4_)dM>pr4}v#nv{IPZQF2`!+zt_Gv=vTC8EeQNrMJnT!$-c8o&& z3rR*o()${)3B5I(;e?A0E))(#(sk0?C&eGhxZ$^Ncv2!D?Gxi4B@5L=RCvHpjGae; zuYu5maN9_UU+BqgIE~!Df+3THaV>3&h5Eg_7YH@iqX5OYtr21*Bs@}1$}$93v03Oi zE0PZ|TlPnHBK8hgAF%Y@@_}TP;7;);bNY%Aq^I~FJz;($OKt+F!r?y`ipJHPBeV|X z1fGfRmuB(zgakgo6EjUGB9gUa+_N~08$Aqwpzl_8pV zD2{UDPksSk(G5Rf&`t!Z7&p>(TZjeWhbjZEip_n@B9^p@tviaSgFn_JjmJP|_mwy5wM~u>ZFtKw=Z#y-7&S zqDl$xu4H`hbHm(6E}cU$*0AkXq4xfwnZlrJayKtlf6Xc)L+fwdZ1-}juWy7r840k4 z2d4@Lj^>pRez?+Z>G%TJ45|l_EiZOwJZM z|2VL>FyMQ8ZxrgTBq0M3@!dsP+(&qK`GB1x`k4{dj>Rdg<3F1ZB$%9reBjw|rSuN> z;Vi-jjJw=Pn*5bg4k@xD?`tIcnZNj4Sa5hT%IMvFg@b+)?9USL#P57qXvq8NpC1WB z4VY8^N9yO0B-X0q|_?58L=RNV)hfrh>QzK<^znpz8gX;tYYi#Un-RT?8>_y z;4HxHj1d&BP$8niePOywGP0LDx3t`DGqi=aUDJk>-WPxf+}h6Y$>IXxB+TogVL+bZ z@cWZKUC1X%?+ZYKfg7+f4L2a%W<(BH{c8bo0jb*LhR4sQO>-pNU1pvH?W7`k9u<9O~0=TLk=Xa6-wUWd(+ql zcF1E$r+$WTQ~kr}Kxxj(vmQ6pk8Pf1I#!zvlwsywAG}lz_Gp zwy_z$5z;D2Pd`7nKxqBO#><8EpCSBkWw*HjJh8iqXysAyqr&~w5UgI10oyCKX4ty7 z8FsfV@b1y$UjZKRuLe7{h2 zCO5pW#ZNlc3RrQ=TPq-A5+E6na3eYF#5qMqI>H&shwT^2Kg4n{M~FN(XzVF$yo(4d z*D?fSIY}601-ttIurWUn*^=`FR#KqjP8Wu)-nC44_hj2&71$SRP;%TQ>=jJh@e5Ym{)}lRmE-a@fF15)_hFv31+@o}yF2s06%w z`%W2{7~>gg>F;*n!DcY&lWN(2H_t=a@!=Kc4f`{EG~esHq8-&)8GSP zvU%(uh08#WUtYeK5A-SW2U_^dGYa7Y6r^XHFns#T+l6;}q~{B+)L$DNM&v4}w{8$h zPUI2{^2y@^d=8RhRs+r#`W6?(gr5C(y(PSRG>08_+$$vBpm9>wDBxfVZX_paynC=- zPO9q;L#niWpRo6qqHhX&D$>siZa(2*27Z2+_l_Se&%k|&f|>BV$&a^&zGUIy1l&m5 zIH>^|m5*mwF#b{T@)!{bx+^J2q4-hpd;#cYWJGtPdlH^k6J~Le^o1m^CT}1@F&S7l z{)J>zW3=hKF+vejcX$8^uzu7CHiWHw%Lf*h39D+y#DvsFc){?YLZZCr3ZdkBPe`l+ z6eB4hZX^X>H(c1`&l(d>LHQ~i^9sWA_`uue2rc(?Tr0RA6OlGRh8&0^{7|Lm0}Mnq z16r-^KEz`z$G+olWkr9X?~fbmg+1RQ9IKf3y8{#x(Yo=cE#QulRx$BNA29p1iZI6{ zu;Ec{f+w?*e2}E~y@390%_;?9y6)S8`Ai*8gn}rEV!{*NBmC(X1<9==ryT3Mg%p#H zjH$7_HWcbXukQuS1zABSBc|)_NTEHkrKhm^9gGu-QAj#AE0~5;liUbZ{3D_CI{y(y ze$K~AnB@bFzZ05fZn;=UT+OSB;sf^A7M!xkoZ-!&>jrRd4LRd8aEegghmR?+mbm>` zVb5F47x;`MPt4G3e{DlJKL@tFAo6w&W;A3F)msRs%Goc%ABkd&5dPj8;(M43;d$1Ofd5-EvIYtj0Ln!?Sa6|NKsw^*6@dOu#z?vwZr&vs+E+lMO&GV^E`0crkb8>w+G|uVu&;=kvkD8k!^4q&AR>VsQW-)qM#Q5a>>aQdKsd7h ze+rc^*MC~rKE+$faM9Wi#ZkvF$OvhTOLvJ0=_vq{TF(cFfaJ+>TS*N-t!#K9H|c#h zjQ-n*hXhty&W&ek0-`WK7M_mLTG_NBLPo%klJA2ug05 zez~i!5aRoDH}l5_B`*`w%TAso96uaI;rhVMmJfs*7N^zj782L&azfK;Z;t(DW5?hO zih_z-;poT7m~S4?TcXTwAwEEU4AH&-1R!lMVC{!+Bn9DMtNo=7@gO8zqJ=GpG{-1J zl981dAr7+IaO);M{=OUH@qQ&w+TDBts?a8&O;~@-FOqOh(&CPi@BsAYwE+esn}O|K zwg5JMcink>zz(g9boetLuzUbJZ>=idHX)pXePDcmf>BTuAR#z>LoIoxP&@*{lg9_5 z?kyxkJEY>z(26@!hCG1q!{!5Iz=VcX_o#v}bd&CtvtP*^j1C5TeA<+Y8P5HfU>h8X z7!#txqY7acF`^3T3xGl-qaqT2D`}Xti#)~aA&mbCtKh_^bW{iFJwYJi`<3?PlOKw4BfptGsdm$u*JT%@KmM`vr#*e< H6*K=gsC{w` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/fluid/potion_still.png.mcmeta b/src/main/resources/assets/create/textures/fluid/potion_still.png.mcmeta new file mode 100644 index 000000000..24f9c2fae --- /dev/null +++ b/src/main/resources/assets/create/textures/fluid/potion_still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 1 + } +} From 42f97477cfe64bed419232ad2d4e80d287adf742 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Mon, 19 Oct 2020 23:16:33 +0100 Subject: [PATCH 18/36] Up-tip the tools. Another couple of tooltip updates; I've still left the smart pipe untouched until I've understood the filtering properly. --- .../assets/create/lang/default/tooltips.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index 55f496a26..fb1eafaef 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -92,7 +92,7 @@ "block.create.fluid_tank.tooltip": "FLUID TANK", "block.create.fluid_tank.tooltip.summary": "_Stores_ all your favourite _fluids_.", "block.create.fluid_tank.tooltip.control1": "Right-clicked with Wrench", - "block.create.fluid_tank.tooltip.action1": "changes the optional window", + "block.create.fluid_tank.tooltip.action1": "Changes the optional window", "block.create.fluid_valve.tooltip": "FLUID VALVE", "block.create.fluid_valve.tooltip.summary": "Halts the flow of fluid down a pipe.", @@ -108,8 +108,6 @@ "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", "block.create.smart_fluid_pipe.tooltip.summary": "A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", - "block.create.smart_fluid_pipe.tooltip.condition1": " ~ ", - "block.create.smart_fluid_pipe.tooltip.behaviour1": " ~ ", "block.create.smart_fluid_pipe.tooltip.control1": " ~ ", "block.create.smart_fluid_pipe.tooltip.action1": " ~ ", @@ -120,6 +118,15 @@ "block.create.spout.tooltip.condition2": "Fluid Automation", "block.create.spout.tooltip.behaviour2": "The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "While in Hand", + "block.create.mechanical_arm.tooltip.action1": "Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", + "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", "item.create.wand_of_symmetry.tooltip.condition1": "When in Hotbar", @@ -363,7 +370,7 @@ "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", "block.create.portable_storage_interface.tooltip.summary": "A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", "block.create.portable_storage_interface.tooltip.condition1": "While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interacts with stationary _portable_ _storage_ _interfaces_ to transfer items to or from the contraption. Direction of transfer is dependent on the blocks attached to the _Interface_. The contraption will briefly stall as items are exchanged.", "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", From 9729c137f14b69a013a74e05ca996c4a047b1a4f Mon Sep 17 00:00:00 2001 From: Bob Dole Date: Mon, 19 Oct 2020 18:40:59 -0400 Subject: [PATCH 19/36] Fix Bell contraptions and Schematic usage - Bell contraptions no longer causes a NullPointerException when they are stopped - Schematic usage shouldn't require a player to not be sneaking, and changes the key to CTRL to match tool tips --- .../components/actors/BellMovementBehaviour.java | 5 +++-- .../create/content/schematics/client/SchematicHandler.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java index e5b89a27d..cc14b1ffc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BellMovementBehaviour.java @@ -25,7 +25,8 @@ public class BellMovementBehaviour extends MovementBehaviour { @Override public void stopMoving(MovementContext context) { - context.world.playSound(null, new BlockPos(context.position), SoundEvents.BLOCK_BELL_USE, SoundCategory.BLOCKS, - 2.0F, 1.0F); + if (context.position != null) + context.world.playSound(null, new BlockPos(context.position), SoundEvents.BLOCK_BELL_USE, SoundCategory.BLOCKS, + 2.0F, 1.0F); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 632108933..31fe3496e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -221,14 +221,14 @@ public class SchematicHandler { } public boolean mouseScrolled(double delta) { - if (!active || Minecraft.getInstance().player.isSneaking()) + if (!active) return false; if (selectionScreen.focused) { selectionScreen.cycle((int) delta); return true; } - if (AllKeys.ACTIVATE_TOOL.isPressed()) + if (!AllKeys.ctrlDown()) return currentTool.getTool() .handleMouseWheel(delta); return false; From e54cdf1c96cc31f39c87e5db2dc164d23319e14d Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Tue, 20 Oct 2020 00:10:19 +0100 Subject: [PATCH 20/36] Lang file Tweaks --- .../assets/create/lang/default/messages.json | 14 +++++++------- .../assets/create/textures/gui/icons.png | Bin 4289 -> 8608 bytes 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 57d78d5bb..992767763 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -302,10 +302,10 @@ "create.schematicannon.status.schematicNotPlaced": "Schematic Not Deployed", "create.schematicannon.status.schematicExpired": "Schematic File Expired", - "create.gui.filter.blacklist": "Blacklist", - "create.gui.filter.blacklist.description": "Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", - "create.gui.filter.whitelist": "Whitelist", - "create.gui.filter.whitelist.description": "Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.blacklist": "Deny-List", + "create.gui.filter.blacklist.description": "Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", + "create.gui.filter.whitelist": "Allow-List", + "create.gui.filter.whitelist.description": "Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.respect_data": "Respect Data", "create.gui.filter.respect_data.description": "Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "Ignore Data", @@ -348,11 +348,11 @@ "create.gui.attribute_filter.selected_attributes": "Selected attributes:", "create.gui.attribute_filter.add_attribute": "Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "Whitelist (Any)", + "create.gui.attribute_filter.whitelist_disjunctive": "Allow-List (Any)", "create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "Whitelist (All)", + "create.gui.attribute_filter.whitelist_conjunctive": "Allow-List (All)", "create.gui.attribute_filter.whitelist_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "Blacklist", + "create.gui.attribute_filter.blacklist": "Deny-List", "create.gui.attribute_filter.blacklist.description": "Items pass if they do NOT have any of the selected attributes.", "create.gui.attribute_filter.add_reference_item": "Add Reference Item", diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index a8557a63b6a09698e26deb05f2e507017c33072f..7a0182e4be6121e572baa7d5fcb1bca2d37df2b8 100644 GIT binary patch literal 8608 zcmcIq1ydYBl%B=igUe!p4el1)f;)sD!QEW~ED0V0A-F?ucMt9mT!TZf0E-4) z{D8ae>Y7*G^WK~Krr+07UrnUCsysFZIR*d#*a~lCGywqgY=QtZl;?|~Td@@Y5PJG) zzxB{G^#;4RIa}E}Sb{x#T`a+tKDN(`K1;AP{UnOEMA;{7Hk`vmRw(Sl21yUY9SIQfhpe;yC_4*72G zvpOF_CN8pL+D@G5t0EWvUP_8)JFCPbi+4<(@7>&8xGo$WsvKnpcNpFBm`o?qJB#gI zPDnrksc^H`S8qNz@6se)+`dn9&gN*(&JLRRVsg~u18Mcqe3P|TOgO#pRAPSOyU#$) zlQ`?6TJk9Db?n^@H#)k%r&J5V3B9;mtn;*^eQ;w+|9f1G3O@<1yJ^T!gY%GS zIGK~+$=pY-eo8fm9|JaA?dGBlg5Tq!zSdH24kXDfv3t6iS+KbZ24*YyEKr^J5ew_B z1@oAjRG*&T%=A7SY;>OAh)uS?TE+YDM9s4MLdQ>8I(3G}I_|5BI2Rj7$H``3F~yU# z86g=f$Inb;)y|Hvw~Y5127h*hT#e6u-B!(`IR>GCWenRmQ@;*Dt7sF|KRI(X;zgJ< ziN~i7Cj6#D%uQ(i)V3Yg$|NLuu=JrQ)Z2;m?2vO(iVmPk%a6}hsC8qXRU6GDPh(6x zQiL?rPmeO!6{gvjG&H`7PGf6WQ7o%ySd&W^ybteBnPYrvKnR-=mfahwEczmqW~NGZ!9*$iofb{4#hML_5*Z{ggvK zS}4r>#TmEMZZRVnZoBgN5Jd+2TxKB=W^)V9Y`jtIb@yxe-AAW2!{H!^^O<+5yW(mm zy}N1&+~U~z;_7ob?3R?V9jOHKg;q9um)A0RLqbQda06PUNs=qEWWeA>jSgcZhj^h$YAC67+@Jtxei<*S@*i4Vwf3DBC;kdFDI@|lx z=~X#LryRKQoY}_&RO~P@4c50#6|k@lS=ZMtF!vYXdsP`SCrR4%;uREbUVK4;haI_n zmQ;UR+e}2Y@#0TPn|{%?$`L^{|8lBX{X4CnpW=a1L@Sz#k9HK}G)XF%I?Y~vwc{;y zHO2$h`MOH=Jy4;B04JfEGC=-yz_^rMcZS=7SnscS&zq$+#v&%n{qT7&3avYfdBtu# zyK{>&np(Z)7;vDSoy0t(gU|X)6a?|{&G53r+#4;H!*A%$k#@{^**tIlsC+4>1r5C` zsM|V9Y(23&5i`oSM`1JPNf_S<>F^q0Gv^JBzF`e|$*{%tEmqp6oVFM(ZI|+pl#j^$ zcS7JpezE*?blxv=(3Y^N`sXZ-KNP}gXNq%^`K|+Run8^dBn&9+)-y>ig_GFKEB)nr zT1Ryx3upH;HG4}_zb>`5#k}=Toi!zDH4Iu3wuNu;nr~4_Gr96wEPZvHPkE)YeG@WXgLM;=?=5gZN0E$mTzDzN(Ca zvk%R%eK$-KXgGeJhiQaCJKw$vDV2#tj%KE+>U08+d|3JLPxFGd-Ba%RuFWQ(GTu}kTuGq9#b1U(rXRGmr$%_@xlSk%(o zW&Q21E2%b7ag?DwE5JY5Z~AQ9+YBAG^(LSL*WpxOI#_q{Zkn`b=HOq-8C)$-lOe#@ z$M^~*FLW)iHtc^h2rQfBUJQ13#)>*bwgmW6Ve=|`PJVIyxOuByy&>$W&~7a+R_r~( zYUb1Bu4rByZ(ZUQqt5cE7b4)R3WhH;X5$nRPtRq9Woqa_ti5jzwBB zNSDhM1eNOBk`U#GUgXbB?xH7o8^`tP&SW677JJ{7w5D7Ja06`)tyB-m#L=GK0>@zx=a zp0j4FCn~v;V}DhRO1(QTup~%0%ip`r`gY1jFkLPbRq;pjOlXwH0KS|f64(8F&&xVO zUV%@m`>86sYH8Xk>?lWEJUcWD7H%@A-Ntu$MIXlXdr5hhBHCxVGq;pClAGjcJL!I^ zi#pQk1B>2zJ@$j+egiwHBp_&(vEu4d%l4!NE3^sDc zEkaUTVTTjW6@;QfV+}Nz%j@DYXa)F3EPjP6Z9L_2L)+TX`;yEKqp4FRRu!N3Y+Xy# zmt9yh2y3vy6=yu2V+Osrx7__bFGP4!Gkhm5oxagnZ6kM46<}6ydvGu(R;xYjG^b|u z?L-7$EZU^cgb~I(ah_hg;wzpOXum^BI9Fhk>9p-;UzNAek$;1H8nJ~a*9>Nx0!ak2 z*AO8ygeoVp)_8&5@hbt=2qpK(Q(uRN7L z3Ld zU%bLT)4iCBr}yFIua*qKp0D)s!cIV(k%IOqN9J++HmvHLhE&^liGMj3>&@#1za*X= zD9jRgXUgw_wId_X-zwms9@}6X+$$N+skbxFc?v_iPD2wGO*QHh5T{jp zM5OM&?z;LIU*1VJaDx5304mI5&_tray~{uzE5o=~*d~ za9HzR(YPW$XqxWFskY2ide@5?BvEb5rg4%S_OQ1ZfNQSR-#ckO1y7S$D!|k^ikT`6 z1qKr`>RSFPk{C7<7$~yZlq5zl!3fUtREUYA2cmN`DbFAYm$IEQg;21fb_Z$lTbOg% zjVnH4+AHvh3*rF^Ujh~$0#<0?HYYWwu>1gI+>Te)^m4yddaHtS`frnzf1{E*~Hr`lxa3q`9GKz)Ih#Lx!hz^jzfq+~W3V>%v+ zztal{Z?_;zlK(!5ug}ytCT00{vDzsoPnJONRlo(Ml8(--`$V%?q?Y`yBCxGnpNW=6 zalTR4BxF%HF^bXElzqQ}uHaqK-vR+zbQ5fhRMZUMH@BAq4hbYhf?1GI6jKV>&K+OE zW4i~2p1Yg*iM3N~bSYDMa^^HHak@|4o^uw>OwifS4BhwjE$AyRR*E6`n6=;+L01-a zvQjLs+9&g8`Hl+#9BqR%&9ShSM-EAkUcl!-U@*7<2+ zw(Lg*qa?5>u)0!T=>F1P)52q*Z66w0sNQ|Q<%y)h7x?SlpUYm{A|YF=rE@;R!<=WKn9r7P^cu6a==LCM4ZF6N+ecItZ*`2#y4V$uvX zv)qS1u1OG%7*7*_O>>`>Lv8eAn#w_O@qIlRnzG;}FAn{9)Ep!vOc;Bjy2JK!l8v5z zz7H1KAj2jf;|#u#Yq5o>#sN-a*C9HEj_u?|oycSt=`#g_r|rJHBw$ma@`UJ6(O z{Wh3{M%aeS7e)4cTYBk3)ikA7cAPi)5usS0>?T5Y1aIdIP4JIT!lu~b$!AWiVOnO9 z5~PH>suP~=FfR~vn7DygN-f+N$wcGY1t-;tpsu@&I{>w1iZY<@_u)7Eg>XRvZ4)eg z-i=-nlNQahYUa)mFg+nLLqvq8Q{hlQ<$X+f|7eG+c&}!LvbEtHX!kIDm?$+n8n1uG z6I+;>4Evxp!6dD-Ij51Z!$`9qnZcZp{|?(0ZrVFh`I2tF+hP){w)J&IjCg77YNTCn zN4f{)#&Df*p?RQ4C-iFRZCJ8vtG=Tan%5lh8>Hn^1f$cxmHehQRVciU^6fswl{$Kz zhMDkpJoTnGi|pJ8AOE@gls}VB(kpeBg^Em0eL3I+^EDUc3bIz$y{th4|&lI!FGn| zT&3;Qj-AnnztSgT)pFVgm?o!o^B%=ozp2`acgop4b(b}uxYrdYer=Pk-Bp~GU8pC-f=Xfjf=o6W;F|8!|-FL%~go@ zdQo&QGQe@{_K5r9 znauEQHiX$r9cFpM!%d_!S$Sl(6$bv|^1fJlF|*r#7$GTb^sZn3+auyzmBQB+yr_y{ z9cnfXWV~i_*fB;f<;qb9s8?sjTqlQX!~3{HmYtU2@iRFH#r#r8XHols8PU>{&sxI<^|?q6*} zV@~VJ=_KbddAljeI1^;#qOA+)yw!CZSRF^R*uyDKTT&_t&+tCHVADePnlvK9$f5r_ zspr{!vTyUYlz%cE4Wb-z$5YcOlZg~V)Ib8Qidd@VVn9*(jM_uO4-*Y$7u4yQ$OYdH z(t2P%@_8N@qVpBtK&p9u!E-^GYa!f>`wUFPR+X$DFq5WT=(WvyHOh&r>3EsHl&;Rb zA!y~7uSH8@wK0DU95xqVKJ`{+&Di8xmUP9{%y4>)_uCIsG5pxhE#Nt) zq#9O+yw4|J`eR4sBECNI7ZiprI$B@-o-mg_J($&(0)uA?Dfv?6Tw`^BGwV(8w@?)# zx(pC9Rxw!uXPCX-?&>6~l)kQEDb z>Ja4G{CO$4ewPPkB{V72LUx%qn$VN2oba~Br6GUi`xTO zE^L3{MWA3a<72)?P`4q6ec0sGt#qeneo4;Ds;(fV{Ub-DDLa7uX@=#QF`3x8JdFCM ztEg0(ICp2(wj;fAbiO+|lOpk2qTct+!KB~U_O!?D)E217%~Vs~2rxs@_w@Lk?gQYxK=p>u$cP-q z*5%3JS)fi2lyM{Dv5bnKI8472n(ez@n5w{9lrOORWCgpDY5e&eSD@1vZi;#FbbePB z?53daz2x(mC12l3DrXewz$(;A*;kzqSy7&SakP1$>A7ps*)BUbn7(7x9V50QF9T@K%@K2!bXp3?KccmOGm@CRp} z3i|okURxcglAXV70b0zgiXPQN5F#*b%nbQhw=v#9MXi5x)GJ^L1bji^n+Z)}CQo7A zZzLrw9PkhUCFZUEDKX-_I5B8xWLc)|jZ1RM$yN0C@j5Q@a_#(+-FbiTX!F_woBD{^ zrpM+Zf4##`sk`rHeK@a|XVZ&af>{r?D?}4^yVUv-FX{%DlT<+jFQF)eXJg2L4Md#qR5?hk>ymnp4k54 zrx+X-?=&UGy86_hQw;y1v4x!(!s{0e=f}WQCMQ4*-IgH#t#TJ>9N6?>1cgb?d3+nY zBGu8cqnFIZ_jHN@#kQ89czW{eOpJet zphcQx=jxO9sA?0bRm&=^`2H2*q-5}4iVsqG(DqlCrET)0cv5-d>Y9Ofy$49@c@m!s zQR>u|aqNzf2gRm%Lk=a5b+#a~A z*kpXs1d`&aMqHIr9YweqeF%|O(9qnK%@b?&!!q8vIO2nK&J)((C;J?)6YAq25DO|a zd67NhpB#r`rX()|JpJoA?M3m=Gw3dF^xXjfr}Ezb<>}`B6Yx+y6jWqUw=oEbg&54a z3RIpYy>bN^N$qEiZnZ7SP>*=v%;@_i60)i?SzlMasxaqJ9KAe7^d&-t1n$Pq$;cOK z+i#sWhHy8AJ`Rv#VNhaWA@HHl?(3zbbqS|UPqn~CTjo!2Wxe&XJuCeK{9&F~mfo+a z5uq2`Sq4A`2Z=fC=IZL|)8v+m;89^m^8w|qAb+(VXvj6ELD*=SuS!FCE%V~cMQ}x_ z1+`>?eqXVe57VkZE9*7oJOXb3+BO8 zniV6jboV|tIuP9tz~LGfo$aVCd0c3SWrq{Vv+8&auzqT*Yy$RH!m@b6r!#ftZ5skSd`m@~M%)Eg<;{qQ%_dB-$DiT=R<@AX8s}CG&ve?&9XxpM zLN;BY5Y9@2QIDAFgu4r^1L1hcA?_u)NdMWvc=mJ%sT+=pnSSY*xE1m?pGhoX@(?0J z{koXT^icRyu#0wXkON4V66Zv`Wb?7DaB$<$*=;=KrD6KR*VE1_bk2NA-iInXxp{Fe zORJyzbv}e(0fe`j`!p1fNva6M4sw*{-=HU1dO8>Kp(iIXZDk?m#|zypDiN*Be;GN$ z8K{@9xWYRPS?56RX?R??#ls3}gz}KkrjkYl{HX*=2|WVNbH^Urc++bq8fp5}-_K|t z*Z<+vSro~KkeaU($JPJhqhcwv74?*D8GhOIr`N`Pcac(F3avf8WmkM2!{sC$+UP&` zqR~s1s-(fw$?<(HI=+&@tj}E}q{+Ol87*hbRnz$Qj<8E5xtilbqBOHcj-rsf@^-@A zPeoZLMkH~s>^WcMDO+1TKhDW-e!+h*u#{N=VE)qr^jV6Q002DTr`r3fnq2shDC&gi zn!n%`Pjl0(RMjc=VPI=LLJIs|agnfU(=dN+qsF-6@-jz}Dq6F&i^D|QWI9mMyISAQ zkxb-XWM`$2I__;xM+Bf;Q3@fH^6=b^X!nKixj;aWIp3lXp1!p@F5!!OZE8kY4sR^U za?YJ45)x<$(?CRKbM8c?7+2qH51$O>-CZs&)p&-Mi6YT`1~>OY^Aqirv^5L)Xh%Y` zEM^zwcs37@vX+Wwt(*#e^@{J`G!(hZU*58uM#%N8Pc>H%{AJQBp*V?!s}kubrN!7e zq-H&}j-Rl5t=YaB^paU~Trz;bzr$#c$AePlJ#6-R#k^;+#T|hW=H^bT^~+iofXqlZ zCQipcD_lYFG*T5lllQPGfe_(>D_f=g!tn`Gf1H{tBaN}INWW9A%p<#UAl-#-j|7f6 zjUSVQij2S}@Fd_7H#@r)Qh-vBKt9X8aMrX& zSnJKHuGkI1ZymQ>*S#@EHi2A~An+GmB)hdvD}8bnLsf6hBud9jSq_X&Gsl5zUYzqq zs#it~?25a&p$T2*c4(gHx&tIe0^&R07wq0wF)m>^|IDWn3guk5Rh-LkkGAEo<=7;F z0DFqdKUoTTZ(8go6a3?rp3H2oS}cQs3iFzC=lM&trF3 zpYIJ4)IHyaz$M}WH(4S>bVbkd>D4kD%AK~f@#3dCcuAnHW-yLFGew8ogF}I z+!;uP6E0m9ueY4_NF_z;(0PXj_N0c=dKuCBz9-qr#mQRs^eV4zo5)QjXv~i3DX&Uw z9*}xG-R#|8Y9k2N+FO4Iqv`2W=%O{Bb4SH5AfAQXt!9s_aSog<>()|zyRrASK@5V7jef{np8rj|9UGU z)i#Eh?fjjaAmK1Z@<5YN{gV1l3HwEa)?kFK(n6Eai_ngKn&g)V(lT{y7&dVK{dRk| zN4`jj=nFl*!1mp$$2B^V5>t0YT2gKqpPz~PTIZyfr$0EfX_m!aK7I2$Nn3ifSG;TY zIiq|1;fAwpw<@D^1aX$|lfh~DBAV3B; z2Y^@v_cLYIy(A&0|;@e;u(A$p}$u7ox;-|C~pMvKF zj}4n~i3k874FJ#p;9tr9qsGRUfMeMZ7EFG<(MVDJex(C`_lQUb0BrlHKm;&gi%{N< z4syuc!u-_7>LT8on;o$H1mJh|DCiebN?0I$Jv1r0 za_lUUBbEV}N4HQA=cvT=IA5EAzoWaf);j&c6SL|p`W`pkAh19!IErRso1m=dw<4j2 z#Ce@yqB5S&LJg#~>|^F>Nu8{C`Cr!ADppmR&o)IippF{@imF5SaAK1q)+bwIKthes zWat_)7EFuZm2!&&1euEg5=j4jXne+#T7*rqj-rs|{#C19acpG)r_F#jt((nW8*M9 zshdAV*=tQtLAN`}*TY>Wolj!_;;D&0B%lEl8(XutG_QT|9&difo(?l*hm@6-;q|N! zcR6=HTm^`2%$4a47O7<)OQCI!r3)N`tFO>De$`pG?M-Bd>s1+tI(OW@{1E`>55emh z8yh=@EjOKHKHXmI{ioB~58vL~VC+*#aj1MOHC6U&UjpjqTpf1@WkxR^gC1}9Xat`i zcOZZQAKHp`bPYd+pLB*l1IKcI+Kby(_%0g&CWzl!sJ)#?Ae cnIZIqD7^1%n_Z5g1UxqdSyh=zDU*-?0r5oaC;$Ke literal 4289 zcmeHL`CC(0w?2Wil!`)wipo%1CQ(TQWge@Hf`LK-Nf?9}W<)^35Qg+CtwkW9K%yd0 z1w?@m5Rxzih%ytwIxr;+F%c9(z#zl`fqe11xA(b!!u{d?u%ENnvxjxo+VA`Bbxw{a z+f@Dl(u73`6O zd?m9Lue$gr0>Hk8FAY@bdtbJdim$7~PrsxD38uSO-Z?-R!nyKZRh1v*uDz<(0fQYJ z9KbGg0Bp@byXdF{J3Loc5y-22chteb{^~15#q8|Dl;7EGuR>pCZZYXk=RUc>usgbEJWUFn(2^I8p^%zW z1=RZJ7#oX4WSRKLYqAbm`iDRd^ZX}2^@Mw`{s^oJm@ur`+mX%XS`>?-w|m08j?dx) zMJ23beRW>x&&Lfl{YDUiD(iJ;++m@5#*4(lw!wGYdc7D`?Bj~#%$x0Ps4>j>_dlK% zov0Sy#@AG@YOtN+=mJ`}62dPp&!02~AN7%IEGsGg`j%A)203m~DQpjpC^Ogd85kaW z(Fq?Ki_AHISgmGWzEDzKytL8s1M19%8bXinSzHw#-x-klT%=x5dGLgn@Nv?k1nsfl z+LK}Iv90P%M9aEWop^$AV*Bg)h#hTQ{!lD)>yekf zt&eXgANko@6rn_{^3;wu9u*&IsmCZCQJY|v#2MO_&+hV2_+aGY3=;b6Fxqf?nOaXv zXazSqr8mGME2=a45TQQP{q8YGQE}zHA+Muuz{)CL*_JGBKhW>;HPgkf#>TZs#jPf$ zP`@^6b*4vm^Ihnp=9fj#=ng~v!N+EQeZJ7NvAX%kU0wiG=QYj!53U&qQmP)!+~ivf z7*y{ftGF9UZXL}#d-7@T&kip`Zp208)yGN*T3gzTmu8xL@dZRr0d#yRj#@S@#%>g83-6vu>O2^UBznGardv+xY^E34?fg3(4)+ z@$-G`q>-5Px&`nhg%;6Kud41h54H*C727flo1$-iDndM4IeEAgx@L*b|2*KejohMe zsm?qs?~OaXe>g2S#XyFTz$we1d9L#rU4Z>|Fh@|Wf0ULTN-bxuXn$+DNKDP8> zcRId`OKHGAg}VLzCxPE?7PQ2N+_=RX_Sc?maP*)TZkf&wmmraS{P<$l_wla4t42)d z)Dsh{uIp36g;Cc%i)`rq)<@Mrk=AYER%;*F720|iEzdiz+=}9t4uuaR@foXPEnBRYTa$CFCE)M>}^1J{>{2^q08KmTlaidiSE?aqESK6@{@@Hvi#FX|7TIPYE3#yWyEp*@fvgYy z2YbNP`YolSnco<#d7ce@w&3WY-Yf)O)g}YRFR#fpm~3JvZJqTxH9G?3KZp-9;JsS$ z_u!11)Hfe4ruF7Lpmlfhem!WG3?#f=gxr9tLc5N6dkJm0;?^=mN3(Dk-g5sqc_X1dV$iKmxPx2_m4j>^lYA*&I8^h`SvQvoZ#%N;9?&J`+LOz8)lzw5= zWfJoV@9DHPxVY${+p(pDak2OUAtjZ>_e}SO>8s5}>19^gF-6f6A<1J$gu=8I*(&sz zmEvXjU&SHU=_{!~f+!_0CV+m$UxW`2i41Hg2ld|ZJslD)vcb|{wO)Lz$@VkoLc444 zAbVHUv-HdqkIDklSfAp7;!LGSR2cC>G6*!_0^m?OxRRm7Ki@R}iJj`my0=FWxSDqz z2kXl+nlJrr+}J<5jifpem*dygPDw%PH_SoE2}uP<3gT7`mjagVrT(?2UFv_Ce!kH(7Tyv%&`5d4S3ry5ce{?ccc zuM>)3YL_(X;@d}G?wN#!`1u?+4LUnEGKre$ncd+9_)5PyT68iA#9CuHyve<&X4uTv zP_M})zz&!`9KaM@E_#wIH7DwV>f@VS)Sp!8A(kGT+&DZjk;K=5QuZt%!Gj*md2O5|DUc7Vp_Xjt&TJ9sl%V0e1BuGU<9CGR7C|U1 zQ3bC^1Q%M~f2>+wt5#&`d>dz@*sE0;WvEI@@mem2ty*L%i*+xZ!h%NoX{_U!)S2RPQ|}}s^AsM8 z`%0CmFQe7uk{wv?s+JC}XnWgk_b?TgdEEopnp*#EuxUBN+WC+?p7(YYaDrjVjs@}F z_C!J$T52uU-&Ld@&&(D#D(cLn@9`|X)Rr4{2I|ZzIuv-F`=iy@`HMMf)H%;LCL-(r z^E6H>*$#d?CY{2>(5XmuZzz0>8^3SJ3P?>9JU}x?|3zpOpM7#II9+J)MT2##Ly?o1 zjYDay+P;Z?TecK&O+%RSOiybt&`z!jT7P?)85m=zcK?k5rJ~ZPQZ3DmzRVN^S7yno z7suL@54U4&tOy9}(ZyRp+AQZ~?oaymf*)T{VDr@%XY~24`K;R}n1#v9osRTkO3R7Z zNnL0&8EqA|-I$axZ{Dp7Y6%EvdU+`D?8^h4<^souY)B;=lLZfO4vOxs-bI(OgPVQm z#r!TvPP1D;STGZV7cj@i)(A};4FdSo+8?96#i1K=`9u?_W#l>5x3Hor_%sp!!z_Ht z($<+LD_@>K*u?&gUY_;7Z9@j)asVrN=^2%a`k?tqOV~Ll2aLa!8vVWe)wF6wDGt$~ zdY*=k6@2F*$HHh=T{O##$i3Ub-%gdhd_`kAa+ZXQxTCDe_qs?XnLr(eHbs_dVK+W zRphG8dk?d_N-_XxgshQ`Qa72(0Vj6%*^h_cJu|%`pCO*W;ZT9f|4aMxz<{}v9H7zR z3at6u%`79Zp+jTQ`821{`l%Go%XkIAynj^|yXnq1h5s`Iczj{AUFU@ziK$7`af_6uRw5R$J%23-)k6T8UTfqMH*nNh}92;hE*B5L4MOy0J7d90Y=mH z?H~SjQQ{m(mWh`HqH^`0chLp`_?t4HH@d+A-&#(Ir>XVc%M;1*Hd8f%cdSQ!*GIUA z01tSgf@i4&*wS1|1}NPeijHTla_KY(c=~qNsPNX7jMrg2kn$BM(dC7&@E>6b59Uf5@^m$$>b!-5X=O$vNFH&D$&MrHKwkyCy_p(q5m z8b3a=0ZWK2UTW!;pVe5=wvSrNHG$xY=UEEY$1}l=3G=$94|Rh?e4V|Hb*$PzPW?Wq ziV6cGrhO6R|0?k&*OWL@&BE(k>vOL~)s+~c4@ z!>-va=4I((O$9;cucF}b1pSY**wve0oWfOCz<3j#kW22~-CEm}md17Y>vhw2*I#=O zbw0A9$zSF)>HuYuIJ&U^_4iqlrscvR*m943o4R=OeMN=s=DVVr7j{y~;^wFKk~&LH zF9Ccscr{~V%#ZnQm-Cx4)YV>(9>ae}v^3t#lJ0yCe{!+}xHmqw3cMo(X{`;FF*;Ve zux&e8pGM5cdQvY7PBOqqosp;v>VfV^>?9w1Udw`_POsJME)@Z|Pv>_bo<%r#`pu4c zeGu@zWXGUU=hxM4sjZdpfTApoF>(=(a=>V`D*&XoZyKBe?EZ6K{!@L+F3SIA!9U3R m|6$oj$^VJ8OsA!7eb30g+!f(k3YYzM09+m64h?57{p;V#eGZfW From df252b3e30b75140d953c81455f62e767848db3e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Oct 2020 13:42:16 +0200 Subject: [PATCH 21/36] Catching up - remapped seat tooltips - remapped outdated lang keys - applied changes of #395 to 1.15 - Fixed Schematic hotbar overlay sometimes drawing on top of the item icon - Fixed mechanical arm lighting and render bounds issues --- src/generated/resources/.cache/cache | 24 +- .../create/blockstates/radial_chassis.json | 48 +- .../resources/assets/create/lang/en_us.json | 112 +- .../assets/create/lang/unfinished/de_de.json | 86 +- .../assets/create/lang/unfinished/fr_fr.json | 84 +- .../assets/create/lang/unfinished/it_it.json | 84 +- .../assets/create/lang/unfinished/ja_jp.json | 84 +- .../assets/create/lang/unfinished/ko_kr.json | 84 +- .../assets/create/lang/unfinished/nl_nl.json | 86 +- .../assets/create/lang/unfinished/pt_br.json | 86 +- .../assets/create/lang/unfinished/ru_ru.json | 2060 +++++++++-------- .../assets/create/lang/unfinished/zh_cn.json | 84 +- .../java/com/simibubi/create/AllBlocks.java | 3 +- .../BlockBreakingKineticTileEntity.java | 5 +- .../flywheel/FlywheelTileEntity.java | 11 +- .../block/mechanicalArm/ArmRenderer.java | 4 +- .../block/mechanicalArm/ArmTileEntity.java | 9 + .../item/filter/AttributeFilterScreen.java | 20 +- .../logistics/item/filter/FilterScreen.java | 14 +- .../client/SchematicHotbarSlotOverlay.java | 2 + .../create/foundation/item/TooltipHelper.java | 16 +- .../assets/create/lang/default/messages.json | 20 +- .../assets/create/lang/default/tooltips.json | 8 +- .../resources/assets/create/lang/fr_fr.json | 20 +- .../resources/assets/create/lang/it_it.json | 20 +- .../resources/assets/create/lang/ja_jp.json | 20 +- .../resources/assets/create/lang/ko_kr.json | 20 +- .../resources/assets/create/lang/ru_ru.json | 20 +- .../resources/assets/create/lang/zh_cn.json | 20 +- .../assets/create/textures/gui/widgets.png | Bin 2406 -> 1895 bytes 30 files changed, 1835 insertions(+), 1319 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index c2daa081e..521a7f5e4 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -211,7 +211,7 @@ da612a05f94dc19e07e250efc35a7b2839d2ee76 assets/create/blockstates/mechanical_pi debef0f5dde74103aaf4422de4bc90e4099b0c47 assets/create/blockstates/mechanical_plough.json 92269fe66d7b83095a2e04e121af0be792f55dd6 assets/create/blockstates/mechanical_press.json b7c4a0ff0c6f16e14d71fc0fb7fc66d032b65cf3 assets/create/blockstates/mechanical_pump.json -1478fc76afb9b186fd3fddc20c29525d60d692bc assets/create/blockstates/mechanical_saw.json +264d72320ee0f1e014319f7d99dcc1fa953a4ad4 assets/create/blockstates/mechanical_saw.json 4e48ad0936647065c2322390e7c0fe115c853a98 assets/create/blockstates/millstone.json 468202df0802e17c75fcad0993daf1bc5300ca91 assets/create/blockstates/minecart_anchor.json 6a42f86aaff8ced70aaa6adb9460614ab40c21e5 assets/create/blockstates/mossy_andesite.json @@ -312,7 +312,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json +89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json @@ -369,16 +369,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 33f621fe1a09a46426af59c9352c33e97c2bc00d assets/create/lang/en_ud.json -f68da0c370026f416745b46445b53c63457cdeac assets/create/lang/en_us.json -1fa1a84b7dae8c7636a667e094883646ad6fa1e2 assets/create/lang/unfinished/de_de.json -4b2501a9d7730b4fb469d241afd72483171ce36b assets/create/lang/unfinished/fr_fr.json -efff9eee3f434fa04b3a688e8e861ab7d36fb45f assets/create/lang/unfinished/it_it.json -6db6ebd43ec38e11ad81f4b997b5765857bdf8da assets/create/lang/unfinished/ja_jp.json -3975b1184f38e7d7150ba2be0179bd3cf36ed7ca assets/create/lang/unfinished/ko_kr.json -84c44b3b4805925d0b489e295b38a72dbf2703e1 assets/create/lang/unfinished/nl_nl.json -f82f1e6250dd9a5ca9a7b92078bf1f7429d14d00 assets/create/lang/unfinished/pt_br.json -72d5dcbaa454de0ff33ff0cb2108938c2a5e677a assets/create/lang/unfinished/ru_ru.json -fdc2007ea9e3f8d8b2a6f8dedc434b591a0bbf0a assets/create/lang/unfinished/zh_cn.json +25fba2944b4a86281bc40fddba4a8136d53e3c26 assets/create/lang/en_us.json +52ad08a48ec59354f826b9cfe7eb6ea79ec7bab9 assets/create/lang/unfinished/de_de.json +62bf8e59e095e3c5dfc0a00f68b25de09cbd1b7e assets/create/lang/unfinished/fr_fr.json +4fb16e3e63bd5df457d7c77c6290b4ce595fd4a8 assets/create/lang/unfinished/it_it.json +654032efb15080b3824536cc4a0b32507b006264 assets/create/lang/unfinished/ja_jp.json +fec915edfbc9bca029dcbd6b5bdd7f9c777fb08b assets/create/lang/unfinished/ko_kr.json +8de3030ee744fe793ad2c27c5f9f2e7a3b933e3c assets/create/lang/unfinished/nl_nl.json +5cebc2913e4c04b496e00e0841474118c7709c4e assets/create/lang/unfinished/pt_br.json +68beb3243e78a3f34426229286f97a7cf2f3e489 assets/create/lang/unfinished/ru_ru.json +bf38c2b2063126ca3c3ed9183726665c8aaea419 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 1aa3d3728..d60327a8a 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 861c5684a..4ec3a9046 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -818,10 +818,10 @@ "create.schematicannon.status.schematicNotPlaced": "Schematic Not Deployed", "create.schematicannon.status.schematicExpired": "Schematic File Expired", - "create.gui.filter.blacklist": "Blacklist", - "create.gui.filter.blacklist.description": "Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", - "create.gui.filter.whitelist": "Whitelist", - "create.gui.filter.whitelist.description": "Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.deny_list": "Deny-List", + "create.gui.filter.deny_list.description": "Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", + "create.gui.filter.allow_list": "Allow-List", + "create.gui.filter.allow_list.description": "Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.respect_data": "Respect Data", "create.gui.filter.respect_data.description": "Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "Ignore Data", @@ -843,10 +843,6 @@ "create.item_attributes.blastable.inverted": "is not smeltable in Blast Furnace", "create.item_attributes.enchanted": "is enchanted", "create.item_attributes.enchanted.inverted": "is unenchanted", - "create.item_attributes.renamed": "has a custom name", - "create.item_attributes.renamed.inverted": "does not have a custom name", - "create.item_attributes.fluid_container": "can hold fluid", - "create.item_attributes.fluid_container.inverted": "cannot hold fluid", "create.item_attributes.damaged": "is damaged", "create.item_attributes.damaged.inverted": "is not damaged", "create.item_attributes.badly_damaged": "is heavily damaged", @@ -863,41 +859,17 @@ "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s", - "create.item_attributes.has_enchant": "is enchanted with %1$s", - "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", - "create.item_attributes.has_fluid": "contains %1$s", - "create.item_attributes.has_fluid.inverted": "does not contain %1$s", - "create.item_attributes.has_name": "has the custom name %1$s", - "create.item_attributes.has_name.inverted": "does not have the custom name %1$s", - "create.item_attributes.book_author": "was authored by %1$s", - "create.item_attributes.book_author.inverted": "was not authored by %1$s", - "create.item_attributes.book_copy_original": "is an original", - "create.item_attributes.book_copy_original.inverted": "is not an original", - "create.item_attributes.book_copy_first": "is a first-generation copy", - "create.item_attributes.book_copy_first.inverted": "is not a first-generation copy", - "create.item_attributes.book_copy_second": "is a second-generation copy", - "create.item_attributes.book_copy_second.inverted": "is not a second-generation copy", - "create.item_attributes.book_copy_tattered": "is a tattered mess", - "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", - "create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s", - "create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s", - "create.item_attributes.astralsorcery_constellation": "is attuned to %1$s", - "create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s", - "create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s", - "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", - "create.item_attributes.astralsorcery_amulet": "improves %1$s", - "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", "create.gui.attribute_filter.add_attribute": "Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "Whitelist (Any)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "Whitelist (All)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "Blacklist", - "create.gui.attribute_filter.blacklist.description": "Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_disjunctive": "Allow-List (Any)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_conjunctive": "Allow-List (All)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.deny_list": "Deny-List", + "create.gui.attribute_filter.deny_list.description": "Items pass if they do NOT have any of the selected attributes.", "create.gui.attribute_filter.add_reference_item": "Add Reference Item", "create.tooltip.holdKey": "Hold [%1$s]", @@ -982,7 +954,7 @@ "block.create.andesite_casing.tooltip": "ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "_Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "_Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1029,6 +1001,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip.summary": "Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "Right click on Seat", + "block.create.seat.tooltip.action1": "Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "CHUTE", "block.create.chute.tooltip.summary": "Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "When powered by a fan", @@ -1044,6 +1021,53 @@ "item.create.empty_blaze_burner.tooltip": "EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "_Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "_Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "Changes the optional window", + + "block.create.fluid_valve.tooltip": "FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": " ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": " ~ ", + + "block.create.spout.tooltip": "SPOUT", + "block.create.spout.tooltip.summary": "An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "Fluid Automation", + "block.create.spout.tooltip.behaviour2": "The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "While in Hand", + "block.create.mechanical_arm.tooltip.action1": "Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Perfectly mirrors Block placement across configured planes.", @@ -1247,8 +1271,8 @@ "block.create.blaze_heater.tooltip": "BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "_Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "_Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "When fuel is used on the blaze heater", @@ -1261,8 +1285,8 @@ "block.create.mechanical_mixer.tooltip.summary": "A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational_ _Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "Starts to mix items in the basin whenever all necessary ingredients are present.", - "block.create.mechanical_mixer.tooltip.condition2": "When used with Wrench", - "block.create.mechanical_mixer.tooltip.behaviour2": "_Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + "block.create.mechanical_mixer.tooltip.control1": "When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", @@ -1288,7 +1312,7 @@ "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", "block.create.portable_storage_interface.tooltip.summary": "A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", "block.create.portable_storage_interface.tooltip.condition1": "While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip.behaviour1": "Interacts with stationary _portable_ _storage_ _interfaces_ to transfer items to or from the contraption. Direction of transfer is dependent on the blocks attached to the _Interface_. The contraption will briefly stall as items are exchanged.", "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index e8f05621e..beb9fcf3f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 928", + "_": "Missing Localizations: 972", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "Bauplan nicht positioniert", "create.schematicannon.status.schematicExpired": "Bauplandatei abgelaufen", - "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", - "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", - "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.deny_list": "UNLOCALIZED: Deny-List", + "create.gui.filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", + "create.gui.filter.allow_list": "UNLOCALIZED: Allow-List", + "create.gui.filter.allow_list.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_disjunctive": "UNLOCALIZED: Allow-List (Any)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_conjunctive": "UNLOCALIZED: Allow-List (All)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.deny_list": "UNLOCALIZED: Deny-List", + "create.gui.attribute_filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", "create.tooltip.holdKey": "Halte [%1$s]", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRIESTAB", "item.create.wand_of_symmetry.tooltip.summary": "Spiegelt deine Blockplatzierung perfekt über die konfigurierten Ebenen.", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational_ _Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "UNLOCALIZED: When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "UNLOCALIZED: Starts to mix items in the basin whenever all necessary ingredients are present.", - "block.create.mechanical_mixer.tooltip.condition2": "UNLOCALIZED: When used with Wrench", - "block.create.mechanical_mixer.tooltip.behaviour2": "UNLOCALIZED: _Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", @@ -1261,7 +1313,7 @@ "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _portable_ _storage_ _interfaces_ to transfer items to or from the contraption. Direction of transfer is dependent on the blocks attached to the _Interface_. The contraption will briefly stall as items are exchanged.", "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 274921286..d6af217bb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 555", + "_": "Missing Localizations: 601", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "Schéma non déployé", "create.schematicannon.status.schematicExpired": "Fichier de schéma arrivé à expiration", - "create.gui.filter.blacklist": "Liste noire", - "create.gui.filter.blacklist.description": "Les articles réussissent s'ils ne correspondent à AUCUN des éléments ci-dessus. Une liste noire vide accepte tout.", - "create.gui.filter.whitelist": "Liste blanche", - "create.gui.filter.whitelist.description": "Les éléments réussissent s'ils correspondent à l'un des éléments ci-dessus. Une liste blanche vide rejette tout.", + "create.gui.filter.deny_list": "Liste noire", + "create.gui.filter.deny_list.description": "Les articles réussissent s'ils ne correspondent à AUCUN des éléments ci-dessus. Une liste noire vide accepte tout.", + "create.gui.filter.allow_list": "Liste blanche", + "create.gui.filter.allow_list.description": "Les éléments réussissent s'ils correspondent à l'un des éléments ci-dessus. Une liste blanche vide rejette tout.", "create.gui.filter.respect_data": "Respect des données", "create.gui.filter.respect_data.description": "Les objets ne correspondent que si leur durabilité, leurs enchantements et autres attributs correspondent également.", "create.gui.filter.ignore_data": "Ignorer les données", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "Liste blanche (n'importe)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.", - "create.gui.attribute_filter.whitelist_conjunctive": "Liste blanche (tout)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Les objets ne passent que s'ils ont TOUS les attributs sélectionnés.", - "create.gui.attribute_filter.blacklist": "Liste noire", - "create.gui.attribute_filter.blacklist.description": "Les éléments réussissent s'ils n'ont AUCUN des attributs sélectionnés.", + "create.gui.attribute_filter.allow_list_disjunctive": "Liste blanche (n'importe)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.", + "create.gui.attribute_filter.allow_list_conjunctive": "Liste blanche (tout)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Les objets ne passent que s'ils ont TOUS les attributs sélectionnés.", + "create.gui.attribute_filter.deny_list": "Liste noire", + "create.gui.attribute_filter.deny_list.description": "Les éléments réussissent s'ils n'ont AUCUN des attributs sélectionnés.", "create.gui.attribute_filter.add_reference_item": "Ajouter un objet de référence", "create.tooltip.holdKey": "Enfoncez [%1$s]", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "BÂTON DE SYMÉTRIE", "item.create.wand_of_symmetry.tooltip.summary": "Reflète parfaitement le placement des blocs sur les plans configurés.", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "Un fouet cinétique pour appliquer toutes les recettes d'artisanat informes aux objets en dessous. Nécessite une _force_ _de_ _rotation_ constant et un _bassin_ placé en dessous (avec un espace entre les deux).", "block.create.mechanical_mixer.tooltip.condition1": "Lorsqu'au-dessus d'un bassin", "block.create.mechanical_mixer.tooltip.behaviour1": "Commence à mélanger les objets dans le bassin lorsque tous les ingrédients nécessaires sont présents.", - "block.create.mechanical_mixer.tooltip.condition2": "Lorsqu'utilisé avec une clé", - "block.create.mechanical_mixer.tooltip.behaviour2": "_Configure_ la quantité minimale du _total_ _d'ingredients_ pour les recettes appliquées. Utilisez cette option pour _exclure_ les _recettes_ _indésirables_ avec des ingrédients similaires mais moins.", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "ÉTABLI MÉCANIQUE", "block.create.mechanical_crafter.tooltip.summary": "Un assembleur cinétique pour _automatiser_ n'importe quelle recette _en_ _forme_. Placez-en _plusieurs_ _dans_ _une_ _grille_ correspondant à votre recette, et _arrangez_ _leurs_ _tapis_ _roulant_ pour créer un _flux_ qui sort de la grille sur l'un des établis.", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index f5730a023..ec8a23067 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 539", + "_": "Missing Localizations: 585", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "Schematica Non Implementata", "create.schematicannon.status.schematicExpired": "File Schematica Scaduto", - "create.gui.filter.blacklist": "Lista Nera", - "create.gui.filter.blacklist.description": "Gli oggetti passano se NON corrispondono a nessuno dei precedenti. Una Lista Nera vuota accetta tutto.", - "create.gui.filter.whitelist": "Lista Bianca", - "create.gui.filter.whitelist.description": "Gli oggetti passano se corrispondono a uno dei precedenti. Una Lista Bianca vuota rifiuta tutto.", + "create.gui.filter.deny_list": "Lista Nera", + "create.gui.filter.deny_list.description": "Gli oggetti passano se NON corrispondono a nessuno dei precedenti. Una Lista Nera vuota accetta tutto.", + "create.gui.filter.allow_list": "Lista Bianca", + "create.gui.filter.allow_list.description": "Gli oggetti passano se corrispondono a uno dei precedenti. Una Lista Bianca vuota rifiuta tutto.", "create.gui.filter.respect_data": "Rispetto dei Dati", "create.gui.filter.respect_data.description": "Gli oggetti corrispondono solo se la loro durata, incantesimi e altri attributi corrispondono.", "create.gui.filter.ignore_data": "Ignora Dati", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "Attributi selezionati:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "Lista Bianca (Qualsiasi)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.", - "create.gui.attribute_filter.whitelist_conjunctive": "Lista Bianca (Tutti)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Gli oggetti passano solo se hanno TUTTI gli attributi selezionati.", - "create.gui.attribute_filter.blacklist": "Lista Nera", - "create.gui.attribute_filter.blacklist.description": "Gli oggetti passano se NON hanno nessuno degli attributi selezionati.", + "create.gui.attribute_filter.allow_list_disjunctive": "Lista Bianca (Qualsiasi)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.", + "create.gui.attribute_filter.allow_list_conjunctive": "Lista Bianca (Tutti)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Gli oggetti passano solo se hanno TUTTI gli attributi selezionati.", + "create.gui.attribute_filter.deny_list": "Lista Nera", + "create.gui.attribute_filter.deny_list.description": "Gli oggetti passano se NON hanno nessuno degli attributi selezionati.", "create.gui.attribute_filter.add_reference_item": "Agg. Oggetto di Riferim.", "create.tooltip.holdKey": "Premi [%1$s]", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "ASTA DI SIMETRIA", "item.create.wand_of_symmetry.tooltip.summary": "Rispecchia perfettamente il posizionamento dei blocchi su piani configurati.", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "Una frusta cinetica per applicare qualsiasi ricetta di creazione informe agli oggetti sottostanti. Richiede una _Forza_ _di_ _Rotazione_ costante e una _Bacinella_ posizionata sotto (con uno spazio in mezzo).", "block.create.mechanical_mixer.tooltip.condition1": "Quando sopra a una Bacinella", "block.create.mechanical_mixer.tooltip.behaviour1": "Inizia a mescolare gli oggetti nella bacinella ogni volta che sono presenti tutti gli ingredienti necessari.", - "block.create.mechanical_mixer.tooltip.condition2": "Se utilizzato con la Chiave Inglese", - "block.create.mechanical_mixer.tooltip.behaviour2": "Configura la quantità minima di _ingredienti_ _totali_ per le ricette applicate. Utilizzare questa opzione per _escludere_ _ricette_ _indesiderate_ con ingredienti simili o meno.", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "COSTRUTTORE MECCANICO", "block.create.mechanical_crafter.tooltip.summary": "Un assemblatore cinetico per _automatizzare_ qualsiasi ricetta di _creazione_ _modellata_. Posiziona i _multipli_ _in_ _una_ _griglia_ corrispondente alla tua ricetta, e _disponi_ _i_ _loro_ _nastri_ per creare un _flusso_ che esce dalla griglia su uno degli costruttori.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 72ed9f0d7..9959ca968 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 538", + "_": "Missing Localizations: 584", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "配置されていない概略図です", "create.schematicannon.status.schematicExpired": "概略図ファイルが期限切れです", - "create.gui.filter.blacklist": "ブラックリスト", - "create.gui.filter.blacklist.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", - "create.gui.filter.whitelist": "ホワイトリスト", - "create.gui.filter.whitelist.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", + "create.gui.filter.deny_list": "ブラックリスト", + "create.gui.filter.deny_list.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", + "create.gui.filter.allow_list": "ホワイトリスト", + "create.gui.filter.allow_list.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", "create.gui.filter.respect_data": "データを重視", "create.gui.filter.respect_data.description": "アイテムは、耐久性、エンチャント、その他の属性も一致する場合にのみ一致します。", "create.gui.filter.ignore_data": "データを無視", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "選択された属性:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "ホワイトリスト(どれか)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", - "create.gui.attribute_filter.whitelist_conjunctive": "ホワイトリスト(全て)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", - "create.gui.attribute_filter.blacklist": "ブラックリスト", - "create.gui.attribute_filter.blacklist.description": "選択された属性を持たない場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.allow_list_disjunctive": "ホワイトリスト(どれか)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.allow_list_conjunctive": "ホワイトリスト(全て)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.deny_list": "ブラックリスト", + "create.gui.attribute_filter.deny_list.description": "選択された属性を持たない場合、アイテムは通り抜けます。", "create.gui.attribute_filter.add_reference_item": "参照アイテムを追加", "create.tooltip.holdKey": "[%1$s] を長押し", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "対称性が必要", "item.create.wand_of_symmetry.tooltip.summary": "構成されたプレーン全体のブロック配置を完全にミラーリングします。", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "その下のアイテムに形状のない製作レシピを適用するための動力ミキサー。 一定の_回転力_と下に配置された_鉢_が必要です(間にギャップがあります)。", "block.create.mechanical_mixer.tooltip.condition1": "鉢の上にあるとき", "block.create.mechanical_mixer.tooltip.behaviour1": "必要なすべての成分が存在するときはいつでも、鉢のアイテムの混合を開始します。", - "block.create.mechanical_mixer.tooltip.condition2": "レンチと併用したとき", - "block.create.mechanical_mixer.tooltip.behaviour2": "適用されるレシピの_総材料_の最小量を_構成_します。 このオプションを使用して、似ているが成分が少ない_不要なレシピを除外_します。", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "メカニカルクラフト", "block.create.mechanical_crafter.tooltip.summary": "_あらゆる形状の製作レシピ_を自動化するための動的アセンブラー。 _レシピに対応するグリッドに複数を配置_し、_フェアベルトを配置して_、いずれかのクラフターのグリッドから出る_流れ_を作成します。", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 1159a98f7..ab223925e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 539", + "_": "Missing Localizations: 585", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "청사진이 전개되지 않음", "create.schematicannon.status.schematicExpired": "청사진 파일이 제거됨", - "create.gui.filter.blacklist": "블랙리스트", - "create.gui.filter.blacklist.description": "위 목록에 맞지않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", - "create.gui.filter.whitelist": "화이트리스트", - "create.gui.filter.whitelist.description": "위 목록에 맞는 아이템이면 통과합니다. 빈 화이트리스트는 모두 통과시키지 않습니다.", + "create.gui.filter.deny_list": "블랙리스트", + "create.gui.filter.deny_list.description": "위 목록에 맞지않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", + "create.gui.filter.allow_list": "화이트리스트", + "create.gui.filter.allow_list.description": "위 목록에 맞는 아이템이면 통과합니다. 빈 화이트리스트는 모두 통과시키지 않습니다.", "create.gui.filter.respect_data": "상세정보 일치", "create.gui.filter.respect_data.description": "위 목록 아이템의 내구도, 마법부여, 그리고 다른 NBT와 일치할 때 통과시킵니다.", "create.gui.filter.ignore_data": "상세정보 무시", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "선택된 속성:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", - "create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", - "create.gui.attribute_filter.blacklist": "블랙리스트", - "create.gui.attribute_filter.blacklist.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_disjunctive": "화이트리스트 (최소)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_conjunctive": "화이트리스트 (모두)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", + "create.gui.attribute_filter.deny_list": "블랙리스트", + "create.gui.attribute_filter.deny_list.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", "create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기", "create.tooltip.holdKey": "[%1$s]를 눌러 설명보기", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "설정된 반사 모드에 따라 블럭 설치를 똑같이 재현합니다.", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "아래있는 아이템을 조합할 혼합기입니다. _지속적인_ _회전력_과 한 칸 아래에 _대야_가 필요합니다.", "block.create.mechanical_mixer.tooltip.condition1": "대야 위에 있을 때", "block.create.mechanical_mixer.tooltip.behaviour1": "모든 필요한 아이템이 준비될 때마다 대야 안의 아이템을 섞기 시작합니다.", - "block.create.mechanical_mixer.tooltip.condition2": "렌치를 사용할 때", - "block.create.mechanical_mixer.tooltip.behaviour2": "필요한 조합법의 _최소_ _재료_ _종류_를 설정합니다. 이는 적은 재료로 _원치_ _않은_ _조합법_이 작동되는 것을 막습니다.", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "모든 조합법을 _자동화_할 장치입니다. 조합법대로 여러개를 _격자_로 설치하고, 화살표를 돌려 _한_ _곳으로_ _모이게_ 설정해야합니다.", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 82fca5cd5..a119d14a3 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 867", + "_": "Missing Localizations: 913", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "Bouwtekening niet geplaatst", "create.schematicannon.status.schematicExpired": "Bouwtekening verlopen", - "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", - "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", - "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.deny_list": "UNLOCALIZED: Deny-List", + "create.gui.filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", + "create.gui.filter.allow_list": "UNLOCALIZED: Allow-List", + "create.gui.filter.allow_list.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_disjunctive": "UNLOCALIZED: Allow-List (Any)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_conjunctive": "UNLOCALIZED: Allow-List (All)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.deny_list": "UNLOCALIZED: Deny-List", + "create.gui.attribute_filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", "create.tooltip.holdKey": "Houd [%1$s] ingedrukt", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRIE STAF", "item.create.wand_of_symmetry.tooltip.summary": "Spiegelt uw blokplaatsing perfect over de geconfigureerde vlakken.", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "Een kinetische garde voor het toepassen van vormloze recepten op objecten eronder. Vereist constante _Rotatiekracht_ en een _Bekken_ hieronder geplaatst (met een tussenruimte).", "block.create.mechanical_mixer.tooltip.condition1": "Wanneer boven een Bekken", "block.create.mechanical_mixer.tooltip.behaviour1": "Begint objecten in het bekken te mengen wanneer alle benodigde ingrediënten aanwezig zijn.", - "block.create.mechanical_mixer.tooltip.condition2": "Wanneer gebruikt met een Sleutel", - "block.create.mechanical_mixer.tooltip.behaviour2": "_Configureert_ de minimale hoeveelheid _totale_ _ingredienten_ voor toegepaste recepten. Gebruik deze optie om _ongewenste_ _recepten_ met vergelijkbare maar minder ingrediënten _te_ _vermijden._", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", @@ -1261,7 +1313,7 @@ "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _portable_ _storage_ _interfaces_ to transfer items to or from the contraption. Direction of transfer is dependent on the blocks attached to the _Interface_. The contraption will briefly stall as items are exchanged.", "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 477382187..57e45ba6e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 935", + "_": "Missing Localizations: 979", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "Esquema não Colocado", "create.schematicannon.status.schematicExpired": "Arquivo de Esquema Expirado", - "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", - "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", - "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", + "create.gui.filter.deny_list": "UNLOCALIZED: Deny-List", + "create.gui.filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", + "create.gui.filter.allow_list": "UNLOCALIZED: Allow-List", + "create.gui.filter.allow_list.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_disjunctive": "UNLOCALIZED: Allow-List (Any)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_conjunctive": "UNLOCALIZED: Allow-List (All)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.deny_list": "UNLOCALIZED: Deny-List", + "create.gui.attribute_filter.deny_list.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", "create.tooltip.holdKey": "Segure [%1$s]", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "VARINHA DE SIMETRIA", "item.create.wand_of_symmetry.tooltip.summary": "Espelhar perfeitamente a colocação de blocos nos planos configurados.", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational_ _Force_ and a _Basin_ placed below (with a gap in between).", "block.create.mechanical_mixer.tooltip.condition1": "UNLOCALIZED: When above Basin", "block.create.mechanical_mixer.tooltip.behaviour1": "UNLOCALIZED: Starts to mix items in the basin whenever all necessary ingredients are present.", - "block.create.mechanical_mixer.tooltip.condition2": "UNLOCALIZED: When used with Wrench", - "block.create.mechanical_mixer.tooltip.behaviour2": "UNLOCALIZED: _Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", @@ -1261,7 +1313,7 @@ "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _portable_ _storage_ _interfaces_ to transfer items to or from the contraption. Direction of transfer is dependent on the blocks attached to the _Interface_. The contraption will briefly stall as items are exchanged.", "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index d31f1b1ef..369716c3f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,661 +1,661 @@ { - "_": "Missing Localizations: 929", + "_": "Missing Localizations: 254", "_": "->------------------------] Game Elements [------------------------<-", - "block.create.acacia_window": "UNLOCALIZED: Acacia Window", - "block.create.acacia_window_pane": "UNLOCALIZED: Acacia Window Pane", - "block.create.adjustable_crate": "Гибкий ящик", - "block.create.adjustable_pulley": "UNLOCALIZED: Adjustable Pulley", - "block.create.adjustable_pulse_repeater": "UNLOCALIZED: Adjustable Pulse Repeater", - "block.create.adjustable_repeater": "Настраиваемый повторитель", - "block.create.analog_lever": "UNLOCALIZED: Analog Lever", + "block.create.acacia_window": "Акациевое окно", + "block.create.acacia_window_pane": "Панель из акациевого окна", + "block.create.adjustable_crate": "Регулируемый ящик", + "block.create.adjustable_pulley": "Настраиваемый конвейерный привод", + "block.create.adjustable_pulse_repeater": "Регулируемый импульсный повторитель", + "block.create.adjustable_repeater": "Регулируемый повторитель", + "block.create.analog_lever": "Аналоговый рычаг", "block.create.andesite_belt_funnel": "UNLOCALIZED: Andesite Belt Funnel", - "block.create.andesite_bricks": "Андезитовые кирпичи", - "block.create.andesite_bricks_slab": "UNLOCALIZED: Andesite Bricks Slab", - "block.create.andesite_bricks_stairs": "UNLOCALIZED: Andesite Bricks Stairs", - "block.create.andesite_bricks_wall": "UNLOCALIZED: Andesite Bricks Wall", - "block.create.andesite_casing": "UNLOCALIZED: Andesite Casing", - "block.create.andesite_cobblestone": "UNLOCALIZED: Andesite Cobblestone", - "block.create.andesite_cobblestone_slab": "UNLOCALIZED: Andesite Cobblestone Slab", - "block.create.andesite_cobblestone_stairs": "UNLOCALIZED: Andesite Cobblestone Stairs", - "block.create.andesite_cobblestone_wall": "UNLOCALIZED: Andesite Cobblestone Wall", + "block.create.andesite_bricks": "Андезитовый кирпич", + "block.create.andesite_bricks_slab": "Плита из андезитового кирпича", + "block.create.andesite_bricks_stairs": "Ступени из андезитового кирпича", + "block.create.andesite_bricks_wall": "Стена из андезитового кирпича", + "block.create.andesite_casing": "Андезитовый корпус", + "block.create.andesite_cobblestone": "Андезит-булыжник", + "block.create.andesite_cobblestone_slab": "Андезит-булыжниковая плита", + "block.create.andesite_cobblestone_stairs": "Андезит-булыжниковые ступени", + "block.create.andesite_cobblestone_wall": "Андезит-булыжниковая стена", "block.create.andesite_funnel": "UNLOCALIZED: Andesite Funnel", - "block.create.andesite_pillar": "UNLOCALIZED: Andesite Pillar", + "block.create.andesite_pillar": "Андезитовая колонна", "block.create.andesite_tunnel": "UNLOCALIZED: Andesite Tunnel", - "block.create.basin": "UNLOCALIZED: Basin", - "block.create.belt": "Механическая лента", - "block.create.birch_window": "UNLOCALIZED: Birch Window", - "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.basin": "Чаша", + "block.create.belt": "Конвейер", + "block.create.birch_window": "Берёзовое окно", + "block.create.birch_window_pane": "Панель берёзового окна", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", - "block.create.brass_block": "UNLOCALIZED: Brass Block", - "block.create.brass_casing": "UNLOCALIZED: Brass Casing", + "block.create.brass_block": "Латунный блок", + "block.create.brass_casing": "Латунный корпус", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", - "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", - "block.create.chiseled_dark_scoria": "UNLOCALIZED: Chiseled Dark Scoria", - "block.create.chiseled_dolomite": "UNLOCALIZED: Chiseled Dolomite", - "block.create.chiseled_gabbro": "UNLOCALIZED: Chiseled Gabbro", - "block.create.chiseled_limestone": "UNLOCALIZED: Chiseled Limestone", - "block.create.chiseled_scoria": "UNLOCALIZED: Chiseled Scoria", - "block.create.chiseled_weathered_limestone": "UNLOCALIZED: Chiseled Weathered Limestone", + "block.create.cart_assembler": "Сборщик вагонеток", + "block.create.chiseled_dark_scoria": "Резной тёмный пепел", + "block.create.chiseled_dolomite": "Резной доломит", + "block.create.chiseled_gabbro": "Резной габбро", + "block.create.chiseled_limestone": "Резной известняк", + "block.create.chiseled_scoria": "Резной пепел", + "block.create.chiseled_weathered_limestone": "Выветренный резной известняк", "block.create.chute": "UNLOCALIZED: Chute", - "block.create.clockwork_bearing": "UNLOCALIZED: Clockwork Bearing", - "block.create.clutch": "Переключаемая муфта", + "block.create.clockwork_bearing": "Часовой механизм", + "block.create.clutch": "Сцепление", "block.create.cogwheel": "Шестерня", "block.create.content_observer": "UNLOCALIZED: Content Observer", - "block.create.copper_block": "UNLOCALIZED: Copper Block", - "block.create.copper_casing": "UNLOCALIZED: Copper Casing", - "block.create.copper_ore": "UNLOCALIZED: Copper Ore", - "block.create.copper_shingles": "UNLOCALIZED: Copper Shingles", + "block.create.copper_block": "Медный блок", + "block.create.copper_casing": "Медный корпус", + "block.create.copper_ore": "Медная руда", + "block.create.copper_shingles": "Медная черепица", "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", - "block.create.creative_crate": "Креативный ящик", - "block.create.creative_motor": "UNLOCALIZED: Creative Motor", - "block.create.crushing_wheel": "Дробильное колесо", - "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", - "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.creative_crate": "Творческий ящик", + "block.create.creative_motor": "Творческий мотор", + "block.create.crushing_wheel": "Колесо дробления", + "block.create.crushing_wheel_controller": "Контроллер колеса дробления", + "block.create.cuckoo_clock": "Часы с кукушкой", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", - "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", - "block.create.dark_oak_window_pane": "UNLOCALIZED: Dark Oak Window Pane", - "block.create.dark_scoria": "UNLOCALIZED: Dark Scoria", - "block.create.dark_scoria_bricks": "UNLOCALIZED: Dark Scoria Bricks", - "block.create.dark_scoria_bricks_slab": "UNLOCALIZED: Dark Scoria Bricks Slab", - "block.create.dark_scoria_bricks_stairs": "UNLOCALIZED: Dark Scoria Bricks Stairs", - "block.create.dark_scoria_bricks_wall": "UNLOCALIZED: Dark Scoria Bricks Wall", - "block.create.dark_scoria_cobblestone": "UNLOCALIZED: Dark Scoria Cobblestone", - "block.create.dark_scoria_cobblestone_slab": "UNLOCALIZED: Dark Scoria Cobblestone Slab", - "block.create.dark_scoria_cobblestone_stairs": "UNLOCALIZED: Dark Scoria Cobblestone Stairs", - "block.create.dark_scoria_cobblestone_wall": "UNLOCALIZED: Dark Scoria Cobblestone Wall", - "block.create.dark_scoria_pillar": "UNLOCALIZED: Dark Scoria Pillar", - "block.create.deployer": "UNLOCALIZED: Deployer", + "block.create.dark_oak_window": "Окно из тёмного дуба", + "block.create.dark_oak_window_pane": "Панель из окна из тёмного дуб", + "block.create.dark_scoria": "Тёмный пепел", + "block.create.dark_scoria_bricks": "Тёмные пепельный кирпич", + "block.create.dark_scoria_bricks_slab": "Плита из тёмного пепельного кирпича", + "block.create.dark_scoria_bricks_stairs": "Ступени из тёмного пепельного кирпича", + "block.create.dark_scoria_bricks_wall": "Стена из тёмного пепельного кирпича", + "block.create.dark_scoria_cobblestone": "Ступени из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone_slab": "Плита из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone_stairs": "Ступени из тёмного пепел-булыжника", + "block.create.dark_scoria_cobblestone_wall": "Стена из тёмного пепел-булыжника", + "block.create.dark_scoria_pillar": "Колонна из тёмного пепел-булыжника", + "block.create.deployer": "Автономный активатор", "block.create.depot": "UNLOCALIZED: Depot", - "block.create.diorite_bricks": "Диоритовые кирпичи", - "block.create.diorite_bricks_slab": "UNLOCALIZED: Diorite Bricks Slab", - "block.create.diorite_bricks_stairs": "UNLOCALIZED: Diorite Bricks Stairs", - "block.create.diorite_bricks_wall": "UNLOCALIZED: Diorite Bricks Wall", - "block.create.diorite_cobblestone": "UNLOCALIZED: Diorite Cobblestone", - "block.create.diorite_cobblestone_slab": "UNLOCALIZED: Diorite Cobblestone Slab", - "block.create.diorite_cobblestone_stairs": "UNLOCALIZED: Diorite Cobblestone Stairs", - "block.create.diorite_cobblestone_wall": "UNLOCALIZED: Diorite Cobblestone Wall", - "block.create.diorite_pillar": "UNLOCALIZED: Diorite Pillar", + "block.create.diorite_bricks": "Диоритовый кирпич", + "block.create.diorite_bricks_slab": "Плита из диоритового кирпича", + "block.create.diorite_bricks_stairs": "Ступени из диоритового кирпича", + "block.create.diorite_bricks_wall": "Стена из диоритового кирпича", + "block.create.diorite_cobblestone": "Диорит-булыжник", + "block.create.diorite_cobblestone_slab": "Плита из диорит-булыжника", + "block.create.diorite_cobblestone_stairs": "Ступени из диорит-булыжника", + "block.create.diorite_cobblestone_wall": "Стена из диорит-булыжника", + "block.create.diorite_pillar": "Диоритовая колонна", "block.create.dolomite": "Доломит", - "block.create.dolomite_bricks": "Доломитовые кирпичи", + "block.create.dolomite_bricks": "Доломитовый кирпич", "block.create.dolomite_bricks_slab": "Плита из доломитового кирпича", - "block.create.dolomite_bricks_stairs": "Ступеньки из доломитового кирпича", - "block.create.dolomite_bricks_wall": "Ограда из доломитового кирпича", - "block.create.dolomite_cobblestone": "UNLOCALIZED: Dolomite Cobblestone", - "block.create.dolomite_cobblestone_slab": "UNLOCALIZED: Dolomite Cobblestone Slab", - "block.create.dolomite_cobblestone_stairs": "UNLOCALIZED: Dolomite Cobblestone Stairs", - "block.create.dolomite_cobblestone_wall": "UNLOCALIZED: Dolomite Cobblestone Wall", + "block.create.dolomite_bricks_stairs": "Ступени из доломитового кирпича", + "block.create.dolomite_bricks_wall": "Стена из доломитового кирпича", + "block.create.dolomite_cobblestone": "Доломит-булыжник", + "block.create.dolomite_cobblestone_slab": "Плита доломит-булыжника", + "block.create.dolomite_cobblestone_stairs": "Ступени доломит-булыжника", + "block.create.dolomite_cobblestone_wall": "Стена доломит-булыжника", "block.create.dolomite_pillar": "Доломитовая колонна", - "block.create.encased_belt": "Ленточный привод", - "block.create.encased_fan": "Вентилятор", + "block.create.encased_belt": "Конвейерный привод", + "block.create.encased_fan": "Вентилятор в кожухе", "block.create.encased_fluid_pipe": "UNLOCALIZED: Encased Fluid Pipe", - "block.create.encased_shaft": "Вальный привод", - "block.create.fancy_andesite_bricks": "UNLOCALIZED: Fancy Andesite Bricks", - "block.create.fancy_andesite_bricks_slab": "UNLOCALIZED: Fancy Andesite Bricks Slab", - "block.create.fancy_andesite_bricks_stairs": "UNLOCALIZED: Fancy Andesite Bricks Stairs", - "block.create.fancy_andesite_bricks_wall": "UNLOCALIZED: Fancy Andesite Bricks Wall", - "block.create.fancy_dark_scoria_bricks": "UNLOCALIZED: Fancy Dark Scoria Bricks", - "block.create.fancy_dark_scoria_bricks_slab": "UNLOCALIZED: Fancy Dark Scoria Bricks Slab", - "block.create.fancy_dark_scoria_bricks_stairs": "UNLOCALIZED: Fancy Dark Scoria Bricks Stairs", - "block.create.fancy_dark_scoria_bricks_wall": "UNLOCALIZED: Fancy Dark Scoria Bricks Wall", - "block.create.fancy_diorite_bricks": "UNLOCALIZED: Fancy Diorite Bricks", - "block.create.fancy_diorite_bricks_slab": "UNLOCALIZED: Fancy Diorite Bricks Slab", - "block.create.fancy_diorite_bricks_stairs": "UNLOCALIZED: Fancy Diorite Bricks Stairs", - "block.create.fancy_diorite_bricks_wall": "UNLOCALIZED: Fancy Diorite Bricks Wall", - "block.create.fancy_dolomite_bricks": "UNLOCALIZED: Fancy Dolomite Bricks", - "block.create.fancy_dolomite_bricks_slab": "UNLOCALIZED: Fancy Dolomite Bricks Slab", - "block.create.fancy_dolomite_bricks_stairs": "UNLOCALIZED: Fancy Dolomite Bricks Stairs", - "block.create.fancy_dolomite_bricks_wall": "UNLOCALIZED: Fancy Dolomite Bricks Wall", - "block.create.fancy_gabbro_bricks": "UNLOCALIZED: Fancy Gabbro Bricks", - "block.create.fancy_gabbro_bricks_slab": "UNLOCALIZED: Fancy Gabbro Bricks Slab", - "block.create.fancy_gabbro_bricks_stairs": "UNLOCALIZED: Fancy Gabbro Bricks Stairs", - "block.create.fancy_gabbro_bricks_wall": "UNLOCALIZED: Fancy Gabbro Bricks Wall", - "block.create.fancy_granite_bricks": "UNLOCALIZED: Fancy Granite Bricks", - "block.create.fancy_granite_bricks_slab": "UNLOCALIZED: Fancy Granite Bricks Slab", - "block.create.fancy_granite_bricks_stairs": "UNLOCALIZED: Fancy Granite Bricks Stairs", - "block.create.fancy_granite_bricks_wall": "UNLOCALIZED: Fancy Granite Bricks Wall", - "block.create.fancy_limestone_bricks": "UNLOCALIZED: Fancy Limestone Bricks", - "block.create.fancy_limestone_bricks_slab": "UNLOCALIZED: Fancy Limestone Bricks Slab", - "block.create.fancy_limestone_bricks_stairs": "UNLOCALIZED: Fancy Limestone Bricks Stairs", - "block.create.fancy_limestone_bricks_wall": "UNLOCALIZED: Fancy Limestone Bricks Wall", - "block.create.fancy_scoria_bricks": "UNLOCALIZED: Fancy Scoria Bricks", - "block.create.fancy_scoria_bricks_slab": "UNLOCALIZED: Fancy Scoria Bricks Slab", - "block.create.fancy_scoria_bricks_stairs": "UNLOCALIZED: Fancy Scoria Bricks Stairs", - "block.create.fancy_scoria_bricks_wall": "UNLOCALIZED: Fancy Scoria Bricks Wall", - "block.create.fancy_weathered_limestone_bricks": "UNLOCALIZED: Fancy Weathered Limestone Bricks", - "block.create.fancy_weathered_limestone_bricks_slab": "UNLOCALIZED: Fancy Weathered Limestone Bricks Slab", - "block.create.fancy_weathered_limestone_bricks_stairs": "UNLOCALIZED: Fancy Weathered Limestone Bricks Stairs", - "block.create.fancy_weathered_limestone_bricks_wall": "UNLOCALIZED: Fancy Weathered Limestone Bricks Wall", + "block.create.encased_shaft": "Вал в кожухе", + "block.create.fancy_andesite_bricks": "Красивый андезитовый кирпич", + "block.create.fancy_andesite_bricks_slab": "Плита из красивого андезитового кирпича", + "block.create.fancy_andesite_bricks_stairs": "Ступени из красивого андезитового кирпича", + "block.create.fancy_andesite_bricks_wall": "Стена из красивого андезитового кирпича", + "block.create.fancy_dark_scoria_bricks": "Красивый тёмный пепельный кирпич", + "block.create.fancy_dark_scoria_bricks_slab": "Плита из красивого тёмного пепельного кирпича", + "block.create.fancy_dark_scoria_bricks_stairs": "Ступени из красивого тёмного пепельного кирпича", + "block.create.fancy_dark_scoria_bricks_wall": "Стена из красивого тёмного пепельного кирпича", + "block.create.fancy_diorite_bricks": "Красивый диоритовый кирпич", + "block.create.fancy_diorite_bricks_slab": "Плита из красивого диоритового кирпича", + "block.create.fancy_diorite_bricks_stairs": "Ступени из красивого диоритового кирпича", + "block.create.fancy_diorite_bricks_wall": "Стена из красивого диоритового кирпича", + "block.create.fancy_dolomite_bricks": "Красивый доломитовый кирпич", + "block.create.fancy_dolomite_bricks_slab": "Плита из красивого доломитового кирпича", + "block.create.fancy_dolomite_bricks_stairs": "Ступени из красивого доломитового кирпича", + "block.create.fancy_dolomite_bricks_wall": "Стена из красивого доломитового кирпича", + "block.create.fancy_gabbro_bricks": "Красивый габбро кирпич", + "block.create.fancy_gabbro_bricks_slab": "Плита из красивого габбро кирпича", + "block.create.fancy_gabbro_bricks_stairs": "Ступени из красивого габбро кирпича", + "block.create.fancy_gabbro_bricks_wall": "Стена из красивого габбро кирпича", + "block.create.fancy_granite_bricks": "Красивый гранитный кирпич", + "block.create.fancy_granite_bricks_slab": "Плита из красивого гранитного кирпича", + "block.create.fancy_granite_bricks_stairs": "Ступени из красивого гранитного кирпича", + "block.create.fancy_granite_bricks_wall": "Стена красивого гранитного кирпича", + "block.create.fancy_limestone_bricks": "Красивый известняковый кирпич", + "block.create.fancy_limestone_bricks_slab": "Плита из красивого известнякового кирпича", + "block.create.fancy_limestone_bricks_stairs": "Ступени из красивого известнякового кирпича", + "block.create.fancy_limestone_bricks_wall": "Стена из красивого известнякового кирпича", + "block.create.fancy_scoria_bricks": "Красивый пепельный кирпич", + "block.create.fancy_scoria_bricks_slab": "Плита из красивого пепельного кирпича", + "block.create.fancy_scoria_bricks_stairs": "Ступени из красивого пепельного кирпича", + "block.create.fancy_scoria_bricks_wall": "Стена из красивого пепельного кирпича", + "block.create.fancy_weathered_limestone_bricks": "Красивый выветренный известняковый кирпич", + "block.create.fancy_weathered_limestone_bricks_slab": "Плита из красивого выветренного известнякового кирпича", + "block.create.fancy_weathered_limestone_bricks_stairs": "Ступени из красивого выветренного известнякового кирпича", + "block.create.fancy_weathered_limestone_bricks_wall": "Стена из красивого выветренного известнякового кирпича", "block.create.fluid_pipe": "UNLOCALIZED: Fluid Pipe", "block.create.fluid_tank": "UNLOCALIZED: Fluid Tank", "block.create.fluid_valve": "UNLOCALIZED: Fluid Valve", - "block.create.flywheel": "UNLOCALIZED: Flywheel", - "block.create.framed_glass": "UNLOCALIZED: Framed Glass", - "block.create.framed_glass_pane": "UNLOCALIZED: Framed Glass Pane", - "block.create.furnace_engine": "UNLOCALIZED: Furnace Engine", + "block.create.flywheel": "Маховик", + "block.create.framed_glass": "Обрамлённое стекло", + "block.create.framed_glass_pane": "Обрамлённая стеклянная панель", + "block.create.furnace_engine": "Печной двигатель", "block.create.gabbro": "Габбро", - "block.create.gabbro_bricks": "Габбровые кирпичи", - "block.create.gabbro_bricks_slab": "UNLOCALIZED: Gabbro Bricks Slab", - "block.create.gabbro_bricks_stairs": "Ступеньки из габбрового кирпича", - "block.create.gabbro_bricks_wall": "Ограда из габбрового кирпича", - "block.create.gabbro_cobblestone": "UNLOCALIZED: Gabbro Cobblestone", - "block.create.gabbro_cobblestone_slab": "UNLOCALIZED: Gabbro Cobblestone Slab", - "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", - "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", - "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", - "block.create.gearbox": "Муфта", - "block.create.gearshift": "Реверсивная муфта", + "block.create.gabbro_bricks": "Габбровый кирпич", + "block.create.gabbro_bricks_slab": "Плита из габбро кирпича", + "block.create.gabbro_bricks_stairs": "Ступени из габбро кирпича", + "block.create.gabbro_bricks_wall": "Стена из габбро кирпича", + "block.create.gabbro_cobblestone": "Габбро-булыжник", + "block.create.gabbro_cobblestone_slab": "Плита из габбро-булыжника", + "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", + "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", + "block.create.gabbro_pillar": "Габбро колонна", + "block.create.gearbox": "Коробка передач", + "block.create.gearshift": "Реверсивный механизм", "block.create.glass_fluid_pipe": "UNLOCALIZED: Glass Fluid Pipe", - "block.create.granite_bricks": "Гранитные кирпичи", - "block.create.granite_bricks_slab": "UNLOCALIZED: Granite Bricks Slab", - "block.create.granite_bricks_stairs": "UNLOCALIZED: Granite Bricks Stairs", - "block.create.granite_bricks_wall": "UNLOCALIZED: Granite Bricks Wall", - "block.create.granite_cobblestone": "UNLOCALIZED: Granite Cobblestone", - "block.create.granite_cobblestone_slab": "UNLOCALIZED: Granite Cobblestone Slab", - "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", - "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", - "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.granite_bricks": "Гранитный кирпич", + "block.create.granite_bricks_slab": "Плита из гранитного кирпича", + "block.create.granite_bricks_stairs": "Ступени из гранитного кирпича", + "block.create.granite_bricks_wall": "Стена из гранитного кирпича", + "block.create.granite_cobblestone": "Гранит-булыжник", + "block.create.granite_cobblestone_slab": "Плита из гранит-булыжника", + "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", + "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", + "block.create.granite_pillar": "Гранитная колонна", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", - "block.create.hand_crank": "UNLOCALIZED: Hand Crank", - "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", - "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", - "block.create.jungle_window": "UNLOCALIZED: Jungle Window", - "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", + "block.create.hand_crank": "Рукоятка", + "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", + "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", + "block.create.jungle_window": "Окно из тропического дерева", + "block.create.jungle_window_pane": "Панель окна из тропического дерева", "block.create.large_cogwheel": "Большая шестерня", - "block.create.layered_andesite": "UNLOCALIZED: Layered Andesite", - "block.create.layered_dark_scoria": "UNLOCALIZED: Layered Dark Scoria", - "block.create.layered_diorite": "UNLOCALIZED: Layered Diorite", - "block.create.layered_dolomite": "UNLOCALIZED: Layered Dolomite", - "block.create.layered_gabbro": "UNLOCALIZED: Layered Gabbro", - "block.create.layered_granite": "UNLOCALIZED: Layered Granite", - "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", - "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", - "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.layered_andesite": "Слоистый андезит", + "block.create.layered_dark_scoria": "Слоистый тёмный пепел", + "block.create.layered_diorite": "Слоистый диорит", + "block.create.layered_dolomite": "Слоистый доломит", + "block.create.layered_gabbro": "Слоистый габбро", + "block.create.layered_granite": "Слоистый гранит", + "block.create.layered_limestone": "Слоистый известняк", + "block.create.layered_scoria": "Слоистый пепел", + "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", - "block.create.limesand": "Известь", + "block.create.limesand": "Известковый песок", "block.create.limestone": "Известняк", - "block.create.limestone_bricks": "Известковые кирпичи", - "block.create.limestone_bricks_slab": "Плита из известкового кирпича", - "block.create.limestone_bricks_stairs": "Ступеньки из известкового кирпича", - "block.create.limestone_bricks_wall": "Ограда из известкового кирпича", - "block.create.limestone_cobblestone": "UNLOCALIZED: Limestone Cobblestone", - "block.create.limestone_cobblestone_slab": "UNLOCALIZED: Limestone Cobblestone Slab", - "block.create.limestone_cobblestone_stairs": "UNLOCALIZED: Limestone Cobblestone Stairs", - "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", - "block.create.limestone_pillar": "Известняковая колонна", - "block.create.linear_chassis": "Поступательная рама", + "block.create.limestone_bricks": "Известняковый кирпич", + "block.create.limestone_bricks_slab": "Плита из известнякового кирпича", + "block.create.limestone_bricks_stairs": "Ступени из известнякового кирпича", + "block.create.limestone_bricks_wall": "Стена из известнякового кирпича", + "block.create.limestone_cobblestone": "Известняк-булыжник", + "block.create.limestone_cobblestone_slab": "Плита из известняк-булыжника", + "block.create.limestone_cobblestone_stairs": "Ступени из известняк-булыжника", + "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", + "block.create.limestone_pillar": "Известковая колонна", + "block.create.linear_chassis": "Линейное шасси", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", - "block.create.mechanical_bearing": "Механический подшипник", - "block.create.mechanical_crafter": "UNLOCALIZED: Mechanical Crafter", - "block.create.mechanical_drill": "Механический бур", - "block.create.mechanical_harvester": "Механический комбайнер", - "block.create.mechanical_mixer": "UNLOCALIZED: Mechanical Mixer", + "block.create.mechanical_bearing": "Механический вращатель", + "block.create.mechanical_crafter": "Механический крафтер", + "block.create.mechanical_drill": "Механическая дрель", + "block.create.mechanical_harvester": "Механический комбайн", + "block.create.mechanical_mixer": "Механический смешиватель", "block.create.mechanical_piston": "Механический поршень", - "block.create.mechanical_piston_head": "Ствол механического поршня", - "block.create.mechanical_plough": "UNLOCALIZED: Mechanical Plough", + "block.create.mechanical_piston_head": "Механическая головка поршня", + "block.create.mechanical_plough": "Механический плуг", "block.create.mechanical_press": "Механический пресс", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", - "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", - "block.create.millstone": "UNLOCALIZED: Millstone", - "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", - "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", - "block.create.mossy_dark_scoria": "UNLOCALIZED: Mossy Dark Scoria", - "block.create.mossy_diorite": "UNLOCALIZED: Mossy Diorite", - "block.create.mossy_dolomite": "UNLOCALIZED: Mossy Dolomite", - "block.create.mossy_gabbro": "UNLOCALIZED: Mossy Gabbro", - "block.create.mossy_granite": "UNLOCALIZED: Mossy Granite", - "block.create.mossy_limestone": "UNLOCALIZED: Mossy Limestone", - "block.create.mossy_scoria": "UNLOCALIZED: Mossy Scoria", - "block.create.mossy_weathered_limestone": "UNLOCALIZED: Mossy Weathered Limestone", - "block.create.mysterious_cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", - "block.create.natural_scoria": "UNLOCALIZED: Natural Scoria", - "block.create.nixie_tube": "UNLOCALIZED: Nixie Tube", - "block.create.nozzle": "UNLOCALIZED: Nozzle", - "block.create.oak_window": "UNLOCALIZED: Oak Window", - "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.mechanical_saw": "Механическая пила", + "block.create.millstone": "Жернов", + "block.create.minecart_anchor": "Вагонеточный якорь", + "block.create.mossy_andesite": "Замшелый андезит", + "block.create.mossy_dark_scoria": "Замшелый тёмный пепел", + "block.create.mossy_diorite": "Замшелый диорит", + "block.create.mossy_dolomite": "Замшелый доломит", + "block.create.mossy_gabbro": "Замшелый габбро", + "block.create.mossy_granite": "Замшелый гранит", + "block.create.mossy_limestone": "Замшелый известняк", + "block.create.mossy_scoria": "Замшелый пепел", + "block.create.mossy_weathered_limestone": "Замшелый выветренный известняк", + "block.create.mysterious_cuckoo_clock": "Часы с кукушкой", + "block.create.natural_scoria": "Натуральный пепел", + "block.create.nixie_tube": "Газоразрядный индикатор", + "block.create.nozzle": "Форсунка", + "block.create.oak_window": "Дубовое окно", + "block.create.oak_window_pane": "Панель из дубового окна", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", - "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", - "block.create.ornate_iron_window_pane": "UNLOCALIZED: Ornate Iron Window Pane", - "block.create.overgrown_andesite": "UNLOCALIZED: Overgrown Andesite", - "block.create.overgrown_dark_scoria": "UNLOCALIZED: Overgrown Dark Scoria", - "block.create.overgrown_diorite": "UNLOCALIZED: Overgrown Diorite", - "block.create.overgrown_dolomite": "UNLOCALIZED: Overgrown Dolomite", - "block.create.overgrown_gabbro": "UNLOCALIZED: Overgrown Gabbro", - "block.create.overgrown_granite": "UNLOCALIZED: Overgrown Granite", - "block.create.overgrown_limestone": "UNLOCALIZED: Overgrown Limestone", - "block.create.overgrown_scoria": "UNLOCALIZED: Overgrown Scoria", - "block.create.overgrown_weathered_limestone": "UNLOCALIZED: Overgrown Weathered Limestone", - "block.create.paved_andesite": "UNLOCALIZED: Paved Andesite", - "block.create.paved_andesite_slab": "UNLOCALIZED: Paved Andesite Slab", - "block.create.paved_andesite_stairs": "UNLOCALIZED: Paved Andesite Stairs", - "block.create.paved_andesite_wall": "UNLOCALIZED: Paved Andesite Wall", - "block.create.paved_dark_scoria": "UNLOCALIZED: Paved Dark Scoria", - "block.create.paved_dark_scoria_slab": "UNLOCALIZED: Paved Dark Scoria Slab", - "block.create.paved_dark_scoria_stairs": "UNLOCALIZED: Paved Dark Scoria Stairs", - "block.create.paved_dark_scoria_wall": "UNLOCALIZED: Paved Dark Scoria Wall", - "block.create.paved_diorite": "UNLOCALIZED: Paved Diorite", - "block.create.paved_diorite_slab": "UNLOCALIZED: Paved Diorite Slab", - "block.create.paved_diorite_stairs": "UNLOCALIZED: Paved Diorite Stairs", - "block.create.paved_diorite_wall": "UNLOCALIZED: Paved Diorite Wall", - "block.create.paved_dolomite": "UNLOCALIZED: Paved Dolomite", - "block.create.paved_dolomite_slab": "UNLOCALIZED: Paved Dolomite Slab", - "block.create.paved_dolomite_stairs": "UNLOCALIZED: Paved Dolomite Stairs", - "block.create.paved_dolomite_wall": "UNLOCALIZED: Paved Dolomite Wall", - "block.create.paved_gabbro": "UNLOCALIZED: Paved Gabbro", - "block.create.paved_gabbro_slab": "UNLOCALIZED: Paved Gabbro Slab", - "block.create.paved_gabbro_stairs": "UNLOCALIZED: Paved Gabbro Stairs", - "block.create.paved_gabbro_wall": "UNLOCALIZED: Paved Gabbro Wall", - "block.create.paved_granite": "UNLOCALIZED: Paved Granite", - "block.create.paved_granite_slab": "UNLOCALIZED: Paved Granite Slab", - "block.create.paved_granite_stairs": "UNLOCALIZED: Paved Granite Stairs", - "block.create.paved_granite_wall": "UNLOCALIZED: Paved Granite Wall", - "block.create.paved_limestone": "UNLOCALIZED: Paved Limestone", - "block.create.paved_limestone_slab": "UNLOCALIZED: Paved Limestone Slab", - "block.create.paved_limestone_stairs": "UNLOCALIZED: Paved Limestone Stairs", - "block.create.paved_limestone_wall": "UNLOCALIZED: Paved Limestone Wall", - "block.create.paved_scoria": "UNLOCALIZED: Paved Scoria", - "block.create.paved_scoria_slab": "UNLOCALIZED: Paved Scoria Slab", - "block.create.paved_scoria_stairs": "UNLOCALIZED: Paved Scoria Stairs", - "block.create.paved_scoria_wall": "UNLOCALIZED: Paved Scoria Wall", - "block.create.paved_weathered_limestone": "UNLOCALIZED: Paved Weathered Limestone", - "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", - "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", - "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.ornate_iron_window": "Украшенное железное окно", + "block.create.ornate_iron_window_pane": "Панель из украшенного железного окна", + "block.create.overgrown_andesite": "Заросший андезит", + "block.create.overgrown_dark_scoria": "Заросший тёмный пепел", + "block.create.overgrown_diorite": "Заросший диорит", + "block.create.overgrown_dolomite": "Заросший доломит", + "block.create.overgrown_gabbro": "Заросший габбро", + "block.create.overgrown_granite": "Заросший гранит", + "block.create.overgrown_limestone": "Заросший известняк", + "block.create.overgrown_scoria": "Заросший пепел", + "block.create.overgrown_weathered_limestone": "Заросший выветренный известняк", + "block.create.paved_andesite": "Мощёный андезит", + "block.create.paved_andesite_slab": "Плита из мощёного андезита", + "block.create.paved_andesite_stairs": "Ступени из мощёного андезита", + "block.create.paved_andesite_wall": "Стена из мощёного андезита", + "block.create.paved_dark_scoria": "Мощёный тёмный пепел", + "block.create.paved_dark_scoria_slab": "Плита из мощёного пепла", + "block.create.paved_dark_scoria_stairs": "Ступени из мощёного пепла", + "block.create.paved_dark_scoria_wall": "Стена из мощёного тёмного пепла", + "block.create.paved_diorite": "Мощёный диорит", + "block.create.paved_diorite_slab": "Плита из мощёного диорита", + "block.create.paved_diorite_stairs": "Ступени из мощёного диорита", + "block.create.paved_diorite_wall": "Стена из мощёного диорита", + "block.create.paved_dolomite": "Мощёный доломит", + "block.create.paved_dolomite_slab": "Плита из мощёного доломита", + "block.create.paved_dolomite_stairs": "Ступени из мощёного доломита", + "block.create.paved_dolomite_wall": "Стена из мощёного доломита", + "block.create.paved_gabbro": "Мощёный габбро", + "block.create.paved_gabbro_slab": "Плита из мощёного габбро", + "block.create.paved_gabbro_stairs": "Ступени из мощёного габбро", + "block.create.paved_gabbro_wall": "Стена из мощёного габбро", + "block.create.paved_granite": "Мощёный гранит", + "block.create.paved_granite_slab": "Плита из мощёного гранита", + "block.create.paved_granite_stairs": "Ступени из мощёного гранита", + "block.create.paved_granite_wall": "Стена из мощёного гранита", + "block.create.paved_limestone": "Мощёный известняк", + "block.create.paved_limestone_slab": "Плита из мощёного известняка", + "block.create.paved_limestone_stairs": "Ступени из мощёного известняка", + "block.create.paved_limestone_wall": "Стена из мощёного известняка", + "block.create.paved_scoria": "Мощёный пепел", + "block.create.paved_scoria_slab": "Плита из мощёного пепла", + "block.create.paved_scoria_stairs": "Ступени из мощёного пепла", + "block.create.paved_scoria_wall": "Стена из мощёного пепла", + "block.create.paved_weathered_limestone": "Мощёный выветренный известняк", + "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", + "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", + "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Удлинитель поршня", - "block.create.polished_dark_scoria": "UNLOCALIZED: Polished Dark Scoria", - "block.create.polished_dark_scoria_slab": "UNLOCALIZED: Polished Dark Scoria Slab", - "block.create.polished_dark_scoria_stairs": "UNLOCALIZED: Polished Dark Scoria Stairs", - "block.create.polished_dark_scoria_wall": "UNLOCALIZED: Polished Dark Scoria Wall", + "block.create.polished_dark_scoria": "Полированный тёмный пепел", + "block.create.polished_dark_scoria_slab": "Плита из полированного тёмного пепла", + "block.create.polished_dark_scoria_stairs": "Ступени из полированного тёмного пепла", + "block.create.polished_dark_scoria_wall": "Стена из полированного тёмного пепла", "block.create.polished_dolomite": "Полированный доломит", - "block.create.polished_dolomite_slab": "UNLOCALIZED: Polished Dolomite Slab", - "block.create.polished_dolomite_stairs": "UNLOCALIZED: Polished Dolomite Stairs", - "block.create.polished_dolomite_wall": "UNLOCALIZED: Polished Dolomite Wall", - "block.create.polished_gabbro": "Полированный габбро", - "block.create.polished_gabbro_slab": "UNLOCALIZED: Polished Gabbro Slab", - "block.create.polished_gabbro_stairs": "UNLOCALIZED: Polished Gabbro Stairs", - "block.create.polished_gabbro_wall": "UNLOCALIZED: Polished Gabbro Wall", + "block.create.polished_dolomite_slab": "Плита из полированного доломита", + "block.create.polished_dolomite_stairs": "Ступени из полированного доломита", + "block.create.polished_dolomite_wall": "Стена из полированного доломита", + "block.create.polished_gabbro": "Полированный габро", + "block.create.polished_gabbro_slab": "Плита из полированного габро", + "block.create.polished_gabbro_stairs": "Ступени из полированного габро", + "block.create.polished_gabbro_wall": "Стена из полированного габро", "block.create.polished_limestone": "Полированный известняк", "block.create.polished_limestone_slab": "Плита из полированного известняка", - "block.create.polished_limestone_stairs": "UNLOCALIZED: Polished Limestone Stairs", - "block.create.polished_limestone_wall": "UNLOCALIZED: Polished Limestone Wall", - "block.create.polished_scoria": "UNLOCALIZED: Polished Scoria", - "block.create.polished_scoria_slab": "UNLOCALIZED: Polished Scoria Slab", - "block.create.polished_scoria_stairs": "UNLOCALIZED: Polished Scoria Stairs", - "block.create.polished_scoria_wall": "UNLOCALIZED: Polished Scoria Wall", - "block.create.polished_weathered_limestone": "Полированный обветренный известняк", - "block.create.polished_weathered_limestone_slab": "Плита из полированного обветренного известняка", - "block.create.polished_weathered_limestone_stairs": "UNLOCALIZED: Polished Weathered Limestone Stairs", - "block.create.polished_weathered_limestone_wall": "UNLOCALIZED: Polished Weathered Limestone Wall", - "block.create.portable_storage_interface": "UNLOCALIZED: Portable Storage Interface", - "block.create.powered_latch": "UNLOCALIZED: Powered Latch", - "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", - "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", - "block.create.pulse_repeater": "Повторитель импульса", + "block.create.polished_limestone_stairs": "Ступени из полированного известняка", + "block.create.polished_limestone_wall": "Стена из полированного известняка", + "block.create.polished_scoria": "Полированный пепел", + "block.create.polished_scoria_slab": "Плита из полированного пепла", + "block.create.polished_scoria_stairs": "Ступени из полированного пепла", + "block.create.polished_scoria_wall": "Стена из полированного пепла", + "block.create.polished_weathered_limestone": "Полированный выветренный известняк", + "block.create.polished_weathered_limestone_slab": "Плита из полированного выветренного известняка", + "block.create.polished_weathered_limestone_stairs": "Ступени из полированного выветренного известняка", + "block.create.polished_weathered_limestone_wall": "Стена из полированного выветренного известняка", + "block.create.portable_storage_interface": "Портативный интерфейс хранения", + "block.create.powered_latch": "Механизированная защёлка", + "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", + "block.create.pulley_magnet": "Шкивный магнит", + "block.create.pulse_repeater": "Импульсный повторитель", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", - "block.create.radial_chassis": "Поворотная рама", + "block.create.radial_chassis": "Радиальное шасси", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", - "block.create.redstone_contact": "Контактное соединение", - "block.create.redstone_link": "Сигнальное соединение", + "block.create.redstone_contact": "Контакт сигнала красного камня", + "block.create.redstone_link": "Беспроводной передатчик сигнала красного камня", "block.create.refined_radiance_casing": "UNLOCALIZED: Radiant Casing", - "block.create.reinforced_rail": "UNLOCALIZED: Reinforced Rail", - "block.create.rope": "UNLOCALIZED: Rope", - "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", - "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", - "block.create.schematic_table": "Стол для схем", - "block.create.schematicannon": "Схемопушка", - "block.create.scoria": "UNLOCALIZED: Scoria", - "block.create.scoria_bricks": "UNLOCALIZED: Scoria Bricks", - "block.create.scoria_bricks_slab": "UNLOCALIZED: Scoria Bricks Slab", - "block.create.scoria_bricks_stairs": "UNLOCALIZED: Scoria Bricks Stairs", - "block.create.scoria_bricks_wall": "UNLOCALIZED: Scoria Bricks Wall", - "block.create.scoria_cobblestone": "UNLOCALIZED: Scoria Cobblestone", - "block.create.scoria_cobblestone_slab": "UNLOCALIZED: Scoria Cobblestone Slab", - "block.create.scoria_cobblestone_stairs": "UNLOCALIZED: Scoria Cobblestone Stairs", - "block.create.scoria_cobblestone_wall": "UNLOCALIZED: Scoria Cobblestone Wall", - "block.create.scoria_pillar": "UNLOCALIZED: Scoria Pillar", - "block.create.secondary_linear_chassis": "UNLOCALIZED: Secondary Linear Chassis", - "block.create.sequenced_gearshift": "UNLOCALIZED: Sequenced Gearshift", + "block.create.reinforced_rail": "Усиленные рельсы", + "block.create.rope": "Канат", + "block.create.rope_pulley": "Лебёдка", + "block.create.rotation_speed_controller": "Регулятор скорости вращения", + "block.create.schematic_table": "Схематичный стол", + "block.create.schematicannon": "Схематичная пушка", + "block.create.scoria": "Пепел", + "block.create.scoria_bricks": "Пепельный кирпич", + "block.create.scoria_bricks_slab": "Плита из пепельного кирпича", + "block.create.scoria_bricks_stairs": "Ступени из пепельного кирпича", + "block.create.scoria_bricks_wall": "Стена из пепельного кирпича", + "block.create.scoria_cobblestone": "Пепел-булыжник", + "block.create.scoria_cobblestone_slab": "Плита из пепел-булыжника", + "block.create.scoria_cobblestone_stairs": "Ступени из пепел-булыжника", + "block.create.scoria_cobblestone_wall": "Стена из пепел-булыжника", + "block.create.scoria_pillar": "Колонна из пепла", + "block.create.secondary_linear_chassis": "Вторичное линейное шасси", + "block.create.sequenced_gearshift": "Последовательный переключатель передач", "block.create.shadow_steel_casing": "UNLOCALIZED: Shadow Casing", "block.create.shaft": "Вал", "block.create.smart_fluid_pipe": "UNLOCALIZED: Smart Fluid Pipe", - "block.create.speedometer": "UNLOCALIZED: Speedometer", + "block.create.speedometer": "Спидометр", "block.create.spout": "UNLOCALIZED: Spout", - "block.create.spruce_window": "UNLOCALIZED: Spruce Window", - "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.spruce_window": "Еловое окно", + "block.create.spruce_window_pane": "Панель из елового окна", "block.create.sticky_mechanical_piston": "Липкий механический поршень", - "block.create.stockpile_switch": "Коммутатор хранилища", - "block.create.stressometer": "UNLOCALIZED: Stressometer", + "block.create.stockpile_switch": "Настраиваемый компаратор", + "block.create.stressometer": "Динамометр", "block.create.tiled_glass": "Плиточное стекло", "block.create.tiled_glass_pane": "Плиточная стеклянная панель", "block.create.turntable": "Поворотный стол", - "block.create.vertical_framed_glass": "UNLOCALIZED: Vertical Framed Glass", - "block.create.vertical_framed_glass_pane": "UNLOCALIZED: Vertical Framed Glass Pane", + "block.create.vertical_framed_glass": "Вертикальное обрамлённое стекло", + "block.create.vertical_framed_glass_pane": "Вертикальная обрамлённая стеклянная панель", "block.create.water_wheel": "Водяное колесо", - "block.create.weathered_limestone": "Обветренный известняк", - "block.create.weathered_limestone_bricks": "Кирпичи из обветренного известняка", - "block.create.weathered_limestone_bricks_slab": "Плита из кирпича из обветренного известняка", - "block.create.weathered_limestone_bricks_stairs": "Ступеньки из кирпича из обветренного известняка", - "block.create.weathered_limestone_bricks_wall": "Ограда из кирпича из обветренного известняка", - "block.create.weathered_limestone_cobblestone": "UNLOCALIZED: Weathered Limestone Cobblestone", - "block.create.weathered_limestone_cobblestone_slab": "UNLOCALIZED: Weathered Limestone Cobblestone Slab", - "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", - "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", - "block.create.weathered_limestone_pillar": "Колонна из обветренного известняка", + "block.create.weathered_limestone": "Выветренный известняк", + "block.create.weathered_limestone_bricks": "Выветренный известняковый кирпич", + "block.create.weathered_limestone_bricks_slab": "Плита из выветренного известнякового кирпича", + "block.create.weathered_limestone_bricks_stairs": "Ступени из выветренного известнякового кирпича", + "block.create.weathered_limestone_bricks_wall": "Стена из выветренного известнякового кирпича", + "block.create.weathered_limestone_cobblestone": "Выветренный известняк-булыжник", + "block.create.weathered_limestone_cobblestone_slab": "Плита из известняк-булыжника", + "block.create.weathered_limestone_cobblestone_stairs": "Ступени из известняк-булыжника", + "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", + "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", - "block.create.zinc_block": "UNLOCALIZED: Zinc Block", - "block.create.zinc_ore": "UNLOCALIZED: Zinc Ore", + "block.create.zinc_block": "Цинковый блок", + "block.create.zinc_ore": "Цинковая руда", - "entity.create.contraption": "UNLOCALIZED: Contraption", + "entity.create.contraption": "Штуковина", "entity.create.seat": "UNLOCALIZED: Seat", - "entity.create.stationary_contraption": "UNLOCALIZED: Stationary Contraption", - "entity.create.super_glue": "UNLOCALIZED: Super Glue", + "entity.create.stationary_contraption": "Стационарная штуковина", + "entity.create.super_glue": "Супер клей", "fluid.create.flowing_potion": "UNLOCALIZED: Potion", - "item.create.andesite_alloy": "UNLOCALIZED: Andesite Alloy", - "item.create.attribute_filter": "UNLOCALIZED: Attribute Filter", - "item.create.belt_connector": "Механическая лента", + "item.create.andesite_alloy": "Андезитовый сплав", + "item.create.attribute_filter": "Фильтр атрибутов", + "item.create.belt_connector": "Механический ремень", "item.create.blaze_cake": "UNLOCALIZED: Blaze Cake", - "item.create.brass_hand": "UNLOCALIZED: Brass Hand", - "item.create.brass_ingot": "UNLOCALIZED: Brass Ingot", - "item.create.brass_nugget": "UNLOCALIZED: Brass Nugget", - "item.create.brass_sheet": "UNLOCALIZED: Brass Sheet", - "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", + "item.create.brass_hand": "Латунная рука", + "item.create.brass_ingot": "Латунный слиток", + "item.create.brass_nugget": "Кусочек латуни", + "item.create.brass_sheet": "Латунный лист", + "item.create.chromatic_compound": "Хроматический компаунд", "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", - "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", - "item.create.copper_nugget": "UNLOCALIZED: Copper Nugget", - "item.create.copper_sheet": "UNLOCALIZED: Copper Sheet", - "item.create.crafter_slot_cover": "UNLOCALIZED: Crafter Slot Cover", - "item.create.crushed_brass": "UNLOCALIZED: Crushed Brass", - "item.create.crushed_copper_ore": "UNLOCALIZED: Crushed Copper Ore", - "item.create.crushed_gold_ore": "UNLOCALIZED: Crushed Gold Ore", - "item.create.crushed_iron_ore": "UNLOCALIZED: Crushed Iron Ore", - "item.create.crushed_zinc_ore": "UNLOCALIZED: Crushed Zinc Ore", - "item.create.deforester": "UNLOCALIZED: Deforester", + "item.create.copper_ingot": "Медный слиток", + "item.create.copper_nugget": "Кусочек меди", + "item.create.copper_sheet": "Медный лист", + "item.create.crafter_slot_cover": "Крышка на слот крафтера", + "item.create.crushed_brass": "Дробленая латунь", + "item.create.crushed_copper_ore": "Измельчённая медная руда", + "item.create.crushed_gold_ore": "Измельчённая золотая руда", + "item.create.crushed_iron_ore": "Измельчённая железная руда", + "item.create.crushed_zinc_ore": "Измельчённая цинковая руда", + "item.create.deforester": "Уничтожитель леса", "item.create.dough": "Тесто", - "item.create.electron_tube": "UNLOCALIZED: Electron Tube", + "item.create.electron_tube": "Электронная лампа", "item.create.empty_blaze_burner": "UNLOCALIZED: Empty Blaze Burner", - "item.create.empty_schematic": "Пустая схема", - "item.create.extendo_grip": "UNLOCALIZED: Extendo Grip", + "item.create.empty_schematic": "Пустая схематика", + "item.create.extendo_grip": "Удлинённая рука", "item.create.filter": "Фильтр", - "item.create.furnace_minecart_contraption": "UNLOCALIZED: Furnace Minecart Contraption", - "item.create.goggles": "UNLOCALIZED: Engineer's Goggles", - "item.create.golden_sheet": "UNLOCALIZED: Golden Sheet", - "item.create.handheld_blockzapper": "Портативный размещатель блоков", - "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", - "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", - "item.create.iron_sheet": "Железная пластина", - "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", - "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", + "item.create.furnace_minecart_contraption": "Печно-вагонеточная штуковина", + "item.create.goggles": "Инженерные очки", + "item.create.golden_sheet": "Золотой лист", + "item.create.handheld_blockzapper": "Ручная блоковая пушка", + "item.create.handheld_worldshaper": "Ручной редактор мира", + "item.create.integrated_circuit": "Интегральная схема", + "item.create.iron_sheet": "Железный лист", + "item.create.lapis_sheet": "Лазуритовый лист", + "item.create.minecart_contraption": "Вагонетка штуковина", "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", - "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", - "item.create.powdered_obsidian": "UNLOCALIZED: Powdered Obsidian", + "item.create.polished_rose_quartz": "Полированный розовый кварц", + "item.create.powdered_obsidian": "Порошкообразный обсидиан", "item.create.propeller": "Пропеллер", - "item.create.red_sand_paper": "UNLOCALIZED: Red Sand Paper", - "item.create.refined_radiance": "UNLOCALIZED: Refined Radiance", - "item.create.rose_quartz": "Розовый Кварц", - "item.create.sand_paper": "UNLOCALIZED: Sand Paper", - "item.create.schematic": "Схема", - "item.create.schematic_and_quill": "Схема и перо", - "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", - "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.red_sand_paper": "Красная наждачная бумага", + "item.create.refined_radiance": "Изысканное сияние", + "item.create.rose_quartz": "Розовый кварц", + "item.create.sand_paper": "Наждачная бумага", + "item.create.schematic": "Схематика", + "item.create.schematic_and_quill": "Схематика и перо", + "item.create.shadow_steel": "Призрачная сталь", + "item.create.super_glue": "Супер клей", "item.create.tree_fertilizer": "Удобрение для деревьев", - "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", - "item.create.wand_of_symmetry": "Посох симметрии", - "item.create.wheat_flour": "UNLOCALIZED: Wheat Flour", - "item.create.whisk": "UNLOCALIZED: Whisk", - "item.create.wrench": "UNLOCALIZED: Wrench", - "item.create.zinc_ingot": "UNLOCALIZED: Zinc Ingot", - "item.create.zinc_nugget": "UNLOCALIZED: Zinc Nugget", + "item.create.vertical_gearbox": "Вертикальная коробка передач", + "item.create.wand_of_symmetry": "Жезл симметрии", + "item.create.wheat_flour": "Пшеничная мука", + "item.create.whisk": "Венчик", + "item.create.wrench": "Гаечный ключ", + "item.create.zinc_ingot": "Цинковый слиток", + "item.create.zinc_nugget": "Кусочек цинка", "_": "->------------------------] Advancements [------------------------<-", - "advancement.create.root": "UNLOCALIZED: Welcome to Create", - "advancement.create.root.desc": "UNLOCALIZED: It's time to start building some amazing Contraptions!", - "advancement.create.andesite_alloy": "UNLOCALIZED: Alliterations Aplenty", - "advancement.create.andesite_alloy.desc": "UNLOCALIZED: Create's materials have weird names, Andesite Alloy is one of them.", - "advancement.create.its_alive": "UNLOCALIZED: It's Alive!", - "advancement.create.its_alive.desc": "UNLOCALIZED: Watch your first kinetic component spin.", - "advancement.create.shifting_gears": "UNLOCALIZED: Shifting Gears", - "advancement.create.shifting_gears.desc": "UNLOCALIZED: Connect a Large Cogwheel to a Small Cogwheel, allowing you to change the speed of your contraption.", - "advancement.create.overstressed": "UNLOCALIZED: Overstressed", - "advancement.create.overstressed.desc": "UNLOCALIZED: Experience the limits of stress firsthand.", - "advancement.create.belt": "UNLOCALIZED: Convey It All", - "advancement.create.belt.desc": "UNLOCALIZED: Connect two shafts with a Mechanical Belt.", - "advancement.create.wrench": "UNLOCALIZED: Configure Conveniently", - "advancement.create.wrench.desc": "UNLOCALIZED: Create a Wrench to aid you in building your contraptions.", - "advancement.create.goggles": "UNLOCALIZED: Stress-O-Vision", - "advancement.create.goggles.desc": "UNLOCALIZED: Create some Engineer's Goggles to aid you in getting more kinetic information from components.", - "advancement.create.speedometer": "UNLOCALIZED: But How Fast Exactly?", - "advancement.create.speedometer.desc": "UNLOCALIZED: Place and power a Speedometer. Look at it through your goggles to read its exact value.", - "advancement.create.stressometer": "UNLOCALIZED: But How Stressed Exactly?", - "advancement.create.stressometer.desc": "UNLOCALIZED: Place and power a Stressometer. Look at it through your goggles to read its exact value.", - "advancement.create.water_wheel": "UNLOCALIZED: Harnessing Hydraulics", - "advancement.create.water_wheel.desc": "UNLOCALIZED: Place a Water Wheel and try getting it to spin!", - "advancement.create.lava_wheel": "UNLOCALIZED: Magma Wheel", - "advancement.create.lava_wheel.desc": "UNLOCALIZED: This shouldn't have worked.", - "advancement.create.millstone": "UNLOCALIZED: Pocket Crusher", - "advancement.create.millstone.desc": "UNLOCALIZED: Place and power a Millstone.", - "advancement.create.andesite_casing": "UNLOCALIZED: The Andesite Age", - "advancement.create.andesite_casing.desc": "UNLOCALIZED: Use some Andesite Alloy and Wood to create a basic Casing.", - "advancement.create.mechanical_drill": "UNLOCALIZED: Stationary Breakers", - "advancement.create.mechanical_drill.desc": "UNLOCALIZED: Place and power a Mechanical Drill.", - "advancement.create.press": "UNLOCALIZED: Press Goes 'Bonk!'", - "advancement.create.press.desc": "UNLOCALIZED: Power a Mechanical Press and use it to create some Sheets.", - "advancement.create.polished_rose_quartz": "UNLOCALIZED: Pink Diamonds", - "advancement.create.polished_rose_quartz.desc": "UNLOCALIZED: Use a piece of Sand Paper to polish Rose Quartz until it becomes transparent.", - "advancement.create.electron_tube": "UNLOCALIZED: Beep Boop", - "advancement.create.electron_tube.desc": "UNLOCALIZED: Make some Electron Tubes, useful in crafting less primitive machinery.", - "advancement.create.mechanical_saw": "UNLOCALIZED: Stationary Chopping", - "advancement.create.mechanical_saw.desc": "UNLOCALIZED: Place and power a Mechanical Saw.", - "advancement.create.basin": "UNLOCALIZED: Basin Operation", - "advancement.create.basin.desc": "UNLOCALIZED: Place a Basin and try throwing items into it.", - "advancement.create.mixer": "UNLOCALIZED: Mixin' It Up", - "advancement.create.mixer.desc": "UNLOCALIZED: Place a Mechanical Mixer above the Basin, power it, and start mixing some ingredients.", - "advancement.create.compact": "UNLOCALIZED: Automated Compacting", - "advancement.create.compact.desc": "UNLOCALIZED: Use a Press and a Basin to compact some items.", - "advancement.create.expert_lane_1": "UNLOCALIZED: The Andesite Expert Lane", - "advancement.create.expert_lane_1.desc": "UNLOCALIZED: Work in Progress", - "advancement.create.brass": "UNLOCALIZED: An Actual Alloy", - "advancement.create.brass.desc": "UNLOCALIZED: Use Crushed Copper and Crushed Zinc to create some Brass.", - "advancement.create.brass_casing": "UNLOCALIZED: The Brass Age", - "advancement.create.brass_casing.desc": "UNLOCALIZED: Use newly obtained Brass and some Wood to create a more advanced Casing.", - "advancement.create.copper_casing": "UNLOCALIZED: The Copper Age", - "advancement.create.copper_casing.desc": "UNLOCALIZED: Use some Copper Sheets and Wood to create some Copper Casings.", - "advancement.create.crafter": "UNLOCALIZED: Automated Assembly", - "advancement.create.crafter.desc": "UNLOCALIZED: Place and power some Mechanical Crafters.", - "advancement.create.deployer": "UNLOCALIZED: Poke, Place, and Attack", - "advancement.create.deployer.desc": "UNLOCALIZED: Place and power a Deployer, the perfect reflection of yourself.", + "advancement.create.root": "Добро пожаловать в Create", + "advancement.create.root.desc": "Пришло время начать строить некоторые удивительные штуковины!", + "advancement.create.andesite_alloy": "Повторение - мать учения", + "advancement.create.andesite_alloy.desc": "Материалы Create имеют странные названия, одно из них - Андезитовый сплав", + "advancement.create.its_alive": "Оно живое!", + "advancement.create.its_alive.desc": "Смастерите ваш первый кинетический компонент вращения.", + "advancement.create.shifting_gears": "Механизм переключения", + "advancement.create.shifting_gears.desc": "Подсоедините большую шестерню к шестерне, что позволит изменить скорость вращения.", + "advancement.create.overstressed": "Перегрузка", + "advancement.create.overstressed.desc": "Испытайте пределы стресса из первых рук.", + "advancement.create.belt": "Передай все это", + "advancement.create.belt.desc": "Соедините два вала с помощью механического ремня.", + "advancement.create.wrench": "Конфигурировать удобно", + "advancement.create.wrench.desc": "Создайте гаечный ключ, чтобы помочь себе в создании изобретений.", + "advancement.create.goggles": "Стресс-о-зрение", + "advancement.create.goggles.desc": "Создайте инженерные очки, чтобы получить больше кинетической информации для компонентов.", + "advancement.create.speedometer": "Что действительно быстро?", + "advancement.create.speedometer.desc": "Поставьте и подключите спидометр. Посмотрите на спидометр через очки, чтобы прочитать точное значение.", + "advancement.create.stressometer": "Что действительно сильно?", + "advancement.create.stressometer.desc": "Поставьте и подключите динамометр. Посмотрите на динамометр через очки, чтобы прочитать точное значение.", + "advancement.create.water_wheel": "Гидравлика", + "advancement.create.water_wheel.desc": "Поставьте водяное колесо и попытайтесь заставить его вращаться!", + "advancement.create.lava_wheel": "Адское колесо", + "advancement.create.lava_wheel.desc": "Это не должно было работать.", + "advancement.create.millstone": "Карманная дробилка", + "advancement.create.millstone.desc": "Поставьте и приведите в действие жернов", + "advancement.create.andesite_casing": "Андезитовый век", + "advancement.create.andesite_casing.desc": "Используйте немного андезитового сплава и дерева для создания корпуса.", + "advancement.create.mechanical_drill": "Стационарные выключатели", + "advancement.create.mechanical_drill.desc": "Установите и приведите в действие механическую дрель", + "advancement.create.press": "Пресс делает «Бонк!'", + "advancement.create.press.desc": "Приведите механический пресс в действие и используйте его для создания пластин.", + "advancement.create.polished_rose_quartz": "Розовый алмаз", + "advancement.create.polished_rose_quartz.desc": "Используйте кусок наждачной бумаги, чтобы отполировать розовый кварц, пока он не станет прозрачным.", + "advancement.create.electron_tube": "Бип бип", + "advancement.create.electron_tube.desc": "Сделайте несколько электронных ламп, пригодных для изготовления менее примитивных машин.", + "advancement.create.mechanical_saw": "Стационарная рубка", + "advancement.create.mechanical_saw.desc": "Поставьте и подключите механическую пилу", + "advancement.create.basin": "Операция в чаше", + "advancement.create.basin.desc": "Поставьте чашу и попытайтесь бросить в неё предметы.", + "advancement.create.mixer": "Смешай это", + "advancement.create.mixer.desc": "Поставьте механический смешиватель над чашей, подключите его и начните смешивать некоторые ингредиенты.", + "advancement.create.compact": "Автоматическое уплотнение", + "advancement.create.compact.desc": "Используйте пресс и чашу для уплотнения некоторых предметов.", + "advancement.create.expert_lane_1": "Знаток дорожек андезита", + "advancement.create.expert_lane_1.desc": "Работа в процессе", + "advancement.create.brass": "Действительный сплав", + "advancement.create.brass.desc": "Используйте измельчённую медь и измельчённый цинк, чтобы создать немного латуни.", + "advancement.create.brass_casing": "Бронзовый век", + "advancement.create.brass_casing.desc": "Используйте только что полученную латунь и немного дерева, чтобы создать более продвинутый корпус.", + "advancement.create.copper_casing": "Медный век", + "advancement.create.copper_casing.desc": "Используйте несколько медных листов для создания медного корпуса.", + "advancement.create.crafter": "Автоматизированная сборка", + "advancement.create.crafter.desc": "Поставьте и подключите механический крафтер", + "advancement.create.deployer": "Тыкайте, ставьте и атакуйте", + "advancement.create.deployer.desc": "Приведите в действие автономный активатор, идеальное отражение себя.", "advancement.create.mechanical_arm": "UNLOCALIZED: Mechanical Grab'n'Drop", "advancement.create.mechanical_arm.desc": "UNLOCALIZED: Craft a Mechanical Arm, select in- and outputs, place it down and give it power; then watch as it does all the work for you.", "advancement.create.musical_arm": "UNLOCALIZED: Play Me My Theme Tune!", "advancement.create.musical_arm.desc": "UNLOCALIZED: Watch a Mechanical Arm operate your Jukebox.", - "advancement.create.fist_bump": "UNLOCALIZED: Pound It, Bro!", - "advancement.create.fist_bump.desc": "UNLOCALIZED: Make two Deployers fist-bump.", - "advancement.create.crushing_wheel": "UNLOCALIZED: A Pair of Giants", - "advancement.create.crushing_wheel.desc": "UNLOCALIZED: Create some Crushing Wheels to break down more materials more effectively.", - "advancement.create.chromatic_compound": "UNLOCALIZED: Bipolar Minerals", - "advancement.create.chromatic_compound.desc": "UNLOCALIZED: Create a Bar of Chromatic Compound.", - "advancement.create.shadow_steel": "UNLOCALIZED: Void Returner", - "advancement.create.shadow_steel.desc": "UNLOCALIZED: Create Shadow Steel, a metal bar of nothingness.", - "advancement.create.refined_radiance": "UNLOCALIZED: Bright and Inspiring", - "advancement.create.refined_radiance.desc": "UNLOCALIZED: Create Refined Radiance, a powerful chromatic substance.", - "advancement.create.zapper": "UNLOCALIZED: Building With Style", - "advancement.create.zapper.desc": "UNLOCALIZED: Craft a Blockzapper. A radiant laser gun that helps you build.", - "advancement.create.upgraded_zapper": "UNLOCALIZED: Radiant Overdrive", - "advancement.create.upgraded_zapper.desc": "UNLOCALIZED: Create and activate a fully upgraded Blockzapper.", - "advancement.create.wand_of_symmetry": "UNLOCALIZED: Radiant Mirrors", - "advancement.create.wand_of_symmetry.desc": "UNLOCALIZED: Craft a Staff of Symmetry.", - "advancement.create.deforester": "UNLOCALIZED: Radiant Chopping", - "advancement.create.deforester.desc": "UNLOCALIZED: Craft a Deforester, and say goodbye to the local forest.", - "advancement.create.extendo_grip": "UNLOCALIZED: Boioioing!", - "advancement.create.extendo_grip.desc": "UNLOCALIZED: Get hold of an Extendo Grip.", - "advancement.create.dual_extendo_grip": "UNLOCALIZED: Ultimate Boing-age", - "advancement.create.dual_extendo_grip.desc": "UNLOCALIZED: Dual wield Extendo Grips for super-human reach.", - "advancement.create.eob": "UNLOCALIZED: End of Beta", - "advancement.create.eob.desc": "UNLOCALIZED: Expect more content here in the future. <3", + "advancement.create.fist_bump": "Брось это, братан!", + "advancement.create.fist_bump.desc": "Сделайте два удара кулаком.", + "advancement.create.crushing_wheel": "Пара гигантов", + "advancement.create.crushing_wheel.desc": "Создайте несколько дробящих колес, чтобы более эффективно разрушать больше материалов.", + "advancement.create.chromatic_compound": "Биполярные минералы", + "advancement.create.chromatic_compound.desc": "Создайте хроматический компаунд", + "advancement.create.shadow_steel": "Возвращение пустоты", + "advancement.create.shadow_steel.desc": "Создайте призрачную сталь, металлический слиток небытия.", + "advancement.create.refined_radiance": "Яркий и вдохновляющий", + "advancement.create.refined_radiance.desc": "Создайте изысканное сияние, мощное хроматическое вещество.", + "advancement.create.zapper": "Строительство со стилем", + "advancement.create.zapper.desc": "Создайте ручную блоковую пушку, которая поможет вам строить.", + "advancement.create.upgraded_zapper": "Сияющий овердрайв", + "advancement.create.upgraded_zapper.desc": "Создайте и активируйте полностью модернизированную ручную блоковую пушку.", + "advancement.create.wand_of_symmetry": "Сияющие зеркала", + "advancement.create.wand_of_symmetry.desc": "Создайте жезл симметрии.", + "advancement.create.deforester": "Лучистая рубка", + "advancement.create.deforester.desc": "Создайте уничтожитель леса и попрощайтесь с местным лесом.", + "advancement.create.extendo_grip": "Кипение!", + "advancement.create.extendo_grip.desc": "Возьмите в руки удлинённую руку", + "advancement.create.dual_extendo_grip": "Окончательное выкипание", + "advancement.create.dual_extendo_grip.desc": "Две удлинённой руки для сверхчеловеческого охвата.", + "advancement.create.eob": "Конец бета-версии", + "advancement.create.eob.desc": "Ожидайте больше контента здесь в будущем. <3", "_": "->------------------------] UI & Messages [------------------------<-", - "itemGroup.create.base": "UNLOCALIZED: Create", - "itemGroup.create.palettes": "UNLOCALIZED: Create Palettes", + "itemGroup.create.base": "Create: Механизмы", + "itemGroup.create.palettes": "Create: Декор", - "death.attack.create.crush": "%1$s был переработан дробильными колёсами", - "death.attack.create.fan_fire": "%1$s сгорел заживо от горячего воздуха.", - "death.attack.create.fan_lava": "%1$s сгорел заживо от лавового вентилятора", - "death.attack.create.mechanical_drill": "%1$s был проколот механическим буром", - "death.attack.create.mechanical_saw": "UNLOCALIZED: %1$s got cut in half by a Mechanical Saw", - "death.attack.create.cuckoo_clock_explosion": "UNLOCALIZED: %1$s was blown up by tampered cuckoo clock", + "death.attack.create.crush": "%1$s был обработан колёсами дробления", + "death.attack.create.fan_fire": "%1$s был сожжен до смерти горячим воздухом", + "death.attack.create.fan_lava": "%1$s был сожжен до смерти поклонником лавы", + "death.attack.create.mechanical_drill": "%1$s был пронзен с помощью механической дрели", + "death.attack.create.mechanical_saw": "%1$s был разрезан пополам механической пилой", + "death.attack.create.cuckoo_clock_explosion": "%1$s взорвали подделанные часы с кукушкой", - "create.block.deployer.damage_source_name": "UNLOCALIZED: a rogue Deployer", - "create.block.cart_assembler.invalid": "UNLOCALIZED: Place your Cart Assembler on a rail block", + "create.block.deployer.damage_source_name": "автономным активатором", + "create.block.cart_assembler.invalid": "Поместите сборщик вагонеток на блок рельс", - "create.recipe.crushing": "Дробление", - "create.recipe.milling": "UNLOCALIZED: Milling", + "create.recipe.crushing": "Измельчение", + "create.recipe.milling": "Помол", "create.recipe.fan_washing": "UNLOCALIZED: Bulk Washing", "create.recipe.fan_washing.fan": "UNLOCALIZED: Fan behind Flowing Water", "create.recipe.fan_smoking": "UNLOCALIZED: Bulk Smoking", "create.recipe.fan_smoking.fan": "UNLOCALIZED: Fan behind Fire", "create.recipe.fan_blasting": "UNLOCALIZED: Bulk Blasting", "create.recipe.fan_blasting.fan": "UNLOCALIZED: Fan behind Lava", - "create.recipe.pressing": "Механический пресс", - "create.recipe.mixing": "UNLOCALIZED: Mixing", + "create.recipe.pressing": "Прессование", + "create.recipe.mixing": "Смешивание", "create.recipe.automatic_shapeless": "UNLOCALIZED: Automated Shapeless Crafting", "create.recipe.automatic_brewing": "UNLOCALIZED: Automated Brewing", - "create.recipe.packing": "UNLOCALIZED: Compacting", + "create.recipe.packing": "Прессование", "create.recipe.automatic_packing": "UNLOCALIZED: Automated Packing", "create.recipe.sawing": "UNLOCALIZED: Sawing", - "create.recipe.mechanical_crafting": "UNLOCALIZED: Mechanical Crafting", + "create.recipe.mechanical_crafting": "Механическое создание", "create.recipe.automatic_shaped": "UNLOCALIZED: Automated Shaped Crafting", - "create.recipe.block_cutting": "UNLOCALIZED: Block Cutting", - "create.recipe.blockzapper_upgrade": "Портативный размещатель блоков", - "create.recipe.sandpaper_polishing": "UNLOCALIZED: Sandpaper Polishing", - "create.recipe.mystery_conversion": "UNLOCALIZED: Mysterious Conversion", - "create.recipe.processing.chance": "%1$s%% шанс выпадения", + "create.recipe.block_cutting": "Резка блока", + "create.recipe.blockzapper_upgrade": "Ручная блоковая пушка", + "create.recipe.sandpaper_polishing": "Полировка наждачной бумагой", + "create.recipe.mystery_conversion": "Хроматический метаморфоз", + "create.recipe.processing.chance": "%1$s%% шанса", "create.recipe.heat_requirement.none": "UNLOCALIZED: No Heating Required", "create.recipe.heat_requirement.heated": "UNLOCALIZED: Heated", "create.recipe.heat_requirement.superheated": "UNLOCALIZED: Super-Heated", - "create.generic.range": "Зона", + "create.generic.range": "Диапазон", "create.generic.radius": "Радиус", - "create.generic.width": "UNLOCALIZED: Width", - "create.generic.height": "UNLOCALIZED: Height", - "create.generic.length": "UNLOCALIZED: Length", + "create.generic.width": "Ширина", + "create.generic.height": "Высота", + "create.generic.length": "Длина", "create.generic.speed": "Скорость", "create.generic.delay": "Задержка", - "create.generic.unit.ticks": "тик", - "create.generic.unit.seconds": "сек", - "create.generic.unit.minutes": "мин", - "create.generic.unit.rpm": "UNLOCALIZED: RPM", - "create.generic.unit.stress": "UNLOCALIZED: su", - "create.generic.unit.degrees": "UNLOCALIZED: °", + "create.generic.unit.ticks": "тиков", + "create.generic.unit.seconds": "секунд", + "create.generic.unit.minutes": "минут", + "create.generic.unit.rpm": "об./мин.", + "create.generic.unit.stress": "Н*м", + "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", - "create.action.scroll": "КолМыши", + "create.action.scroll": "Прокрутка", "create.action.confirm": "Подтвердить", - "create.action.abort": "Отменить", + "create.action.abort": "Прервать", "create.action.saveToFile": "Сохранить", - "create.action.discard": "Сбросить", + "create.action.discard": "Отказаться", - "create.keyinfo.toolmenu": "Фокусировка меню иструментов", - "create.keyinfo.scrollup": "UNLOCALIZED: Simulate Mousewheel Up (inworld)", - "create.keyinfo.scrolldown": "UNLOCALIZED: Simulate Mousewheel Down (inworld)", + "create.keyinfo.toolmenu": "Меню инструмента фокусировки", + "create.keyinfo.scrollup": "Имитация движения мыши вверх (в мире)", + "create.keyinfo.scrolldown": "Имитация движения мыши вниз (в мире)", - "create.gui.scrollInput.defaultTitle": "Выберите:", - "create.gui.scrollInput.scrollToModify": "КолМыши, чтобы изменить", - "create.gui.scrollInput.scrollToAdjustAmount": "UNLOCALIZED: Scroll to Adjust Amount", - "create.gui.scrollInput.scrollToSelect": "КолМыши, чтобы выделить", - "create.gui.scrollInput.shiftScrollsFaster": "Зажмите Shift, чтобы прокручивать быстрее", - "create.gui.toolmenu.focusKey": "Зажмите [%1$s], чтобы сфокусироваться", - "create.gui.toolmenu.cycle": "[КолМыши] , чтобы выбрать", + "create.gui.scrollInput.defaultTitle": "Выбрать опцию:", + "create.gui.scrollInput.scrollToModify": "Прокрутите, чтобы изменить", + "create.gui.scrollInput.scrollToAdjustAmount": "Прокрутите, чтобы настроить количество", + "create.gui.scrollInput.scrollToSelect": "Прокрутите, чтобы выбрать", + "create.gui.scrollInput.shiftScrollsFaster": "Нажмите Shift для быстрой прокрутки", + "create.gui.toolmenu.focusKey": "Удерживайте [%1$s] для смены задач", + "create.gui.toolmenu.cycle": "[Прокрутка] для переключения", "create.gui.symmetryWand.mirrorType": "Зеркало", "create.gui.symmetryWand.orientation": "Ориентация", - "create.symmetry.mirror.plane": "Линейно", - "create.symmetry.mirror.doublePlane": "Прямоугольно", - "create.symmetry.mirror.triplePlane": "Восьмиугольно", + "create.symmetry.mirror.plane": "Одинарное", + "create.symmetry.mirror.doublePlane": "Двойное", + "create.symmetry.mirror.triplePlane": "Тройное", - "create.orientation.orthogonal": "Перпендикулярно", - "create.orientation.diagonal": "Диагонально", - "create.orientation.horizontal": "Горизонтально", - "create.orientation.alongZ": "По оси Z", - "create.orientation.alongX": "По оси X", + "create.orientation.orthogonal": "Перпендикуляр.", + "create.orientation.diagonal": "Диагональ.", + "create.orientation.horizontal": "Горизонталь.", + "create.orientation.alongZ": "Вдоль Z", + "create.orientation.alongX": "Вдоль X", - "create.gui.blockzapper.title": "Порт. размещ. блоков", + "create.gui.blockzapper.title": "Ручная блоковая пушка", "create.gui.blockzapper.replaceMode": "Режим замены", - "create.gui.blockzapper.searchDiagonal": "Следовать диагоналям", - "create.gui.blockzapper.searchFuzzy": "Игнорировать материальные границы", - "create.gui.blockzapper.range": "Радиус", - "create.gui.blockzapper.needsUpgradedAmplifier": "UNLOCALIZED: Requires Upgraded Amplifier", - "create.gui.blockzapper.patternSection": "Шаблоны", - "create.gui.blockzapper.pattern.solid": "Сплошной", + "create.gui.blockzapper.searchDiagonal": "Следовать по диагонали", + "create.gui.blockzapper.searchFuzzy": "Игнорировать границы материала", + "create.gui.blockzapper.range": "Диапазон распространения", + "create.gui.blockzapper.needsUpgradedAmplifier": "Требуется модернизированный усилитель", + "create.gui.blockzapper.patternSection": "Шаблон", + "create.gui.blockzapper.pattern.solid": "Всё", "create.gui.blockzapper.pattern.checkered": "Шахматная доска", - "create.gui.blockzapper.pattern.inversecheckered": "Обратная шахматная доска", - "create.gui.blockzapper.pattern.chance25": "25% покрытия", - "create.gui.blockzapper.pattern.chance50": "50% покрытия", - "create.gui.blockzapper.pattern.chance75": "75% покрытия", - "create.gui.terrainzapper.title": "UNLOCALIZED: Handheld Worldshaper", - "create.gui.terrainzapper.placement": "UNLOCALIZED: Placement", - "create.gui.terrainzapper.placement.merged": "UNLOCALIZED: Merged", - "create.gui.terrainzapper.placement.attached": "UNLOCALIZED: Attached", - "create.gui.terrainzapper.placement.inserted": "UNLOCALIZED: Inserted", - "create.gui.terrainzapper.brush": "UNLOCALIZED: Brush", - "create.gui.terrainzapper.brush.cuboid": "UNLOCALIZED: Cuboid", - "create.gui.terrainzapper.brush.sphere": "UNLOCALIZED: Sphere", - "create.gui.terrainzapper.brush.cylinder": "UNLOCALIZED: Cylinder", - "create.gui.terrainzapper.tool": "UNLOCALIZED: Tool", - "create.gui.terrainzapper.tool.fill": "UNLOCALIZED: Fill", - "create.gui.terrainzapper.tool.place": "UNLOCALIZED: Place", - "create.gui.terrainzapper.tool.replace": "UNLOCALIZED: Replace", - "create.gui.terrainzapper.tool.clear": "UNLOCALIZED: Clear", - "create.gui.terrainzapper.tool.overlay": "UNLOCALIZED: Overlay", - "create.gui.terrainzapper.tool.flatten": "UNLOCALIZED: Flatten", + "create.gui.blockzapper.pattern.inversecheckered": "Перевернутая шахматная доска", + "create.gui.blockzapper.pattern.chance25": "25% крен", + "create.gui.blockzapper.pattern.chance50": "50% крен", + "create.gui.blockzapper.pattern.chance75": "75% крен", + "create.gui.terrainzapper.title": "Ручной редактор мира", + "create.gui.terrainzapper.placement": "Размещение", + "create.gui.terrainzapper.placement.merged": "Слитый", + "create.gui.terrainzapper.placement.attached": "Прикреплённый", + "create.gui.terrainzapper.placement.inserted": "Вставленный", + "create.gui.terrainzapper.brush": "Обычный", + "create.gui.terrainzapper.brush.cuboid": "Куб", + "create.gui.terrainzapper.brush.sphere": "Сфера", + "create.gui.terrainzapper.brush.cylinder": "Цилиндр", + "create.gui.terrainzapper.tool": "Инструмент", + "create.gui.terrainzapper.tool.fill": "Заполнить", + "create.gui.terrainzapper.tool.place": "Поставить", + "create.gui.terrainzapper.tool.replace": "Заменить", + "create.gui.terrainzapper.tool.clear": "Очистить", + "create.gui.terrainzapper.tool.overlay": "Наложение", + "create.gui.terrainzapper.tool.flatten": "Выравнивание", - "create.terrainzapper.shiftRightClickToSet": "UNLOCALIZED: Shift-Right-Click to Select a Shape", + "create.terrainzapper.shiftRightClickToSet": "ПКМ крадясь, чтобы выбрать форму", - "create.blockzapper.usingBlock": "Материал: %1$s", - "create.blockzapper.componentUpgrades": "Улучшения компонентов:", + "create.blockzapper.usingBlock": "С помощью: %1$s", + "create.blockzapper.componentUpgrades": "Обновления компонентов:", "create.blockzapper.component.body": "Корпус", "create.blockzapper.component.amplifier": "Усилитель", "create.blockzapper.component.accelerator": "Ускоритель", - "create.blockzapper.component.retriever": "Коллектор", - "create.blockzapper.component.scope": "Прицел", - "create.blockzapper.componentTier.none": "Ничего", - "create.blockzapper.componentTier.brass": "UNLOCALIZED: Brass", - "create.blockzapper.componentTier.chromatic": "UNLOCALIZED: Chromatic", - "create.blockzapper.leftClickToSet": "ЛКМ на блок, чтобы выбрать материал", - "create.blockzapper.empty": "Закончились блоки!", + "create.blockzapper.component.retriever": "Поисковик", + "create.blockzapper.component.scope": "Объем", + "create.blockzapper.componentTier.none": "Нет", + "create.blockzapper.componentTier.brass": "Латунный", + "create.blockzapper.componentTier.chromatic": "Хроматический", + "create.blockzapper.leftClickToSet": "Щелкните ЛКМ по блоку, чтобы выбрать материал", + "create.blockzapper.empty": "Вне блоков!", "create.minecart_coupling.two_couplings_max": "UNLOCALIZED: Minecarts cannot have more than two couplings each", "create.minecart_coupling.unloaded": "UNLOCALIZED: Parts of your train seem to be in unloaded chunks", @@ -663,143 +663,143 @@ "create.minecart_coupling.removed": "UNLOCALIZED: Removed all couplings from minecart", "create.minecart_coupling.too_far": "UNLOCALIZED: Minecarts are too far apart", - "create.contraptions.movement_mode": "UNLOCALIZED: Movement Mode", - "create.contraptions.movement_mode.move_place": "UNLOCALIZED: Always Place when Stopped", - "create.contraptions.movement_mode.move_place_returned": "UNLOCALIZED: Place only in Starting Position", - "create.contraptions.movement_mode.move_never_place": "UNLOCALIZED: Place only when Anchor Destroyed", - "create.contraptions.movement_mode.rotate_place": "UNLOCALIZED: Always Place when Stopped", - "create.contraptions.movement_mode.rotate_place_returned": "UNLOCALIZED: Only Place near Initial Angle", - "create.contraptions.movement_mode.rotate_never_place": "UNLOCALIZED: Only Place when Anchor Destroyed", - "create.contraptions.cart_movement_mode": "UNLOCALIZED: Cart Movement Mode", - "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", - "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", - "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.movement_mode": "Режим движения", + "create.contraptions.movement_mode.move_place": "Всегда ставить при остановке", + "create.contraptions.movement_mode.move_place_returned": "Ставить только в исходное положение", + "create.contraptions.movement_mode.move_never_place": "Ставить только, когда якорь уничтожен", + "create.contraptions.movement_mode.rotate_place": "Всегда ставить при остановке", + "create.contraptions.movement_mode.rotate_place_returned": "Только место возле начального угла", + "create.contraptions.movement_mode.rotate_never_place": "Только место, когда якорь уничтожен", + "create.contraptions.cart_movement_mode": "Режим движения вагонетки", + "create.contraptions.cart_movement_mode.rotate": "Всегда лицом к движению", + "create.contraptions.cart_movement_mode.rotate_paused": "Пауза во время вращения", + "create.contraptions.cart_movement_mode.rotation_locked": "Блокировка вращения", "create.logistics.filter": "Фильтр", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", - "create.logistics.firstFrequency": "Част. #1", - "create.logistics.secondFrequency": "Част. #2", + "create.logistics.firstFrequency": "Частота #1", + "create.logistics.secondFrequency": "Частота #2", - "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", - "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", - "create.gui.goggles.at_current_speed": "UNLOCALIZED: At current Speed", - "create.gui.goggles.base_value": "UNLOCALIZED: Base Value", - "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", - "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", - "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", - "create.gui.stressometer.capacity": "UNLOCALIZED: Remaining Capacity", - "create.gui.stressometer.overstressed": "UNLOCALIZED: Overstressed", - "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", - "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", - "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.adjustable_crate.title": "Гибкий ящик", - "create.gui.adjustable_crate.storageSpace": "Обьём хранилища", - "create.gui.stockpile_switch.title": "Сенсор хранилища", + "create.gui.goggles.generator_stats": "Статистика генератора:", + "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", + "create.gui.goggles.at_current_speed": "На текущей скорости", + "create.gui.goggles.base_value": "Базовая стоимость", + "create.gui.gauge.info_header": "Калибровочная информация:", + "create.gui.speedometer.title": "Скорость вращения", + "create.gui.stressometer.title": "Сетевой момент", + "create.gui.stressometer.capacity": "Оставшаяся емкость", + "create.gui.stressometer.overstressed": "Перегрузка", + "create.gui.stressometer.no_rotation": "Нет вращения", + "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с_достаточной_ _скоростью_.", + "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _замедлите_ _скорость_ компонентов с высоким _влиянием_ на _момент_.", + "create.gui.adjustable_crate.title": "Регулируемый ящик", + "create.gui.adjustable_crate.storageSpace": "Ёмкость", + "create.gui.stockpile_switch.title": "Настраиваемый компаратор", "create.gui.stockpile_switch.invert_signal": "UNLOCALIZED: Invert Signal", "create.gui.stockpile_switch.move_to_lower_at": "UNLOCALIZED: Move to lower lane at %1$s%%", "create.gui.stockpile_switch.move_to_upper_at": "UNLOCALIZED: Move to upper lane at %1$s%%", - "create.gui.sequenced_gearshift.title": "UNLOCALIZED: Sequenced Gearshift", - "create.gui.sequenced_gearshift.instruction": "UNLOCALIZED: Instruction", - "create.gui.sequenced_gearshift.instruction.turn_angle": "UNLOCALIZED: Turn", - "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "UNLOCALIZED: Angle", - "create.gui.sequenced_gearshift.instruction.turn_distance": "UNLOCALIZED: Piston", - "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "UNLOCALIZED: Distance", - "create.gui.sequenced_gearshift.instruction.wait": "UNLOCALIZED: Wait", - "create.gui.sequenced_gearshift.instruction.wait.duration": "UNLOCALIZED: Duration", - "create.gui.sequenced_gearshift.instruction.end": "UNLOCALIZED: End", - "create.gui.sequenced_gearshift.speed": "UNLOCALIZED: Speed, Direction", - "create.gui.sequenced_gearshift.speed.forward": "UNLOCALIZED: Input speed, Forwards", - "create.gui.sequenced_gearshift.speed.forward_fast": "UNLOCALIZED: Double speed, Forwards", - "create.gui.sequenced_gearshift.speed.back": "UNLOCALIZED: Input speed, Reversed", - "create.gui.sequenced_gearshift.speed.back_fast": "UNLOCALIZED: Double speed, Reversed", + "create.gui.sequenced_gearshift.title": "Посл. переключ. передач", + "create.gui.sequenced_gearshift.instruction": "Инструкция", + "create.gui.sequenced_gearshift.instruction.turn_angle": "Повернуть", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Угол", + "create.gui.sequenced_gearshift.instruction.turn_distance": "Поршень", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Расстояние", + "create.gui.sequenced_gearshift.instruction.wait": "Перерыв", + "create.gui.sequenced_gearshift.instruction.wait.duration": "Продолжительность", + "create.gui.sequenced_gearshift.instruction.end": "Конец", + "create.gui.sequenced_gearshift.speed": "Скорость, Направление", + "create.gui.sequenced_gearshift.speed.forward": "Скорость ввода, вперед", + "create.gui.sequenced_gearshift.speed.forward_fast": "Двойная скорость, вперед", + "create.gui.sequenced_gearshift.speed.back": "Скорость ввода, реверс", + "create.gui.sequenced_gearshift.speed.back_fast": "Двойная скорость, реверс", - "create.schematicAndQuill.dimensions": "Размер схемы: %1$sx%2$sx%3$s", + "create.schematicAndQuill.dimensions": "Размер схематики: %1$sx%2$sx%3$s", "create.schematicAndQuill.firstPos": "Первая позиция установлена.", "create.schematicAndQuill.secondPos": "Вторая позиция установлена.", - "create.schematicAndQuill.noTarget": "Зажмите [Ctrl], чтобы выделять блоки воздуха.", - "create.schematicAndQuill.abort": "Выделение удалено.", + "create.schematicAndQuill.noTarget": "Удерживайте [Ctrl], чтобы выбрать воздушные блоки.", + "create.schematicAndQuill.abort": "Выделение убрано", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", - "create.schematicAndQuill.fallbackName": "Моя схема", + "create.schematicAndQuill.fallbackName": "Моя схематика", "create.schematicAndQuill.saved": "Сохранено как %1$s", - "create.schematic.invalid": "[!] Недействительный предмет - используйте стол для схем", + "create.schematic.invalid": "[!] Недопустимый предмет — вместо этого используйте схематичный стол", "create.schematic.position": "Позиция", "create.schematic.rotation": "Вращение", - "create.schematic.rotation.none": "Ничего", - "create.schematic.rotation.cw90": "90° по часовой", - "create.schematic.rotation.cw180": "180° по часовой", - "create.schematic.rotation.cw270": "270° по часовой", - "create.schematic.mirror": "Отразить", - "create.schematic.mirror.none": "Ничего", - "create.schematic.mirror.frontBack": "Перед-зад", - "create.schematic.mirror.leftRight": "Лево-право", - "create.schematic.tool.deploy": "Разместить", - "create.schematic.tool.move": "Сдвиг по XZ", - "create.schematic.tool.movey": "Сдвиг по Y", - "create.schematic.tool.rotate": "Повернуть", - "create.schematic.tool.print": "Напечатать", - "create.schematic.tool.flip": "Отразить", - "create.schematic.tool.deploy.description.0": "Размещает конструкцию.", - "create.schematic.tool.deploy.description.1": "ПКМ на земле для размещения.", - "create.schematic.tool.deploy.description.2": "Зажмите [Ctrl] для перемещения на фикс. дистанции.", - "create.schematic.tool.deploy.description.3": "[Ctrl]-КолМыши для изменения дистанции.", - "create.schematic.tool.move.description.0": "Сдвигает схему по горизонтали", - "create.schematic.tool.move.description.1": "Смотрите на схему и [CTRL]-КолМыши для сдвига.", + "create.schematic.rotation.none": "Нет", + "create.schematic.rotation.cw90": "По час. стрелке 90", + "create.schematic.rotation.cw180": "По час. стрелке 180", + "create.schematic.rotation.cw270": "По час. стрелке 270", + "create.schematic.mirror": "Зеркало", + "create.schematic.mirror.none": "Нет", + "create.schematic.mirror.frontBack": "Спереди-сзади", + "create.schematic.mirror.leftRight": "Влево-вправо", + "create.schematic.tool.deploy": "Развернуть", + "create.schematic.tool.move": "Подвинуть XZ", + "create.schematic.tool.movey": "Подвинуть Y", + "create.schematic.tool.rotate": "Вращать", + "create.schematic.tool.print": "Печать", + "create.schematic.tool.flip": "Перевернуть", + "create.schematic.tool.deploy.description.0": "Перемещает структуру в локации.", + "create.schematic.tool.deploy.description.1": "Щелкните ПКМ на земле, чтобы разместить.", + "create.schematic.tool.deploy.description.2": "Удерживайте [Ctrl], чтобы выбрать фиксированное расстояние.", + "create.schematic.tool.deploy.description.3": "[Ctrl] и прокрутка, чтобы изменить расстояние.", + "create.schematic.tool.move.description.0": "Сдвинуть схему по горизонтали.", + "create.schematic.tool.move.description.1": "Наведите курсор на схему и нажмите [CTRL] и прокрутка, чтобы нажать на нее.", "create.schematic.tool.move.description.2": "", "create.schematic.tool.move.description.3": "", - "create.schematic.tool.movey.description.0": "Сдвигает схему по вертикали", - "create.schematic.tool.movey.description.1": "[CTRL]-КолМыши для сдвига вверх/вниз", + "create.schematic.tool.movey.description.0": "Сдвигает схему по вертикали.", + "create.schematic.tool.movey.description.1": "[CTRL] и прокрутка - переместить вверх/вниз.", "create.schematic.tool.movey.description.2": "", "create.schematic.tool.movey.description.3": "", - "create.schematic.tool.rotate.description.0": "Вращает схему вокруг центра.", - "create.schematic.tool.rotate.description.1": "[CTRL]-КолМыши для поворота на 90°", + "create.schematic.tool.rotate.description.0": "Вращает схематику вокруг ее центра.", + "create.schematic.tool.rotate.description.1": "[CTRL] и прокрутка вращать на 90 градусов.", "create.schematic.tool.rotate.description.2": "", "create.schematic.tool.rotate.description.3": "", - "create.schematic.tool.print.description.0": "Моментально размещает структуру в мире", - "create.schematic.tool.print.description.1": "[ПКМ] для размещения в текущем месте.", - "create.schematic.tool.print.description.2": "Только для креативного режима.", + "create.schematic.tool.print.description.0": "Мгновенно размещает структуру в мире.", + "create.schematic.tool.print.description.1": "[ПКМ], чтобы подтвердить размещение в текущем местоположении.", + "create.schematic.tool.print.description.2": "Этот инструмент предназначен только для творческого режима.", "create.schematic.tool.print.description.3": "", - "create.schematic.tool.flip.description.0": "Отражает схему вдоль выбранной стороны.", - "create.schematic.tool.flip.description.1": "Смотрите на схему и [CTRL]-КолМыши для отражения.", + "create.schematic.tool.flip.description.0": "Переверните схему вдоль выбранного лица.", + "create.schematic.tool.flip.description.1": "Наведите курсор на схему и [CTRL] + прокрутка, чтобы перевернуть ее.", "create.schematic.tool.flip.description.2": "", "create.schematic.tool.flip.description.3": "", - "create.schematics.synchronizing": "Синхронизация...", - "create.schematics.uploadTooLarge": "Схема слишком большая", - "create.schematics.maxAllowedSize": "Максимальный размер файла схемы:", + "create.schematics.synchronizing": "Синхронизация..", + "create.schematics.uploadTooLarge": "Ваша схематика слишком велика.", + "create.schematics.maxAllowedSize": "Максимально допустимый размер файла:", - "create.gui.schematicTable.title": "Стол для схем", + "create.gui.schematicTable.title": "Схематичный стол", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", "create.gui.schematicTable.availableSchematics": "Доступные схемы", - "create.gui.schematicTable.noSchematics": "Нет сохранённых схем", - "create.gui.schematicTable.uploading": "Загрузка...", + "create.gui.schematicTable.noSchematics": "Схемы не сохранены", + "create.gui.schematicTable.uploading": "Загрузка ...", "create.gui.schematicTable.finished": "Загрузка завершена!", - "create.gui.schematicannon.title": "Схемопушка", - "create.gui.schematicannon.listPrinter": "Распечатать список материалов", - "create.gui.schematicannon.gunpowderLevel": "Порох: %1$s%%", + "create.gui.schematicannon.title": "Схематичная пушка", + "create.gui.schematicannon.listPrinter": "Список материалов", + "create.gui.schematicannon.gunpowderLevel": "Порох на %1$s%%", "create.gui.schematicannon.shotsRemaining": "Выстрелов осталось: %1$s", - "create.gui.schematicannon.shotsRemainingWithBackup": "C запасом: %1$s", - "create.gui.schematicannon.optionEnabled": "Включена", - "create.gui.schematicannon.optionDisabled": "Отключена", + "create.gui.schematicannon.shotsRemainingWithBackup": "С резервной копией: %1$s", + "create.gui.schematicannon.optionEnabled": "В настоящее время включен", + "create.gui.schematicannon.optionDisabled": "В настоящее время отключен", "create.gui.schematicannon.showOptions": "UNLOCALIZED: Show Printer Settings", "create.gui.schematicannon.option.dontReplaceSolid": "Не заменять целые блоки", "create.gui.schematicannon.option.replaceWithSolid": "Заменять целые блоки целыми блоками", "create.gui.schematicannon.option.replaceWithAny": "Заменять целые блоки чем угодно", "create.gui.schematicannon.option.replaceWithEmpty": "Заменять целые блоки пустотой", "create.gui.schematicannon.option.skipMissing": "Пропускать отсутствующие блоки", - "create.gui.schematicannon.option.skipTileEntities": "Защита от сущностей", + "create.gui.schematicannon.option.skipTileEntities": "Защитить имущество", "create.gui.schematicannon.slot.gunpowder": "UNLOCALIZED: Add gunpowder to fuel the cannon", "create.gui.schematicannon.slot.listPrinter": "UNLOCALIZED: Place books here to print a Checklist for your Schematic", "create.gui.schematicannon.slot.schematic": "UNLOCALIZED: Add your Schematic here. Make sure it is deployed at a specific location.", - "create.gui.schematicannon.option.skipMissing.description": "Если схемопушка не найдёт нужный блок, то она продолжит в следующем месте.", - "create.gui.schematicannon.option.skipTileEntities.description": "Схемопушка будет избегать замены блоков с данными, например сундуки.", - "create.gui.schematicannon.option.dontReplaceSolid.description": "Схемопушка никогда не заменит целые блоки, только не целые и воздух.", - "create.gui.schematicannon.option.replaceWithSolid.description": "Схемопушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", - "create.gui.schematicannon.option.replaceWithAny.description": "Схемопушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", - "create.gui.schematicannon.option.replaceWithEmpty.description": "Схемопушка отчистит все блоки, включая замену на воздух.", + "create.gui.schematicannon.option.skipMissing.description": "Если пушка не может найти требуемый блок, она будет строить в следующем месте.", + "create.gui.schematicannon.option.skipTileEntities.description": "Пушка не будет заменять блоки хранения данных, такие как сундуки.", + "create.gui.schematicannon.option.dontReplaceSolid.description": "Пушка никогда не заменит целые блоки, только не целые и воздух.", + "create.gui.schematicannon.option.replaceWithSolid.description": "Пушка будет заменять целый блок только в случае, если в схеме в этом месте расположен целый блок.", + "create.gui.schematicannon.option.replaceWithAny.description": "Пушка будет заменять целые блоки, если в схеме в этом месте есть что-либо.", + "create.gui.schematicannon.option.replaceWithEmpty.description": "Пушка отчистит все блоки, включая замену на воздух.", "create.schematicannon.status.idle": "Бездействует", "create.schematicannon.status.ready": "Готова", @@ -807,92 +807,92 @@ "create.schematicannon.status.finished": "Закончила", "create.schematicannon.status.paused": "Приостановлена", "create.schematicannon.status.stopped": "Остановлена", - "create.schematicannon.status.noGunpowder": "Кончился порох", - "create.schematicannon.status.targetNotLoaded": "Блок не загружен", + "create.schematicannon.status.noGunpowder": "Требуется порох", + "create.schematicannon.status.targetNotLoaded": "Цель не загружена", "create.schematicannon.status.targetOutsideRange": "Цель слишком далеко", "create.schematicannon.status.searching": "Поиск", "create.schematicannon.status.skipping": "Пропуск", - "create.schematicannon.status.missingBlock": "Нет блока:", - "create.schematicannon.status.placing": "Размещение", - "create.schematicannon.status.clearing": "Отчистка", - "create.schematicannon.status.schematicInvalid": "Схема недействительна", - "create.schematicannon.status.schematicNotPlaced": "Схема не размещена", + "create.schematicannon.status.missingBlock": "Требует блок:", + "create.schematicannon.status.placing": "Стройка", + "create.schematicannon.status.clearing": "Очистка", + "create.schematicannon.status.schematicInvalid": "Неверная схема", + "create.schematicannon.status.schematicNotPlaced": "Схема не загружена", "create.schematicannon.status.schematicExpired": "Срок действия файла схемы истек", - "create.gui.filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT match any of the above. An empty Blacklist accepts everything.", - "create.gui.filter.whitelist": "UNLOCALIZED: Whitelist", - "create.gui.filter.whitelist.description": "UNLOCALIZED: Items pass if they match any of the above. An empty Whitelist rejects everything.", - "create.gui.filter.respect_data": "UNLOCALIZED: Respect Data", - "create.gui.filter.respect_data.description": "UNLOCALIZED: Items only match if their durability, enchantments, and other attributes match as well.", - "create.gui.filter.ignore_data": "UNLOCALIZED: Ignore Data", - "create.gui.filter.ignore_data.description": "UNLOCALIZED: Items match regardless of their attributes.", + "create.gui.filter.deny_list": "Чёрный список", + "create.gui.filter.deny_list.description": "Предметы проходят, если они не соответствуют ни одному из вышеперечисленных. Пустой черный список принимает все.", + "create.gui.filter.allow_list": "Белый список", + "create.gui.filter.allow_list.description": "Предметы проходят, если они соответствуют любому из вышеперечисленных. Пустой белый список отвергает все.", + "create.gui.filter.respect_data": "Использование данных", + "create.gui.filter.respect_data.description": "Предметы совпадают только в том случае, если их прочность, чары и другие атрибуты совпадают.", + "create.gui.filter.ignore_data": "Игнорирование данных", + "create.gui.filter.ignore_data.description": "Предметы совпадают независимо от их атрибутов.", - "create.item_attributes.placeable": "UNLOCALIZED: is placeable", + "create.item_attributes.placeable": "можно разместить", "create.item_attributes.placeable.inverted": "UNLOCALIZED: is not placeable", - "create.item_attributes.consumable": "UNLOCALIZED: can be eaten", + "create.item_attributes.consumable": "можно съесть", "create.item_attributes.consumable.inverted": "UNLOCALIZED: cannot be eaten", - "create.item_attributes.smeltable": "UNLOCALIZED: can be Smelted", + "create.item_attributes.smeltable": "можно расплавить", "create.item_attributes.smeltable.inverted": "UNLOCALIZED: cannot be Smelted", - "create.item_attributes.washable": "UNLOCALIZED: can be Washed", + "create.item_attributes.washable": "можно промыть", "create.item_attributes.washable.inverted": "UNLOCALIZED: cannot be Washed", - "create.item_attributes.smokable": "UNLOCALIZED: can be Smoked", + "create.item_attributes.smokable": "можно коптить", "create.item_attributes.smokable.inverted": "UNLOCALIZED: cannot be Smoked", "create.item_attributes.crushable": "UNLOCALIZED: can be Crushed", "create.item_attributes.crushable.inverted": "UNLOCALIZED: cannot be Crushed", - "create.item_attributes.blastable": "UNLOCALIZED: is smeltable in Blast Furnace", + "create.item_attributes.blastable": "плавится в доменной печи", "create.item_attributes.blastable.inverted": "UNLOCALIZED: is not smeltable in Blast Furnace", - "create.item_attributes.enchanted": "UNLOCALIZED: is enchanted", + "create.item_attributes.enchanted": "зачарован", "create.item_attributes.enchanted.inverted": "UNLOCALIZED: is unenchanted", - "create.item_attributes.damaged": "UNLOCALIZED: is damaged", + "create.item_attributes.damaged": "повреждён", "create.item_attributes.damaged.inverted": "UNLOCALIZED: is not damaged", - "create.item_attributes.badly_damaged": "UNLOCALIZED: is heavily damaged", + "create.item_attributes.badly_damaged": "сильно повреждён", "create.item_attributes.badly_damaged.inverted": "UNLOCALIZED: is not heavily damaged", - "create.item_attributes.not_stackable": "UNLOCALIZED: cannot stack", + "create.item_attributes.not_stackable": "не может складываться", "create.item_attributes.not_stackable.inverted": "UNLOCALIZED: can be stacked", - "create.item_attributes.equipable": "UNLOCALIZED: can be equipped", + "create.item_attributes.equipable": "может быть надет", "create.item_attributes.equipable.inverted": "UNLOCALIZED: cannot be equipped", - "create.item_attributes.furnace_fuel": "UNLOCALIZED: is furnace fuel", + "create.item_attributes.furnace_fuel": "это топливо", "create.item_attributes.furnace_fuel.inverted": "UNLOCALIZED: is not furnace fuel", - "create.item_attributes.in_tag": "UNLOCALIZED: is tagged %1$s", + "create.item_attributes.in_tag": "помечен %1$s", "create.item_attributes.in_tag.inverted": "UNLOCALIZED: is not tagged %1$s", - "create.item_attributes.in_item_group": "UNLOCALIZED: is in group '%1$s'", + "create.item_attributes.in_item_group": "принадлежит %1$s", "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", - "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", + "create.item_attributes.added_by": "был добавлен %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", - "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", - "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", + "create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны", + "create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "UNLOCALIZED: Whitelist (Any)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "UNLOCALIZED: Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "UNLOCALIZED: Whitelist (All)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "UNLOCALIZED: Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "UNLOCALIZED: Blacklist", - "create.gui.attribute_filter.blacklist.description": "UNLOCALIZED: Items pass if they do NOT have any of the selected attributes.", - "create.gui.attribute_filter.add_reference_item": "UNLOCALIZED: Add Reference Item", + "create.gui.attribute_filter.allow_list_disjunctive": "Белый список (любой)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Предметы проходят, если у них есть какой-либо из выбранных атрибутов.", + "create.gui.attribute_filter.allow_list_conjunctive": "Белый список (все)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Предметы проходят, только если они имеют ВСЕ выбранные атрибуты.", + "create.gui.attribute_filter.deny_list": "Чёрный список", + "create.gui.attribute_filter.deny_list.description": "Предметы проходят, если они НЕ имеют ни одного из выбранных атрибутов.", + "create.gui.attribute_filter.add_reference_item": "Добавить предмет", - "create.tooltip.holdKey": "Зажмите [%1$s]", - "create.tooltip.holdKeyOrKey": "Зажмите [%1$s] или [%2$s]", + "create.tooltip.holdKey": "Удерживайте [%1$s]", + "create.tooltip.holdKeyOrKey": "Удерживайте [%1$s] или [%2$s]", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", - "create.tooltip.speedRequirement": "UNLOCALIZED: Speed Requirement: %1$s", - "create.tooltip.speedRequirement.none": "UNLOCALIZED: None", - "create.tooltip.speedRequirement.medium": "UNLOCALIZED: Moderate", - "create.tooltip.speedRequirement.high": "UNLOCALIZED: Fast", - "create.tooltip.stressImpact": "UNLOCALIZED: Stress Impact: %1$s", - "create.tooltip.stressImpact.low": "UNLOCALIZED: Low", - "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", - "create.tooltip.stressImpact.high": "UNLOCALIZED: High", - "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", - "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", - "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", - "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", - "create.tooltip.capacityProvided.high": "UNLOCALIZED: Large", - "create.tooltip.capacityProvided.asGenerator": "UNLOCALIZED: (As Generator)", - "create.tooltip.generationSpeed": "UNLOCALIZED: Generates at %1$s %2$s", - "create.tooltip.analogStrength": "UNLOCALIZED: Analog Strength: %1$s/15", + "create.tooltip.speedRequirement": "Требование к скорости: %1$s", + "create.tooltip.speedRequirement.none": "Нет", + "create.tooltip.speedRequirement.medium": "Умеренная", + "create.tooltip.speedRequirement.high": "Быстрая", + "create.tooltip.stressImpact": "Требование к моменту: %1$s", + "create.tooltip.stressImpact.low": "Низкий", + "create.tooltip.stressImpact.medium": "Средний", + "create.tooltip.stressImpact.high": "Высокий", + "create.tooltip.stressImpact.overstressed": "Перегрузка", + "create.tooltip.capacityProvided": "Ёмкостный момент: %1$s", + "create.tooltip.capacityProvided.low": "Маленький", + "create.tooltip.capacityProvided.medium": "Средний", + "create.tooltip.capacityProvided.high": "Большой", + "create.tooltip.capacityProvided.asGenerator": "(Как генератор)", + "create.tooltip.generationSpeed": "Создаёт %1$s %2$s", + "create.tooltip.analogStrength": "Аналоговая сила: %1$s/15", "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", @@ -921,23 +921,23 @@ "create.gui.config.overlay7": "UNLOCALIZED: Run /create overlay reset", "create.gui.config.overlay8": "UNLOCALIZED: to reset to the default position", - "create.command.killTPSCommand": "UNLOCALIZED: killtps", - "create.command.killTPSCommand.status.slowed_by.0": "UNLOCALIZED: [Create]: Server tick is currently slowed by %s ms :o", - "create.command.killTPSCommand.status.slowed_by.1": "UNLOCALIZED: [Create]: Server tick is slowed by %s ms now >:)", - "create.command.killTPSCommand.status.slowed_by.2": "UNLOCALIZED: [Create]: Server tick is back to regular speed :D", - "create.command.killTPSCommand.status.usage.0": "UNLOCALIZED: [Create]: use /killtps stop to bring back server tick to regular speed", - "create.command.killTPSCommand.status.usage.1": "UNLOCALIZED: [Create]: use /killtps start to artificially slow down the server tick", - "create.command.killTPSCommand.argument.tickTime": "UNLOCALIZED: tickTime", + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: Тики сервера в настоящее время замедлены на %s мс :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: Тики сервера теперь замедлены на %s мс >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: Тики сервера вернулись к в норму :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: используйте /killtps stop , чтобы вернуть тик сервера на обычную скорость", + "create.command.killTPSCommand.status.usage.1": "[Create]: используйте /killtps start <Время тика>, чтобы искусственно замедлить тик сервера", + "create.command.killTPSCommand.argument.tickTime": "Время тика", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon shoots", - "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon finishes", - "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", - "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press activates", - "create.subtitle.mechanical_press_item_break": "UNLOCALIZED: Metal clanks", - "create.subtitle.blockzapper_place": "UNLOCALIZED: Blocks zap into place", - "create.subtitle.blockzapper_confirm": "UNLOCALIZED: Affirmative Ding", - "create.subtitle.blockzapper_deny": "UNLOCALIZED: Declining Boop", - "create.subtitle.block_funnel_eat": "UNLOCALIZED: Funnel CHOMPS", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", + "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", + "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.mechanical_press_activation": "Механический пресс активирован", + "create.subtitle.mechanical_press_item_break": "Лязг металла", + "create.subtitle.blockzapper_place": "Блок запрыгивает на место", + "create.subtitle.blockzapper_confirm": "Утвердительный динь", + "create.subtitle.blockzapper_deny": "Тихий буп", + "create.subtitle.block_funnel_eat": "Воронкообразный чмопс", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze munches happily", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "Идеально отражает размещаемые блоки по настроенным плоскостям.", @@ -1027,7 +1079,7 @@ "item.create.wand_of_symmetry.tooltip.control2": "ПКМ в воздух", "item.create.wand_of_symmetry.tooltip.action2": "_Убирает_ зеркало", "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадясь", - "item.create.wand_of_symmetry.tooltip.action3": "Открывает _Меню_ _настройки_", + "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", "item.create.handheld_blockzapper.tooltip.summary": "Новейшее устройство для размещения или замены блоков на расстоянии.", @@ -1036,85 +1088,85 @@ "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадясь", - "item.create.handheld_blockzapper.tooltip.action3": "Открывает _Меню_ _настройки_", + "item.create.handheld_blockzapper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", - "item.create.handheld_worldshaper.tooltip": "UNLOCALIZED: HANDHELD WORLDSHAPER", - "item.create.handheld_worldshaper.tooltip.summary": "UNLOCALIZED: Handy tool for creating _landscapes_ and _terrain_ _features_.", - "item.create.handheld_worldshaper.tooltip.control1": "UNLOCALIZED: L-Click at Block", - "item.create.handheld_worldshaper.tooltip.action1": "UNLOCALIZED: Sets blocks placed by the tool to the targeted block.", - "item.create.handheld_worldshaper.tooltip.control2": "UNLOCALIZED: R-Click at Block", - "item.create.handheld_worldshaper.tooltip.action2": "UNLOCALIZED: Applies the currently selected _Brush_ and _Tool_ at the targeted location.", - "item.create.handheld_worldshaper.tooltip.control3": "UNLOCALIZED: R-Click while Sneaking", - "item.create.handheld_worldshaper.tooltip.action3": "UNLOCALIZED: Opens the _Configuration_ _Interface_", + "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", + "item.create.handheld_worldshaper.tooltip.summary": "Удобный инструмент для создания _ландшафтов_ и _рельефа_ _местности_.", + "item.create.handheld_worldshaper.tooltip.control1": "ЛКМ на блок", + "item.create.handheld_worldshaper.tooltip.action1": "Устанавливает блоки, помещенные инструментом, в целевой блок.", + "item.create.handheld_worldshaper.tooltip.control2": "ПКМ на блок", + "item.create.handheld_worldshaper.tooltip.action2": "Применяет выбранную _кисть_ и _инструмент_ в выбранном месте.", + "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_worldshaper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", - "item.create.tree_fertilizer.tooltip.summary": "Сильная смесь минералов, подходящая обычным видам деревьев.", + "item.create.tree_fertilizer.tooltip.summary": "Мощная комбинация минералов подходит для ускорения роста распространенных типов деревьев.", "item.create.tree_fertilizer.tooltip.condition1": "При использовании на саженце", - "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья независимо от свободного пространства", + "item.create.tree_fertilizer.tooltip.behaviour1": "Выращивает деревья,_независимо_ от _условий_ _их_ _расположения_", - "item.create.deforester.tooltip": "UNLOCALIZED: DEFORESTER", - "item.create.deforester.tooltip.summary": "UNLOCALIZED: A _radiant_ _axe_ able to chop down trees in a split second.", + "item.create.deforester.tooltip": "DEFORESTER", + "item.create.deforester.tooltip.summary": "_Уничтожитель_ _леса_, способен рубить деревья за доли секунды.", - "item.create.extendo_grip.tooltip": "UNLOCALIZED: EXTENDO GRIP", - "item.create.extendo_grip.tooltip.summary": "UNLOCALIZED: Boioioing! Greatly _increases_ _reach_ _distance_ of the wielder.", - "item.create.extendo_grip.tooltip.condition1": "UNLOCALIZED: When in Off-Hand", - "item.create.extendo_grip.tooltip.behaviour1": "UNLOCALIZED: Increases _reach_ _distance_ of items used in the _Main-Hand_.", + "item.create.extendo_grip.tooltip": "EXTENDO GRIP", + "item.create.extendo_grip.tooltip.summary": "Бойоиоинг! Значительно _увеличивает_ _досягаемость_ владельца.", + "item.create.extendo_grip.tooltip.condition1": "Находясь в другой руке", + "item.create.extendo_grip.tooltip.behaviour1": "Увеличьте _расстояние_ _досягаемости_ предметов, используемых в _главной_ _руке_.", - "item.create.filter.tooltip": "UNLOCALIZED: FILTER", - "item.create.filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ _items_ or several _nested_ _filters_.", - "item.create.filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", - "item.create.filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", - "item.create.filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", - "item.create.filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + "item.create.filter.tooltip": "FILTER", + "item.create.filter.tooltip.summary": "Управляет_ _выходами_ и входами логистических устройств с _большей_ _точностью_, _сопоставляя_ их со _списком_ _предметов_ или несколькими _вложенными_ _фильтрами_.", + "item.create.filter.tooltip.condition1": "Когда в слоте фильтра", + "item.create.filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", + "item.create.filter.tooltip.condition2": "При ПКМ", + "item.create.filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", - "item.create.attribute_filter.tooltip": "UNLOCALIZED: ATTRIBUTE FILTER", - "item.create.attribute_filter.tooltip.summary": "UNLOCALIZED: _Controls_ _outputs_ and _inputs_ of logistical devices with more _precision_, matching them against a _set_ _of_ item _attributes_ and _categories_.", - "item.create.attribute_filter.tooltip.condition1": "UNLOCALIZED: When in filter slot", - "item.create.attribute_filter.tooltip.behaviour1": "UNLOCALIZED: _Controls_ item flow according to its _configuration_.", - "item.create.attribute_filter.tooltip.condition2": "UNLOCALIZED: When R-Clicked", - "item.create.attribute_filter.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface_.", + "item.create.attribute_filter.tooltip": "ATTRIBUTE FILTER", + "item.create.attribute_filter.tooltip.summary": "_Управляет_ _выходами_ и _входами_ логистических устройств с _большей_ _точностью_, сопоставляя их с набором _атрибутов_ и _категорий предметов_.", + "item.create.attribute_filter.tooltip.condition1": "Когда в слоте фильтра", + "item.create.attribute_filter.tooltip.behaviour1": "_Управляет_ потоком предметов в соответствии с его _конфигурацией_.", + "item.create.attribute_filter.tooltip.condition2": "ПКМ", + "item.create.attribute_filter.tooltip.behaviour2": "Открывает _интерфейс_ _конфигурации_.", "item.create.empty_schematic.tooltip": "EMPTY SCHEMATIC", - "item.create.empty_schematic.tooltip.summary": "Используется для крафта и записи в _Столе_ _для_ _схем._", + "item.create.empty_schematic.tooltip.summary": "Используется в качестве ингредиента рецепта и для записи в _Схематичный столе_", "item.create.schematic.tooltip": "SCHEMATIC", - "item.create.schematic.tooltip.summary": "Хранит структуру для размещения. Расположите голограмму и используйте _Схемопушку_ для построения голограммы.", - "item.create.schematic.tooltip.condition1": "Когда в руке", - "item.create.schematic.tooltip.behaviour1": "Может быть размещена с помошью инструментов на экране", + "item.create.schematic.tooltip.summary": "Содержит структуру, которая будет позиционироваться и помещаться в мир. Расположите голограмму по своему усмотрению и используйте _схематичную пушку_ для ее построения.", + "item.create.schematic.tooltip.condition1": "При удерживании", + "item.create.schematic.tooltip.behaviour1": "Может быть позиционирован с помощью инструментов на экране.", "item.create.schematic.tooltip.control1": "ПКМ крадясь", - "item.create.schematic.tooltip.action1": "Открывает _Меню_ для ввода точных _Координат._", + "item.create.schematic.tooltip.action1": "Открывает _интерфейс_ для ввода _точных_ _координат_.", "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", - "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в .nbt файл.", + "item.create.schematic_and_quill.tooltip.summary": "Используется для сохранения структуры в вашем мире в файл .nbt.", "item.create.schematic_and_quill.tooltip.condition1": "Шаг 1", - "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две точки с помощью ПКМ", + "item.create.schematic_and_quill.tooltip.behaviour1": "Выберите две угловые точки, используя ПКМ.", "item.create.schematic_and_quill.tooltip.condition2": "Шаг 2", - "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl-КолМыши_ на сторону для изменения размера. ПКМ еще раз для сохранения.", + "item.create.schematic_and_quill.tooltip.behaviour2": "_Ctrl_ и _прокрутка_ на голограмме для изменения размера. Нажмите ПКМ, чтобы сохранить.", "item.create.schematic_and_quill.tooltip.control1": "ПКМ", - "item.create.schematic_and_quill.tooltip.action1": "Выбрать точку / Сохранить", - "item.create.schematic_and_quill.tooltip.control2": "С зажатым Ctrl", - "item.create.schematic_and_quill.tooltip.action2": "Выбрать точки в _воздухе._ _КолМыши_ для изменения расстояния.", + "item.create.schematic_and_quill.tooltip.action1": "Выберите угловые точки / подтвердите сохранение.", + "item.create.schematic_and_quill.tooltip.control2": "Удержание Ctrl", + "item.create.schematic_and_quill.tooltip.action2": "Выберите точки в воздухе. Прокрутка для настройки расстояния.", "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадясь", - "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _Удаляет_ выделение.", + "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _удаляет_ выделение.", "block.create.schematicannon.tooltip": "SCHEMATICANNON", - "block.create.schematicannon.tooltip.summary": "Стреляет блоками для воссоздания размещенной _Схемы._ Использует блоки из соседних инвентарей и _Порох_ в качестве топлива.", - "block.create.schematicannon.tooltip.control1": "ПКМ по пушке", - "block.create.schematicannon.tooltip.action1": "Открывает _Меню_", + "block.create.schematicannon.tooltip.summary": "_Ставит блоки_ для воссоздания _схематики_ в мире. Использует предметы из _соседнего_ _инвентаря_ и _порох_ в качестве _топлива_.", + "block.create.schematicannon.tooltip.control1": "ПКМ", + "block.create.schematicannon.tooltip.action1": "Открывает _интерфейс_", "block.create.schematic_table.tooltip": "SCHEMATIC TABLE", - "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схемы на _Пустые_ _схемы._", - "block.create.schematic_table.tooltip.condition1": "Если положить пустую схему.", - "block.create.schematic_table.tooltip.behaviour1": "Записывает выбранный файл из папки со схемами", + "block.create.schematic_table.tooltip.summary": "Записывает сохраненные схематики в _пустые_ _схематики_.", + "block.create.schematic_table.tooltip.condition1": "Когда дана пустая схема", + "block.create.schematic_table.tooltip.behaviour1": "Загружает выбранный файл из вашей папки Schematics.", "block.create.shaft.tooltip": "SHAFT", "block.create.shaft.tooltip.summary": "_Передаёт_ _вращение_ по прямой.", "block.create.cogwheel.tooltip": "COGWHEEL", - "block.create.cogwheel.tooltip.summary": "_Передаёт_ _вращение_ по прямой и к присоеденённым _Шестерням._", + "block.create.cogwheel.tooltip.summary": "_Передаёт_ _вращение_ по прямой и к присоединённым _шестерням._", "block.create.large_cogwheel.tooltip": "LARGE COGWHEEL", - "block.create.large_cogwheel.tooltip.summary": "Увеличенная версия _Шестерни,_ позволяющая _изменять_ _скорость_ _вращения_ при соединении с меньшим аналогом.", + "block.create.large_cogwheel.tooltip.summary": "_Увеличенная_ _версия_ _шестерни_, позволяющая изменять _скорость_ _вращения_ при подключении к _меньшей_ _шестерне_.", "block.create.encased_shaft.tooltip": "ENCASED SHAFT", "block.create.encased_shaft.tooltip.summary": "_Передаёт_ _вращение_ по прямой. Подходит для передачи вращения через стены.", @@ -1123,383 +1175,383 @@ "block.create.gearbox.tooltip.summary": "_Передаёт_ _вращение_ в _4_ _направлениях._ Реверсирует прямые соединения.", "block.create.gearshift.tooltip": "GEARSHIFT", - "block.create.gearshift.tooltip.summary": "_Переключатель_ _вращения_ для подсоединенных валов.", - "block.create.gearshift.tooltip.condition1": "Когда запитан", - "block.create.gearshift.tooltip.behaviour1": "_Реверсирует_ выходящее _вращение._", + "block.create.gearshift.tooltip.summary": "_Управляет_ _направлением_ _вращения_ для соединенных валов.", + "block.create.gearshift.tooltip.condition1": "Когда приведён в действие", + "block.create.gearshift.tooltip.behaviour1": "_Изменяет_ исходящее вращение.", "block.create.clutch.tooltip": "CLUTCH", - "block.create.clutch.tooltip.summary": "_Переключатель_ _вращения_ для подсоединенных валов.", - "block.create.clutch.tooltip.condition1": "Когда запитан", - "block.create.clutch.tooltip.behaviour1": "_Останавливает_ подачу вращения на другую сторону.", + "block.create.clutch.tooltip.summary": "_Управляет_ _включением_/_выключением вращения для соединенных валов.", + "block.create.clutch.tooltip.condition1": "Когда приведён в действие", + "block.create.clutch.tooltip.behaviour1": "_Прекращает_ передачу вращения на другую сторону.", "block.create.encased_belt.tooltip": "ENCASED_BELT", - "block.create.encased_belt.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоеденённому _Ленточному_ _приводу._", - "block.create.encased_belt.tooltip.condition1": "При присоеденёнии к другому Ленточному приводу", - "block.create.encased_belt.tooltip.behaviour1": "Присоеденённый блок будет иметь те же _скорость_ и _направление_ _вращения._ Присоеденённые ленты не обязаны смотреть в ту же сторону.", + "block.create.encased_belt.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоединённому конвейерному приводу.", + "block.create.encased_belt.tooltip.condition1": "Когда подключён", + "block.create.encased_belt.tooltip.behaviour1": "Прикреплённые блоки будут иметь одинаковую скорость вращения и направление. Присоединённые приводы не обязаны смотреть в ту же сторону.", - "block.create.adjustable_pulley.tooltip": "UNLOCALIZED: ANALOG BELT PULLEY", - "block.create.adjustable_pulley.tooltip.summary": "UNLOCALIZED: _Relays_ _Rotation_ through its block and to attached _Encased_ _Belts_. Attached encased belts will _rotate_ _faster_ based on the _analog_ _redstone_ _signal_ this block receives.", - "block.create.adjustable_pulley.tooltip.condition1": "UNLOCALIZED: Redstone Control", - "block.create.adjustable_pulley.tooltip.behaviour1": "UNLOCALIZED: Without a signal, it will _not_ _speed_ _up_ connected belts. With a full strength signal connected belt, speed _doubles_.", + "block.create.adjustable_pulley.tooltip": "ANALOG BELT PULLEY", + "block.create.adjustable_pulley.tooltip.summary": "_Передаёт_ _вращение_ через себя и к присоединённому конвейерному приводу. При подаче _аналогового_ _сигнала_ _красного_ _камня_ привод будет вращаться _в_ _2_ _раза_ _быстрее_.", + "block.create.adjustable_pulley.tooltip.condition1": "Управление сигналом красивого камня", + "block.create.adjustable_pulley.tooltip.behaviour1": "_Без_ сигнала он _не_ ускорит работу подключённых приводов. При _полной_ _мощности_ сигнала, _скорость_ _удваивается_.", "item.create.belt_connector.tooltip": "BELT CONNECTOR", - "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _Механической_ _ленты._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _Конвейер_ для _Существ._", + "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", "item.create.belt_connector.tooltip.control1": "ПКМ по валу", - "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива ленты. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению ленты.", + "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива конвейера. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению конвейера.", "item.create.belt_connector.tooltip.control2": "ПКМ крадясь", - "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для ленты.", + "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для конвейера.", - "item.create.goggles.tooltip": "UNLOCALIZED: GOGGLES", - "item.create.goggles.tooltip.summary": "UNLOCALIZED: A pair of glasses to augment your vision with useful _kinetic_ _information_.", - "item.create.goggles.tooltip.condition1": "UNLOCALIZED: When worn", - "item.create.goggles.tooltip.behaviour1": "UNLOCALIZED: Shows _colored_ _indicators_ corresponding to the _Speed_ _Level_ of a placed kinetic component as well as _Stress_ _Impact_ and _Capacity_ of individual components.", - "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", - "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + "item.create.goggles.tooltip": "GOGGLES", + "item.create.goggles.tooltip.summary": "Очки для улучшения зрения с помощью полезной кинетической информации.", + "item.create.goggles.tooltip.condition1": "При ношении", + "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также воздействию момента и мощности отдельных компонентов.", + "item.create.goggles.tooltip.condition2": "При взгляде на датчик", + "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или моменте сети, к которой подключён датчик.", - "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", - "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", - "item.create.wrench.tooltip.control1": "UNLOCALIZED: Right-Click a kinetic block", - "item.create.wrench.tooltip.action1": "UNLOCALIZED: _Rotates_ _components_ toward or away from the face with which you interacted.", - "item.create.wrench.tooltip.control2": "UNLOCALIZED: R-Click while Sneaking", - "item.create.wrench.tooltip.action2": "UNLOCALIZED: _Disassembles_ _Kinetic_ _components_ and places them back in _your_ _inventory_.", + "item.create.wrench.tooltip": "WRENCH", + "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", + "item.create.wrench.tooltip.control1": "ПКМ по кинетическому блоку", + "item.create.wrench.tooltip.action1": "_Поворачивает_ _компонент_ с которым вы взаимодействуете _к_ _лицу_ или _от_ _лица_.", + "item.create.wrench.tooltip.control2": "ПКМ крадясь", + "item.create.wrench.tooltip.action2": "Разбирает кинетические компоненты и помещает их обратно в ваш инвентарь.", - "block.create.creative_motor.tooltip": "UNLOCALIZED: CREATIVE MOTOR", - "block.create.creative_motor.tooltip.summary": "UNLOCALIZED: A configurable source of _Rotational_ _Force_.", + "block.create.creative_motor.tooltip": "CREATIVE MOTOR", + "block.create.creative_motor.tooltip.summary": "Настраиваемый источник вращательной силы.", "block.create.water_wheel.tooltip": "WATER WHEEL", "block.create.water_wheel.tooltip.summary": "Предоставляет _силу_ _вращения_ из смежных _источников_ _воды._", "block.create.encased_fan.tooltip": "ENCASED FAN", - "block.create.encased_fan.tooltip.summary": "Преобразовывает _силу_ _вращения_ в _воздушный_ _поток_ и обратно. Имеет множество применений.", - "block.create.encased_fan.tooltip.condition1": "При нахождении над огнём", - "block.create.encased_fan.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ (должен стоять вертикально)", + "block.create.encased_fan.tooltip.summary": "_Преобразует_ _вращательную_ _силу_ в _воздушные_ _потоки_ и обратно. Имеет множество применений.", + "block.create.encased_fan.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.encased_fan.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ от любых _источников_ _тепла_, непосредственно под собой. Вентилятор должен быть обращен вниз.", "block.create.encased_fan.tooltip.condition2": "При вращении", - "block.create.encased_fan.tooltip.behaviour2": "_Толкает_ существ с одной стороны, _притягивает_ с другой. Сила и скорость зависят от входящего вращения.", - "block.create.encased_fan.tooltip.condition3": "Когда воздух проходит через специальные блоки", - "block.create.encased_fan.tooltip.behaviour3": "Обрабатывает предметы перед блоком: _вода_ моет, _огонь_ коптит, _лава_ плавит.", + "block.create.encased_fan.tooltip.behaviour2": "Толкает или вытягивает объекты в зависимости от направления вращения.", + "block.create.encased_fan.tooltip.condition3": "При продувке через специальные блоки", + "block.create.encased_fan.tooltip.behaviour3": "_Жидкости_ и _частицы_ _огня_ выбрасываются в _воздушный_ _поток_. Это может быть использовано для _обработки_ _предметов_.", - "block.create.nozzle.tooltip": "UNLOCALIZED: NOZZLE", - "block.create.nozzle.tooltip.summary": "UNLOCALIZED: Attach to the front of an _Encased_ _Fan_ to distribute its effect on Entities in _all_ _directions_.", + "block.create.nozzle.tooltip": "NOZZLE", + "block.create.nozzle.tooltip.summary": "Прикрепите к передней части _вентилятора_, чтобы распределить его влияние на сущностей _во_ _всех_ _направлениях_.", - "block.create.hand_crank.tooltip": "UNLOCALIZED: HAND CRANK", - "block.create.hand_crank.tooltip.summary": "UNLOCALIZED: A simple _source_ of _Rotational_ _Force_ that requires the interaction of players. Be careful not to wear yourself out!", - "block.create.hand_crank.tooltip.condition1": "UNLOCALIZED: When Used", - "block.create.hand_crank.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.hand_crank.tooltip": "HAND CRANK", + "block.create.hand_crank.tooltip.summary": "Простой _источник_ _вращательной_ _силы_, требующий взаимодействия игроков.", + "block.create.hand_crank.tooltip.condition1": "При использовании", + "block.create.hand_crank.tooltip.behaviour1": "Предоставляет _силу_ _вращения_ прикреплённому приспособлению. Крадитесь, чтобы повернуть вращение вспять.", - "block.create.cuckoo_clock.tooltip": "UNLOCALIZED: CUCKOO CLOCK", - "block.create.cuckoo_clock.tooltip.summary": "UNLOCALIZED: Fine craftsmanship for _decorating_ a space and _keeping_ _track_ _of_ _time_.", - "block.create.cuckoo_clock.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.cuckoo_clock.tooltip.behaviour1": "UNLOCALIZED: Shows the _current_ _time_ and plays a tune twice a day. _Activates_ once at _noon_ and at dusk, as soon as _players_ _can_ _sleep_.", + "block.create.cuckoo_clock.tooltip": "CUCKOO CLOCK", + "block.create.cuckoo_clock.tooltip.summary": "_Прекрасное_ _мастерство_ для _украшения_ пространства и _отслеживания_ _времени_.", + "block.create.cuckoo_clock.tooltip.condition1": "При вращении", + "block.create.cuckoo_clock.tooltip.behaviour1": "Показывает текущее время и напевает мелодию два раза в день. _Активируется_ _один_ _раз_ в _полдень_ и в _сумерках_, как только _игроки_ _могут_ _спать_.", "block.create.turntable.tooltip": "TURNTABLE", "block.create.turntable.tooltip.summary": "Преобразует _силу_ _вращения_ прямиком в морскую болезнь.", - "block.create.millstone.tooltip": "UNLOCALIZED: MILLSTONE", - "block.create.millstone.tooltip.summary": "UNLOCALIZED: A kinetic component suitable for _grinding_ inserted _materials_. Can be powered by an adjacent cogwheel or by connecting to the shaft at the bottom. Results have to be extracted from the component.", - "block.create.millstone.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.millstone.tooltip.behaviour1": "UNLOCALIZED: Starts applying _milling_ _recipes_ to any items inserted from the side or the top of the block.", - "block.create.millstone.tooltip.condition2": "UNLOCALIZED: When R-Clicked", - "block.create.millstone.tooltip.behaviour2": "UNLOCALIZED: Collects the outputs manually.", + "block.create.millstone.tooltip": "MILLSTONE", + "block.create.millstone.tooltip.summary": "Кинетический компонент, подходящий для _измельчения_ вставленных _материалов_. Может быть приведён в действие шестернёй или соединенён с валом внизу. Результаты должны быть извлечены из компонента.", + "block.create.millstone.tooltip.condition1": "При вращении", + "block.create.millstone.tooltip.behaviour1": "Начинает применять рецепты дробления к любым предметам, вставленным сбоку или сверху блока.", + "block.create.millstone.tooltip.condition2": "При ПКМ", + "block.create.millstone.tooltip.behaviour2": "Измельчённые материалы следует извлекать вручную.", "block.create.crushing_wheel.tooltip": "CRUSHING WHEEL", - "block.create.crushing_wheel.tooltip.summary": "Большие вращающиеся колеса, которые _дробят_ всё, что мешает их движению.", - "block.create.crushing_wheel.tooltip.condition1": "При присоеденении к другому дробильному колесу", - "block.create.crushing_wheel.tooltip.behaviour1": "Формирует дробильную установку для обработки различных вещей. Зубцы колёс должны соединяться и двигаться с _одинаковой_ _скоростью_ в _противоположных_ _направлениях._", + "block.create.crushing_wheel.tooltip.summary": "Большие вращающиеся колёса, которые _ломают_ _всё_ что угодно.", + "block.create.crushing_wheel.tooltip.condition1": "При присоединении к другому колесу дробления", + "block.create.crushing_wheel.tooltip.behaviour1": "Образует дробильную машину для обработки самых разных вещей. Зубья колёс должны _соединяться_ и _двигаться_ с _одинаковой_ _скоростью_ в _противоположных_ _направлениях_.", "block.create.mechanical_press.tooltip": "MECHANICAL PRESS", - "block.create.mechanical_press.tooltip.summary": "Мощный поршень для спрессовывания предметов под ним. Требуется постоянная _сила_ _вращения._", - "block.create.mechanical_press.tooltip.condition1": "Когда запитан", - "block.create.mechanical_press.tooltip.behaviour1": "_Начинает_ спрессовывать предметы под ним.", - "block.create.mechanical_press.tooltip.condition2": "При нахождении над механической лентой", - "block.create.mechanical_press.tooltip.behaviour2": "_Автоматически_ спрессовывает проходящие по ленте предметы.", - "block.create.mechanical_press.tooltip.condition3": "UNLOCALIZED: When above Basin", - "block.create.mechanical_press.tooltip.behaviour3": "UNLOCALIZED: Starts to _compact_ _items_ in the basin whenever all necessary ingredients are present.", + "block.create.mechanical_press.tooltip.summary": "Силовой поршень для сжатия предметов под ним. Требуется _постоянная_ _вращательная_ _сила_.", + "block.create.mechanical_press.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.mechanical_press.tooltip.behaviour1": "_Начинает_ сжимать предметы, упавшие под него.", + "block.create.mechanical_press.tooltip.condition2": "Когда над конвейером", + "block.create.mechanical_press.tooltip.behaviour2": "_Автоматически_ спрессовывает проходящие по конвейеру предметы.", + "block.create.mechanical_press.tooltip.condition3": "Когда над чашей", + "block.create.mechanical_press.tooltip.behaviour3": "Начинает _компактировать_ _предметы_ в чаше, когда присутствуют все необходимые ингредиенты.", - "block.create.basin.tooltip": "UNLOCALIZED: BASIN", - "block.create.basin.tooltip.summary": "UNLOCALIZED: A handy _item_ _container_ used in processing with the _Mechanical_ _Mixer_ and the _Mechanical_ _Press_. Supports _Redstone_ _Comparators_.", + "block.create.basin.tooltip": "BASIN", + "block.create.basin.tooltip.summary": "Удобный _контейнер_ _для_ _предметов_, используемый при обработке _механическим_ _смешивателем_ и _механическим прессом_. Поддерживает компараторы.", "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", "block.create.blaze_heater.tooltip.behaviour3": "UNLOCALIZED: Increases the remaining burn time by the furnace brn time of the used item. Consumes the item. Use _special_ _fuel_ for best results.", - "block.create.reinforced_rail.tooltip": "UNLOCALIZED: REINFORCED RAIL", - "block.create.reinforced_rail.tooltip.summary": "UNLOCALIZED: A timber stabilized rail, _does_ _not_ _need_ _supports_.", + "block.create.reinforced_rail.tooltip": "REINFORCED RAIL", + "block.create.reinforced_rail.tooltip.summary": "Рельсы, которые не нуждаются в поддержке.", - "block.create.mechanical_mixer.tooltip": "UNLOCALIZED: MECHANICAL MIXER", - "block.create.mechanical_mixer.tooltip.summary": "UNLOCALIZED: A kinetic whisk for applying any shapeless crafting recipes to items beneath it. Requires constant _Rotational_ _Force_ and a _Basin_ placed below (with a gap in between).", - "block.create.mechanical_mixer.tooltip.condition1": "UNLOCALIZED: When above Basin", - "block.create.mechanical_mixer.tooltip.behaviour1": "UNLOCALIZED: Starts to mix items in the basin whenever all necessary ingredients are present.", - "block.create.mechanical_mixer.tooltip.condition2": "UNLOCALIZED: When used with Wrench", - "block.create.mechanical_mixer.tooltip.behaviour2": "UNLOCALIZED: _Configures_ the minimum amount of _total_ _ingredients_ for applied recipes. Use this option to _rule_ _out_ _unwanted_ _recipes_ with similar but less ingredients.", + "block.create.mechanical_mixer.tooltip": "MECHANICAL MIXER", + "block.create.mechanical_mixer.tooltip.summary": "Кинетический венчик, используемый для смешивания предметов, находящихся под ним. Требуется _постоянная_ _вращательная_ _сила_ и _чаша_, расположенная внизу (с промежутком между ними).", + "block.create.mechanical_mixer.tooltip.condition1": "Когда над чашей", + "block.create.mechanical_mixer.tooltip.behaviour1": "Начинает смешивать предметы в бассейне, когда присутствуют все необходимые ингредиенты.", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", - "block.create.mechanical_crafter.tooltip": "UNLOCALIZED: MECHANICAL CRAFTER", - "block.create.mechanical_crafter.tooltip.summary": "UNLOCALIZED: A kinetic assembler for _automating_ any _shaped_ _crafting_ recipe. Place _multiple_ _in_ _a_ _grid_ corresponding to your recipe, and _arrange_ _their_ _belts_ to create a _flow_ that exits the grid on one of the crafters.", - "block.create.mechanical_crafter.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.mechanical_crafter.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _the_ _crafting_ _process_ as soon as _all_ _crafters_ in the grid have been _given_ _an_ _item_.", - "block.create.mechanical_crafter.tooltip.condition2": "UNLOCALIZED: On Redstone Pulse", - "block.create.mechanical_crafter.tooltip.behaviour2": "UNLOCALIZED: _Forces_ the start of the _crafting_ _process_ with all currently given _items_ in the grid.", - "block.create.mechanical_crafter.tooltip.control1": "UNLOCALIZED: When Wrenched at Front", - "block.create.mechanical_crafter.tooltip.action1": "UNLOCALIZED: _Cycles_ _the_ _direction_ an individual crafter _moves_ _its_ _items_ towards. To form a working grid, _arrange_ _the_ _belts_ _in_ _a_ _flow_ which moves all items towards a final crafter. The final crafter must _point_ _away_ from the grid.", - "block.create.mechanical_crafter.tooltip.control2": "UNLOCALIZED: When Wrenched at back", - "block.create.mechanical_crafter.tooltip.action2": "UNLOCALIZED: _Connects_ the _input_ _inventory_ of adjacent crafters. Use this to _combine_ _slots_ in the crafting grid and _save_ _on_ _input_ _work_.", + "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", + "block.create.mechanical_crafter.tooltip.summary": "_Кинетический_ _сборщик_ для автоматизации любого рецепта крафта. _Поместите_ _ингредиенты_ в сетку, _соответственно_ _нужному_ _рецепту_, и расположите их так, чтобы _создать_ _поток_, который _кончается_ на одном из крафтеров.", + "block.create.mechanical_crafter.tooltip.condition1": "При вращении", + "block.create.mechanical_crafter.tooltip.behaviour1": "Начинает процесс изготовления, как только _всем_ _крафтерам_ _в_ _сетке_ _даётся_ _предмет_.", + "block.create.mechanical_crafter.tooltip.condition2": "При подаче сигнала красного камня", + "block.create.mechanical_crafter.tooltip.behaviour2": "Вызывает начало процесса крафта со всеми заданными в данный момент предметами в сетке.", + "block.create.mechanical_crafter.tooltip.control1": "Когда вывернут наизнанку спереди", + "block.create.mechanical_crafter.tooltip.action1": "_Зацикливает_ _направление_, в котором отдельный крафтер перемещает свои предметы. Чтобы сформировать рабочую сетку, расположите крафтеры в потоке, который перемещает все предметы к конечному кратеру. Конечный должен указывать в сторону от сетки.", + "block.create.mechanical_crafter.tooltip.control2": "Когда вывернут на спину", + "block.create.mechanical_crafter.tooltip.action2": "_Подключает_ _входной_ _инвентарь_ соседних крафтеров. Используйте это, чтобы объединить слоты в сетке крафта и сэкономить на вызоде.", - "block.create.furnace_engine.tooltip": "UNLOCALIZED: FURNACE ENGINE", - "block.create.furnace_engine.tooltip.summary": "UNLOCALIZED: A powerful source of _Rotational_ _Power_ that requires a _running_ _furnace_ to work.", - "block.create.furnace_engine.tooltip.condition1": "UNLOCALIZED: When Attached to Lit Furnace", - "block.create.furnace_engine.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _powering_ a _Flywheel_ placed in front of it (1m apart). Use a Blast Furnace for higher speeds.", + "block.create.furnace_engine.tooltip": "FURNACE ENGINE", + "block.create.furnace_engine.tooltip.summary": "_Мощный_ источник _энергии_ _вращения_, для работы которого требуется _работающая_ _печь.", + "block.create.furnace_engine.tooltip.condition1": "Когда прикреплен к работающей печи", + "block.create.furnace_engine.tooltip.behaviour1": "_Начинает_ _приводить_ _в_ _действие_ _маховик_, расположенный _перед_ ним (на расстоянии 1 м). Используйте доменную печь для более высоких скоростей.", - "block.create.flywheel.tooltip": "UNLOCALIZED: FLYWHEEL", - "block.create.flywheel.tooltip.summary": "UNLOCALIZED: A large metal wheel to _harness_ _and_ _stabilize_ generated force by an _attached_ _Engine_. Flywheels connect to engines if they are _1m_ _apart_ and at a _90°_ _Angle_ from each other.", - "block.create.flywheel.tooltip.condition1": "UNLOCALIZED: When Attached to Running Engine", - "block.create.flywheel.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to a connected contraption based on the generator's strength and speed.", + "block.create.flywheel.tooltip": "FLYWHEEL", + "block.create.flywheel.tooltip.summary": "Большое металлическое колесо для _удержания_ и _стабилизации_ создаваемой силы с помощью _прикреплённого_ _двигателя_. Маховики _соединяются_ с _двигателями_, если они находятся на расстоянии _1_ _м_ друг от друга и под углом _90°_ друг к другу.", + "block.create.flywheel.tooltip.condition1": "При подключении к работающему двигателю", + "block.create.flywheel.tooltip.behaviour1": "Обеспечивает вращательную силу для подключенного устройства в зависимости от силы и скорости генератора.", - "block.create.portable_storage_interface.tooltip": "UNLOCALIZED: PORTABLE STORAGE INTERFACE", - "block.create.portable_storage_interface.tooltip.summary": "UNLOCALIZED: A portable interchange point for _moving_ _items_ to and from a _structure_ moved by a piston, bearing, minecart, or pulley.", - "block.create.portable_storage_interface.tooltip.condition1": "UNLOCALIZED: While Moving", - "block.create.portable_storage_interface.tooltip.behaviour1": "UNLOCALIZED: Interacts with stationary _transposers_ such that transposers _facing_ _away_ from the interface _pull_ _items_, and transposers targeting the interface will _insert_ _items_ from attached inventory. The contraption will briefly stall as items are exchanged.", + "block.create.portable_storage_interface.tooltip": "PORTABLE STORAGE INTERFACE", + "block.create.portable_storage_interface.tooltip.summary": "Переносная точка обмена для _перемещения_ предметов в и из _конструкции_, перемещаемой поршнем, шасси, вагонеткой или конвейром.", + "block.create.portable_storage_interface.tooltip.condition1": "Во время движения", + "block.create.portable_storage_interface.tooltip.behaviour1": "Взаимодействует со стационарными переместителями так, что переместители, обращенные в сторону от интерфейса, вытягивают предметы, а транспортеры, нацеленные на интерфейс, вставляют предметы из прикреплённого инвентаря. Конструкция ненадолго остановится при обмене предметов.", - "block.create.rotation_speed_controller.tooltip": "UNLOCALIZED: ROTATION SPEED CONTROLLER", - "block.create.rotation_speed_controller.tooltip.summary": "UNLOCALIZED: A _configurable_ _relay_ able to speed up or slow down the target component to any desired speed.", - "block.create.rotation_speed_controller.tooltip.condition1": "UNLOCALIZED: When Attached to Large Cogwheel", - "block.create.rotation_speed_controller.tooltip.behaviour1": "UNLOCALIZED: Relays incoming rotational force to the wheel, trying to _match_ the _speed_ it is configured to target. The _cogwheel_ has to be _attached_ _on_ _top_ of the controller.", + "block.create.rotation_speed_controller.tooltip": "ROTATION SPEED CONTROLLER", + "block.create.rotation_speed_controller.tooltip.summary": "_Настраиваемое_ _реле_, способное _ускорять_ или _замедлять_ скорость до любой желаемой.", + "block.create.rotation_speed_controller.tooltip.condition1": "Когда прикреплено к большой шестерне", + "block.create.rotation_speed_controller.tooltip.behaviour1": "Передаёт поступающее вращательное усилие на шестерню, пытаясь соответствовать скорости, на которую оно настроено. Шестерня должна быть прикреплена к верхней части контроллера.", "block.create.mechanical_piston.tooltip": "MECHANICAL PISTON", - "block.create.mechanical_piston.tooltip.summary": "Более продвинутая версия _Поршня,_ использующая _силу_ _вращения_ для более точного перемещения присоединенных конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без удлинителей поршень не будет двигаться. Используйте _Поступательную_ _раму_ для перемещения более чем одной линии блоков.", + "block.create.mechanical_piston.tooltip.summary": "Более продвинутая версия _поршня_. Он использует _силу_ _вращения_ для _точного_ перемещения прикреплённых конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без _удлинителей_ поршень _не_ будет двигаться. Используйте блоки _шасси_ или _слизи_, чтобы перемещать _более_ одной линии блоков.", "block.create.mechanical_piston.tooltip.condition1": "При вращении", - "block.create.mechanical_piston.tooltip.behaviour1": "Начинает перемещать прикрепленную конструкцию. Скорость и направление зависят от входящего вращения.", + "block.create.mechanical_piston.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", "block.create.sticky_mechanical_piston.tooltip": "STICKY MECHANICAL PISTON", - "block.create.sticky_mechanical_piston.tooltip.summary": "Более продвинутая версия _Липкого_ _поршня,_ использующая _силу_ _вращения_ для более точного перемещения присоединенных конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без удлинителей поршень не будет двигаться. Используйте _Поступательную_ _раму_ для перемещения более чем одной линии блоков.", + "block.create.sticky_mechanical_piston.tooltip.summary": "Более продвинутая версия _липкого_ _поршня_. Он использует _силу_ _вращения_ для _точного_ перемещения прикреплённых конструкций. _Удлинители_ _поршня_ сзади определяют _длину_ устройства. Без _удлинителей_ поршень _не_ будет двигаться. Используйте блоки _шасси_ или _слизи_, чтобы перемещать _более_ одной линии блоков.", "block.create.sticky_mechanical_piston.tooltip.condition1": "При вращении", - "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Начинает перемещать прикрепленную конструкцию. Скорость и направление зависят от входящего вращения.", + "block.create.sticky_mechanical_piston.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", "block.create.piston_extension_pole.tooltip": "PISTON POLE", - "block.create.piston_extension_pole.tooltip.summary": "Используется для увеличения длины _Механического_ _поршня._", - "block.create.piston_extension_pole.tooltip.condition1": "При присоеденении к механическому поршню", - "block.create.piston_extension_pole.tooltip.behaviour1": "Увеличивает длину поршня на 1 блок", + "block.create.piston_extension_pole.tooltip.summary": "Используется для увеличения длины _механического_ _поршня_.", + "block.create.piston_extension_pole.tooltip.condition1": "При присоединении к механическому поршню", + "block.create.piston_extension_pole.tooltip.behaviour1": "Расширяет диапазон поршня на 1 блок", "block.create.mechanical_bearing.tooltip": "MECHANICAL BEARING", - "block.create.mechanical_bearing.tooltip.summary": "Используется для вращения _больших_ конструкций_ или генерации _силы_ _вращения_ с помощью ветра.", + "block.create.mechanical_bearing.tooltip.summary": "Используется для _вращения_ _больших_ _конструкций_ или генерации _силы_ _вращения_ с помощью ветра.", "block.create.mechanical_bearing.tooltip.condition1": "При вращении", - "block.create.mechanical_bearing.tooltip.behaviour1": "Начинает вращать присоединенную _Поворотную_ _раму_ и связанные с ним блоки.", - "block.create.mechanical_bearing.tooltip.condition2": "Когда запитан", - "block.create.mechanical_bearing.tooltip.behaviour2": "Начинает предоставлять _силу_ _вращения_ из вращения присоединенной конструкции. Структура должна включать подходящий _парус_ (в настоящее время любой блок шерсти).", + "block.create.mechanical_bearing.tooltip.behaviour1": "Начинает вращение прикреплённых блоков. Используйте блоки шасси или слизи, чтобы перемещать более одного блока.", + "block.create.mechanical_bearing.tooltip.condition2": "При подаче сигнала красного камня", + "block.create.mechanical_bearing.tooltip.behaviour2": "Обеспечивает вращательную силу, создаваемую вращением прикреплённой структуры. Структура должна включать подходящие _парусные_ _блоки_ (в настоящее время любой шерстяной блок).", - "block.create.clockwork_bearing.tooltip": "UNLOCALIZED: CLOCKWORK BEARING", - "block.create.clockwork_bearing.tooltip.summary": "UNLOCALIZED: An advanced version of the _Mechanical_ _Bearing_ for rotating up to two _clock_ _hands_ according to current _in-game_ _time_.", - "block.create.clockwork_bearing.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.clockwork_bearing.tooltip.behaviour1": "UNLOCALIZED: Starts rotating the attached Structure towards the _current_ _hour_. If an independent second structure exists in front of the first one, it will serve as the _minute_ _hand_.", + "block.create.clockwork_bearing.tooltip": "CLOCKWORK BEARING", + "block.create.clockwork_bearing.tooltip.summary": "Усовершенствованная версия _радиального_ _шасси_ для вращения _до_ _двух_ стрелок в соответствии с текущим _игровым_ _временем_.", + "block.create.clockwork_bearing.tooltip.condition1": "При вращении", + "block.create.clockwork_bearing.tooltip.behaviour1": "Начинает вращать прикреплённую структуру в направлении _текущего_ _часа_. Если независимая _вторая_ _структура_ существует _перед_ первой, она будет служить _минутной_ _стрелкой_.", - "block.create.sequenced_gearshift.tooltip": "UNLOCALIZED: SEQUENCED GEARSHIFT", - "block.create.sequenced_gearshift.tooltip.summary": "UNLOCALIZED: A _programmable_ _utility_ _component,_ which can change its _rotational_ _through-put_ according to up to _5_ _consecutive_ _instructions._ Use this to power Mechanical Bearings, Pistons or Pulleys with more control over timing and speed. May become less precise at higher speeds.", - "block.create.sequenced_gearshift.tooltip.condition1": "UNLOCALIZED: When Powered by Redstone", - "block.create.sequenced_gearshift.tooltip.behaviour1": "UNLOCALIZED: _Starts_ _executing_ programmed instructions based on the input speed.", - "block.create.sequenced_gearshift.tooltip.condition2": "UNLOCALIZED: When R-Clicked", - "block.create.sequenced_gearshift.tooltip.behaviour2": "UNLOCALIZED: Opens the _configuration_ _interface._", + "block.create.sequenced_gearshift.tooltip": "SEQUENCED GEARSHIFT", + "block.create.sequenced_gearshift.tooltip.summary": "_Программируемый_ компонент, который может _изменять_ свою _скорость_ вращения в соответствии с _5_ _последовательными_ _инструкциями._ Используйте это для питания _радиального_ _шасси_, _поршней_ или _конвейров_ с большим контролем _времени_ и _скорости_. Может стать менее точным на более высоких скоростях.", + "block.create.sequenced_gearshift.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.sequenced_gearshift.tooltip.behaviour1": "Начинает выполнять _запрограммированные_ _инструкции_ на основе _скорости_ ввода.", + "block.create.sequenced_gearshift.tooltip.condition2": "При ПКМ", + "block.create.sequenced_gearshift.tooltip.behaviour2": "Открывается _интерфейс_ _конфигурации_.", - "block.create.cart_assembler.tooltip": "UNLOCALIZED: CART ASSEMBLER", - "block.create.cart_assembler.tooltip.summary": "UNLOCALIZED: When _placed_ _on_ a _Rail_, adopts functionality and _assembles/disassembles_ _structures_ on passing _carts_.", - "block.create.cart_assembler.tooltip.condition1": "UNLOCALIZED: When placed above Rail", - "block.create.cart_assembler.tooltip.behaviour1": "UNLOCALIZED: _Assembles_ onto passing _carts_ _when_ _powered_, _disassembles_ them _otherwise_.", - "block.create.cart_assembler.tooltip.condition2": "UNLOCALIZED: When placed above Powered Rail", - "block.create.cart_assembler.tooltip.behaviour2": "UNLOCALIZED: _Assembles_ and _accelerates_ _carts_ _when_ _powered_, _disassembles_ and _holds_ them _otherwise_.", - "block.create.cart_assembler.tooltip.condition3": "UNLOCALIZED: When placed above Detector Rail", - "block.create.cart_assembler.tooltip.behaviour3": "UNLOCALIZED: _Assembles_ unassembled _carts_, _disassembles_ assembled _carts_.", - "block.create.cart_assembler.tooltip.condition4": "UNLOCALIZED: When placed above Activator Rail", - "block.create.cart_assembler.tooltip.behaviour4": "UNLOCALIZED: _Disassembles_ _carts_ when _powered_.", + "block.create.cart_assembler.tooltip": "CART ASSEMBLER", + "block.create.cart_assembler.tooltip.summary": "При _размещении_ _над_ _рельсами_ принимает функциональные возможности и _собирает/разбирает_ конструкции на _вагонетках_.", + "block.create.cart_assembler.tooltip.condition1": "При размещении над рельсами", + "block.create.cart_assembler.tooltip.behaviour1": "По умолчанию _разбирает_ _вагонетки_, _при_ _подаче_ _сигнала_ красного камня _собирает-.", + "block.create.cart_assembler.tooltip.condition2": "При размещении над энергорельсами", + "block.create.cart_assembler.tooltip.behaviour2": "_Собирает_ и _ускоряет_ вагонетки _при_ _сигнале_ красного камня, в противном случае _разбирает_ и _удерживает_ их.", + "block.create.cart_assembler.tooltip.condition3": "При размещении над рельсами с датчиком", + "block.create.cart_assembler.tooltip.behaviour3": "_Собирает_ _разобранные_ вагонетки, _разбирает_ _собранные_ вагонетки.", + "block.create.cart_assembler.tooltip.condition4": "При размещении над активирующими рельсами", + "block.create.cart_assembler.tooltip.behaviour4": "_Разбирает_ _тележки_ _при_ сигнале_ красного камня.", - "block.create.rope_pulley.tooltip": "UNLOCALIZED: ROPE PULLEY", - "block.create.rope_pulley.tooltip.summary": "UNLOCALIZED: Moves attached _blocks_ and _structures_ _vertically_. Use _Chassis_ or _Slime_ _Blocks_ to move more than a single block.", - "block.create.rope_pulley.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.rope_pulley.tooltip.behaviour1": "UNLOCALIZED: Starts moving the attached structure. Speed and direction correlate to the incoming Rotation Speed.", + "block.create.rope_pulley.tooltip": "ROPE PULLEY", + "block.create.rope_pulley.tooltip.summary": "Перемещает прикреплённые _блоки_ и _конструкции_ по _вертикали_. Используйте блоки _шасси_ или _слизи_, чтобы перемещать более одного блока.", + "block.create.rope_pulley.tooltip.condition1": "При вращении", + "block.create.rope_pulley.tooltip.behaviour1": "Начинает двигаться прикреплённая конструкция. Скорость и направление коррелируют с входящей скоростью вращения.", "block.create.linear_chassis.tooltip": "TRANSLATION CHASSIS", - "block.create.linear_chassis.tooltip.summary": "Настраиваемая основа для конструкций, перемещаемых _Механическим_ _поршнем._ Эти блоки должны формировать первый слой блоков перед поршнем.", - "block.create.linear_chassis.tooltip.condition1": "При движении механическим поршнем", - "block.create.linear_chassis.tooltip.behaviour1": "_Перемещает_ все _прикрепленные_ _рамы_ с одинаковой ориентацией, и блоки перед ним. При возврате поршня в исходное положение блоки будут втягиваться, только если лицевая сторона рамы _липкая_ (см. [Ctrl]).", - "block.create.linear_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", - "block.create.linear_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", - "block.create.linear_chassis.tooltip.control1": "ПКМ со сгустком слизи", - "block.create.linear_chassis.tooltip.action1": "Делает выбранную сторону _липкой._ При возвращении поршня, рама будет _втягивать_ все подсоединенные блоки в своей колонне и в пределах заданного диапазона.", + "block.create.linear_chassis.tooltip.summary": "Настраиваемый базовый блок, соединяющий конструкции для перемещения.", + "block.create.linear_chassis.tooltip.condition1": "При движении", + "block.create.linear_chassis.tooltip.behaviour1": "_Перемещает_ все _подключённые_ _шасси_ с _одинаковой_ ориентацией, а также _столбец_ _блоков_ в пределах своего _диапазона_. Блоки будут вытягиваться только в том случае, если лицевая сторона шасси липкая (см. [Ctrl]).", + "block.create.linear_chassis.tooltip.condition2": "Используя гаечный ключ", + "block.create.linear_chassis.tooltip.behaviour2": "Настройте диапазон для этого блока шасси. Удерживайте CTRL, чтобы изменить диапазон всех подключённых блоков шасси.", + "block.create.linear_chassis.tooltip.control1": "ПКМ сгустком слизи", + "block.create.linear_chassis.tooltip.action1": "Делает нужную сторону липкой. При перемещении шасси будет тянуть прикреплённые блоки независимо от направления движения.", "block.create.secondary_linear_chassis.tooltip": "UNLOCALIZED: SECONDARY LINEAR CHASSIS", "block.create.secondary_linear_chassis.tooltip.summary": "UNLOCALIZED: A second type of _Linear_ _Chassis_ that does not connect to the other.", "block.create.radial_chassis.tooltip": "ROTATION CHASSIS", - "block.create.radial_chassis.tooltip.summary": "Требуется для вращающихся конструкций с _Механическим_ _подшипником._", - "block.create.radial_chassis.tooltip.condition1": "При вращении с помощью подшипника", - "block.create.radial_chassis.tooltip.behaviour1": "_Поворачивает_ все блоки, прикрепленные к _липким_ сторонам (см. [Ctrl]) в пределах заданного диапазона вокруг себя. _Передает_ вращение на присоединенные поворотные рамы.", - "block.create.radial_chassis.tooltip.condition2": "UNLOCALIZED: With Wrench", - "block.create.radial_chassis.tooltip.behaviour2": "UNLOCALIZED: Configure the _range_ for this chassis block. Hold CTRL to modify the range of all attached chassis blocks as well.", - "block.create.radial_chassis.tooltip.control1": "ПКМ со сгустком слизи", - "block.create.radial_chassis.tooltip.action1": "Делает выбранную сторону _липкой._ При вращении, все присоединенные блоки в пределах заданного диапазона будут вращаться вместе с ней.", + "block.create.radial_chassis.tooltip.summary": "Конфигурируемый базовый блок, соединяющий конструкции для движения.", + "block.create.radial_chassis.tooltip.condition1": "При движении", + "block.create.radial_chassis.tooltip.behaviour1": "_Перемещает_ все _прикреплённые_ _шасси_ в колонне, и цилиндр из блоков вокруг себя. Блоки вокруг него перемещаются только тогда, когда они находятся в пределах досягаемости и прикреплён к липкой стороне (см. [Ctrl]).", + "block.create.radial_chassis.tooltip.condition2": "Используя гаечный ключ", + "block.create.radial_chassis.tooltip.behaviour2": "Настройте диапазон для этого блока шасси. Удерживайте CTRL, чтобы изменить диапазон всех подключённых блоков шасси.", + "block.create.radial_chassis.tooltip.control1": "ПКМ сгустком слизи", + "block.create.radial_chassis.tooltip.action1": "Делает нужную сторону липкой. При перемещении шасси все обозначенные блоки, прикреплённые к липкой стороне, перемещаются вместе с ним.", - "block.create.mechanical_drill.tooltip": "MECHANICAL mechanical_drill", - "block.create.mechanical_drill.tooltip.summary": "Механическое устройство, пригодное для _разрушения_ _блоков._", + "block.create.mechanical_drill.tooltip": "MECHANICAL DRILL", + "block.create.mechanical_drill.tooltip.summary": "Механическое устройство, подходящее _для_ _разрушения_ _блоков_. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", "block.create.mechanical_drill.tooltip.condition1": "При вращении", "block.create.mechanical_drill.tooltip.behaviour1": "Действует как _стационарный_ разрушитель блоков. Также _наносит_ _урон_ _существам_ в рабочей области.", - "block.create.mechanical_drill.tooltip.condition2": "При движении механическим поршнем", - "block.create.mechanical_drill.tooltip.behaviour2": "Разрушает блоки, на которые наталкивается.", + "block.create.mechanical_drill.tooltip.condition2": "Во время движения", + "block.create.mechanical_drill.tooltip.behaviour2": "Ломает блоки, с которыми сталкивается.", - "block.create.mechanical_harvester.tooltip": "MECHANICAL mechanical_harvester", - "block.create.mechanical_harvester.tooltip.summary": "Механический резак для растений, подходящий для автоматизации выращивания средних растений", - "block.create.mechanical_harvester.tooltip.condition1": "При движении механическим поршнем", - "block.create.mechanical_harvester.tooltip.behaviour1": "_Срезает_ все _зрелые_ _посевы_ и сбрасывает их в исходное состояние роста.", + "block.create.mechanical_harvester.tooltip": "MECHANICAL HARVESTER", + "block.create.mechanical_harvester.tooltip.summary": "Механический кусторез, подходящий для автоматизации выращивания средних растений. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", + "block.create.mechanical_harvester.tooltip.condition1": "Во время движения", + "block.create.mechanical_harvester.tooltip.behaviour1": "_Собирает_ все _зрелые_ _культуры_, с которыми сталкивается лезвие, и возвращает их в исходное состояние роста.", - "block.create.mechanical_plough.tooltip": "UNLOCALIZED: MECHANICAL PLOUGH", - "block.create.mechanical_plough.tooltip.summary": "UNLOCALIZED: A mechanical plough has a variety of uses. It is movable with _Mechanical_ _Pistons_, _Bearings_ or other controllers.", - "block.create.mechanical_plough.tooltip.condition1": "UNLOCALIZED: While Moving", - "block.create.mechanical_plough.tooltip.behaviour1": "UNLOCALIZED: _Breaks_ _blocks_ which _cannot_ _be_ _collided_ with, such as torches, tracks or snow layers. _Applies_ its _motion_ to _entities_ without hurting them. _Tills_ _soil_ _blocks_ as though a Hoe would be used on them.", + "block.create.mechanical_plough.tooltip": "MECHANICAL PLOUGH", + "block.create.mechanical_plough.tooltip.summary": "Механический плуг имеет множество применений. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", + "block.create.mechanical_plough.tooltip.condition1": "Во время движения", + "block.create.mechanical_plough.tooltip.behaviour1": "_Разбивает блоки_, с которыми _невозможно_ _столкнуться_, например, факелы, дорожки пыли или слои снега. Применяет его движение к _сущностям_, не причиняя им _вреда_. _Обрабатывает_ блоки земли, как _мотыга_.", - "block.create.mechanical_saw.tooltip": "UNLOCALIZED: MECHANICAL SAW", - "block.create.mechanical_saw.tooltip.summary": "UNLOCALIZED: Suitable for _cutting_ _trees_ effectively and for _cutting_ _blocks_ into their carpentered counterparts. It is movable using _Mechanical_ _Pistons_ or _Bearings_.", - "block.create.mechanical_saw.tooltip.condition1": "UNLOCALIZED: When facing up", - "block.create.mechanical_saw.tooltip.behaviour1": "UNLOCALIZED: Applies _Sawing_ and _Stonecutting_ _Recipes_ to items dropped onto or inserted into it. When multiple outputs are possible, it cycles through them unless a _filter_ is assigned.", - "block.create.mechanical_saw.tooltip.condition2": "UNLOCALIZED: When facing horizontally", - "block.create.mechanical_saw.tooltip.behaviour2": "UNLOCALIZED: _Breaks_ _logs_ in front of it. If the log supported a tree on its own, the _tree_ _will_ _collapse_ away from the saw.", - "block.create.mechanical_saw.tooltip.condition3": "UNLOCALIZED: While Moving", - "block.create.mechanical_saw.tooltip.behaviour3": "UNLOCALIZED: _Cuts_ all _Trees_ with which the saw collides.", + "block.create.mechanical_saw.tooltip": "MECHANICAL SAW", + "block.create.mechanical_saw.tooltip.summary": "Подходит для эффективной _резки_ _деревьев_ и для резки _плотницких_ _блоков_. Она подвижна с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", + "block.create.mechanical_saw.tooltip.condition1": "Когда лицевой стороной вверх", + "block.create.mechanical_saw.tooltip.behaviour1": "Применяет _рецепты_ _пиления_ и _камнерезания_ к предметам, упавшим на него или вставленным в него. Когда возможно несколько выходов, он циклически проходит через них, если только не назначен фильтр.", + "block.create.mechanical_saw.tooltip.condition2": "Если направлена горизонтально", + "block.create.mechanical_saw.tooltip.behaviour2": "_Ломает_ _бревна_ перед ним. Если бревно само по себе _поддерживало_ дерево, то _дерево_ _рухнет_ от пилы.", + "block.create.mechanical_saw.tooltip.condition3": "Во время движения", + "block.create.mechanical_saw.tooltip.behaviour3": "_Вырезает_ все _деревья_, с которыми сталкивается пила.", "block.create.stockpile_switch.tooltip": "stockpile_switch", - "block.create.stockpile_switch.tooltip.summary": "Переключение сигнала на основе _предметов_ и _объёма_ _хранилища_ в прикрепленном контейнере.", - "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего порога", - "block.create.stockpile_switch.tooltip.behaviour1": "Перестаёт подавать сигнал", - "block.create.stockpile_switch.tooltip.condition2": "Когда выше верхнего порога", - "block.create.stockpile_switch.tooltip.behaviour2": "Начинает подавать _сигнал_ пока не будет достигнут нижний порог", - "block.create.stockpile_switch.tooltip.control1": "ПКМ", - "block.create.stockpile_switch.tooltip.action1": "Открывает _Меню_ _настройки_", + "block.create.stockpile_switch.tooltip.summary": "Подаёт сигнал красного камня в зависимости от _заполниности_ _прикреплённого_ _ящика_.", + "block.create.stockpile_switch.tooltip.condition1": "Когда ниже нижнего предела", + "block.create.stockpile_switch.tooltip.behaviour1": "Не подаёт _сигнал_ _красного_ _камня_.", + "block.create.stockpile_switch.tooltip.condition2": "Когда выше верхнего предела", + "block.create.stockpile_switch.tooltip.behaviour2": "Начинает давать _сигнал_ _красного_ _камня_, пака нижний предел не будет достигнут снова.", + "block.create.stockpile_switch.tooltip.control1": "При ПКМ", + "block.create.stockpile_switch.tooltip.action1": "Открывается _интерфейс_ _конфигурации_.", "block.create.redstone_link.tooltip": "REDSTONE LINK", - "block.create.redstone_link.tooltip.summary": "Конечные точки для _беспроводных_ соединений. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", - "block.create.redstone_link.tooltip.condition1": "Когда запитан", - "block.create.redstone_link.tooltip.behaviour1": "Получает сигнал на той же _частоте_ и выводит его.", - "block.create.redstone_link.tooltip.control1": "ПКМ с предметом", - "block.create.redstone_link.tooltip.action1": "Устанавливает _частоту_ для этого звена. Всего для определения частоты можно использовать _2_ _предмета._", + "block.create.redstone_link.tooltip.summary": "_Беспроводной_ _передатчик_ сигнала красного камня. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", + "block.create.redstone_link.tooltip.condition1": "Когда приведен в действие", + "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той-же _частоты_ выдаёт сигнал красного камня или наоборот.", + "block.create.redstone_link.tooltip.control1": "При ПКМ предметом", + "block.create.redstone_link.tooltip.action1": "Устанавливает частоту для этого предмета. Всего _два_ разных предмета могут быть использованы в комбинации для определения частоты.", "block.create.redstone_link.tooltip.control2": "ПКМ крадясь", - "block.create.redstone_link.tooltip.action2": "Переключение между режимами _приёма_ и _передачи._", + "block.create.redstone_link.tooltip.action2": "Переключение между режимом _приемника_ и _передатчика_.", - "block.create.nixie_tube.tooltip": "UNLOCALIZED: NIXIE TUBE", - "block.create.nixie_tube.tooltip.summary": "UNLOCALIZED: A fancy redstone-powered _Number_ _Display_ ranging from 0 to 15.", - "block.create.nixie_tube.tooltip.condition1": "UNLOCALIZED: When Powered", - "block.create.nixie_tube.tooltip.behaviour1": "UNLOCALIZED: Shows the current redstone _Signal_ _Strength_ as its displayed value.", + "block.create.nixie_tube.tooltip": "NIXIE TUBE", + "block.create.nixie_tube.tooltip.summary": "Красивый дисплей с питанием от _сигнала_ _красного_ _камня_ в диапазоне от 0 до 15.", + "block.create.nixie_tube.tooltip.condition1": "При подаче сигнала красного камня", + "block.create.nixie_tube.tooltip.behaviour1": "Показывает _текущую_ _силу_ _сигнала_ красного камня в качестве отображаемого значения.", - "block.create.redstone_contact.tooltip": "REDSTONE redstone_contact", - "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов.", + "block.create.redstone_contact.tooltip": "REDSTONE CONTACT", + "block.create.redstone_contact.tooltip.summary": "Простое устройство для продвинутых механизмов. Он подвижен с помощью _механических_ _поршней_, _радиальных_ _шасси_ или других контроллеров.", "block.create.redstone_contact.tooltip.condition1": "Когда смотрит на другое контактное соединение", - "block.create.redstone_contact.tooltip.behaviour1": "Подаёт _сигнал_", - "block.create.redstone_contact.tooltip.condition2": "При движении механическим поршнем", - "block.create.redstone_contact.tooltip.behaviour2": "Включает все стационарные контактные соединения, через которые проходит.", + "block.create.redstone_contact.tooltip.behaviour1": "Выдаёт _сигнал_ _красного_ _камня_", + "block.create.redstone_contact.tooltip.condition2": "Во время движения", + "block.create.redstone_contact.tooltip.behaviour2": "Активирует все стационарные контакты, которые проходит.", - "block.create.adjustable_crate.tooltip": "adjustable_crate", - "block.create.adjustable_crate.tooltip.summary": "Этот _контейнер_ позволяет контролировать его емкость. Он может содержать до _16_ _стаков_ любого предмета.", - "block.create.adjustable_crate.tooltip.control1": "ПКМ", - "block.create.adjustable_crate.tooltip.action1": "Открывает _Меню_", + "block.create.adjustable_crate.tooltip": "ADJUSTABLE CRATE", + "block.create.adjustable_crate.tooltip.summary": "Этот контейнер для хранения позволяет вручную контролировать его емкость. Он может вместить до 16 стеков любого предмета. Поддерживает компараторы.", + "block.create.adjustable_crate.tooltip.control1": "При ПКМ", + "block.create.adjustable_crate.tooltip.action1": "Открывается _интерфейс_.", - "block.create.creative_crate.tooltip": "CREATIVE CRATE", - "block.create.creative_crate.tooltip.summary": "Снабжает _Схемопушку_ бесконечным запасом блоков", - "block.create.creative_crate.tooltip.condition1": "UNLOCALIZED: When Item in Filter Slot", - "block.create.creative_crate.tooltip.behaviour1": "UNLOCALIZED: Anything _extracting_ from this container will provide an _endless_ _supply_ of the item specified. Items _inserted_ into this crate will be _voided._", + "block.create.creative_crate.tooltip": "THE ENDLESS CRATE", + "block.create.creative_crate.tooltip.summary": "Этот _контейнер_ для _хранения_ позволяющий _бесконечную_ _дублировать_ любой предмет. Поместите рядом со схематичной пушкой, чтобы удалить любые требования к материалу.", + "block.create.creative_crate.tooltip.condition1": "Когда предмет в слоте фильтра", + "block.create.creative_crate.tooltip.behaviour1": "Все, что извлечено из этого контейнера, обеспечит бесконечную поставку указанного предмета. Предметы, _вставленные_ в этот ящик, будут _аннулированы_.", - "block.create.deployer.tooltip": "UNLOCALIZED: DEPLOYER", - "block.create.deployer.tooltip.summary": "UNLOCALIZED: _Punches_, _Uses_, and _Activates_. This machine will try to _imitate_ a _player_ as a much as possible. Can _Take_ and _Deposit_ _items_ in adjacent _Inventory_. Can be assigned an item-stack as a _filter_.", - "block.create.deployer.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.deployer.tooltip.behaviour1": "UNLOCALIZED: Extends its arm and _activates_ in the block space _2m_ _ahead_ of itself.", - "block.create.deployer.tooltip.condition2": "UNLOCALIZED: R-Clicked with Wrench", - "block.create.deployer.tooltip.behaviour2": "UNLOCALIZED: Toggles punch mode. In _punch_ _mode_, the Deployer will attempt to use its item to _break_ _blocks_ or _hurt_ _entities_.", + "block.create.deployer.tooltip": "DEPLOYER", + "block.create.deployer.tooltip.summary": "_Ударяет_, _использует_ и _активирует_. Эта машина постарается максимально _имитировать_ _игрока_. Может _брать_ и _класть_ _предметы_ в соседний _инвентарь_. Может быть назначен _фильтр_ в виде стака предметов.", + "block.create.deployer.tooltip.condition1": "При вращении", + "block.create.deployer.tooltip.behaviour1": "_Вытягивает_ _руку_ и _активирует_ на _2_ _м_ _впереди_ себя.", + "block.create.deployer.tooltip.condition2": "ПКМ гаечным ключом", + "block.create.deployer.tooltip.behaviour2": "Переключает режим удара. В режиме пробивки автономный активатор попытается использовать свой предмет, чтобы разбить блоки или нанести урон сущностям.", - "block.create.funnel.tooltip": "BELT FUNNEL", - "block.create.funnel.tooltip.summary": "Собирает входящие предметы на _Механической_ _ленте_ и по возможности кладет их в прилагаемый _инвентарь._ Должен быть непосредственно _над_ лентой, с проёмом, смотрящим против направления ленты. Инвентарь должен быть на той же высоте, что и воронка.", - "block.create.funnel.tooltip.condition1": "UNLOCALIZED: Passive Belt pulling", - "block.create.funnel.tooltip.behaviour1": "UNLOCALIZED: Funnels can pull items _from_ _belts_ when placed above them, either sideways or at the end. When a side-ways funnel is backed up, items on the _belt_ _will_ _not_ _stall_.", + "block.create.funnel.tooltip": "FUNNEL", + "block.create.funnel.tooltip.summary": "_Собирает_ _поступающие_ _предметы_ и вставляет их в прилагаемый _инвентарь_, если это возможно. Может собирать предметы из мира или из конвейера.", + "block.create.funnel.tooltip.condition1": "Сбор предметов с конвейера", + "block.create.funnel.tooltip.behaviour1": "Воронки могут вытягивать предметы с _конвейеров_, когда они находятся над ними, сбоку или на конце. При отсутствии свободного места в прилагаемом инвентаре, предметы _на_ _конвейере_ _не_ _останавливаются_.", - "block.create.belt_tunnel.tooltip": "UNLOCALIZED: BELT TUNNEL", - "block.create.belt_tunnel.tooltip.summary": "UNLOCALIZED: An aesthetic option for running your _Mechanical_ _Belts_ through walls. Belts have to be reinforced with _Brass_ _Casing_. Tunnels can _synchronize_ with _their_ _neighbours_, only letting items pass if all tunnels in the group have one waiting. [Ctrl]", - "block.create.belt_tunnel.tooltip.control1": "UNLOCALIZED: R-Click with Wrench on Front", - "block.create.belt_tunnel.tooltip.action1": "UNLOCALIZED: Toggles _synchronized_ _behaviour_. Synchronized tunnels hold items until their neighbours have an item as well.", - "block.create.belt_tunnel.tooltip.control2": "UNLOCALIZED: R-Click with Wrench on Side", - "block.create.belt_tunnel.tooltip.action2": "UNLOCALIZED: _Adjusts_ _window_ _shutters_ if the tunnel has a window on that face.", + "block.create.belt_tunnel.tooltip": "BELT TUNNEL", + "block.create.belt_tunnel.tooltip.summary": "Эстетичный вариант для прохождения ваших _конвейеров_ сквозь стены. Конвейеры при этом должны быть усилены латунным корпусом. Туннели могут с_инхронизироваться_ _со_ _своими_ _соседями_, пропуская предметы, только если все туннели в группе имеют одно ожидание. [Ctrl]", + "block.create.belt_tunnel.tooltip.control1": "ПКМ по передней стороне ключом", + "block.create.belt_tunnel.tooltip.action1": "Переключает _синхронизированное_ _поведение_. Синхронизированные туннели удерживают предметы до тех пор, пока их соседи не получат предмет.", + "block.create.belt_tunnel.tooltip.control2": "ПКМ по стороне ключом", + "block.create.belt_tunnel.tooltip.action2": "_Регулирует_ _шторки_, если у туннеля есть окно на этой стороне.", - "block.create.brass_casing.tooltip": "UNLOCALIZED: BRASS CASING", - "block.create.brass_casing.tooltip.summary": "UNLOCALIZED: Sturdy machine casing with a variety of uses. Safe for decoration.", - "block.create.brass_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.brass_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.brass_casing.tooltip": "BRASS CASING", + "block.create.brass_casing.tooltip.summary": "Прочный корпус машины с различными вариантами применения. Сейф для украшения.", + "block.create.brass_casing.tooltip.condition1": "При использовании на конвейере", + "block.create.brass_casing.tooltip.behaviour1": "Усиливает конвейеры латунным основанием. Усиленные конвейеры _поддерживают_ _конвейерные_ _тунели_, _извлекающие_ _устройства_, _воронки_ и _периместители_, взаимодействующие с конвейером сбоку и снизу.", "block.create.belt_observer.tooltip": "BELT OBSERVER", - "block.create.belt_observer.tooltip.summary": "Сканирует предметы, проходящие по _Механической_ _ленте_ перед ним. Хорошо работает с _поршнем_ сверху, отталкивающим определенные предметы.", - "block.create.belt_observer.tooltip.condition1": "Когда предмет соответствует фильтру", - "block.create.belt_observer.tooltip.behaviour1": "Подаёт короткий _импульс_ со всех сторон. Пустой фильтр соответствует любому элементу.", - "block.create.belt_observer.tooltip.condition2": "UNLOCALIZED: Pulse Mode", - "block.create.belt_observer.tooltip.behaviour2": "UNLOCALIZED: Emits a _pulse_ when a _matching_ _item_ _passes_ the center of the observed belt segment.", - "block.create.belt_observer.tooltip.condition3": "UNLOCALIZED: Eject Mode", - "block.create.belt_observer.tooltip.behaviour3": "UNLOCALIZED: _Ejects_ _matching_ _items_ off the side. If the target belt or space is _occupied_, the item will be _held_ _in_ _place_.", - "block.create.belt_observer.tooltip.condition4": "UNLOCALIZED: Split Mode", - "block.create.belt_observer.tooltip.behaviour4": "UNLOCALIZED: _Splits_ a _matching_ _item_ _stack_ and _ejects_ _half_ of it off the side.", + "block.create.belt_observer.tooltip.summary": "Обнаруживает предметы и объекты, проходящие мимо по _конвейеру_ перед ним. Используйте _гаечный_ _ключ_ для смены режима. Не предметы всегда будут обрабатываться в режиме обнаружения независимо от настроек.", + "block.create.belt_observer.tooltip.condition1": "Режим обнаружения", + "block.create.belt_observer.tooltip.behaviour1": "_Обеспечивает_ _сигнал_ красного камня, _пока_ _соответствующий_ _предмет_ находится в наблюдаемом сегменте конвейера.", + "block.create.belt_observer.tooltip.condition2": "Импульсный режим", + "block.create.belt_observer.tooltip.behaviour2": "_Издаёт_ _импульс_, когда _соответствующий_ _элемент_ проходит центр наблюдаемого сегмента конвейера.", + "block.create.belt_observer.tooltip.condition3": "Режим выброса", + "block.create.belt_observer.tooltip.behaviour3": "_Выбрасывает_ _соответствующие_ _предметы со стороны. Если целевой конвейер или пространство _занято_, предмет будет удерживаться на месте.", + "block.create.belt_observer.tooltip.condition4": "Режим разделения", + "block.create.belt_observer.tooltip.behaviour4": "_Разбивает_ _соответствующий_ _стек_ _предметов_ и _выбрасывает_ _половину_ из него сбоку.", "block.create.pulse_repeater.tooltip": "PULSE REPEATER", - "block.create.pulse_repeater.tooltip.summary": "Простая схема для уменьшения времени проходящего сигнала до _1_ _тика._", + "block.create.pulse_repeater.tooltip.summary": "Простая схема обрезки длинны проходящего сигнала до _1_ _тика_.", "block.create.adjustable_repeater.tooltip": "FLEX REPEATER", - "block.create.adjustable_repeater.tooltip.summary": "Продвинутый _Повторитель_ с _настраиваемой_ _задержкой_ вплоть до 30 минут.", + "block.create.adjustable_repeater.tooltip.summary": "_Усовершенствованный_ _повторитель_ с _настраиваемой_ _задержкой_ до 30 минут.", - "block.create.adjustable_pulse_repeater.tooltip": "UNLOCALIZED: FLEX PULSE REPEATER", - "block.create.adjustable_pulse_repeater.tooltip.summary": "UNLOCALIZED: A _Pulse_ _Repeater_ with a _configurable_ _Delay_ up to 30 Minutes.", + "block.create.adjustable_pulse_repeater.tooltip": "FLEX PULSE REPEATER", + "block.create.adjustable_pulse_repeater.tooltip.summary": "_Импульсный_ _повторитель_ с _настраиваемой_ _задержкой_ до 30 минут.", - "block.create.analog_lever.tooltip": "UNLOCALIZED: ANALOG LEVER", - "block.create.analog_lever.tooltip.summary": "UNLOCALIZED: A lever with more _precise_ _control_ over its emitted _signal_ _strength_.", + "block.create.analog_lever.tooltip": "ANALOG LEVER", + "block.create.analog_lever.tooltip.summary": "Рычаг с более точным _контролем_ над _уровнем_ _излучаемого_ _сигнала_.", - "block.create.powered_toggle_latch.tooltip": "UNLOCALIZED: POWERED TOGGLE LATCH", - "block.create.powered_toggle_latch.tooltip.summary": "UNLOCALIZED: A lever that can be toggled by a _Redstone_ _Pulse_.", + "block.create.powered_toggle_latch.tooltip": "POWERED TOGGLE LATCH", + "block.create.powered_toggle_latch.tooltip.summary": "Рычаг, который может переключаться с помощью импульса сигнал красного камня.", - "block.create.powered_latch.tooltip": "UNLOCALIZED: POWERED LATCH", - "block.create.powered_latch.tooltip.summary": "UNLOCALIZED: A lever that can be controlled by _Redstone_ _Signals_. A signal on the _back_ _enables_ it, a signal from the _side_ _will_ _reset_ it.", + "block.create.powered_latch.tooltip": "POWERED LATCH", + "block.create.powered_latch.tooltip.summary": "Рычаг, которым можно управлять с помощью сигналов красного камня. Сигнал с задней стороны включает его, сигнал со стороны сбрасывает его.", - "block.create.speedometer.tooltip": "UNLOCALIZED: SPEEDOMETER", - "block.create.speedometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _rotational_ _speed_ of attached kinetic components. Supports _Redstone_ _Comparators_.", - "block.create.speedometer.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.speedometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of speed. _Green_ indicates Slow, _Blue_ Moderate and _Purple_ Fast rotation. Some mechanical components require a sufficient level of speed to work properly.", + "block.create.speedometer.tooltip": "SPEEDOMETER", + "block.create.speedometer.tooltip.summary": "Измеряет и отображает _скорость_ _вращения_ прикреплённых кинетических компонентов. Поддерживает _компараторы_.", + "block.create.speedometer.tooltip.condition1": "При вращении", + "block.create.speedometer.tooltip.behaviour1": "Указывает цвет, соответствующий уровню скорости. _Зелёный_ указывает на медленное, _синий_ - на умеренное, а _пурпурное_ - на быстрое вращение. Некоторые механические компоненты требуют достаточного уровня скорости для правильной работы.", - "block.create.stressometer.tooltip": "UNLOCALIZED: STRESSOMETER", - "block.create.stressometer.tooltip.summary": "UNLOCALIZED: Measures and displays the _overall_ _stress_ of the attached kinetic network. Supports _Redstone_ _Comparators_.", - "block.create.stressometer.tooltip.condition1": "UNLOCALIZED: When Rotated", - "block.create.stressometer.tooltip.behaviour1": "UNLOCALIZED: Indicates a color corresponding to the level of stress. _Over-stressed_ _networks_ will cease to move. Stress can be relieved by adding more _rotational_ _sources_ to the network.", + "block.create.stressometer.tooltip": "STRESSOMETER", + "block.create.stressometer.tooltip.summary": "Измеряет и отображает _общий_ _момент_ подключённой кинетической сети. Поддерживает _компараторы_.", + "block.create.stressometer.tooltip.condition1": "При вращении", + "block.create.stressometer.tooltip.behaviour1": "Указывает цвет, соответствующий уровню момента. Перенапряженные сети перестанут двигаться. Напряжение можно снять, добавив в сеть дополнительные источники вращения.", "item.create.sand_paper.tooltip": "UNLOCALIZED: SAND PAPER", "item.create.sand_paper.tooltip.summary": "UNLOCALIZED: A rough paper that can be used to _polish_ _materials_. Can be automatically applied using the Deployer.", "item.create.sand_paper.tooltip.condition1": "UNLOCALIZED: When Used", "item.create.sand_paper.tooltip.behaviour1": "UNLOCALIZED: Applies polish to items held in the _offhand_ or lying on the _floor_ when _looking_ _at_ _them_", - "item.create.super_glue.tooltip": "UNLOCALIZED: SUPER GLUE", - "item.create.super_glue.tooltip.summary": "UNLOCALIZED: Glue a block to another, and they will forever be inseparable.", - "item.create.super_glue.tooltip.condition1": "UNLOCALIZED: When Used", - "item.create.super_glue.tooltip.behaviour1": "UNLOCALIZED: Makes the _clicked_ _face_ of a block _sticky_. Blocks attached to sticky faces will be _dragged_ _along_ when moved by _mechanical_ _pistons_, _bearings_ and other controllers.", - "item.create.super_glue.tooltip.condition2": "UNLOCALIZED: When Held in Offhand", - "item.create.super_glue.tooltip.behaviour2": "UNLOCALIZED: _Automatically_ _attaches_ blocks placed from the main hand to the _side_ they were _placed_ _against._", + "item.create.super_glue.tooltip": "SUPER GLUE", + "item.create.super_glue.tooltip.summary": "Приклейте блок к другому, и они навсегда будут неразлучны.", + "item.create.super_glue.tooltip.condition1": "При использовании", + "item.create.super_glue.tooltip.behaviour1": "Делает лицевую сторону _липкой_. Блоки, прикреплённые к липким граням, будут _перемещаться_ при помощи _механических поршней_, _радиальных_ _шасси_ и других контроллеров.", + "item.create.super_glue.tooltip.condition2": "Кода в другой руке", + "item.create.super_glue.tooltip.behaviour2": "Автоматически _прикрепляет_ _блоки_, расположенные от основной руки, к той _стороне_, _против_ _которой_ они были.", - "item.create.refined_radiance.tooltip": "UNLOCALIZED: REFINED RADIANCE", - "item.create.refined_radiance.tooltip.summary": "UNLOCALIZED: A Chromatic material forged from _absorbed_ _light_.", + "item.create.refined_radiance.tooltip": "REFINED RADIANCE", + "item.create.refined_radiance.tooltip.summary": "Хроматический материал, _добытый_ _из_ _поглощенного_ _света_.", - "item.create.shadow_steel.tooltip": "UNLOCALIZED: SHADOW STEEL", - "item.create.shadow_steel.tooltip.summary": "UNLOCALIZED: A Chromatic material forged _in_ _the_ _void_.", + "item.create.shadow_steel.tooltip": "SHADOW STEEL", + "item.create.shadow_steel.tooltip.summary": "Хроматический материал, _добытый_ _в_ _пустоте_.", - "item.create.crafter_slot_cover.tooltip": "UNLOCALIZED: SLOT COVER", - "item.create.crafter_slot_cover.tooltip.summary": "UNLOCALIZED: Used to mark a _Mechanical_ _Crafter_ as an empty slot in a recipe. Crafters do not necessarily have to form a full square grid. This is useful when there are recipes where _ingredients_ _are_ _diagonal_ to each other.", + "item.create.crafter_slot_cover.tooltip": "SLOT COVER", + "item.create.crafter_slot_cover.tooltip.summary": "Используется для обозначения слота как пустой слот рецепта в _механическом_ _крафтере_. Крафтеры не обязательно должны образовывать полную квадратную сетку. Это полезно если есть рецепты, где ингредиенты располагаются _по_ _диагонали_ друг к другу.", - "create.tooltip.wip": "UNLOCALIZED: WIP", - "create.tooltip.workInProgress": "UNLOCALIZED: Work in progress!", - "create.tooltip.randomWipDescription0": "UNLOCALIZED: Please keep this item away from children.", - "create.tooltip.randomWipDescription1": "UNLOCALIZED: A baby panda dies every time you use this item. Every. Time.", - "create.tooltip.randomWipDescription2": "UNLOCALIZED: Use at your own risk.", - "create.tooltip.randomWipDescription3": "UNLOCALIZED: This is not the item you are looking for, *finger-wiggles* please disperse.", - "create.tooltip.randomWipDescription4": "UNLOCALIZED: This item will self-destruct in 10 seconds. 10, 9, 8...", - "create.tooltip.randomWipDescription5": "UNLOCALIZED: Believe me, it's useless.", - "create.tooltip.randomWipDescription6": "UNLOCALIZED: By using this item, you hereby consent to our disclaimer and agree to its terms.", - "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", - "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + "create.tooltip.wip": "WIP", + "create.tooltip.workInProgress": "Работа продолжается!", + "create.tooltip.randomWipDescription0": "Пожалуйста держите этот предмет подальше от детей!", + "create.tooltip.randomWipDescription1": "Маленькая панда умирает каждый раз, когда вы используете этот предмет. Каждый. Время.", + "create.tooltip.randomWipDescription2": "Используйте на свой страх и риск.", + "create.tooltip.randomWipDescription3": "Это не тот предмет, который вы ищете, *шевелит пальцами* пожалуйста, ускорьтесь.", + "create.tooltip.randomWipDescription4": "Этот предмет самоуничтожится за 10 секунд. 10, 9, 8...", + "create.tooltip.randomWipDescription5": "Поверьте мне, это бесполезно.", + "create.tooltip.randomWipDescription6": "Используя этот пункт, вы тем самым соглашаетесь с нашим отказом от ответственности и соглашаетесь с его условиями.", + "create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?", + "create.tooltip.randomWipDescription8": "Используя его, вы немедленно пожалеете о своем решении.", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 1a3be748a..096e4f728 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 221", + "_": "Missing Localizations: 267", "_": "->------------------------] Game Elements [------------------------<-", @@ -819,10 +819,10 @@ "create.schematicannon.status.schematicNotPlaced": "蓝图未部署", "create.schematicannon.status.schematicExpired": "蓝图文件已过期", - "create.gui.filter.blacklist": "黑名单", - "create.gui.filter.blacklist.description": "只通过不在黑名单中的物品,如果黑名单为空,所有物品都可以通过", - "create.gui.filter.whitelist": "白名单", - "create.gui.filter.whitelist.description": "只通过在白名单中的物品,如果白名单为空,所有物品都无法通过", + "create.gui.filter.deny_list": "黑名单", + "create.gui.filter.deny_list.description": "只通过不在黑名单中的物品,如果黑名单为空,所有物品都可以通过", + "create.gui.filter.allow_list": "白名单", + "create.gui.filter.allow_list.description": "只通过在白名单中的物品,如果白名单为空,所有物品都无法通过", "create.gui.filter.respect_data": "匹配物品属性", "create.gui.filter.respect_data.description": "只有物品的耐久、附魔等其他属性相同时才可以匹配", "create.gui.filter.ignore_data": "忽视物品属性", @@ -865,12 +865,12 @@ "create.gui.attribute_filter.selected_attributes": "已选择的属性:", "create.gui.attribute_filter.add_attribute": "UNLOCALIZED: Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "UNLOCALIZED: Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "任意匹配白名单 (任何)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "只要有其中一项属性符合,就可以通过", - "create.gui.attribute_filter.whitelist_conjunctive": "全匹配白名单 (所有)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "只有所有属性都匹配才可以通过", - "create.gui.attribute_filter.blacklist": "黑名单", - "create.gui.attribute_filter.blacklist.description": "只要没有上述属性,就可以通过", + "create.gui.attribute_filter.allow_list_disjunctive": "任意匹配白名单 (任何)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "只要有其中一项属性符合,就可以通过", + "create.gui.attribute_filter.allow_list_conjunctive": "全匹配白名单 (所有)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "只有所有属性都匹配才可以通过", + "create.gui.attribute_filter.deny_list": "黑名单", + "create.gui.attribute_filter.deny_list.description": "只要没有上述属性,就可以通过", "create.gui.attribute_filter.add_reference_item": "添加参考物品", "create.tooltip.holdKey": "按住 [%1$s]", @@ -955,7 +955,7 @@ "block.create.andesite_casing.tooltip": "UNLOCALIZED: ANDESITE CASING", "block.create.andesite_casing.tooltip.summary": "UNLOCALIZED: Simple machine casing with a variety of uses. Safe for decoration.", "block.create.andesite_casing.tooltip.condition1": "UNLOCALIZED: When used on Mechanical Belt", - "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with a Brass foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", + "block.create.andesite_casing.tooltip.behaviour1": "UNLOCALIZED: _Reinforces_ _belts_ with an Andesite foundation. Reinforced Belts can support _Belt_ _Tunnels_ and allows _Chutes_ to directly take _items_.", "block.create.andesite_funnel.tooltip": "UNLOCALIZED: ANDESITE FUNNEL", "block.create.andesite_funnel.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and place them into the attached _Item_ _Container_. Can be disabled with a _Redstone_ _Signal_.", @@ -1002,6 +1002,11 @@ "block.create.copper_valve_handle.tooltip.condition1": "UNLOCALIZED: When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "UNLOCALIZED: Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", + "block.create.seat.tooltip": "UNLOCALIZED: SEAT", + "block.create.seat.tooltip.summary": "UNLOCALIZED: Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "UNLOCALIZED: Right click on Seat", + "block.create.seat.tooltip.action1": "UNLOCALIZED: Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.chute.tooltip": "UNLOCALIZED: CHUTE", "block.create.chute.tooltip.summary": "UNLOCALIZED: Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", "block.create.chute.tooltip.control1": "UNLOCALIZED: When powered by a fan", @@ -1017,6 +1022,53 @@ "item.create.empty_blaze_burner.tooltip": "UNLOCALIZED: EMPTY BLAZE BURNER", "item.create.empty_blaze_burner.tooltip.summary": "UNLOCALIZED: A little iron home for your fiery friends. I'm sure you could put them to good use.", + "item.create.empty_blaze_burner.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "item.create.empty_blaze_burner.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", + + "block.create.fluid_pipe.tooltip": "UNLOCALIZED: FLUID PIPE", + "block.create.fluid_pipe.tooltip.summary": "UNLOCALIZED: Used for moving _fluids_ around. Needs a _Mechanical_ _Pump_ to get the _fluid_ moving.", + "block.create.fluid_pipe.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.fluid_pipe.tooltip.behaviour1": "UNLOCALIZED: Can connect to _fluid_ _containers_ such as _Tanks_ or _Basins_. Exposed _pipe_ ends can also drain or place fluid blocks. Be careful of leaks!", + "block.create.fluid_pipe.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_pipe.tooltip.action1": "UNLOCALIZED: Places a window on the pipe if available", + + "block.create.fluid_tank.tooltip": "UNLOCALIZED: FLUID TANK", + "block.create.fluid_tank.tooltip.summary": "UNLOCALIZED: _Stores_ all your favourite _fluids_.", + "block.create.fluid_tank.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.fluid_tank.tooltip.action1": "UNLOCALIZED: Changes the optional window", + + "block.create.fluid_valve.tooltip": "UNLOCALIZED: FLUID VALVE", + "block.create.fluid_valve.tooltip.summary": "UNLOCALIZED: Halts the flow of fluid down a pipe.", + "block.create.fluid_valve.tooltip.condition1": "UNLOCALIZED: Controllable flow", + "block.create.fluid_valve.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ will force the _valve_ to close, ceasing the flow of _fluids_. Reverse the direction of the _rotational_ _force_ to re-open the valve.", + + "block.create.Mechanical_pump.tooltip": "UNLOCALIZED: MECHANICAL PUMP", + "block.create.Mechanical_pump.tooltip.summary": "UNLOCALIZED: Takes _rotational_ _force_ and uses it to move _fluid_ along a _pipe_.", + "block.create.Mechanical_pump.tooltip.condition1": "UNLOCALIZED: Fluid Flow", + "block.create.Mechanical_pump.tooltip.behaviour1": "UNLOCALIZED: Applied _rotational_ _force_ creates pressure that forces _fluid_ through the _pipe_ network. Reverse the direction of the _rotational_ _force_ to switch the direction that the _fluid_ flows.", + "block.create.Mechanical_pump.tooltip.control1": "UNLOCALIZED: Right-clicked with Wrench", + "block.create.Mechanical_pump.tooltip.action1": "UNLOCALIZED: Reverses the direction of the _pump_, switching the default direction of the flow", + + "block.create.smart_fluid_pipe.tooltip": "UNLOCALIZED: SMART FLUID PIPE", + "block.create.smart_fluid_pipe.tooltip.summary": "UNLOCALIZED: A _fluid_ _pipe_ with a filter. Can specify which _fluids_ pass through.", + "block.create.smart_fluid_pipe.tooltip.control1": "UNLOCALIZED: ~ ", + "block.create.smart_fluid_pipe.tooltip.action1": "UNLOCALIZED: ~ ", + + "block.create.spout.tooltip": "UNLOCALIZED: SPOUT", + "block.create.spout.tooltip.summary": "UNLOCALIZED: An injector for refilling your _fluid_ _items_", + "block.create.spout.tooltip.condition1": "UNLOCALIZED: Fluid Transfer", + "block.create.spout.tooltip.behaviour1": "UNLOCALIZED: When a _fluid_ _container_ _item_ such as a _bucket_ or _bottle_ is placed underneath, the spout will attempt to refill it with it's own stored _fluid_.", + "block.create.spout.tooltip.condition2": "UNLOCALIZED: Fluid Automation", + "block.create.spout.tooltip.behaviour2": "UNLOCALIZED: The spout placed above a _belt_ or _depot_ will react automatically with a _fluid_ _container_ _item_ that passes beneath it.", + + "block.create.mechanical_arm.tooltip": "UNLOCALIZED: MECHANICAL ARM", + "block.create.mechanical_arm.tooltip.summary": "UNLOCALIZED: Advanced contraption for re-locating _items_.", + "block.create.mechanical_arm.tooltip.condition1": "UNLOCALIZED: Item Transfer", + "block.create.mechanical_arm.tooltip.behaviour1": "UNLOCALIZED: Can take or place items into any _accessible_ _inventory_, such as _Belts_, _Depots_, _Funnels_ and _Mechanical_ _Crafters_.", + "block.create.mechanical_arm.tooltip.control1": "UNLOCALIZED: While in Hand", + "block.create.mechanical_arm.tooltip.action1": "UNLOCALIZED: Right-Click an _accessible_ _item_ _inventory_ to set it as a _source_ for the _Mechanical_ _Arm_. Right-click twice to set it as the _destination_.", + "block.create.mechanical_arm.tooltip.control2": "UNLOCALIZED: Scroll with Wrench", + "block.create.mechanical_arm.tooltip.action2": "UNLOCALIZED: Sets the ordering behaviour for _items_ output by the _mechanical_ _Arm_.", "item.create.wand_of_symmetry.tooltip": "SYMMETRY WAND", "item.create.wand_of_symmetry.tooltip.summary": "完美地镜面复制工作区域内的方块放置与破坏", @@ -1220,8 +1272,8 @@ "block.create.blaze_heater.tooltip": "UNLOCALIZED: BLAZE HEATER", "block.create.blaze_heater.tooltip.summary": "UNLOCALIZED: A block to heat a basin when housing a tamed blaze.", - "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When using on a blaze or blaze spawner", - "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a blaze in the item", + "block.create.blaze_heater.tooltip.condition1": "UNLOCALIZED: When used on a _Blaze_ or _Blaze_ _spawner_", + "block.create.blaze_heater.tooltip.behaviour1": "UNLOCALIZED: _Captures_ a Blaze in the item", "block.create.blaze_heater.tooltip.condition2": "UNLOCALIZED: When placed below a basin", "block.create.blaze_heater.tooltip.behaviour2": "UNLOCALIZED: Provides _heat_ to basin recipes.", "block.create.blaze_heater.tooltip.condition3": "UNLOCALIZED: When fuel is used on the blaze heater", @@ -1234,8 +1286,8 @@ "block.create.mechanical_mixer.tooltip.summary": "一种能够动态进行搅拌的机器,需要恒定且够快的速度,并且下方需要放置_工作盆_(中间需要一格高)", "block.create.mechanical_mixer.tooltip.condition1": "当位于工作盆上方", "block.create.mechanical_mixer.tooltip.behaviour1": "只要_工作盆_中有必要的物品,就会将物品进行搅拌", - "block.create.mechanical_mixer.tooltip.condition2": "当使用扳手时", - "block.create.mechanical_mixer.tooltip.behaviour2": "_配置_配方中物品合成所需的最小数目,通过这个配置能够_避免不需要_的、相似的配方", + "block.create.mechanical_mixer.tooltip.control1": "UNLOCALIZED: When powered by redstone", + "block.create.mechanical_mixer.tooltip.action1": "UNLOCALIZED: Stalls the Mixer, perfect for crafting that recipe for the very first time!", "block.create.mechanical_crafter.tooltip": "MECHANICAL CRAFTER", "block.create.mechanical_crafter.tooltip.summary": "一种依靠_动能_的_自动_合成台。根据想要合成物品的_合成表_来摆放_相应数量_的机械制造机,并且用扳手调整物品在制造机里的_传动方向_以让他们合在一起后被输出", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 90af7a5ee..d19984f73 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -510,7 +510,7 @@ public class AllBlocks { .item() .transform(customItemModel()) .register(); - + public static final BlockEntry FLUID_VALVE = REGISTRATE.block("fluid_valve", FluidValveBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate((c, p) -> BlockStateGen.directionalAxisBlock(c, p, @@ -775,6 +775,7 @@ public class AllBlocks { .addCriterion("has_seat", p.hasItem(AllItemTags.SEATS.tag)) .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); }) + .onRegisterAfter(Item.class, v -> TooltipHelper.referTo(v, "block.create.seat")) .tag(AllBlockTags.SEATS.tag) .item() .tag(AllItemTags.SEATS.tag) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java index d6152bc98..8364e082e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/BlockBreakingKineticTileEntity.java @@ -92,8 +92,9 @@ public abstract class BlockBreakingKineticTileEntity extends KineticTileEntity { return; if (getSpeed() == 0) return; - if (breakingPos == null) - breakingPos = getBreakingPos(); + + breakingPos = getBreakingPos(); + if (ticksUntilNextProgress < 0) return; if (ticksUntilNextProgress-- > 0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 6c91f6d7e..05283aebd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -67,7 +67,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { stoppingCooldown = compound.getInt("Cooldown"); super.read(compound, clientPacket); if (clientPacket) - visualSpeed.withSpeed(1 / 32f).target(getGeneratedSpeed()); + visualSpeed.withSpeed(1 / 32f) + .target(getGeneratedSpeed()); } @Override @@ -81,6 +82,14 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { angle %= 360; return; } + + /* + * After getting moved by pistons the generatedSpeed attribute reads 16 but the + * actual speed stays at 0, if it happens update rotation + */ + if (getGeneratedSpeed() != 0 && getSpeed() == 0) + updateGeneratedRotation(); + if (stoppingCooldown == 0) return; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index ba13e7bff..f770012ed 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -61,7 +61,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { SuperByteBuffer upperBody = AllBlockPartials.ARM_UPPER_BODY.renderOn(blockState).light(light); SuperByteBuffer head = AllBlockPartials.ARM_HEAD.renderOn(blockState).light(light); SuperByteBuffer claw = AllBlockPartials.ARM_CLAW_BASE.renderOn(blockState).light(light); - SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState).light(light); + SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState); msr.centre(); @@ -101,7 +101,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { ms.push(); ms.translate(0, flip * 3 / 16d, -1 / 16d); msr.rotateX(flip * (hasItem ? isBlockItem ? 0 : -35 : 0)); - clawGrip.renderInto(ms, builder); + clawGrip.light(light).renderInto(ms, builder); ms.pop(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index f45974bdd..3bc9e2901 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -23,8 +23,11 @@ import net.minecraft.nbt.INBT; import net.minecraft.nbt.ListNBT; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; import javax.annotation.Nullable; @@ -132,6 +135,12 @@ public class ArmTileEntity extends KineticTileEntity { sendData(); } } + + @Override + @OnlyIn(Dist.CLIENT) + public AxisAlignedBB getRenderBoundingBox() { + return super.getRenderBoundingBox().grow(3); + } private boolean checkForMusicAmong(List list) { for (ArmInteractionPoint armInteractionPoint : list) { diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index aec61f789..d23c2fa57 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -36,12 +36,12 @@ public class AttributeFilterScreen extends AbstractFilterScreen getTooltipDescriptions() { - return Arrays.asList(blacklistDESC, whitelistConDESC, whitelistDisDESC); + return Arrays.asList(denyDESC, allowConDESC, allowDisDESC); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java index 2144bbda1..2ccb86186 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreen.java @@ -17,10 +17,10 @@ public class FilterScreen extends AbstractFilterScreen { private static final String PREFIX = "gui.filter."; - private String whitelistN = Lang.translate(PREFIX + "whitelist"); - private String whitelistDESC = Lang.translate(PREFIX + "whitelist.description"); - private String blacklistN = Lang.translate(PREFIX + "blacklist"); - private String blacklistDESC = Lang.translate(PREFIX + "blacklist.description"); + private String allowN = Lang.translate(PREFIX + "allow_list"); + private String allowDESC = Lang.translate(PREFIX + "allow_list.description"); + private String denyN = Lang.translate(PREFIX + "deny_list"); + private String denyDESC = Lang.translate(PREFIX + "deny_list.description"); private String respectDataN = Lang.translate(PREFIX + "respect_data"); private String respectDataDESC = Lang.translate(PREFIX + "respect_data.description"); @@ -43,9 +43,9 @@ public class FilterScreen extends AbstractFilterScreen { int y = guiTop; blacklist = new IconButton(x + 18, y + 73, AllIcons.I_BLACKLIST); - blacklist.setToolTip(blacklistN); + blacklist.setToolTip(denyN); whitelist = new IconButton(x + 36, y + 73, AllIcons.I_WHITELIST); - whitelist.setToolTip(whitelistN); + whitelist.setToolTip(allowN); blacklistIndicator = new Indicator(x + 18, y + 67, ""); whitelistIndicator = new Indicator(x + 36, y + 67, ""); widgets.addAll(Arrays.asList(blacklist, whitelist, blacklistIndicator, whitelistIndicator)); @@ -101,7 +101,7 @@ public class FilterScreen extends AbstractFilterScreen { @Override protected List getTooltipDescriptions() { - return Arrays.asList(blacklistDESC, whitelistDESC, respectDataDESC, ignoreDataDESC); + return Arrays.asList(denyDESC, allowDESC, respectDataDESC, ignoreDataDESC); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java index e303daf14..e054d8fcf 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHotbarSlotOverlay.java @@ -14,6 +14,8 @@ public class SchematicHotbarSlotOverlay extends AbstractGui { int x = mainWindow.getScaledWidth() / 2 - 88; int y = mainWindow.getScaledHeight() - 19; RenderSystem.enableAlphaTest(); + RenderSystem.enableDepthTest(); + RenderSystem.enableBlend(); AllGuiTextures.SCHEMATIC_SLOT.draw(this, x + 20 * slot, y); RenderSystem.disableAlphaTest(); } diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index ab49afbc6..092ae6f40 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -34,7 +34,7 @@ public class TooltipHelper { public static final Map cachedTooltips = new HashMap<>(); public static Language cachedLanguage; private static boolean gogglesMode; - private static final Map> tooltipReferrals = new HashMap<>(); + private static final Map> tooltipReferrals = new HashMap<>(); public static String holdShift(Palette color, boolean highlighted) { TextFormatting colorFormat = highlighted ? color.hColor : color.color; @@ -43,7 +43,13 @@ public class TooltipHelper { } public static void referTo(IItemProvider item, Supplier itemWithTooltip) { - tooltipReferrals.put(item.asItem(), itemWithTooltip); + tooltipReferrals.put(item.asItem(), () -> itemWithTooltip.get() + .asItem() + .getTranslationKey()); + } + + public static void referTo(IItemProvider item, String string) { + tooltipReferrals.put(item.asItem(), () -> string); } public static List cutString(String s, TextFormatting defaultColor, TextFormatting highlightColor) { @@ -190,11 +196,7 @@ public class TooltipHelper { } if (tooltipReferrals.containsKey(item)) - return tooltipReferrals.get(item) - .get() - .asItem() - .getTranslationKey() + ".tooltip"; - + return tooltipReferrals.get(item) + ".tooltip"; return item.getTranslationKey(stack) + ".tooltip"; } diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 992767763..f482bb22e 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -302,10 +302,10 @@ "create.schematicannon.status.schematicNotPlaced": "Schematic Not Deployed", "create.schematicannon.status.schematicExpired": "Schematic File Expired", - "create.gui.filter.blacklist": "Deny-List", - "create.gui.filter.blacklist.description": "Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", - "create.gui.filter.whitelist": "Allow-List", - "create.gui.filter.whitelist.description": "Items pass if they match any of the above. An empty Allow-List rejects everything.", + "create.gui.filter.deny_list": "Deny-List", + "create.gui.filter.deny_list.description": "Items pass if they do NOT match any of the above. An empty Deny-List accepts everything.", + "create.gui.filter.allow_list": "Allow-List", + "create.gui.filter.allow_list.description": "Items pass if they match any of the above. An empty Allow-List rejects everything.", "create.gui.filter.respect_data": "Respect Data", "create.gui.filter.respect_data.description": "Items only match if their durability, enchantments, and other attributes match as well.", "create.gui.filter.ignore_data": "Ignore Data", @@ -348,12 +348,12 @@ "create.gui.attribute_filter.selected_attributes": "Selected attributes:", "create.gui.attribute_filter.add_attribute": "Add attribute to List", "create.gui.attribute_filter.add_inverted_attribute": "Add opposite attribute to List", - "create.gui.attribute_filter.whitelist_disjunctive": "Allow-List (Any)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Items pass if they have any of the selected attributes.", - "create.gui.attribute_filter.whitelist_conjunctive": "Allow-List (All)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", - "create.gui.attribute_filter.blacklist": "Deny-List", - "create.gui.attribute_filter.blacklist.description": "Items pass if they do NOT have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_disjunctive": "Allow-List (Any)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Items pass if they have any of the selected attributes.", + "create.gui.attribute_filter.allow_list_conjunctive": "Allow-List (All)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Items pass only if they have ALL of the selected attributes.", + "create.gui.attribute_filter.deny_list": "Deny-List", + "create.gui.attribute_filter.deny_list.description": "Items pass if they do NOT have any of the selected attributes.", "create.gui.attribute_filter.add_reference_item": "Add Reference Item", "create.tooltip.holdKey": "Hold [%1$s]", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index fb1eafaef..7e54c46de 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -59,10 +59,10 @@ "block.create.copper_valve_handle.tooltip.condition1": "When Used", "block.create.copper_valve_handle.tooltip.behaviour1": "Provides _Rotational_ _Force_ to an attached contraption. _Sneak_ _to_ _reverse_ the rotation.", - "block.create.white_seat.tooltip": "WHITE SEAT", - "block.create.white_seat.tooltip.summary": "Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", - "block.create.white_seat.tooltip.control1": "Right click on Seat", - "block.create.white_seat.tooltip.action1": "Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", + "block.create.seat.tooltip": "SEAT", + "block.create.seat.tooltip.summary": "Sit yourself down and enjoy the ride! Will anchor a player onto a moving _contraption_. Great for static furniture too! Comes in a variety of colours.", + "block.create.seat.tooltip.control1": "Right click on Seat", + "block.create.seat.tooltip.action1": "Sits the player on the _Seat_. Press L-shift to leave the _Seat_.", "block.create.chute.tooltip": "CHUTE", "block.create.chute.tooltip.summary": "Will _Collect_ items and transport them vertically. Can both take and place items into _item_ _containers_.", diff --git a/src/main/resources/assets/create/lang/fr_fr.json b/src/main/resources/assets/create/lang/fr_fr.json index 992ccde77..5a01e5277 100644 --- a/src/main/resources/assets/create/lang/fr_fr.json +++ b/src/main/resources/assets/create/lang/fr_fr.json @@ -556,10 +556,10 @@ "create.gui.requester.requestedItemCount": "Quantité exigée", "create.gui.storage.passiveModeOnly": "Le stockage des articles est passif uniquement", - "create.gui.filter.blacklist": "Liste noire", - "create.gui.filter.blacklist.description": "Les articles réussissent s'ils ne correspondent à AUCUN des éléments ci-dessus. Une liste noire vide accepte tout.", - "create.gui.filter.whitelist": "Liste blanche", - "create.gui.filter.whitelist.description": "Les éléments réussissent s'ils correspondent à l'un des éléments ci-dessus. Une liste blanche vide rejette tout.", + "create.gui.filter.deny_list": "Liste noire", + "create.gui.filter.deny_list.description": "Les articles réussissent s'ils ne correspondent à AUCUN des éléments ci-dessus. Une liste noire vide accepte tout.", + "create.gui.filter.allow_list": "Liste blanche", + "create.gui.filter.allow_list.description": "Les éléments réussissent s'ils correspondent à l'un des éléments ci-dessus. Une liste blanche vide rejette tout.", "create.gui.filter.respect_data": "Respect des données", "create.gui.filter.respect_data.description": "Les objets ne correspondent que si leur durabilité, leurs enchantements et autres attributs correspondent également.", "create.gui.filter.ignore_data": "Ignorer les données", @@ -579,12 +579,12 @@ "create.gui.attribute_filter.no_selected_attributes": "Aucun attribut sélectionné", "create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:", - "create.gui.attribute_filter.whitelist_disjunctive": "Liste blanche (n'importe)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.", - "create.gui.attribute_filter.whitelist_conjunctive": "Liste blanche (tout)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Les objets ne passent que s'ils ont TOUS les attributs sélectionnés.", - "create.gui.attribute_filter.blacklist": "Liste noire", - "create.gui.attribute_filter.blacklist.description": "Les éléments réussissent s'ils n'ont AUCUN des attributs sélectionnés.", + "create.gui.attribute_filter.allow_list_disjunctive": "Liste blanche (n'importe)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Les objets réussissent s'ils possèdent l'un des attributs sélectionnés.", + "create.gui.attribute_filter.allow_list_conjunctive": "Liste blanche (tout)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Les objets ne passent que s'ils ont TOUS les attributs sélectionnés.", + "create.gui.attribute_filter.deny_list": "Liste noire", + "create.gui.attribute_filter.deny_list.description": "Les éléments réussissent s'ils n'ont AUCUN des attributs sélectionnés.", "create.gui.attribute_filter.add_reference_item": "Ajouter un objet de référence", "create.tooltip.holdKey": "Enfoncez [%1$s]", diff --git a/src/main/resources/assets/create/lang/it_it.json b/src/main/resources/assets/create/lang/it_it.json index a9b09bba0..ac740d150 100644 --- a/src/main/resources/assets/create/lang/it_it.json +++ b/src/main/resources/assets/create/lang/it_it.json @@ -533,10 +533,10 @@ "create.schematicannon.status.schematicNotPlaced": "Schematica Non Implementata", "create.schematicannon.status.schematicExpired": "File Schematica Scaduto", - "create.gui.filter.blacklist": "Lista Nera", - "create.gui.filter.blacklist.description": "Gli oggetti passano se NON corrispondono a nessuno dei precedenti. Una Lista Nera vuota accetta tutto.", - "create.gui.filter.whitelist": "Lista Bianca", - "create.gui.filter.whitelist.description": "Gli oggetti passano se corrispondono a uno dei precedenti. Una Lista Bianca vuota rifiuta tutto.", + "create.gui.filter.deny_list": "Lista Nera", + "create.gui.filter.deny_list.description": "Gli oggetti passano se NON corrispondono a nessuno dei precedenti. Una Lista Nera vuota accetta tutto.", + "create.gui.filter.allow_list": "Lista Bianca", + "create.gui.filter.allow_list.description": "Gli oggetti passano se corrispondono a uno dei precedenti. Una Lista Bianca vuota rifiuta tutto.", "create.gui.filter.respect_data": "Rispetto dei Dati", "create.gui.filter.respect_data.description": "Gli oggetti corrispondono solo se la loro durata, incantesimi e altri attributi corrispondono.", "create.gui.filter.ignore_data": "Ignora Dati", @@ -560,12 +560,12 @@ "create.gui.attribute_filter.no_selected_attributes": "Nessun attributo selezionato", "create.gui.attribute_filter.selected_attributes": "Attributi selezionati:", - "create.gui.attribute_filter.whitelist_disjunctive": "Lista Bianca (Qualsiasi)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.", - "create.gui.attribute_filter.whitelist_conjunctive": "Lista Bianca (Tutti)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Gli oggetti passano solo se hanno TUTTI gli attributi selezionati.", - "create.gui.attribute_filter.blacklist": "Lista Nera", - "create.gui.attribute_filter.blacklist.description": "Gli oggetti passano se NON hanno nessuno degli attributi selezionati.", + "create.gui.attribute_filter.allow_list_disjunctive": "Lista Bianca (Qualsiasi)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Gli oggetti passano se hanno uno degli attributi selezionati.", + "create.gui.attribute_filter.allow_list_conjunctive": "Lista Bianca (Tutti)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Gli oggetti passano solo se hanno TUTTI gli attributi selezionati.", + "create.gui.attribute_filter.deny_list": "Lista Nera", + "create.gui.attribute_filter.deny_list.description": "Gli oggetti passano se NON hanno nessuno degli attributi selezionati.", "create.gui.attribute_filter.add_reference_item": "Agg. Oggetto di Riferim.", "create.tooltip.holdKey": "Premi [%1$s]", diff --git a/src/main/resources/assets/create/lang/ja_jp.json b/src/main/resources/assets/create/lang/ja_jp.json index 7d30bebe1..3a37574eb 100644 --- a/src/main/resources/assets/create/lang/ja_jp.json +++ b/src/main/resources/assets/create/lang/ja_jp.json @@ -534,10 +534,10 @@ "create.schematicannon.status.schematicNotPlaced": "配置されていない概略図です", "create.schematicannon.status.schematicExpired": "概略図ファイルが期限切れです", - "create.gui.filter.blacklist": "ブラックリスト", - "create.gui.filter.blacklist.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", - "create.gui.filter.whitelist": "ホワイトリスト", - "create.gui.filter.whitelist.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", + "create.gui.filter.deny_list": "ブラックリスト", + "create.gui.filter.deny_list.description": "上記のいずれにも一致しない場合、アイテムは通り抜けます。 空のブラックリストはすべてを受け入れます。", + "create.gui.filter.allow_list": "ホワイトリスト", + "create.gui.filter.allow_list.description": "上記のいずれかに一致した場合、アイテムは通り抜けます。 空のホワイトリストはすべてを拒否します。", "create.gui.filter.respect_data": "データを重視", "create.gui.filter.respect_data.description": "アイテムは、耐久性、エンチャント、その他の属性も一致する場合にのみ一致します。", "create.gui.filter.ignore_data": "データを無視", @@ -561,12 +561,12 @@ "create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません", "create.gui.attribute_filter.selected_attributes": "選択された属性:", - "create.gui.attribute_filter.whitelist_disjunctive": "ホワイトリスト(どれか)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", - "create.gui.attribute_filter.whitelist_conjunctive": "ホワイトリスト(全て)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", - "create.gui.attribute_filter.blacklist": "ブラックリスト", - "create.gui.attribute_filter.blacklist.description": "選択された属性を持たない場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.allow_list_disjunctive": "ホワイトリスト(どれか)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "選択した属性のいずれかを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.allow_list_conjunctive": "ホワイトリスト(全て)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "選択した属性をすべてを持っている場合、アイテムは通り抜けます。", + "create.gui.attribute_filter.deny_list": "ブラックリスト", + "create.gui.attribute_filter.deny_list.description": "選択された属性を持たない場合、アイテムは通り抜けます。", "create.gui.attribute_filter.add_reference_item": "参照アイテムを追加", "create.tooltip.holdKey": "[%1$s] を長押し", diff --git a/src/main/resources/assets/create/lang/ko_kr.json b/src/main/resources/assets/create/lang/ko_kr.json index ed27b864c..8c6015f33 100644 --- a/src/main/resources/assets/create/lang/ko_kr.json +++ b/src/main/resources/assets/create/lang/ko_kr.json @@ -543,10 +543,10 @@ "create.schematicannon.status.schematicNotPlaced": "청사진이 전개되지 않음", "create.schematicannon.status.schematicExpired": "청사진 파일이 제거됨", - "create.gui.filter.blacklist": "블랙리스트", - "create.gui.filter.blacklist.description": "위 목록에 맞지않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", - "create.gui.filter.whitelist": "화이트리스트", - "create.gui.filter.whitelist.description": "위 목록에 맞는 아이템이면 통과합니다. 빈 화이트리스트는 모두 통과시키지 않습니다.", + "create.gui.filter.deny_list": "블랙리스트", + "create.gui.filter.deny_list.description": "위 목록에 맞지않는 아이템이면 통과합니다. 빈 블랙리스트는 모두 통과시킵니다.", + "create.gui.filter.allow_list": "화이트리스트", + "create.gui.filter.allow_list.description": "위 목록에 맞는 아이템이면 통과합니다. 빈 화이트리스트는 모두 통과시키지 않습니다.", "create.gui.filter.respect_data": "상세정보 일치", "create.gui.filter.respect_data.description": "위 목록 아이템의 내구도, 마법부여, 그리고 다른 NBT와 일치할 때 통과시킵니다.", "create.gui.filter.ignore_data": "상세정보 무시", @@ -570,12 +570,12 @@ "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", "create.gui.attribute_filter.selected_attributes": "선택된 속성:", - "create.gui.attribute_filter.whitelist_disjunctive": "화이트리스트 (최소)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", - "create.gui.attribute_filter.whitelist_conjunctive": "화이트리스트 (모두)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", - "create.gui.attribute_filter.blacklist": "블랙리스트", - "create.gui.attribute_filter.blacklist.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_disjunctive": "화이트리스트 (최소)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "아이템이 선택된 속성 중 하나라도 가지고 있다면 통과시킵니다.", + "create.gui.attribute_filter.allow_list_conjunctive": "화이트리스트 (모두)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "아이템이 선택된 속성 모두를 가지고 있어야 통과시킵니다.", + "create.gui.attribute_filter.deny_list": "블랙리스트", + "create.gui.attribute_filter.deny_list.description": "아이템이 선택된 속성이 없다면 통과시킵니다.", "create.gui.attribute_filter.add_reference_item": "참고할 아이템을 추가하기", "create.tooltip.holdKey": "[%1$s]를 눌러 설명보기", diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index 9e5c3f497..981f320d5 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -747,10 +747,10 @@ "create.schematicannon.status.schematicNotPlaced": "Схема не загружена", "create.schematicannon.status.schematicExpired": "Срок действия файла схемы истек", - "create.gui.filter.blacklist": "Чёрный список", - "create.gui.filter.blacklist.description": "Предметы проходят, если они не соответствуют ни одному из вышеперечисленных. Пустой черный список принимает все.", - "create.gui.filter.whitelist": "Белый список", - "create.gui.filter.whitelist.description": "Предметы проходят, если они соответствуют любому из вышеперечисленных. Пустой белый список отвергает все.", + "create.gui.filter.deny_list": "Чёрный список", + "create.gui.filter.deny_list.description": "Предметы проходят, если они не соответствуют ни одному из вышеперечисленных. Пустой черный список принимает все.", + "create.gui.filter.allow_list": "Белый список", + "create.gui.filter.allow_list.description": "Предметы проходят, если они соответствуют любому из вышеперечисленных. Пустой белый список отвергает все.", "create.gui.filter.respect_data": "Использование данных", "create.gui.filter.respect_data.description": "Предметы совпадают только в том случае, если их прочность, чары и другие атрибуты совпадают.", "create.gui.filter.ignore_data": "Игнорирование данных", @@ -774,12 +774,12 @@ "create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны", "create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:", - "create.gui.attribute_filter.whitelist_disjunctive": "Белый список (любой)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "Предметы проходят, если у них есть какой-либо из выбранных атрибутов.", - "create.gui.attribute_filter.whitelist_conjunctive": "Белый список (все)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "Предметы проходят, только если они имеют ВСЕ выбранные атрибуты.", - "create.gui.attribute_filter.blacklist": "Чёрный список", - "create.gui.attribute_filter.blacklist.description": "Предметы проходят, если они НЕ имеют ни одного из выбранных атрибутов.", + "create.gui.attribute_filter.allow_list_disjunctive": "Белый список (любой)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "Предметы проходят, если у них есть какой-либо из выбранных атрибутов.", + "create.gui.attribute_filter.allow_list_conjunctive": "Белый список (все)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "Предметы проходят, только если они имеют ВСЕ выбранные атрибуты.", + "create.gui.attribute_filter.deny_list": "Чёрный список", + "create.gui.attribute_filter.deny_list.description": "Предметы проходят, если они НЕ имеют ни одного из выбранных атрибутов.", "create.gui.attribute_filter.add_reference_item": "Добавить предмет", "create.tooltip.holdKey": "Удерживайте [%1$s]", diff --git a/src/main/resources/assets/create/lang/zh_cn.json b/src/main/resources/assets/create/lang/zh_cn.json index 02fb4993a..4ce4d52c1 100644 --- a/src/main/resources/assets/create/lang/zh_cn.json +++ b/src/main/resources/assets/create/lang/zh_cn.json @@ -744,10 +744,10 @@ "create.schematicannon.status.schematicNotPlaced": "蓝图未部署", "create.schematicannon.status.schematicExpired": "蓝图文件已过期", - "create.gui.filter.blacklist": "黑名单", - "create.gui.filter.blacklist.description": "只通过不在黑名单中的物品,如果黑名单为空,所有物品都可以通过", - "create.gui.filter.whitelist": "白名单", - "create.gui.filter.whitelist.description": "只通过在白名单中的物品,如果白名单为空,所有物品都无法通过", + "create.gui.filter.deny_list": "黑名单", + "create.gui.filter.deny_list.description": "只通过不在黑名单中的物品,如果黑名单为空,所有物品都可以通过", + "create.gui.filter.allow_list": "白名单", + "create.gui.filter.allow_list.description": "只通过在白名单中的物品,如果白名单为空,所有物品都无法通过", "create.gui.filter.respect_data": "匹配物品属性", "create.gui.filter.respect_data.description": "只有物品的耐久、附魔等其他属性相同时才可以匹配", "create.gui.filter.ignore_data": "忽视物品属性", @@ -771,12 +771,12 @@ "create.gui.attribute_filter.no_selected_attributes": "没有标记任何属性", "create.gui.attribute_filter.selected_attributes": "已选择的属性:", - "create.gui.attribute_filter.whitelist_disjunctive": "任意匹配白名单 (任何)", - "create.gui.attribute_filter.whitelist_disjunctive.description": "只要有其中一项属性符合,就可以通过", - "create.gui.attribute_filter.whitelist_conjunctive": "全匹配白名单 (所有)", - "create.gui.attribute_filter.whitelist_conjunctive.description": "只有所有属性都匹配才可以通过", - "create.gui.attribute_filter.blacklist": "黑名单", - "create.gui.attribute_filter.blacklist.description": "只要没有上述属性,就可以通过", + "create.gui.attribute_filter.allow_list_disjunctive": "任意匹配白名单 (任何)", + "create.gui.attribute_filter.allow_list_disjunctive.description": "只要有其中一项属性符合,就可以通过", + "create.gui.attribute_filter.allow_list_conjunctive": "全匹配白名单 (所有)", + "create.gui.attribute_filter.allow_list_conjunctive.description": "只有所有属性都匹配才可以通过", + "create.gui.attribute_filter.deny_list": "黑名单", + "create.gui.attribute_filter.deny_list.description": "只要没有上述属性,就可以通过", "create.gui.attribute_filter.add_reference_item": "添加参考物品", "create.tooltip.holdKey": "按住 [%1$s]", diff --git a/src/main/resources/assets/create/textures/gui/widgets.png b/src/main/resources/assets/create/textures/gui/widgets.png index 6b62bdd32004ef96000aef7a503106d0ea615f87..76be0599020c8c56ff9d784464cca4b2326d5baa 100644 GIT binary patch literal 1895 zcmeHHhfmXa6#teo3KWqcvcZKO6gB!gK!F1Uq{zlHWJr-?6&XsEb;u0Laf0Wa5K#|D z3?h~xVOnUJ0zD{#fQYi8v=-0;EtcZ|D<0{|#E z;_W;EK#5%xz@Wt@>V+?18^wD%oB|d7+H5h947YKy0ie1-UKA_^fW%>UXM+9A%nX@K z*3r?)%geJo6KiM|B4%b56x7z%S~rg{;t`2?r?|D1U~ zJUf__6B2!cKp+?y8F4rq9*?)Nu>m0z3WaNHYg{h3uC6X@9z?Sx$g2v5T;EBMtEt|4#^ z=_p2qO~CjGFl7Pee?oC>WmoY#H{CQgUDVedm6z@1S=Q*c2)LyT9zA+gR#sM7SxKc* zySlm<3faS8O56{M!d) zm5D62BjYv5eRWW-2WkyKn=xRTNW8a@U$9k~wpJWHDbsrl&~Tts7xeb_4i67cPfu@c zZHs|PRL@({&StBp%&5e_R}5juj8Ks2CS-+y2;U)a z{siP$LmnP-ZQz{Qat|`sf;`p)ls({;A?P{^hE7O*u*9-#RVRK@7&4V?Is~friSGgo zyQjYsnsj%l|C<6{Mee^M?m{*We=Z(?9ZlPc+C?)N1OP2^w6h^3o?rTt6;BA& zK5d$P6O-$>e@`nW_u;!ka)xKB_u`_+Y3nn-+E>KP>QU}z47fM!w{5QyV)uQcY1b6$ zC!tl3+{~7+4Kud6EORK|q8>!a-abx$=BuB1&gs^Dl%`hu{FA-k)6x+nl3bDLY0@@V zx&gQIu%Zs>K(X&Otr%TxjaBON%bdfyUyO{5jM-82TDkSb0sI8$92ptVSH+ZUqh-*^ z@JF|LP{e*ecoLF<`Ccm`O1`KdAA7e}vPa`#bF*c@gj(4)(9>7D@%(!_rfwyd z7?k=xYAQ#kCQN4G@8;EtS1XNzmLvi5!SOVdTLb+E^5;V4V4$IKz}x1;p24S1Y6(aD zd=2jy6fqcumA;Lnb&i*j4=%|2a8bCIVbn;4KP`B+OX1TfCGcz+L5)y;&m?xNDSDG1 z?O%U!f7SU;F;7_1-F+VZ)gP$HT{K=_TesX8XfLp65>&q~N#vE4 zmavW7*ehxLMpjVbm#0NRN$a(vlZiF7V<|-96eTrwC5`n_Faf9NEm>$s8MC!%hgkvn zN~*~|(@gI8WzplioC5hhY^`_(zxyV_NpB4+*rta!H1 literal 2406 zcmd^B`BM}268{E7v~qZi_EoO>rUMF8s7M&laA;}-N}vHm3&@d5fEYk130DX$Q+bR9 z?BkFCf~}7tw{pc06A+LH5yBN>2_Zm?oG~PjKu#XMKj8h;-}=MO?q~Oh{mf@~b~Zl% zi7@`;Q_Agt5Q*foJ zt@Pjb@3%=v0YPW@r*seu$H4ByZQALE>-&DZZ+qf6ieq4}IvUXVZO+6O|G`;izk)8k z3A<2ijf@R*k!p$VyKH_A*(K?w@q!9MD%Q2BCsDSUpcW$@~pDcm|wZ#*RQ)$Byassuxqq90=Mkm zgS(rV%k!F~(FlxYC)d;hrV~o|J?*9q?L0^t;Y#HvNOoT1g;F;n2k0h&gSsu8v z0{`81q%2=$uLF6$O}=P4IVh|@gqOXkuW!&`#L#cnAFVM0JqJU*NRL@p0>h}2vw zZ5W}kgjB@{c(8+xSZoyHnZHRg=z6imJ7y8-k7&Wef;pwcxL8y6vDH!r(KzyV5nkF109N~frskiREfSsDjon3#91zY@q{9`uI8TO_m2*%#n)?1(I z>+9QCQW92Y=buShTU#w|t1Eq#BL}s+b7#%4b~NcBFLzyW79n0!m3?w!uH7d4)N84b zNzj}YqzMaT6TS|qlq)e93~Oua2Qrx|FPd&?X(=l$Ep6-Q2)darDwQo#NK+P{k;zr| zlWOZc9(kz#93NN7>1@2Ej5llS7yDTFrtYps_$WsR)&F3Olqno%wyK+s-Ae8%#3R&E zj}!}BC4&(*%&EmspjH!Z*o#DgwdOibqkPbLQtd;If6RcFlPj9hf4mu;+H6Xk+U`MF zF_UlH3~%6dj@MuFRSJ2vnsv?Kw9)Y#qs)JTA`jipAhwl0&3} z-8pBD-;CQrYZ&!h)fS7z3N0p0-ZOO%KEWzj=ZfKh2Tx! z=^X9iaIm}c9uXP8SGmGwYU+=X@Fa`W>d`5xN60p>>qd(tLpmHw3$oFocvi4oQ~EY5 zghej8qIQypv%6CKrnPSGSM$yXqQ~sHLyYS-Y8fY^5W4DG#zinIeh!9QZO2>#;?J^d zzVnSa`7*9Y!DxFcazd$!p7*ra%v&9x_l&+%G{Hjb0z!_+9Uc_0SR&ag)Y%AI(W2pF zab@Q{fvUez#16k&pdKpz z;)-guaYe%T3;r;E{DqM4BOT(Aj(l~T(c3dz@S)E+haYK>B)MbU>zwnY&;f$a1+$q7 zIGDk1ySrs<#Zn9jh;?TWnRpl+um*>3M?1VgLhyOV!MEPd~@D@&?zZ@LALfQV4T>e(E&|972@_x+bmcjp#!dlTsuzQJ|ZI(Fl52awEqoRJ} z(dYK=Q#YMGI#g^!gY9fxRIj)5=P+1*L!i0@x|UA<6{70UhcnnDqc%Ei(?K7i=>fek kzrXYF{=&7rc4k-qXs0LoJO=uD?>7S8UnAiymm+`qFPje>N&o-= From fdd1e22c3ee9ae498d638b6772bb8b15be82917c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Oct 2020 14:56:07 +0200 Subject: [PATCH 22/36] RAM-powered Minecarts - Fixed critical memory leak from minecart controller listeners - Made JEI heat conditions a little more readable --- .../compat/jei/category/BasinCategory.java | 4 +- .../CapabilityMinecartController.java | 50 +++++++++++++++++-- .../train/capability/MinecartController.java | 5 +- .../processing/HeatCondition.java | 2 +- 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java index 3f82a09a3..41165913a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BasinCategory.java @@ -177,8 +177,8 @@ public class BasinCategory extends CreateRecipeCategory { AllGuiTextures heatBar = noHeat ? AllGuiTextures.JEI_NO_HEAT_BAR : AllGuiTextures.JEI_HEAT_BAR; heatBar.draw(4, 80); - Minecraft.getInstance().fontRenderer.drawStringWithShadow(Lang.translate(requiredHeat.getTranslationKey()), 9, - 85, requiredHeat.getColor()); + Minecraft.getInstance().fontRenderer.drawString(Lang.translate(requiredHeat.getTranslationKey()), 9, + 86, requiredHeat.getColor()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java index 3120a64c6..19bd2ef7f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/CapabilityMinecartController.java @@ -25,6 +25,7 @@ import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.INBT; import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -33,6 +34,7 @@ import net.minecraftforge.common.capabilities.CapabilityInject; import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.common.util.NonNullConsumer; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.world.ChunkEvent; @@ -45,6 +47,37 @@ public class CapabilityMinecartController implements ICapabilitySerializable> queuedAdditions; static WorldAttached> queuedUnloads; + /** + * This callback wrapper ensures that the listeners map in the controller + * capability only ever contains one instance + */ + public static class MinecartRemovalListener implements NonNullConsumer> { + + private World world; + private AbstractMinecartEntity cart; + + public MinecartRemovalListener(World world, AbstractMinecartEntity cart) { + this.world = world; + this.cart = cart; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof MinecartRemovalListener; + } + + @Override + public int hashCode() { + return 100; + } + + @Override + public void accept(LazyOptional t) { + onCartRemoved(world, cart); + } + + } + static { loadedMinecartsByUUID = new WorldAttached<>(HashMap::new); loadedMinecartsWithCoupling = new WorldAttached<>(HashSet::new); @@ -66,10 +99,12 @@ public class CapabilityMinecartController implements ICapabilitySerializable capability = cart.getCapability(MINECART_CONTROLLER_CAPABILITY); MinecartController controller = capability.orElse(null); - capability.addListener(cap -> onCartRemoved(world, cart)); + capability.addListener(new MinecartRemovalListener(world, cart)); carts.put(uniqueID, controller); + capability.ifPresent(mc -> { if (mc.isLeadingCoupling()) cartsWithCoupling.add(uniqueID); @@ -128,14 +163,14 @@ public class CapabilityMinecartController implements ICapabilitySerializable { + if (capability.cap.isPresent()) + capability.cap.invalidate(); + }); queuedAdditions.get(entity.getEntityWorld()) .add((AbstractMinecartEntity) entity); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java index bc3828495..7d0c87a91 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/capability/MinecartController.java @@ -62,9 +62,8 @@ public class MinecartController implements INBTSerializable { World world = getWorld(); if (needsEntryRefresh) { - List list = CapabilityMinecartController.queuedAdditions.get(world); - if (list != null) - list.add(cart); + CapabilityMinecartController.queuedAdditions.get(world).add(cart); + needsEntryRefresh = false; } stallData.forEach(opt -> opt.ifPresent(sd -> sd.tick(cart))); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java b/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java index 3e733f696..0f84596cd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/HeatCondition.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.utility.Lang; public enum HeatCondition { - NONE(0xffffff), HEATED(0xFFD528), SUPERHEATED(0xA2DFFF), + NONE(0xffffff), HEATED(0xE88300), SUPERHEATED(0x5C93E8), ; From a8031b7569e5d03f5686bc1d1e89ce44cb737b1e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Oct 2020 17:34:39 +0200 Subject: [PATCH 23/36] Missed Tags --- src/generated/resources/.cache/cache | 4 ++++ .../resources/data/forge/tags/blocks/ores.json | 7 +++++++ .../data/forge/tags/blocks/storage_blocks.json | 8 ++++++++ .../resources/data/forge/tags/items/ores.json | 7 +++++++ .../data/forge/tags/items/storage_blocks.json | 8 ++++++++ src/main/java/com/simibubi/create/AllBlocks.java | 11 +++++++++++ 6 files changed, 45 insertions(+) create mode 100644 src/generated/resources/data/forge/tags/blocks/ores.json create mode 100644 src/generated/resources/data/forge/tags/blocks/storage_blocks.json create mode 100644 src/generated/resources/data/forge/tags/items/ores.json create mode 100644 src/generated/resources/data/forge/tags/items/storage_blocks.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 521a7f5e4..336470f9d 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -3153,8 +3153,10 @@ abbe5d7cc9d1705509257888154ed7ca23292586 data/create/tags/items/upright_on_belt. 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/items/valve_handles.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json 81ced867d24ec814942909965dd4576eff1db685 data/forge/tags/blocks/glass_panes.json +4b700ee8aa748c2ec70c29ef1589844879c0deae data/forge/tags/blocks/ores.json 4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data/forge/tags/blocks/ores/copper.json d5ea262a0f5fb210612d22521818e26cf08e591a data/forge/tags/blocks/ores/zinc.json +508730d3822c54d355329bf6a33d58071653afad data/forge/tags/blocks/storage_blocks.json ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data/forge/tags/blocks/storage_blocks/brass.json f6c8f34ceb475546dba5cc6ff288863ea795d20b data/forge/tags/blocks/storage_blocks/copper.json 7f71a774800111e50b42de0e6159ed2d2a807d32 data/forge/tags/blocks/storage_blocks/zinc.json @@ -3170,6 +3172,7 @@ bcf15289cbadd429a48bd9accb4d2d5f75353a61 data/forge/tags/items/nuggets.json cc82188fe8d986f4457301ed4f75ae833d263601 data/forge/tags/items/nuggets/brass.json 7affb30e30a252566a77467994b0c99331f1076c data/forge/tags/items/nuggets/copper.json 0d8cb5092ee6ec01ea09324c80d649ba05549799 data/forge/tags/items/nuggets/zinc.json +4b700ee8aa748c2ec70c29ef1589844879c0deae data/forge/tags/items/ores.json 4a0b13a9835106de9a1dd0a71a02372abb48e7b6 data/forge/tags/items/ores/copper.json d5ea262a0f5fb210612d22521818e26cf08e591a data/forge/tags/items/ores/zinc.json 5d5ec04a61ff2b1ad19210e2859a9c96cc246ef8 data/forge/tags/items/plates.json @@ -3177,6 +3180,7 @@ d5ea262a0f5fb210612d22521818e26cf08e591a data/forge/tags/items/ores/zinc.json c3dab5fe379bc1b7b10d4a0ba7009eee1b75a27c data/forge/tags/items/plates/copper.json fb9bfb4c84ed9cf2da8c4b2fbc4cd4d9f37d3016 data/forge/tags/items/plates/gold.json 04d947ed7a5066f3cfe75a8dc564fe2dca8a9c93 data/forge/tags/items/plates/iron.json +508730d3822c54d355329bf6a33d58071653afad data/forge/tags/items/storage_blocks.json ff1900963bc4cd8ceffa78d58ef1952ceacb2fb7 data/forge/tags/items/storage_blocks/brass.json f6c8f34ceb475546dba5cc6ff288863ea795d20b data/forge/tags/items/storage_blocks/copper.json 7f71a774800111e50b42de0e6159ed2d2a807d32 data/forge/tags/items/storage_blocks/zinc.json diff --git a/src/generated/resources/data/forge/tags/blocks/ores.json b/src/generated/resources/data/forge/tags/blocks/ores.json new file mode 100644 index 000000000..dc8820ef1 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "create:copper_ore", + "create:zinc_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/storage_blocks.json b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json new file mode 100644 index 000000000..fd18acec8 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/storage_blocks.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "create:copper_block", + "create:zinc_block", + "create:brass_block" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ores.json b/src/generated/resources/data/forge/tags/items/ores.json new file mode 100644 index 000000000..dc8820ef1 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ores.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "create:copper_ore", + "create:zinc_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/storage_blocks.json b/src/generated/resources/data/forge/tags/items/storage_blocks.json new file mode 100644 index 000000000..fd18acec8 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/storage_blocks.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "create:copper_block", + "create:zinc_block", + "create:brass_block" + ] +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index d19984f73..b3b0c72c1 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -161,6 +161,7 @@ import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.common.Tags; import net.minecraftforge.common.ToolType; public class AllBlocks { @@ -1033,7 +1034,9 @@ public class AllBlocks { REGISTRATE.block("copper_ore", p -> new OxidizingBlock(p, 1)) .initialProperties(() -> Blocks.IRON_ORE) .transform(oxidizedBlockstate()) + .tag(Tags.Blocks.ORES) .transform(tagBlockAndItem("ores/copper")) + .tag(Tags.Items.ORES) .transform(oxidizedItemModel()) .register(); @@ -1042,14 +1045,18 @@ public class AllBlocks { .properties(p -> p.harvestLevel(2) .harvestTool(ToolType.PICKAXE) .sound(SoundType.STONE)) + .tag(Tags.Blocks.ORES) .transform(tagBlockAndItem("ores/zinc")) + .tag(Tags.Items.ORES) .build() .register(); public static final BlockEntry COPPER_BLOCK = REGISTRATE.block("copper_block", p -> new OxidizingBlock(p, 1 / 32f, true)) .initialProperties(() -> Blocks.IRON_BLOCK) + .tag(Tags.Blocks.STORAGE_BLOCKS) .transform(tagBlockAndItem("storage_blocks/copper")) + .tag(Tags.Items.STORAGE_BLOCKS) .transform(oxidizedItemModel()) .transform(oxidizedBlockstate()) .register(); @@ -1072,14 +1079,18 @@ public class AllBlocks { public static final BlockEntry ZINC_BLOCK = REGISTRATE.block("zinc_block", p -> new MetalBlock(p, true)) .initialProperties(() -> Blocks.IRON_BLOCK) + .tag(Tags.Blocks.STORAGE_BLOCKS) .transform(tagBlockAndItem("storage_blocks/zinc")) + .tag(Tags.Items.STORAGE_BLOCKS) .build() .register(); public static final BlockEntry BRASS_BLOCK = REGISTRATE.block("brass_block", p -> new MetalBlock(p, true)) .initialProperties(() -> Blocks.IRON_BLOCK) + .tag(Tags.Blocks.STORAGE_BLOCKS) .transform(tagBlockAndItem("storage_blocks/brass")) + .tag(Tags.Items.STORAGE_BLOCKS) .build() .register(); From 0b3f0fd1986d0f7483aca63316cd159e54ddf5b0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 20 Oct 2020 21:21:33 +0200 Subject: [PATCH 24/36] More Tweaks --- .../content/logistics/item/filter/FilterItem.java | 8 ++++---- .../content/schematics/client/SchematicHandler.java | 13 ++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java index abc56ce43..b0df76bec 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterItem.java @@ -90,7 +90,7 @@ public class FilterItem extends Item implements INamedContainerProvider { .getBoolean("Blacklist"); list.add(TextFormatting.GOLD - + (blacklist ? Lang.translate("gui.filter.blacklist") : Lang.translate("gui.filter.whitelist"))); + + (blacklist ? Lang.translate("gui.filter.deny_list") : Lang.translate("gui.filter.allow_list"))); int count = 0; for (int i = 0; i < filterItems.getSlots(); i++) { if (count > 3) { @@ -114,10 +114,10 @@ public class FilterItem extends Item implements INamedContainerProvider { WhitelistMode whitelistMode = WhitelistMode.values()[filter.getOrCreateTag() .getInt("WhitelistMode")]; list.add(TextFormatting.GOLD + (whitelistMode == WhitelistMode.WHITELIST_CONJ - ? Lang.translate("gui.attribute_filter.whitelist_conjunctive") + ? Lang.translate("gui.attribute_filter.allow_list_conjunctive") : whitelistMode == WhitelistMode.WHITELIST_DISJ - ? Lang.translate("gui.attribute_filter.whitelist_disjunctive") - : Lang.translate("gui.attribute_filter.blacklist"))); + ? Lang.translate("gui.attribute_filter.allow_list_disjunctive") + : Lang.translate("gui.attribute_filter.deny_list"))); int count = 0; ListNBT attributes = filter.getOrCreateTag() diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index 31fe3496e..d8b7b2c4e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -5,6 +5,7 @@ import java.util.Vector; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllKeys; import com.simibubi.create.content.schematics.SchematicWorld; @@ -28,6 +29,7 @@ import net.minecraft.nbt.NBTUtil; import net.minecraft.util.Mirror; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; @@ -199,11 +201,16 @@ public class SchematicHandler { return; if (!pressed || button != 1) return; - if (Minecraft.getInstance().player.isSneaking()) + Minecraft mc = Minecraft.getInstance(); + if (mc.player.isSneaking()) return; - + if (mc.objectMouseOver instanceof BlockRayTraceResult) { + BlockRayTraceResult blockRayTraceResult = (BlockRayTraceResult) mc.objectMouseOver; + if (AllBlocks.SCHEMATICANNON.has(mc.world.getBlockState(blockRayTraceResult.getPos()))) + return; + } currentTool.getTool() - .handleRightClick(); + .handleRightClick(); } public void onKeyInput(int key, boolean pressed) { From 420501af89a211eb2447e1262a5f32185d28ef08 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Wed, 21 Oct 2020 01:03:27 +0200 Subject: [PATCH 25/36] Fix Server crash on chromatic compound conversion --- .../create/content/curiosities/ChromaticCompoundItem.java | 2 +- src/main/resources/META-INF/accesstransformer.cfg | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java index 3213a7964..afe7c9a87 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java @@ -135,7 +135,7 @@ public class ChromaticCompoundItem extends Item { BeaconTileEntity bte = (BeaconTileEntity) te; - if (!bte.getBeamSegments().isEmpty()) isOverBeacon = true; + if (bte.getLevels() != 0 && !bte.beamSegments.isEmpty()) isOverBeacon = true; break; } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 2069e9221..b8f87e003 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -17,3 +17,6 @@ public net.minecraft.world.chunk.ChunkStatus$ILoadingWorker # PotionBrewing public net.minecraft.potion.PotionBrewing field_185215_c # POTION_ITEMS + +# Beacon +public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments From 89bad1c19292ac56fddbefd455d5583571b79018 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Wed, 21 Oct 2020 19:18:29 +0200 Subject: [PATCH 26/36] Add Attribute Filter Lang back in --- src/generated/resources/.cache/cache | 24 +-- .../assets/create/blockstates/fluid_pipe.json | 190 +++++++++--------- .../create/blockstates/radial_chassis.json | 24 +-- .../resources/assets/create/lang/en_us.json | 26 ++- .../assets/create/lang/unfinished/de_de.json | 28 ++- .../assets/create/lang/unfinished/fr_fr.json | 28 ++- .../assets/create/lang/unfinished/it_it.json | 28 ++- .../assets/create/lang/unfinished/ja_jp.json | 28 ++- .../assets/create/lang/unfinished/ko_kr.json | 28 ++- .../assets/create/lang/unfinished/nl_nl.json | 28 ++- .../assets/create/lang/unfinished/pt_br.json | 28 ++- .../assets/create/lang/unfinished/ru_ru.json | 28 ++- .../assets/create/lang/unfinished/zh_cn.json | 28 ++- .../assets/create/lang/default/messages.json | 26 ++- 14 files changed, 403 insertions(+), 139 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 336470f9d..bd58489ca 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -132,7 +132,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json +3d97226b5e8d8f70ed08e45e78db1faf78d5e28b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -312,7 +312,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -89b63c6e5875da07226854651079bcea85439f5b assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json @@ -369,16 +369,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 33f621fe1a09a46426af59c9352c33e97c2bc00d assets/create/lang/en_ud.json -25fba2944b4a86281bc40fddba4a8136d53e3c26 assets/create/lang/en_us.json -52ad08a48ec59354f826b9cfe7eb6ea79ec7bab9 assets/create/lang/unfinished/de_de.json -62bf8e59e095e3c5dfc0a00f68b25de09cbd1b7e assets/create/lang/unfinished/fr_fr.json -4fb16e3e63bd5df457d7c77c6290b4ce595fd4a8 assets/create/lang/unfinished/it_it.json -654032efb15080b3824536cc4a0b32507b006264 assets/create/lang/unfinished/ja_jp.json -fec915edfbc9bca029dcbd6b5bdd7f9c777fb08b assets/create/lang/unfinished/ko_kr.json -8de3030ee744fe793ad2c27c5f9f2e7a3b933e3c assets/create/lang/unfinished/nl_nl.json -5cebc2913e4c04b496e00e0841474118c7709c4e assets/create/lang/unfinished/pt_br.json -68beb3243e78a3f34426229286f97a7cf2f3e489 assets/create/lang/unfinished/ru_ru.json -bf38c2b2063126ca3c3ed9183726665c8aaea419 assets/create/lang/unfinished/zh_cn.json +ed4fcea49a7ad3c1ed81f7681dd190d2474314fe assets/create/lang/en_us.json +cf1c3a0295a2a3d74bf06ea5a5f0a4832dea060c assets/create/lang/unfinished/de_de.json +1adf9c52894458c41763cfe7c9714e9fc5816f04 assets/create/lang/unfinished/fr_fr.json +db2e9e08036df7f2c3a0c1c319e5ba975b2b4755 assets/create/lang/unfinished/it_it.json +df56f590b03878564544368cad779ef1a78c430d assets/create/lang/unfinished/ja_jp.json +f3af37ad22d3b4a1833e22948c87b3193b44d97a assets/create/lang/unfinished/ko_kr.json +a6ff23a0430637a8119e94f05cb393c7642179c9 assets/create/lang/unfinished/nl_nl.json +4fe5e45ca30e1c6c53103e06e3ad0cdd9671956e assets/create/lang/unfinished/pt_br.json +c3bf50e7e9191b2607573c5453108a5fb6a733b9 assets/create/lang/unfinished/ru_ru.json +bd56413cd36382704d77ce4e194712b1d79dcbd6 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 581373307..a4cffcde7 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", - "north": "true" + "north": "true", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "south": "true", - "up": "true", "down": "false", - "north": "false" + "north": "false", + "up": "true", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,21 +104,21 @@ }, { "when": { - "south": "false", - "up": "true", "down": "true", - "north": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { - "south": "false", + "north": "false", "up": "true", - "down": "false", - "north": "false" + "south": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "down": "false", + "north": "false", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "false", - "east": "true" + "down": "true", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "true", - "east": "false" + "down": "true", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "up": "true", + "west": "false", "down": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "up": "true", + "west": "false", "down": "false", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "up": "false", + "west": "false", "down": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index d60327a8a..9d00ea8b1 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 4ec3a9046..c184a40f0 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -769,9 +769,9 @@ "create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.", "create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:", - "create.gui.schematicTable.title": "Schematic Table", "create.gui.schematicTable.refresh": "Refresh Files", "create.gui.schematicTable.open_folder": "Open Folder", + "create.gui.schematicTable.title": "Schematic Table", "create.gui.schematicTable.availableSchematics": "Available Schematics", "create.gui.schematicTable.noSchematics": "No Schematics Saved", "create.gui.schematicTable.uploading": "Uploading...", @@ -859,6 +859,30 @@ "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s", + "create.item_attributes.has_enchant": "is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", + "create.item_attributes.has_fluid": "contains %1$s", + "create.item_attributes.has_fluid.inverted": "does not contain %1$s", + "create.item_attributes.has_name": "has the custom name %1$s", + "create.item_attributes.has_name.inverted": "does not have the custom name %1$s", + "create.item_attributes.book_author": "was authored by %1$s", + "create.item_attributes.book_author.inverted": "was not authored by %1$s", + "create.item_attributes.book_copy_original": "is an original", + "create.item_attributes.book_copy_original.inverted": "is not an original", + "create.item_attributes.book_copy_first": "is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "is not a first-generation copy", + "create.item_attributes.book_copy_second": "is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index beb9fcf3f..17953de60 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 972", + "_": "Missing Localizations: 996", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "Dein Bauplan ist zu groß.", "create.schematics.maxAllowedSize": "Die maximale Bauplan-Dateigröße ist:", - "create.gui.schematicTable.title": "Bauplantisch", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "Bauplantisch", "create.gui.schematicTable.availableSchematics": "Verfügbare Baupläne", "create.gui.schematicTable.noSchematics": "Keine gespeicherten Baupläne", "create.gui.schematicTable.uploading": "Hochladen...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index d6af217bb..ecc6b57fb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 601", + "_": "Missing Localizations: 625", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "Votre schéma est trop grand.", "create.schematics.maxAllowedSize": "La taille de fichier schématique maximale autorisée est:", - "create.gui.schematicTable.title": "Table à schéma", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "Table à schéma", "create.gui.schematicTable.availableSchematics": "Schémas disponibles", "create.gui.schematicTable.noSchematics": "Aucun schéma enregistré", "create.gui.schematicTable.uploading": "Téléchargement...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "a été ajouté par %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "Aucun attribut sélectionné", "create.gui.attribute_filter.selected_attributes": "Attributs sélectionnés:", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index ec8a23067..080124ed4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 585", + "_": "Missing Localizations: 609", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "La schematica è troppo grande.", "create.schematics.maxAllowedSize": "La dimensione massima consentita del file schematica è:", - "create.gui.schematicTable.title": "Banco Schematico", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "Banco Schematico", "create.gui.schematicTable.availableSchematics": "Schatiche disponibili", "create.gui.schematicTable.noSchematics": "Nessuna Schatica Salvata", "create.gui.schematicTable.uploading": "Caricamento...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "è stato aggiunto da %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "Nessun attributo selezionato", "create.gui.attribute_filter.selected_attributes": "Attributi selezionati:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 9959ca968..5e37f53cd 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 584", + "_": "Missing Localizations: 608", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "概略図が大きすぎます。", "create.schematics.maxAllowedSize": "最大許容概略図ファイルサイズは:", - "create.gui.schematicTable.title": "概略図テーブル", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "概略図テーブル", "create.gui.schematicTable.availableSchematics": "利用可能な概略図", "create.gui.schematicTable.noSchematics": "保存された概略図はありません", "create.gui.schematicTable.uploading": "アップロードしています...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "%1$s によって追加されたか", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "属性が選択されていません", "create.gui.attribute_filter.selected_attributes": "選択された属性:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index ab223925e..e35b31d80 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 585", + "_": "Missing Localizations: 609", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "청사진이 너무 큽니다!.", "create.schematics.maxAllowedSize": "최대 청사진 파일 크기는:", - "create.gui.schematicTable.title": "청사진 테이블", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "청사진 테이블", "create.gui.schematicTable.availableSchematics": "이용가능한 청사진", "create.gui.schematicTable.noSchematics": "저장된 청사진 없음", "create.gui.schematicTable.uploading": "업로딩 중...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "%1$s가 추가함", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "속성이 선택되지 않음", "create.gui.attribute_filter.selected_attributes": "선택된 속성:", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index a119d14a3..ef18f898c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 913", + "_": "Missing Localizations: 937", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "Jouw Bouwtekening is te groot!", "create.schematics.maxAllowedSize": "De maximum toegestane grote van een Bouwtekings bestand is:", - "create.gui.schematicTable.title": "Bouwtekening Tafel", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "Bouwtekening Tafel", "create.gui.schematicTable.availableSchematics": "Beschikbare Bouwtekeningen", "create.gui.schematicTable.noSchematics": "Geen Bouwtekeningen opgeslagen", "create.gui.schematicTable.uploading": "Uploaden...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 57e45ba6e..4911783fb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 979", + "_": "Missing Localizations: 1003", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "Seu esquema é muito grande", "create.schematics.maxAllowedSize": "O tamanho máximo permitido para o esquema é:", - "create.gui.schematicTable.title": "Mesa de Desenho", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "Mesa de Desenho", "create.gui.schematicTable.availableSchematics": "UNLOCALIZED: Available Schematics", "create.gui.schematicTable.noSchematics": "UNLOCALIZED: No Schematics Saved", "create.gui.schematicTable.uploading": "Importando...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "UNLOCALIZED: was added by %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "UNLOCALIZED: No attributes selected", "create.gui.attribute_filter.selected_attributes": "UNLOCALIZED: Selected attributes:", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 369716c3f..68c921001 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 254", + "_": "Missing Localizations: 278", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "Ваша схематика слишком велика.", "create.schematics.maxAllowedSize": "Максимально допустимый размер файла:", - "create.gui.schematicTable.title": "Схематичный стол", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "Схематичный стол", "create.gui.schematicTable.availableSchematics": "Доступные схемы", "create.gui.schematicTable.noSchematics": "Схемы не сохранены", "create.gui.schematicTable.uploading": "Загрузка ...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "был добавлен %1$s", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "Атрибуты не выбраны", "create.gui.attribute_filter.selected_attributes": "Выбранные атрибуты:", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 096e4f728..74f907b4c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 267", + "_": "Missing Localizations: 291", "_": "->------------------------] Game Elements [------------------------<-", @@ -770,9 +770,9 @@ "create.schematics.uploadTooLarge": "你的蓝图太大", "create.schematics.maxAllowedSize": "允许的最大蓝图文件大小为:", - "create.gui.schematicTable.title": "蓝图桌", "create.gui.schematicTable.refresh": "UNLOCALIZED: Refresh Files", "create.gui.schematicTable.open_folder": "UNLOCALIZED: Open Folder", + "create.gui.schematicTable.title": "蓝图桌", "create.gui.schematicTable.availableSchematics": "可用蓝图", "create.gui.schematicTable.noSchematics": "没有保存的蓝图", "create.gui.schematicTable.uploading": "正在上传...", @@ -860,6 +860,30 @@ "create.item_attributes.in_item_group.inverted": "UNLOCALIZED: is not in group '%1$s'", "create.item_attributes.added_by": "由%1$s添加", "create.item_attributes.added_by.inverted": "UNLOCALIZED: was not added by %1$s", + "create.item_attributes.has_enchant": "UNLOCALIZED: is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "UNLOCALIZED: is not enchanted with %1$s", + "create.item_attributes.has_fluid": "UNLOCALIZED: contains %1$s", + "create.item_attributes.has_fluid.inverted": "UNLOCALIZED: does not contain %1$s", + "create.item_attributes.has_name": "UNLOCALIZED: has the custom name %1$s", + "create.item_attributes.has_name.inverted": "UNLOCALIZED: does not have the custom name %1$s", + "create.item_attributes.book_author": "UNLOCALIZED: was authored by %1$s", + "create.item_attributes.book_author.inverted": "UNLOCALIZED: was not authored by %1$s", + "create.item_attributes.book_copy_original": "UNLOCALIZED: is an original", + "create.item_attributes.book_copy_original.inverted": "UNLOCALIZED: is not an original", + "create.item_attributes.book_copy_first": "UNLOCALIZED: is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "UNLOCALIZED: is not a first-generation copy", + "create.item_attributes.book_copy_second": "UNLOCALIZED: is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "UNLOCALIZED: is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "UNLOCALIZED: is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "UNLOCALIZED: is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "UNLOCALIZED: has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "UNLOCALIZED: does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "UNLOCALIZED: is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "UNLOCALIZED: is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "UNLOCALIZED: has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "UNLOCALIZED: does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "UNLOCALIZED: improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "UNLOCALIZED: does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "没有标记任何属性", "create.gui.attribute_filter.selected_attributes": "已选择的属性:", diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index f482bb22e..c9ecf6c6e 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -249,7 +249,6 @@ "create.schematics.uploadTooLarge": "Your schematic exceeds limitations specified by the server.", "create.schematics.maxAllowedSize": "The maximum allowed schematic file size is:", - "create.gui.schematicTable.title": "Schematic Table", "create.gui.schematicTable.refresh": "Refresh Files", "create.gui.schematicTable.open_folder": "Open Folder", "create.gui.schematicTable.title": "Schematic Table", @@ -343,6 +342,31 @@ "create.item_attributes.in_item_group.inverted": "is not in group '%1$s'", "create.item_attributes.added_by": "was added by %1$s", "create.item_attributes.added_by.inverted": "was not added by %1$s", + + "create.item_attributes.has_enchant": "is enchanted with %1$s", + "create.item_attributes.has_enchant.inverted": "is not enchanted with %1$s", + "create.item_attributes.has_fluid": "contains %1$s", + "create.item_attributes.has_fluid.inverted": "does not contain %1$s", + "create.item_attributes.has_name": "has the custom name %1$s", + "create.item_attributes.has_name.inverted": "does not have the custom name %1$s", + "create.item_attributes.book_author": "was authored by %1$s", + "create.item_attributes.book_author.inverted": "was not authored by %1$s", + "create.item_attributes.book_copy_original": "is an original", + "create.item_attributes.book_copy_original.inverted": "is not an original", + "create.item_attributes.book_copy_first": "is a first-generation copy", + "create.item_attributes.book_copy_first.inverted": "is not a first-generation copy", + "create.item_attributes.book_copy_second": "is a second-generation copy", + "create.item_attributes.book_copy_second.inverted": "is not a second-generation copy", + "create.item_attributes.book_copy_tattered": "is a tattered mess", + "create.item_attributes.book_copy_tattered.inverted": "is not a tattered mess", + "create.item_attributes.astralsorcery_crystal": "has crystal attribute %1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "does not have crystal attribute %1$s", + "create.item_attributes.astralsorcery_constellation": "is attuned to %1$s", + "create.item_attributes.astralsorcery_constellation.inverted": "is not attuned to %1$s", + "create.item_attributes.astralsorcery_perk_gem": "has perk attribute %1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "does not have perk attribute %1$s", + "create.item_attributes.astralsorcery_amulet": "improves %1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "does not improve %1$s", "create.gui.attribute_filter.no_selected_attributes": "No attributes selected", "create.gui.attribute_filter.selected_attributes": "Selected attributes:", From b14664d45f9ff3910b60202a63e692d48343ac3e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 22 Oct 2020 00:50:17 +0200 Subject: [PATCH 27/36] Windmill is Bearing is Clockwork - Fixed Mechanical Press animation de-sync between server and client - The press no longer requires a redstone signal to activate on in-world items - Fixed spouts and basin trying to create potion buckets - The Mechanical bearing can no longer generate force from wind - Added the windmill bearing - Windmill bearings can be configured to rotate counter-clockwise - Added Sail Frames and Sails - Sails can by dyed in-world - Sails negate fall damage - Sails attach themselves to blocks and do not require a sticky surface or chassis - Clockwork bearings can now be configured to switch minute and hour hand aswell as use a 24 hour cycle - Fixed tunnels with windows occluding block faces directly behind them - Fixed item model of the mechanical saw --- src/generated/resources/.cache/cache | 102 +++++++-- .../assets/create/blockstates/black_sail.json | 30 +++ .../assets/create/blockstates/blue_sail.json | 30 +++ .../assets/create/blockstates/brown_sail.json | 30 +++ .../assets/create/blockstates/cyan_sail.json | 30 +++ .../assets/create/blockstates/fluid_pipe.json | 204 +++++++++--------- .../assets/create/blockstates/gray_sail.json | 30 +++ .../assets/create/blockstates/green_sail.json | 30 +++ .../create/blockstates/light_blue_sail.json | 30 +++ .../create/blockstates/light_gray_sail.json | 30 +++ .../assets/create/blockstates/lime_sail.json | 30 +++ .../create/blockstates/magenta_sail.json | 30 +++ .../create/blockstates/orange_sail.json | 30 +++ .../assets/create/blockstates/pink_sail.json | 30 +++ .../create/blockstates/purple_sail.json | 30 +++ .../create/blockstates/radial_chassis.json | 72 +++---- .../assets/create/blockstates/red_sail.json | 30 +++ .../assets/create/blockstates/sail_frame.json | 30 +++ .../assets/create/blockstates/white_sail.json | 30 +++ .../create/blockstates/windmill_bearing.json | 30 +++ .../create/blockstates/yellow_sail.json | 30 +++ .../resources/assets/create/lang/en_ud.json | 18 ++ .../resources/assets/create/lang/en_us.json | 25 +++ .../assets/create/lang/unfinished/de_de.json | 27 ++- .../assets/create/lang/unfinished/fr_fr.json | 27 ++- .../assets/create/lang/unfinished/it_it.json | 27 ++- .../assets/create/lang/unfinished/ja_jp.json | 27 ++- .../assets/create/lang/unfinished/ko_kr.json | 27 ++- .../assets/create/lang/unfinished/nl_nl.json | 27 ++- .../assets/create/lang/unfinished/pt_br.json | 27 ++- .../assets/create/lang/unfinished/ru_ru.json | 27 ++- .../assets/create/lang/unfinished/zh_cn.json | 27 ++- .../create/models/block/black_sail.json | 6 + .../assets/create/models/block/blue_sail.json | 6 + .../create/models/block/brown_sail.json | 6 + .../models/block/clockwork_bearing.json | 1 + .../assets/create/models/block/cyan_sail.json | 6 + .../assets/create/models/block/gray_sail.json | 6 + .../create/models/block/green_sail.json | 6 + .../create/models/block/light_blue_sail.json | 6 + .../create/models/block/light_gray_sail.json | 6 + .../assets/create/models/block/lime_sail.json | 6 + .../create/models/block/magenta_sail.json | 6 + .../models/block/mechanical_bearing.json | 1 + .../create/models/block/orange_sail.json | 6 + .../assets/create/models/block/pink_sail.json | 6 + .../create/models/block/purple_sail.json | 6 + .../assets/create/models/block/red_sail.json | 6 + .../create/models/block/windmill_bearing.json | 8 + .../create/models/block/yellow_sail.json | 6 + .../create/models/item/clockwork_bearing.json | 1 + .../models/item/mechanical_bearing.json | 1 + .../assets/create/models/item/sail_frame.json | 3 + .../assets/create/models/item/white_sail.json | 3 + .../create/models/item/windmill_bearing.json | 8 + .../crafting/kinetics/sail_frame.json | 32 +++ .../crafting/kinetics/white_sail.json | 32 +++ .../crafting/kinetics/windmill_bearing.json | 32 +++ .../create/loot_tables/blocks/black_sail.json | 19 ++ .../create/loot_tables/blocks/blue_sail.json | 19 ++ .../create/loot_tables/blocks/brown_sail.json | 19 ++ .../create/loot_tables/blocks/cyan_sail.json | 19 ++ .../create/loot_tables/blocks/gray_sail.json | 19 ++ .../create/loot_tables/blocks/green_sail.json | 19 ++ .../loot_tables/blocks/light_blue_sail.json | 19 ++ .../loot_tables/blocks/light_gray_sail.json | 19 ++ .../create/loot_tables/blocks/lime_sail.json | 19 ++ .../loot_tables/blocks/magenta_sail.json | 19 ++ .../loot_tables/blocks/orange_sail.json | 19 ++ .../create/loot_tables/blocks/pink_sail.json | 19 ++ .../loot_tables/blocks/purple_sail.json | 19 ++ .../create/loot_tables/blocks/red_sail.json | 19 ++ .../create/loot_tables/blocks/sail_frame.json | 19 ++ .../create/loot_tables/blocks/white_sail.json | 19 ++ .../loot_tables/blocks/windmill_bearing.json | 19 ++ .../loot_tables/blocks/yellow_sail.json | 19 ++ .../recipes/crafting/kinetics/sail_frame.json | 20 ++ .../recipes/crafting/kinetics/white_sail.json | 20 ++ .../crafting/kinetics/windmill_bearing.json | 22 ++ .../create/tags/blocks/fan_transparent.json | 1 + .../data/create/tags/blocks/sails.json | 20 ++ .../create/tags/blocks/windmill_sails.json | 17 ++ .../com/simibubi/create/AllBlockPartials.java | 17 +- .../java/com/simibubi/create/AllBlocks.java | 58 ++++- .../java/com/simibubi/create/AllShapes.java | 11 +- .../java/com/simibubi/create/AllTags.java | 2 +- .../com/simibubi/create/AllTileEntities.java | 7 + .../simibubi/create/content/AllSections.java | 6 +- .../press/BeltPressingCallbacks.java | 2 +- .../press/MechanicalPressBlock.java | 29 +-- .../press/MechanicalPressTileEntity.java | 51 ++++- .../BlockMovementTraits.java | 13 +- .../bearing/BearingRenderer.java | 4 +- .../bearing/ClockworkBearingTileEntity.java | 123 +++++++++-- .../bearing/IBearingTileEntity.java | 15 ++ .../bearing/MechanicalBearingBlock.java | 44 ++-- .../bearing/MechanicalBearingTileEntity.java | 91 ++------ .../structureMovement/bearing/SailBlock.java | 198 +++++++++++++++++ .../bearing/SailBlockPlacementHelper.java | 101 +++++++++ .../bearing/WindmillBearingBlock.java | 55 +++++ .../bearing/WindmillBearingTileEntity.java | 111 ++++++++++ .../fluids/actors/GenericItemFilling.java | 7 +- .../contraptions/processing/BasinBlock.java | 17 +- .../simibubi/create/events/ClientEvents.java | 2 + .../foundation/command/AllCommands.java | 2 +- .../create/foundation/config/CClient.java | 2 +- .../foundation/data/BuilderTransformers.java | 9 +- .../data/recipe/StandardRecipeGen.java | 24 +++ .../create/foundation/gui/AllIcons.java | 4 + .../foundation/item/CreateItemGroupBase.java | 5 +- .../assets/create/lang/default/messages.json | 8 + .../create/models/block/bearing/block.json | 2 +- .../create/models/block/bearing/item.json | 2 +- .../models/block/bearing/top_wooden.json | 10 + .../create/models/block/sail_frame.json | 143 ++++++++++++ .../assets/create/models/block/seat.json | 34 ++- .../create/models/block/white_sail.json | 141 ++++++++++++ .../textures/block/bearing_top_wooden.png | Bin 0 -> 516 bytes .../textures/block/sail/canvas_black.png | Bin 0 -> 459 bytes .../textures/block/sail/canvas_blue.png | Bin 0 -> 485 bytes .../textures/block/sail/canvas_brown.png | Bin 0 -> 526 bytes .../textures/block/sail/canvas_cyan.png | Bin 0 -> 475 bytes .../textures/block/sail/canvas_gray.png | Bin 0 -> 479 bytes .../textures/block/sail/canvas_green.png | Bin 0 -> 449 bytes .../textures/block/sail/canvas_light_blue.png | Bin 0 -> 488 bytes .../textures/block/sail/canvas_light_gray.png | Bin 0 -> 490 bytes .../textures/block/sail/canvas_lime.png | Bin 0 -> 479 bytes .../textures/block/sail/canvas_magenta.png | Bin 0 -> 480 bytes .../textures/block/sail/canvas_orange.png | Bin 0 -> 490 bytes .../textures/block/sail/canvas_pink.png | Bin 0 -> 502 bytes .../textures/block/sail/canvas_purple.png | Bin 0 -> 493 bytes .../create/textures/block/sail/canvas_red.png | Bin 0 -> 461 bytes .../textures/block/sail/canvas_white.png | Bin 0 -> 461 bytes .../textures/block/sail/canvas_yellow.png | Bin 0 -> 478 bytes .../create/textures/block/sail/frame.png | Bin 0 -> 718 bytes .../textures/block/windmill_bearing_side.png | Bin 0 -> 432 bytes .../assets/create/textures/gui/icons.png | Bin 8608 -> 4765 bytes 137 files changed, 2840 insertions(+), 368 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/black_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/blue_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/brown_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/cyan_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/gray_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/green_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/light_blue_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/light_gray_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/lime_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/magenta_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/orange_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/pink_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/purple_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/red_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/sail_frame.json create mode 100644 src/generated/resources/assets/create/blockstates/white_sail.json create mode 100644 src/generated/resources/assets/create/blockstates/windmill_bearing.json create mode 100644 src/generated/resources/assets/create/blockstates/yellow_sail.json create mode 100644 src/generated/resources/assets/create/models/block/black_sail.json create mode 100644 src/generated/resources/assets/create/models/block/blue_sail.json create mode 100644 src/generated/resources/assets/create/models/block/brown_sail.json create mode 100644 src/generated/resources/assets/create/models/block/cyan_sail.json create mode 100644 src/generated/resources/assets/create/models/block/gray_sail.json create mode 100644 src/generated/resources/assets/create/models/block/green_sail.json create mode 100644 src/generated/resources/assets/create/models/block/light_blue_sail.json create mode 100644 src/generated/resources/assets/create/models/block/light_gray_sail.json create mode 100644 src/generated/resources/assets/create/models/block/lime_sail.json create mode 100644 src/generated/resources/assets/create/models/block/magenta_sail.json create mode 100644 src/generated/resources/assets/create/models/block/orange_sail.json create mode 100644 src/generated/resources/assets/create/models/block/pink_sail.json create mode 100644 src/generated/resources/assets/create/models/block/purple_sail.json create mode 100644 src/generated/resources/assets/create/models/block/red_sail.json create mode 100644 src/generated/resources/assets/create/models/block/windmill_bearing.json create mode 100644 src/generated/resources/assets/create/models/block/yellow_sail.json create mode 100644 src/generated/resources/assets/create/models/item/sail_frame.json create mode 100644 src/generated/resources/assets/create/models/item/white_sail.json create mode 100644 src/generated/resources/assets/create/models/item/windmill_bearing.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sail_frame.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/windmill_bearing.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/black_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/blue_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/brown_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cyan_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/gray_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/green_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_blue_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/light_gray_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/lime_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/magenta_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/orange_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/pink_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/purple_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/red_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/sail_frame.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/white_sail.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/windmill_bearing.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/yellow_sail.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/sail_frame.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/white_sail.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/windmill_bearing.json create mode 100644 src/generated/resources/data/create/tags/blocks/sails.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlockPlacementHelper.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/bearing/top_wooden.json create mode 100644 src/main/resources/assets/create/models/block/sail_frame.json create mode 100644 src/main/resources/assets/create/models/block/white_sail.json create mode 100644 src/main/resources/assets/create/textures/block/bearing_top_wooden.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_black.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_blue.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_brown.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_cyan.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_gray.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_green.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_light_blue.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_light_gray.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_lime.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_magenta.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_orange.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_pink.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_purple.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_red.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_white.png create mode 100644 src/main/resources/assets/create/textures/block/sail/canvas_yellow.png create mode 100644 src/main/resources/assets/create/textures/block/sail/frame.png create mode 100644 src/main/resources/assets/create/textures/block/windmill_bearing_side.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index bd58489ca..07521487a 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -22,9 +22,11 @@ e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json f25693a9429f6337149ff24f27900dc4eb82a7c2 assets/create/blockstates/belt.json cf9045eb16e5299a1d917c4cb536289f49411276 assets/create/blockstates/birch_window.json 94a1a91403eb4b035fec48071e7fcae57a8a6abd assets/create/blockstates/birch_window_pane.json +e0f1e44c9bce4a7478592cf3a8ee7b91d9083d65 assets/create/blockstates/black_sail.json 58b07d2af6030342f0354f6d3fd0ee128d2d74b4 assets/create/blockstates/black_seat.json a71ddf3291bd13d7877f2fe32c42f50407f99afb assets/create/blockstates/black_valve_handle.json 923aeb2a556f67bc0526f237dd97af2d37b4c9f1 assets/create/blockstates/blaze_burner.json +ec2ab87734acc209e6be3bc4898b1199f819bfd3 assets/create/blockstates/blue_sail.json 4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets/create/blockstates/blue_seat.json 9d7341a5cae5d47788c595167946dfb6441cebd1 assets/create/blockstates/blue_valve_handle.json fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets/create/blockstates/brass_belt_funnel.json @@ -32,6 +34,7 @@ fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets/create/blockstates/brass_belt_fu b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json 3057e1121117c0cd651c288cd8e2d46bdf64afb1 assets/create/blockstates/brass_funnel.json 672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json +11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json 322289524c058fac66bbe76b4924c3b0c0c33b84 assets/create/blockstates/brown_valve_handle.json 26f3b6a8f8249e4e622ab200057d75e228762817 assets/create/blockstates/cart_assembler.json @@ -57,6 +60,7 @@ f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_moto fe2f78b94c20944399101e7369e2d43324297fb6 assets/create/blockstates/crushing_wheel.json a1dd6cb3daa97ea871290ef7b178d28b564ee2a2 assets/create/blockstates/crushing_wheel_controller.json b1126c191877cff86b4e2de83e1fcbd151451cb7 assets/create/blockstates/cuckoo_clock.json +b496452f2f7dbbba385e1fc10b560ec266e4b5e7 assets/create/blockstates/cyan_sail.json 4de72f65bff4e5d9c8153fa3adeee6b61d6f912b assets/create/blockstates/cyan_seat.json 2c04d57e56849f243aec8a1e769574d24daac1e9 assets/create/blockstates/cyan_valve_handle.json 1726b1b9e04a0634e7e1fdcf1cf4cc898efc5c2f assets/create/blockstates/dark_oak_window.json @@ -132,7 +136,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -3d97226b5e8d8f70ed08e45e78db1faf78d5e28b assets/create/blockstates/fluid_pipe.json +4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -161,8 +165,10 @@ a4b0337149cb0617cc60061477c7178d37dbb831 assets/create/blockstates/granite_cobbl d97fdea02187e63f6b63913357c79a18660d676d assets/create/blockstates/granite_cobblestone_stairs.json 9ce66b5a61c3aad398756d26e4efee2b9e12a275 assets/create/blockstates/granite_cobblestone_wall.json f8659e81cd2a623475a6a9aca59149e82de56b1c assets/create/blockstates/granite_pillar.json +5c40c4a27e1dec747a467dd251700c72a6ceb07d assets/create/blockstates/gray_sail.json a5ec5401ba9f3e102a2e1b35837f643847afbca4 assets/create/blockstates/gray_seat.json 5f17a5868616b33eb157965a661046cab7a1427f assets/create/blockstates/gray_valve_handle.json +52b849faef96b8ab9d9d64a1518c8f299af057b8 assets/create/blockstates/green_sail.json 13059309684db0cc7a0f1f4fce2407cf06cce80a assets/create/blockstates/green_seat.json f4a0fc68e8daaa0a47cdc951ced4310057a874b0 assets/create/blockstates/green_valve_handle.json 6ab675fa06317e6d07c0c1a453e7bb43e3f46b3b assets/create/blockstates/hand_crank.json @@ -180,10 +186,13 @@ a4cfcdc038af0f93a58d88ea8860b34d73632ff4 assets/create/blockstates/layered_dolom 038f532f7364c1e793196fcc5856df9ceff93578 assets/create/blockstates/layered_limestone.json 8535d628f8834be62cdf62ef4b60c2ce3a7af99f assets/create/blockstates/layered_scoria.json 419d7fffc5cbd392f10211afa8d17e3eb8df8380 assets/create/blockstates/layered_weathered_limestone.json +029904f21970947a4423a6e0c8c65c4e02f2e8e6 assets/create/blockstates/light_blue_sail.json 2a0a8b1715700bf1e284ee57ef9f7f163c12f3ee assets/create/blockstates/light_blue_seat.json 9bee040558a6b24e21f837fc808e17fae1883e71 assets/create/blockstates/light_blue_valve_handle.json +93537c4e2ab86218a777e7b000c3fcd55a80b1cd assets/create/blockstates/light_gray_sail.json d9a2551e001bb315d071bb9f1f013323a66a5d09 assets/create/blockstates/light_gray_seat.json 8bea8c86de8c218c8932eef140f0ed439e173156 assets/create/blockstates/light_gray_valve_handle.json +ba2c4e3ddafa3c89a72cc243b14e8518fab369aa assets/create/blockstates/lime_sail.json 1de3a88c003df03f5006e1bbaa0236589aba08ad assets/create/blockstates/lime_seat.json 179a3e68b9f2e289eafe0e98e768befbbf91c5c2 assets/create/blockstates/lime_valve_handle.json c4dcb169bd1dffe8501bff455e3eb6ba979f60ab assets/create/blockstates/limesand.json @@ -198,6 +207,7 @@ e7c7b952137c4cb615988ea59b9f14303c9a4dfe assets/create/blockstates/limestone_bri 17c5a6c1dd094c9201ed90fdcebde620a8a39900 assets/create/blockstates/limestone_cobblestone_wall.json b7506b862d13b3f915c60d38bb7a20afc935f70a assets/create/blockstates/limestone_pillar.json 69790737767e06f000c7824749c46664a123160e assets/create/blockstates/linear_chassis.json +85a58ac539775f90903d9ce66374f3f2ffd4fecf assets/create/blockstates/magenta_sail.json 84c494d24cc58af274fdd054896c680e8095d2d0 assets/create/blockstates/magenta_seat.json 3bfce5016e5c929b74368dc2d734e62ae34587a4 assets/create/blockstates/magenta_valve_handle.json 3b3250d6e209403a93d025604a8081087965016e assets/create/blockstates/mechanical_arm.json @@ -229,6 +239,7 @@ b1126c191877cff86b4e2de83e1fcbd151451cb7 assets/create/blockstates/mysterious_cu 36e46e65003a8d0b8555fe5e8f8dc980d6559bc5 assets/create/blockstates/nozzle.json cf60989f63f02067fc4e4ad25033ac83167cdeb0 assets/create/blockstates/oak_window.json 4a796509c3953171f04f957351282205840b3760 assets/create/blockstates/oak_window_pane.json +b0be3d4ff92cb123ec21ec2788db35d0f392ba8a assets/create/blockstates/orange_sail.json 5764a24f6c4fa552b61d2a02135adfc7d93c2e10 assets/create/blockstates/orange_seat.json 1445074ec21a3735ea912b624c0f9f18a450d2d3 assets/create/blockstates/orange_valve_handle.json 8e2028e1a0450a592eed5e10276ba19b1195a206 assets/create/blockstates/ornate_iron_window.json @@ -278,6 +289,7 @@ c17d334e938dcb742550ba8307ca8266a1fc9b49 assets/create/blockstates/paved_weather cb23aef25f3106b06c8fa8f152c638bb0d2185d8 assets/create/blockstates/paved_weathered_limestone_slab.json d62b0992cec1de45dad1f2c273132225f4ef33a0 assets/create/blockstates/paved_weathered_limestone_stairs.json dba4cf86e82ed4502fffed363fbce226a445e774 assets/create/blockstates/paved_weathered_limestone_wall.json +30971f2f76fe56f144178c33ad6bde5fc9fb61c3 assets/create/blockstates/pink_sail.json 919a79e4a4a5fab0aac3ef48e1c786017d6aa001 assets/create/blockstates/pink_seat.json 471a3bb474a0ae0453143888d561256cce894e3f assets/create/blockstates/pink_valve_handle.json 975c97018e9e2419943eaab43aed0970e96feaf7 assets/create/blockstates/piston_extension_pole.json @@ -310,9 +322,11 @@ f42ad32aefcfa7ccc6287f57ee1a5f092b65126f assets/create/blockstates/polished_weat e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggle_latch.json 3a739f9d4276828d83f2d2750bf3227c87bcd438 assets/create/blockstates/pulley_magnet.json 469e430d96cb0a5e1aaf6b7cc5d401d488c9e600 assets/create/blockstates/pulse_repeater.json +d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json +bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json +45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json 8929677f2cc5354aa19ef182af69f9f0b41eb242 assets/create/blockstates/redstone_contact.json @@ -322,6 +336,7 @@ b76ed5f6d271349b2509708c11e713bb299a57b6 assets/create/blockstates/refined_radia e2990fe70ad5d10437a376e70e167d1856277cc1 assets/create/blockstates/rope.json e14d5f7252105934295b4e156ec0e6d62d3d6b1c assets/create/blockstates/rope_pulley.json cc4cf3420fa290cb844f9cf4dfdd836aa9b70500 assets/create/blockstates/rotation_speed_controller.json +ff5525783431f5047fc1ebf71d6c5ad526072b14 assets/create/blockstates/sail_frame.json 7120f29e4b88a1c40125a8cdbe8af3570f4ee352 assets/create/blockstates/schematic_table.json 36592a6542332b35445931e8e9531adf786b63ba assets/create/blockstates/schematicannon.json a5befc14551f043675e985027609aeb7e6bacc0d assets/create/blockstates/scoria.json @@ -362,23 +377,26 @@ fd7a9c7095372485081436c91489cadb2b0c514e assets/create/blockstates/weathered_lim 47f8c91ff4c3f5cad782ab469a1fe5f4909dc7f1 assets/create/blockstates/weathered_limestone_cobblestone_stairs.json c60c3115fd6eeaa3a696428a87a74d184ab7d62d assets/create/blockstates/weathered_limestone_cobblestone_wall.json c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_limestone_pillar.json +512bf17c9ea309b1f7da54440f923530d25e467c assets/create/blockstates/white_sail.json 4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json 89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json +c4cd1131113667da0180898b5db3ebad609db8ba assets/create/blockstates/windmill_bearing.json +e03c48512967845fce09d84b955d3bc7b480fedc assets/create/blockstates/yellow_sail.json a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -33f621fe1a09a46426af59c9352c33e97c2bc00d assets/create/lang/en_ud.json -ed4fcea49a7ad3c1ed81f7681dd190d2474314fe assets/create/lang/en_us.json -cf1c3a0295a2a3d74bf06ea5a5f0a4832dea060c assets/create/lang/unfinished/de_de.json -1adf9c52894458c41763cfe7c9714e9fc5816f04 assets/create/lang/unfinished/fr_fr.json -db2e9e08036df7f2c3a0c1c319e5ba975b2b4755 assets/create/lang/unfinished/it_it.json -df56f590b03878564544368cad779ef1a78c430d assets/create/lang/unfinished/ja_jp.json -f3af37ad22d3b4a1833e22948c87b3193b44d97a assets/create/lang/unfinished/ko_kr.json -a6ff23a0430637a8119e94f05cb393c7642179c9 assets/create/lang/unfinished/nl_nl.json -4fe5e45ca30e1c6c53103e06e3ad0cdd9671956e assets/create/lang/unfinished/pt_br.json -c3bf50e7e9191b2607573c5453108a5fb6a733b9 assets/create/lang/unfinished/ru_ru.json -bd56413cd36382704d77ce4e194712b1d79dcbd6 assets/create/lang/unfinished/zh_cn.json +ad168f04d430ebd783a845e5928c3273da3f0074 assets/create/lang/en_ud.json +25b02b7b025f988b0cda9655b2c586c82dfd369c assets/create/lang/en_us.json +cf9075cacdbd171b33fa0b6cb68365e2c3614b40 assets/create/lang/unfinished/de_de.json +87ea3d2da2863fa61c5d5b9f535aac8c1703be28 assets/create/lang/unfinished/fr_fr.json +3349f2726256c99abd7e5268faa806b628d91e4d assets/create/lang/unfinished/it_it.json +3cf205e25543b7860d6b00f2f91dd799333b9d74 assets/create/lang/unfinished/ja_jp.json +d112e8b804ca16511c4096b328f3635b4c84a3e9 assets/create/lang/unfinished/ko_kr.json +78791855041e56a27fb3520b289ca8a144de98ad assets/create/lang/unfinished/nl_nl.json +d92ac1ec1ebbad873dd6563509767428603b6ba2 assets/create/lang/unfinished/pt_br.json +5d4f30e05fea3bec9c6c85a5f7767eb3dd0a7dfe assets/create/lang/unfinished/ru_ru.json +46996569e164858a5f9dc7f60731707d3517b888 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -440,8 +458,10 @@ e2801a0c3fe8e1c2485291485b977f581fdc8b7c assets/create/models/block/andesite_tun 3905ced5892afa60009bf26279f9fa4756c273d4 assets/create/models/block/birch_window_pane_post.json 62b3f2edc5ef5d7dabbcff19220921b0e3582376 assets/create/models/block/birch_window_pane_side.json 95d4230eb366f5e7684820c9337e3956ed34042a assets/create/models/block/birch_window_pane_side_alt.json +2b59d6f937cd542eba670689c30fe16887dfd9a0 assets/create/models/block/black_sail.json 97d79ab99c0fb278a9b5dc54e1c6563868f87b76 assets/create/models/block/black_seat.json 02747ea1a0e5d4a1cd466bf26878885a89d347fa assets/create/models/block/black_valve_handle.json +d876627b6e519c6f3f59c7c27cc7b0f903206f7c assets/create/models/block/blue_sail.json e58b00a7222152d7facbe0e82f00933b974df747 assets/create/models/block/blue_seat.json c7f91468b196fbda137e6b31764870b3bbfda6b6 assets/create/models/block/blue_valve_handle.json 24dff9a8d22c9a88286d2b7d08384ac9f281a512 assets/create/models/block/brass_belt_funnel_pull_extended.json @@ -461,6 +481,7 @@ addcf821a2348c0985bf9a72229355cfab818069 assets/create/models/block/brass_belt_f a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel/t_left.json 0585fbe58da3a8ed0dc98cc7ed79ac067312078d assets/create/models/block/brass_tunnel/t_right.json a0612a633756433e1b37ddc6d290aa1fc07839ef assets/create/models/block/brass_tunnel/window.json +8ab097caaa0db0915ae9254f7d65092d9171bc60 assets/create/models/block/brown_sail.json 4eed0ad902f5e84f2b6c160f3283e8028640e77d assets/create/models/block/brown_seat.json 6c39677f8c3a84280835c717ea1ef569b7c76a1b assets/create/models/block/brown_valve_handle.json 028a07b49c05fe8a93f1d8c229d81e73d887c2df assets/create/models/block/chiseled_dark_scoria.json @@ -469,7 +490,7 @@ cd7751090cf3d55296b8e415d0af9b6f18d69770 assets/create/models/block/chiseled_gab d2e195aa2e90c712e51d855a9a4a334b52f62a69 assets/create/models/block/chiseled_limestone.json ac07568fa7b2d3fa84d0fe89a498514d30514291 assets/create/models/block/chiseled_scoria.json ecb2b85ee210dce329d2be66b98d0f0d4e6fc223 assets/create/models/block/chiseled_weathered_limestone.json -f9a3f0939ea43b404eb2826b94211a25fca5ebc2 assets/create/models/block/clockwork_bearing.json +30fe120af3cb32faf0729df4d2cdf868f804be17 assets/create/models/block/clockwork_bearing.json 70406933cc4fa5471af6e562fd84a397347dba17 assets/create/models/block/copper_casing.json b2c528cfd24a5cb0cb96c45d0a914f1090f8c32b assets/create/models/block/copper_valve_handle.json 1ef7060b0ca7e9c0bfc8151f98ca08da31862cda assets/create/models/block/crate/brass/bottom.json @@ -482,6 +503,7 @@ a09f639bde4c61d68592eb06c807e7a6791ff950 assets/create/models/block/crate/brass/ 7635211e4d833748acaea37ea48b1f749c32ea5f assets/create/models/block/crate/creative/right.json a123e3c8a9e2ea1665f268cf3991aa7e4b3119c6 assets/create/models/block/crate/creative/single.json 29ab5cfe7aed1271ede125e91bf78c1372b5f96e assets/create/models/block/crate/creative/top.json +68843a02a32c156afad85830877b83f9b51c5147 assets/create/models/block/cyan_sail.json 6704782830b3d872321e895b6903709c18e3778f assets/create/models/block/cyan_seat.json f45ef4a5f0aa8482d493661673b1c0ab6d061157 assets/create/models/block/cyan_valve_handle.json 57e70af1da4e971eca075616b787b70104189d60 assets/create/models/block/dark_oak_window.json @@ -678,8 +700,10 @@ d25cb5553bfd89cd3fca61ebd2204bf2a44cc3da assets/create/models/block/granite_cobb cf267628d47aa424bc20977e69e255ceda3ddfe4 assets/create/models/block/granite_cobblestone_wall_post.json a4f50b75a3186829fc5d62ee4e33997cd202dbd5 assets/create/models/block/granite_cobblestone_wall_side.json 349a58ac4e4535d0fe9ea467632ed904da2c6098 assets/create/models/block/granite_pillar.json +a68cd40ffb769b195437107f4a2c2188b222b74a assets/create/models/block/gray_sail.json 6eb5e59e803e1055968b90f3099cd0a17a1d3fd5 assets/create/models/block/gray_seat.json 7e213be39cc928363bf2b096f055439211050b8d assets/create/models/block/gray_valve_handle.json +17b651233c62b928f0228562a7f6e7a2b7b2d6b7 assets/create/models/block/green_sail.json 1438b8ce54ac5557b8f10dcef94f3525eae19461 assets/create/models/block/green_seat.json cc7ce9b6bc687ad5027a67c3bf22bdf5bcd71674 assets/create/models/block/green_valve_handle.json 9730fcb02f679087e81e24c836751e625be6a298 assets/create/models/block/horizontal_framed_glass.json @@ -703,10 +727,13 @@ ff78465839cbd36a356cd4153c721c88b1f0b297 assets/create/models/block/layered_gabb 8f1014b1fdef246c2ce525f33ade4f03c85d0217 assets/create/models/block/layered_limestone.json 9408ce7ba29a96053c9333b15a05d716752392c6 assets/create/models/block/layered_scoria.json da71aca99ac5cf3731896be47e15d774397a3330 assets/create/models/block/layered_weathered_limestone.json +19bd08ad6ac351e6eee2131f7b4c11a768bf8f08 assets/create/models/block/light_blue_sail.json 1a28b07da68d1461cd04c971ae548d94165e0cf3 assets/create/models/block/light_blue_seat.json 68e01f8d8a31f07f236383e19b49ae1be4cbe3f4 assets/create/models/block/light_blue_valve_handle.json +73f14b905d5fdb433751a33b963852de6491722a assets/create/models/block/light_gray_sail.json 292bec1b9f962b17b29147d982a9b177618b7eb9 assets/create/models/block/light_gray_seat.json 42338c4965da63962ea08077dc9e899aaf4c3c65 assets/create/models/block/light_gray_valve_handle.json +8292d043ebfe280340526a6a0f96d4160099e213 assets/create/models/block/lime_sail.json 31c9474210d8535c5417021fe042d4cc31e17328 assets/create/models/block/lime_seat.json 74008bd0d775b0e2e96b43be2e51d0f3c3abdf21 assets/create/models/block/lime_valve_handle.json ce6fb36a386c895486e021823eb008b0fa4862c3 assets/create/models/block/limesand.json @@ -732,9 +759,10 @@ eee8ae85daa99fcd594da3d4af393726af69493b assets/create/models/block/limestone_co 595bfec2293c44deae49147016cb7971bdd721df assets/create/models/block/linear_chassis_bottom.json 999ce855842170f47db9d1e8e8636c24f7d3ad3d assets/create/models/block/linear_chassis_top.json b9abbd1dcf71e0a1416fd998a82a560c06cef5a3 assets/create/models/block/linear_chassis_top_bottom.json +ec6b5f636e163ff5e361d486cf628ca1af4849a1 assets/create/models/block/magenta_sail.json cbee001cd1bb1125a97d1bb2d1e6e5a68f129303 assets/create/models/block/magenta_seat.json bc5a03a5552eb4a518abefe5e8615f14ee13ca29 assets/create/models/block/magenta_valve_handle.json -0492070642fda75b943080022368505f2d065730 assets/create/models/block/mechanical_bearing.json +2e67f27a895c9163a5d1be62897d5e66b119767a assets/create/models/block/mechanical_bearing.json edf6ee4e590ebf162c00aa952d992f1bee2cad8a assets/create/models/block/mossy_andesite.json 55256e4df0038a619d80d3e6c50b0f3e3682e90a assets/create/models/block/mossy_dark_scoria.json 7b9609eaf8933de6db1a7114fd6631e7d9a16dd1 assets/create/models/block/mossy_diorite.json @@ -751,6 +779,7 @@ e55363147cc27fba84590c7e24460603988118e3 assets/create/models/block/oak_window_p 88883e266828422f86ec71db455a41f0279926fd assets/create/models/block/oak_window_pane_post.json aa12818d00d1995e5b8a218cb613215ec0161d23 assets/create/models/block/oak_window_pane_side.json 488dfd3f4bd82ab1b5b751b4a46881befb8d6819 assets/create/models/block/oak_window_pane_side_alt.json +ff9b51fcaffe54e321b9479f035f4ea7b278bfec assets/create/models/block/orange_sail.json fda0628a09ef726e3e8323b2f38b6a3e612dc2ca assets/create/models/block/orange_seat.json 3b07f3f1985495051d173725b01ddd52b5f70ac4 assets/create/models/block/orange_valve_handle.json 006115bf8e36367c0c409effdeab939a54c20776 assets/create/models/block/ornate_iron_window.json @@ -881,6 +910,7 @@ cc36e21013b80b1dfa041b55047096db127ffa51 assets/create/models/block/paved_weathe 743fc37d4c96834f9bd0697ad7990c721436b901 assets/create/models/block/paved_weathered_limestone_stairs_outer.json 34ba32e570e0a54501db071b9f8c38513edea93d assets/create/models/block/paved_weathered_limestone_wall_post.json daf65510d95730bcf0373d746f2a2dbfe6b44fc0 assets/create/models/block/paved_weathered_limestone_wall_side.json +1b5f9e819cd4b5f5fe6e8c24920b916e8d93c95e assets/create/models/block/pink_sail.json ecc60ce7ee6b753073a99c597db95d6d9df3d438 assets/create/models/block/pink_seat.json 7ada61878d3a3c1d3cc33bcf9a80c21b8f9aaff2 assets/create/models/block/pink_valve_handle.json 83a4922d5799a5a1391a2675e9273caa24cde192 assets/create/models/block/polished_dark_scoria.json @@ -943,6 +973,7 @@ f22d7d8263dcabd726aa04784031ae9062633579 assets/create/models/block/powered_togg e6097d9ab9dc9954cbc750020bc33c7a423b73c6 assets/create/models/block/powered_toggle_latch_on_powered.json 622239a3a09fcac7235b9670eb395a530839a59b assets/create/models/block/pulse_repeater_powered.json 0102e253c941904f12de7acdd46b0079ee3ccf69 assets/create/models/block/pulse_repeater_pulsing.json +b56fad63b82434564bc41ae9c01e3b427203fb5b assets/create/models/block/purple_sail.json 96adc7865ebe64b43865bc2fe914830c11258856 assets/create/models/block/purple_seat.json 062406aacf25e099f9b28a3bf7cacfcaa1da4ef6 assets/create/models/block/purple_valve_handle.json 27d64a828607f94296c0b86cdb35fad996bc5d23 assets/create/models/block/radial_chassis_side_x.json @@ -951,6 +982,7 @@ a9885a3f69e3e2a2812c33bafd9140fcc5cc7c25 assets/create/models/block/radial_chass 92a48c22cf2af0a3156844322f6bb469883608fb assets/create/models/block/radial_chassis_side_y_sticky.json 522f4733118d6fba172696e9478c8f9fe88b236e assets/create/models/block/radial_chassis_side_z.json bffca231a146a6ac49e028f3790cdcbf375e98b0 assets/create/models/block/radial_chassis_side_z_sticky.json +f0099576080a0f2bb09dd85e55777bad69f9f265 assets/create/models/block/red_sail.json 12d4f4119b994c5d71c96ab3aa09beb89dad1e10 assets/create/models/block/red_seat.json 0064825ee3c1702c524d34abb6adb66906586851 assets/create/models/block/red_valve_handle.json c4bb40ed2bddabff154a34f4eff7a485bf6488a0 assets/create/models/block/refined_radiance_casing.json @@ -1022,6 +1054,8 @@ eb838d687f7a925f5b91c4784bfbf33070515e31 assets/create/models/block/weathered_li a5b04a1a35735713f51dcd5a80d9e582e6575bbc assets/create/models/block/weathered_limestone_pillar.json 1377e12f56dce1466ce44078d7154870c5cf7b2a assets/create/models/block/white_seat.json 899f33d51cf36cb1c283bc7e6363f9d451e5736e assets/create/models/block/white_valve_handle.json +f2bee22fe03ac047fbe73ca2c5c759f09bf646df assets/create/models/block/windmill_bearing.json +071ca07daceea4d0db7ed41e815d47589fdb14b7 assets/create/models/block/yellow_sail.json 0a0e2cc973e35586ae00ed17b919383868e992e8 assets/create/models/block/yellow_seat.json 55edee7b0833ab19b98694fab21ae0c8e91f76fd assets/create/models/block/yellow_valve_handle.json c94c60d1d77404af7d74a29a094c7bdf7501b385 assets/create/models/block/zinc_block.json @@ -1075,7 +1109,7 @@ a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets/create/models/item/chiseled_scor 70232ce9b88119fb383717e2c1ad113f7aad6a99 assets/create/models/item/chiseled_weathered_limestone.json fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets/create/models/item/chute.json d418205c83d3e57c830755ee8c09e2962353e493 assets/create/models/item/cinder_flour.json -b1531a7bd3f7f27b9587d13e818a93dc2d088bc8 assets/create/models/item/clockwork_bearing.json +c1da21be9f1af4f7a2ef4ec9cd92195d65ada316 assets/create/models/item/clockwork_bearing.json 0a2a0f0aafeab0088172f77afd40c1fa2cc1f2b8 assets/create/models/item/clutch.json dcb09deae110077bcddf090996b51cc66e9a7de3 assets/create/models/item/cogwheel.json 7717e3b21cff39f497f07687c70c1fa40eaa756d assets/create/models/item/content_observer.json @@ -1252,7 +1286,7 @@ d245aa4994ff197b1ffeb7980d05f96bd20cdeb3 assets/create/models/item/linear_chassi d912be3e87f2beaa8e22747f867739139667241b assets/create/models/item/magenta_seat.json 928c5e3747fb758d2610475258cc168b0d4ee7b6 assets/create/models/item/magenta_valve_handle.json 932facf4bf93b471e8630f4132a4284a9f4d0d39 assets/create/models/item/mechanical_arm.json -49dcc373c33f6fc3760add10eb51bd96cd4fd028 assets/create/models/item/mechanical_bearing.json +e19c7a06697adc2da9d66c5c81e1c6ff131acb65 assets/create/models/item/mechanical_bearing.json 65ac4f19973ddeb1bb4d672f57319130e736e116 assets/create/models/item/mechanical_crafter.json b416a3a2545a63d6839f7f2cb958c58e485a7eb6 assets/create/models/item/mechanical_drill.json bbf18e5d54128375139c712e93b35ec25f59f2d0 assets/create/models/item/mechanical_harvester.json @@ -1261,7 +1295,7 @@ f8d0d4b2a890ea7a69ab0c390947b48fe0478d3f assets/create/models/item/mechanical_pi 726ae61699dc379a4f535c1be3ec2672a2f03583 assets/create/models/item/mechanical_plough.json 6c2acb80e53256fbb85f76851f335f9248ace6da assets/create/models/item/mechanical_press.json 4e363477e3e8059dd7b2bad04046521b31923d1b assets/create/models/item/mechanical_pump.json -bca99d467ec8ead10124becb60ac24b39be83de4 assets/create/models/item/mechanical_saw.json +3fc1fcb2016d2782c3667c21575423122b66705a assets/create/models/item/mechanical_saw.json 0eb5726c8c0de462f432411c210d6132b2c446a4 assets/create/models/item/millstone.json 1134bc8ecdfefe5d30ee4973c37aa9a349c368b4 assets/create/models/item/minecart_contraption.json 5f44acb8a784611c17913ddf64fb4098b3a8aee9 assets/create/models/item/minecart_coupling.json @@ -1377,6 +1411,7 @@ ef52b3734a47e96c5f83d60da73110e925737933 assets/create/models/item/refined_radia 6daff6b82b33374d7add65e352e05ecb2fd9ebdd assets/create/models/item/rope_pulley.json fc54acc37695f21ef650c8310110407647e9a023 assets/create/models/item/rose_quartz.json acfbf487ee65c2c58d89cb2644e33fda75751fde assets/create/models/item/rotation_speed_controller.json +171c343f7f536008f79ea1d63e0a443d064e9ef1 assets/create/models/item/sail_frame.json be86c8156d55d2f128feb66abd70923b3be765cc assets/create/models/item/sand_paper.json 69196df5122a27573112dad49b334dea96aafed0 assets/create/models/item/schematic.json 533483999f61e3b091af567a473875247edaedb3 assets/create/models/item/schematic_and_quill.json @@ -1427,8 +1462,10 @@ def7382f3216c59d835ab64f534678f3d31ecc51 assets/create/models/item/weathered_lim 40bed7f5e9e97da45c5d9cebc3fcf87b2b13a808 assets/create/models/item/weathered_limestone_pillar.json 8914910270736f8f15364c623cd08d4638383cc5 assets/create/models/item/wheat_flour.json 0cc80844db689404d4722c93f1002b0bed05edcd assets/create/models/item/whisk.json +c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.json 69328eb4f91c4407fbcad5e3c4b88363f1a9572c assets/create/models/item/white_seat.json be7a2d59d43083d7f2427193dcb9d68004224dd3 assets/create/models/item/white_valve_handle.json +d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bearing.json 2527b52413965a3e84b4718e08a9b8bb30a741ea assets/create/models/item/wrench.json 4b49bc2418410cded5f0b7da3430f1a22e049f18 assets/create/models/item/yellow_seat.json 790daf016f980801e7587b548a325082c65f6f03 assets/create/models/item/yellow_valve_handle.json @@ -1575,6 +1612,7 @@ f639481c8e1485019bf120463e67811b6d2d8ef9 data/create/advancements/recipes/create dba0696069fe0850120dc6e1ca1ab741b0fe6d21 data/create/advancements/recipes/create.base/crafting/kinetics/red_valve_handle_from_other_valve_handle.json 74522fbb454832fc0eefa5f52b82b7d7d4e9b7fb data/create/advancements/recipes/create.base/crafting/kinetics/rope_pulley.json 48e29ec1b301bf4857db06913ee340f49d61cdf9 data/create/advancements/recipes/create.base/crafting/kinetics/rotation_speed_controller.json +e9faf71b9597deecd2c1fb566f3c438ddc243e82 data/create/advancements/recipes/create.base/crafting/kinetics/sail_frame.json b463cf9343f8d08b8ed3e87f46a19facadd657b0 data/create/advancements/recipes/create.base/crafting/kinetics/secondary_linear_chassisfrom_conversion.json 191213ef824e7b73d66bb3aecc3115306b445e5a data/create/advancements/recipes/create.base/crafting/kinetics/sequenced_gearshift.json cd8cefee21a1690f9158b8e8661a92d20ad0f535 data/create/advancements/recipes/create.base/crafting/kinetics/shaft.json @@ -1589,9 +1627,11 @@ f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create 89401c0a6dffa62dbffdbb63986f580a4878402e data/create/advancements/recipes/create.base/crafting/kinetics/vertical_gearboxfrom_conversion.json 4ab6ae87b6c3a29c0c2966dad2fa335a39fafe78 data/create/advancements/recipes/create.base/crafting/kinetics/water_wheel.json 7c146cc51139c2a8e287a60c8d645fa6f6f48cb1 data/create/advancements/recipes/create.base/crafting/kinetics/whisk.json +f876dcbd2877c921613a4af481c89d66664c1ea8 data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.json 37e545b016a7c5cd283168ac71ace6467a5ad3ef data/create/advancements/recipes/create.base/crafting/kinetics/white_seat.json 856760c4b120f7b29a94dd22fe04d62df061d409 data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json b73e6f8b89e6ef94167b6fa3d0837a27222edb01 data/create/advancements/recipes/create.base/crafting/kinetics/white_valve_handle_from_other_valve_handle.json +6b783787a32446a39bb553359a7db58f71492a42 data/create/advancements/recipes/create.base/crafting/kinetics/windmill_bearing.json ddbe7ae23f48dcaee3ad44a0e597c24380b51682 data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json 14c1cac4545f544a78bfd80cf7dd6355794c6679 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json e8c2001863d9819d2a2c1fddeda41a4f126a5c09 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json @@ -2073,9 +2113,11 @@ d3202a337c15c8b8ec41fa5879bb94327bb75057 data/create/loot_tables/blocks/andesite c7f81e30c31837a287d6d6040cdb02c7dec11441 data/create/loot_tables/blocks/belt.json 67a8e2513c3cb09e6fe80279fda94f79d5018c37 data/create/loot_tables/blocks/birch_window.json bf1d5843f93533f84bc4adec5b77da2114fa2025 data/create/loot_tables/blocks/birch_window_pane.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/black_sail.json cccc209d172cc7bac76f1b4ac79085ee90742ab2 data/create/loot_tables/blocks/black_seat.json f3573f47b8a914aa222633893e158f84fcd6f3d8 data/create/loot_tables/blocks/black_valve_handle.json a2313c9b7d114396fca3c86a740d23fce3873679 data/create/loot_tables/blocks/blaze_burner.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/blue_sail.json 3834f7ac2bbc42cead02d4973842adb9ad97e6bf data/create/loot_tables/blocks/blue_seat.json fcddccd1bf45c2f4ad5f1520e209a4f04487274a data/create/loot_tables/blocks/blue_valve_handle.json 1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data/create/loot_tables/blocks/brass_belt_funnel.json @@ -2083,6 +2125,7 @@ fcddccd1bf45c2f4ad5f1520e209a4f04487274a data/create/loot_tables/blocks/blue_val 8a14258ad5d79d9e4dc5a318905644b446196420 data/create/loot_tables/blocks/brass_casing.json 1dbc446abe190b2832b2ce7d52c2f2d2bdd45949 data/create/loot_tables/blocks/brass_funnel.json 6c8e784677d1a843b6c707484c79751acdb46ebc data/create/loot_tables/blocks/brass_tunnel.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/brown_sail.json d415862a0abe20e8c5c2c8125bb672065330a9bc data/create/loot_tables/blocks/brown_seat.json fedfe922f568c06adc2dfdd641b9abc90ba5af8a data/create/loot_tables/blocks/brown_valve_handle.json 0be542fef3bc0e1a0d556883568a1400a8b97df1 data/create/loot_tables/blocks/cart_assembler.json @@ -2108,6 +2151,7 @@ d8f2f8921b9200b1d9476a77ee1be32c25308ac3 data/create/loot_tables/blocks/creative c28fa42746a4d5ca2f824001b67e58673810169e data/create/loot_tables/blocks/crushing_wheel.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/crushing_wheel_controller.json d370ee874b5b6b98e9a8c368218fe61f644d956d data/create/loot_tables/blocks/cuckoo_clock.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/cyan_sail.json 49a14b9e93abdf02a7aef9c0c4085ac89617fae4 data/create/loot_tables/blocks/cyan_seat.json fe24fd296812fea3f838defa2ca6270523d9d48e data/create/loot_tables/blocks/cyan_valve_handle.json fd309e1d39dcbcb25c3361edecd8c9afa0f847d0 data/create/loot_tables/blocks/dark_oak_window.json @@ -2212,8 +2256,10 @@ fa0ddf45d108f55550164113cb5cfd002586a9d4 data/create/loot_tables/blocks/granite_ feca8a1f62e0e13fcb2252d5f782d74938b84431 data/create/loot_tables/blocks/granite_cobblestone_stairs.json 1d225a68b09d6f389aa7ed48aa05979bdaa482a9 data/create/loot_tables/blocks/granite_cobblestone_wall.json 87a4ac3db5ec80613b940abccc72fc4b37cee0ba data/create/loot_tables/blocks/granite_pillar.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/gray_sail.json d014357b3a467b23473c8223f32471a04a9ff94c data/create/loot_tables/blocks/gray_seat.json 35f916fd0f8465a070270615dbddd716ff68d5bb data/create/loot_tables/blocks/gray_valve_handle.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/green_sail.json a71599eecd3f1179e3d0367623460e798828aa6d data/create/loot_tables/blocks/green_seat.json 865ebead9601b29e6326dc9e1d4c1ca92f3b7a3b data/create/loot_tables/blocks/green_valve_handle.json 9bdc47ea3ffc52f037f12f40f387e6b72a352c4e data/create/loot_tables/blocks/hand_crank.json @@ -2231,10 +2277,13 @@ fa8a5922f7346a15a80b5c7e5dfc26d24ea98728 data/create/loot_tables/blocks/layered_ 197ecf9c00c06f6014ecbec678a5466492902cb0 data/create/loot_tables/blocks/layered_limestone.json 0ec9e366708637a01e600a2a12cc267d81b3f69b data/create/loot_tables/blocks/layered_scoria.json 54816065cd735dfe53b1eb551110ba18c6e3746a data/create/loot_tables/blocks/layered_weathered_limestone.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/light_blue_sail.json b403848d3a4b4ad7a048e70c21e200e40d0c67e3 data/create/loot_tables/blocks/light_blue_seat.json 32afe3fff74ccda4151567961fa6c0b8e3735358 data/create/loot_tables/blocks/light_blue_valve_handle.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/light_gray_sail.json 0cc2b20cb6e2dae6cf9d759c85926663f6066c99 data/create/loot_tables/blocks/light_gray_seat.json 8cc64a1dfb7ce7be2c063248d912c68ad2fe999c data/create/loot_tables/blocks/light_gray_valve_handle.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/lime_sail.json f7893090c6ecb4862c90c408b7f9ce8316f8b608 data/create/loot_tables/blocks/lime_seat.json cae6d16c8967164698efbce3b91018a8e79a81e9 data/create/loot_tables/blocks/lime_valve_handle.json 7dfd638cc6f0d22bbc8fcbdb7212a3bfc8c85223 data/create/loot_tables/blocks/limesand.json @@ -2249,6 +2298,7 @@ cb315814960850b5080598b89ee94c833b5048f7 data/create/loot_tables/blocks/limeston 92fb16606f289ad33860270d098fad2522b24e09 data/create/loot_tables/blocks/limestone_cobblestone_wall.json 371115e5ceb08c07a9ab2371509960c31e0baa8a data/create/loot_tables/blocks/limestone_pillar.json aa751d2e8a7889907c08c4bec6f6ca266230b6d7 data/create/loot_tables/blocks/linear_chassis.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/magenta_sail.json 9e5e017cd3b4f544f487a5ca22ef610a4addc8ec data/create/loot_tables/blocks/magenta_seat.json 517e983d7387ec0d86845d4cf3deaa6d68c71170 data/create/loot_tables/blocks/magenta_valve_handle.json e64c32da44b7e92dbef36fcb448c42b9bd9ae47c data/create/loot_tables/blocks/mechanical_arm.json @@ -2280,6 +2330,7 @@ d3ea271bb5774c73d44ab2e73195c9d5a4ff9c92 data/create/loot_tables/blocks/nixie_tu 6237eb3999181f1db09ca01b08e7785b70722d3b data/create/loot_tables/blocks/nozzle.json 0b2b142cfb3ebe9d4506e498a8e31f48d00db58d data/create/loot_tables/blocks/oak_window.json 90cc4d5857f47c48e2b82f394de9567023c5c8ce data/create/loot_tables/blocks/oak_window_pane.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/orange_sail.json 2333aaea940816b6bc8454ba24e0c9f52af94ac0 data/create/loot_tables/blocks/orange_seat.json 13338687962ef5b48dd9d142a2a862637d5c6953 data/create/loot_tables/blocks/orange_valve_handle.json 267e9e24fac93e3496a80fcb6ed8e9d1c329d2d2 data/create/loot_tables/blocks/ornate_iron_window.json @@ -2329,6 +2380,7 @@ dfeba5c6de20e9ec0252e43b7c4046f017284d3d data/create/loot_tables/blocks/paved_we 32eed137f13c25a7b9db2fb457901e0c03cabb16 data/create/loot_tables/blocks/paved_weathered_limestone_slab.json 67b9227237ed2a8c09c4183c0f2ab1b3bd07084b data/create/loot_tables/blocks/paved_weathered_limestone_stairs.json d3e4ab984aef19ee21a1c5b868eb3fde96c05afd data/create/loot_tables/blocks/paved_weathered_limestone_wall.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/pink_sail.json 6f32e1217986407e41358e9417de63602c78e810 data/create/loot_tables/blocks/pink_seat.json d85b09659f08a73513c57b1b2e5ec7fc4b6f340a data/create/loot_tables/blocks/pink_valve_handle.json 1087b6c6d88dc7c71ed81e1d3e180fe065e6d098 data/create/loot_tables/blocks/piston_extension_pole.json @@ -2361,9 +2413,11 @@ fbe98efcb1a5970b6795fdbbb671fee704c0945f data/create/loot_tables/blocks/portable a3fb7d3e3bf9dc73ce754002f10c469d57db1f71 data/create/loot_tables/blocks/powered_toggle_latch.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/pulley_magnet.json e8fb62c91226ac107dee45c5ebc54c8dd0aee224 data/create/loot_tables/blocks/pulse_repeater.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/purple_sail.json d7f6caa568e6508177a644fb78dc18ce26c9b2c0 data/create/loot_tables/blocks/purple_seat.json 773e4dc856044dabfe9d2323cbda0460dfb626ee data/create/loot_tables/blocks/purple_valve_handle.json 768420dab8785909891e52c4d77a182d99ba11d3 data/create/loot_tables/blocks/radial_chassis.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/red_sail.json 71b0fa3b174efe94a2a735ab2426c376c0ef674a data/create/loot_tables/blocks/red_seat.json 59ee0fd35978068fbce0882e0b207db7eeb202c0 data/create/loot_tables/blocks/red_valve_handle.json f5907a694206facc01f61f3428f72488486761c7 data/create/loot_tables/blocks/redstone_contact.json @@ -2373,6 +2427,7 @@ f5907a694206facc01f61f3428f72488486761c7 data/create/loot_tables/blocks/redstone 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/rope.json cecaac07bd275bb1ae9e302f0bf44b581e74105d data/create/loot_tables/blocks/rope_pulley.json aa6af37356d65105efab2503ffe75f778cfe873b data/create/loot_tables/blocks/rotation_speed_controller.json +30de11bec82606fead9d6bff7bba0232e97f1039 data/create/loot_tables/blocks/sail_frame.json 069701cb804b6522c18624a0d4f3f949ff8b0281 data/create/loot_tables/blocks/schematic_table.json c4a89145334addfd0dd1fedf7fa75ba07a7d3490 data/create/loot_tables/blocks/schematicannon.json af1bbbb8236b4ab05a6a8edc6db960bc758cbdf3 data/create/loot_tables/blocks/scoria.json @@ -2413,8 +2468,11 @@ c2a62f12680d04ed4f586c501bb026e367243dd2 data/create/loot_tables/blocks/weathere a89f425c47c3831071b556697169a3124370aed7 data/create/loot_tables/blocks/weathered_limestone_cobblestone_stairs.json e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathered_limestone_cobblestone_wall.json 54358a64639957cc66ffa5296ff45723f7adf00e data/create/loot_tables/blocks/weathered_limestone_pillar.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/white_sail.json 969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json 79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json +941ea78ea7c0f0061c3d3569ecea333ae6a16bf1 data/create/loot_tables/blocks/windmill_bearing.json +28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/yellow_sail.json 37ead431a278928a09b260ae06a448e2c791a73e data/create/loot_tables/blocks/yellow_seat.json 899bb208908a2f9bec5e544ff47526f3e24db720 data/create/loot_tables/blocks/yellow_valve_handle.json 94661e726b3d19271550359ae898a5590939512e data/create/loot_tables/blocks/zinc_block.json @@ -2556,6 +2614,7 @@ af84b939ced1c0254a27469f857f571afbadc4f6 data/create/recipes/crafting/kinetics/r 5a10019d23726940152e26af3239d55d16bc7880 data/create/recipes/crafting/kinetics/red_valve_handle_from_other_valve_handle.json af525e135eb927b64462120d201ecae7a7ec61ed data/create/recipes/crafting/kinetics/rope_pulley.json e9f1597d40f62c2247b319303f375f0da271346f data/create/recipes/crafting/kinetics/rotation_speed_controller.json +d0d7fb94621f6f02fa3137666f20e677022d9d5b data/create/recipes/crafting/kinetics/sail_frame.json 66922e18791c87fadb7629cdf32d3dd2f50ccd13 data/create/recipes/crafting/kinetics/secondary_linear_chassisfrom_conversion.json a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/sequenced_gearshift.json 2e36438665bfb97265fd4e6ea85505970eae67fd data/create/recipes/crafting/kinetics/shaft.json @@ -2570,9 +2629,11 @@ af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/s 057c889b0a306f44b8835c896663154ccd9ff12f data/create/recipes/crafting/kinetics/vertical_gearboxfrom_conversion.json 4fb009b86a51b2e259bd1f73848803f6276dd820 data/create/recipes/crafting/kinetics/water_wheel.json f508d510576c93712e7f5265345a32e8818bbf0d data/create/recipes/crafting/kinetics/whisk.json +d80a741d2f0d4f742217b43d7e4d37f003ec9f9d data/create/recipes/crafting/kinetics/white_sail.json f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/white_seat.json 7e0d276cd56f04f35d02c25810bffdf8fc297fcd data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json 4d3890621caa0bdbb752a395c1f5761dbbc1121e data/create/recipes/crafting/kinetics/white_valve_handle_from_other_valve_handle.json +8508255518d3718a0d8c2f536f69ffe9ed48a855 data/create/recipes/crafting/kinetics/windmill_bearing.json 3ec8bb5660656f1c676035d8ba5460462c1d1865 data/create/recipes/crafting/kinetics/wrench.json 5579e58473474c4e59efd1ee39ddf0140d66b618 data/create/recipes/crafting/kinetics/yellow_seat.json f055d233ac7ee9eac840a658afa01bedd793ff38 data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json @@ -3142,10 +3203,11 @@ d3fdb8ece6cb072a93ddb64a0baad5ac952117a4 data/create/recipes/weathered_limestone 11667414f73bc2d00bda7c5c1a7d2934bf6e9165 data/create/recipes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json f9ecec40e11a87de73c9dc7c2963c1cb10b1a180 data/create/tags/blocks/brittle.json 246ee2ec4e778e38a362f319506564886d4e0e76 data/create/tags/blocks/fan_heaters.json -798ef82869dbe22682121504a372e95607a785dc data/create/tags/blocks/fan_transparent.json +551299f2f784435859bef13057c2b033eaefc784 data/create/tags/blocks/fan_transparent.json +c9ac7e3e5ec18554e7184168d65e9b8e44ef5610 data/create/tags/blocks/sails.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json -7fa13854a216ee49c0ae3b1e0e23c4cd1fbc4859 data/create/tags/blocks/windmill_sails.json +eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json 081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json d2dc4ff179ef7b2aa9276455c196e15d44aa95a8 data/create/tags/items/crushed_ores.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json diff --git a/src/generated/resources/assets/create/blockstates/black_sail.json b/src/generated/resources/assets/create/blockstates/black_sail.json new file mode 100644 index 000000000..04c433e99 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/black_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/black_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/black_sail" + }, + "facing=north": { + "model": "create:block/black_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/black_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/black_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/black_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/blue_sail.json b/src/generated/resources/assets/create/blockstates/blue_sail.json new file mode 100644 index 000000000..bbd4eb965 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/blue_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/blue_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/blue_sail" + }, + "facing=north": { + "model": "create:block/blue_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/blue_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/blue_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/blue_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/brown_sail.json b/src/generated/resources/assets/create/blockstates/brown_sail.json new file mode 100644 index 000000000..9e99f2044 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/brown_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/brown_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/brown_sail" + }, + "facing=north": { + "model": "create:block/brown_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/brown_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/brown_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/brown_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/cyan_sail.json b/src/generated/resources/assets/create/blockstates/cyan_sail.json new file mode 100644 index 000000000..f5049536d --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/cyan_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/cyan_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/cyan_sail" + }, + "facing=north": { + "model": "create:block/cyan_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/cyan_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/cyan_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/cyan_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index a4cffcde7..581373307 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "down": "false", - "north": "true", + "south": "false", "up": "true", - "south": "false" + "down": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "down": "false", - "north": "false", + "south": "true", "up": "true", - "south": "true" + "down": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "down": "true", - "north": "true", + "south": "false", "up": "false", - "south": "false" + "down": "true", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "down": "true", - "north": "false", + "south": "true", "up": "false", - "south": "true" + "down": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,32 +104,10 @@ }, { "when": { - "down": "true", - "north": "false", + "south": "false", "up": "true", - "south": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { - "down": "false", - "north": "false", - "up": "true", - "south": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { "down": "true", - "north": "false", - "up": "false", - "south": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +115,32 @@ }, { "when": { + "south": "false", + "up": "true", "down": "false", - "north": "true", + "north": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "south": "false", "up": "false", - "south": "true" + "down": "true", + "north": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "south": "true", + "up": "false", + "down": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "down": "false", - "north": "true", + "south": "false", "up": "false", - "south": "false" + "down": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "down": "false", - "north": "false", + "south": "true", "up": "false", - "south": "true" + "down": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "down": "false", - "north": "false", + "south": "false", "up": "false", - "south": "false" + "down": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { + "south": "true", "west": "true", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "true", "north": "false", - "south": "true" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "true", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "true", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "west": "false", + "up": "true", "down": "false", - "east": "true", - "up": "true" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "west": "true", + "up": "true", "down": "false", - "east": "false", - "up": "true" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "west": "false", + "up": "false", "down": "true", - "east": "true", - "up": "false" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "west": "true", + "up": "false", "down": "true", - "east": "false", - "up": "false" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "west": "false", + "up": "true", "down": "true", - "east": "false", - "up": "true" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "west": "false", + "up": "true", "down": "false", - "east": "false", - "up": "true" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "west": "false", + "up": "false", "down": "true", - "east": "false", - "up": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "true", - "down": "false", - "east": "true", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "false", - "down": "false", - "east": "true", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { + "up": "false", + "down": "false", "west": "true", - "down": "false", - "east": "false", - "up": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "west": "false", + "up": "false", "down": "false", - "east": "false", - "up": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/gray_sail.json b/src/generated/resources/assets/create/blockstates/gray_sail.json new file mode 100644 index 000000000..a8295fe9e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/gray_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/gray_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/gray_sail" + }, + "facing=north": { + "model": "create:block/gray_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/gray_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/gray_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/gray_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/green_sail.json b/src/generated/resources/assets/create/blockstates/green_sail.json new file mode 100644 index 000000000..5ee371035 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/green_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/green_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/green_sail" + }, + "facing=north": { + "model": "create:block/green_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/green_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/green_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/green_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_blue_sail.json b/src/generated/resources/assets/create/blockstates/light_blue_sail.json new file mode 100644 index 000000000..f11f20a7b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_blue_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/light_blue_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/light_blue_sail" + }, + "facing=north": { + "model": "create:block/light_blue_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/light_blue_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/light_blue_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/light_blue_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/light_gray_sail.json b/src/generated/resources/assets/create/blockstates/light_gray_sail.json new file mode 100644 index 000000000..c1bb74562 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/light_gray_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/light_gray_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/light_gray_sail" + }, + "facing=north": { + "model": "create:block/light_gray_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/light_gray_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/light_gray_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/light_gray_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/lime_sail.json b/src/generated/resources/assets/create/blockstates/lime_sail.json new file mode 100644 index 000000000..7aeea435a --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/lime_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/lime_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/lime_sail" + }, + "facing=north": { + "model": "create:block/lime_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/lime_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/lime_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/lime_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/magenta_sail.json b/src/generated/resources/assets/create/blockstates/magenta_sail.json new file mode 100644 index 000000000..78b975de0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/magenta_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/magenta_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/magenta_sail" + }, + "facing=north": { + "model": "create:block/magenta_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/magenta_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/magenta_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/magenta_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/orange_sail.json b/src/generated/resources/assets/create/blockstates/orange_sail.json new file mode 100644 index 000000000..5495d60aa --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/orange_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/orange_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/orange_sail" + }, + "facing=north": { + "model": "create:block/orange_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/orange_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/orange_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/orange_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/pink_sail.json b/src/generated/resources/assets/create/blockstates/pink_sail.json new file mode 100644 index 000000000..454f70dfc --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/pink_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/pink_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/pink_sail" + }, + "facing=north": { + "model": "create:block/pink_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/pink_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/pink_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/pink_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/purple_sail.json b/src/generated/resources/assets/create/blockstates/purple_sail.json new file mode 100644 index 000000000..385efaf9b --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/purple_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/purple_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/purple_sail" + }, + "facing=north": { + "model": "create:block/purple_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/purple_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/purple_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/purple_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 9d00ea8b1..1aa3d3728 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/blockstates/red_sail.json b/src/generated/resources/assets/create/blockstates/red_sail.json new file mode 100644 index 000000000..c1059f149 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/red_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/red_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/red_sail" + }, + "facing=north": { + "model": "create:block/red_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/red_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/red_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/red_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/sail_frame.json b/src/generated/resources/assets/create/blockstates/sail_frame.json new file mode 100644 index 000000000..1ffee979f --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/sail_frame.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/sail_frame", + "x": 180 + }, + "facing=up": { + "model": "create:block/sail_frame" + }, + "facing=north": { + "model": "create:block/sail_frame", + "x": 90 + }, + "facing=south": { + "model": "create:block/sail_frame", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/sail_frame", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/sail_frame", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/white_sail.json b/src/generated/resources/assets/create/blockstates/white_sail.json new file mode 100644 index 000000000..30b186772 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/white_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/white_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/white_sail" + }, + "facing=north": { + "model": "create:block/white_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/white_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/white_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/white_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/windmill_bearing.json b/src/generated/resources/assets/create/blockstates/windmill_bearing.json new file mode 100644 index 000000000..80df46d4c --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/windmill_bearing.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/windmill_bearing", + "x": 180 + }, + "facing=up": { + "model": "create:block/windmill_bearing" + }, + "facing=north": { + "model": "create:block/windmill_bearing", + "x": 90 + }, + "facing=south": { + "model": "create:block/windmill_bearing", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/windmill_bearing", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/windmill_bearing", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/yellow_sail.json b/src/generated/resources/assets/create/blockstates/yellow_sail.json new file mode 100644 index 000000000..3f3deb7b0 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/yellow_sail.json @@ -0,0 +1,30 @@ +{ + "variants": { + "facing=down": { + "model": "create:block/yellow_sail", + "x": 180 + }, + "facing=up": { + "model": "create:block/yellow_sail" + }, + "facing=north": { + "model": "create:block/yellow_sail", + "x": 90 + }, + "facing=south": { + "model": "create:block/yellow_sail", + "x": 90, + "y": 180 + }, + "facing=west": { + "model": "create:block/yellow_sail", + "x": 90, + "y": 270 + }, + "facing=east": { + "model": "create:block/yellow_sail", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 90d627d05..337d05b48 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -23,9 +23,11 @@ "block.create.belt": "\u0287\u05DF\u01DD\u15FA", "block.create.birch_window": "\u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", "block.create.birch_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u0265\u0254\u0279\u0131\u15FA", + "block.create.black_sail": "\u05DF\u0131\u0250S \u029E\u0254\u0250\u05DF\u15FA", "block.create.black_seat": "\u0287\u0250\u01DDS \u029E\u0254\u0250\u05DF\u15FA", "block.create.black_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u029E\u0254\u0250\u05DF\u15FA", "block.create.blaze_burner": "\u0279\u01DDu\u0279n\u15FA \u01DDz\u0250\u05DF\u15FA", + "block.create.blue_sail": "\u05DF\u0131\u0250S \u01DDn\u05DF\u15FA", "block.create.blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA", "block.create.blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA", "block.create.brass_belt_funnel": "\u05DF\u01DDuun\u2132 \u0287\u05DF\u01DD\u15FA ss\u0250\u0279\u15FA", @@ -33,6 +35,7 @@ "block.create.brass_casing": "bu\u0131s\u0250\u0186 ss\u0250\u0279\u15FA", "block.create.brass_funnel": "\u05DF\u01DDuun\u2132 ss\u0250\u0279\u15FA", "block.create.brass_tunnel": "\u05DF\u01DDuun\u27D8 ss\u0250\u0279\u15FA", + "block.create.brown_sail": "\u05DF\u0131\u0250S u\u028Do\u0279\u15FA", "block.create.brown_seat": "\u0287\u0250\u01DDS u\u028Do\u0279\u15FA", "block.create.brown_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u028Do\u0279\u15FA", "block.create.cart_assembler": "\u0279\u01DD\u05DFq\u026F\u01DDss\u2C6F \u0287\u0279\u0250\u0186", @@ -58,6 +61,7 @@ "block.create.crushing_wheel": "\u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.crushing_wheel_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 \u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.cuckoo_clock": "\u029E\u0254o\u05DF\u0186 oo\u029E\u0254n\u0186", + "block.create.cyan_sail": "\u05DF\u0131\u0250S u\u0250\u028E\u0186", "block.create.cyan_seat": "\u0287\u0250\u01DDS u\u0250\u028E\u0186", "block.create.cyan_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u0250\u028E\u0186", "block.create.dark_oak_window": "\u028Dopu\u0131M \u029E\u0250O \u029E\u0279\u0250\u15E1", @@ -162,8 +166,10 @@ "block.create.granite_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DD\u0287\u0131u\u0250\u0279\u2141", "block.create.granite_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DD\u0287\u0131u\u0250\u0279\u2141", + "block.create.gray_sail": "\u05DF\u0131\u0250S \u028E\u0250\u0279\u2141", "block.create.gray_seat": "\u0287\u0250\u01DDS \u028E\u0250\u0279\u2141", "block.create.gray_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028E\u0250\u0279\u2141", + "block.create.green_sail": "\u05DF\u0131\u0250S u\u01DD\u01DD\u0279\u2141", "block.create.green_seat": "\u0287\u0250\u01DDS u\u01DD\u01DD\u0279\u2141", "block.create.green_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B u\u01DD\u01DD\u0279\u2141", "block.create.hand_crank": "\u029Eu\u0250\u0279\u0186 pu\u0250H", @@ -181,10 +187,13 @@ "block.create.layered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.layered_scoria": "\u0250\u0131\u0279o\u0254S p\u01DD\u0279\u01DD\u028E\u0250\uA780", "block.create.layered_weathered_limestone": "\u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u0279\u01DD\u028E\u0250\uA780", + "block.create.light_blue_sail": "\u05DF\u0131\u0250S \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", "block.create.light_blue_seat": "\u0287\u0250\u01DDS \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", "block.create.light_blue_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDn\u05DF\u15FA \u0287\u0265b\u0131\uA780", + "block.create.light_gray_sail": "\u05DF\u0131\u0250S \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", "block.create.light_gray_seat": "\u0287\u0250\u01DDS \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", "block.create.light_gray_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028E\u0250\u0279\u2141 \u0287\u0265b\u0131\uA780", + "block.create.lime_sail": "\u05DF\u0131\u0250S \u01DD\u026F\u0131\uA780", "block.create.lime_seat": "\u0287\u0250\u01DDS \u01DD\u026F\u0131\uA780", "block.create.lime_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u026F\u0131\uA780", "block.create.limesand": "pu\u0250s\u01DD\u026F\u0131\uA780", @@ -199,6 +208,7 @@ "block.create.limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780", "block.create.linear_chassis": "s\u0131ss\u0250\u0265\u0186 \u0279\u0250\u01DDu\u0131\uA780", + "block.create.magenta_sail": "\u05DF\u0131\u0250S \u0250\u0287u\u01DDb\u0250W", "block.create.magenta_seat": "\u0287\u0250\u01DDS \u0250\u0287u\u01DDb\u0250W", "block.create.magenta_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u0250\u0287u\u01DDb\u0250W", "block.create.mechanical_arm": "\u026F\u0279\u2C6F \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", @@ -230,6 +240,7 @@ "block.create.nozzle": "\u01DD\u05DFzzoN", "block.create.oak_window": "\u028Dopu\u0131M \u029E\u0250O", "block.create.oak_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u029E\u0250O", + "block.create.orange_sail": "\u05DF\u0131\u0250S \u01DDbu\u0250\u0279O", "block.create.orange_seat": "\u0287\u0250\u01DDS \u01DDbu\u0250\u0279O", "block.create.orange_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DDbu\u0250\u0279O", "block.create.ornate_iron_window": "\u028Dopu\u0131M uo\u0279I \u01DD\u0287\u0250u\u0279O", @@ -279,6 +290,7 @@ "block.create.paved_weathered_limestone_slab": "q\u0250\u05DFS \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", "block.create.paved_weathered_limestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", "block.create.paved_weathered_limestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM p\u01DD\u028C\u0250\u0500", + "block.create.pink_sail": "\u05DF\u0131\u0250S \u029Eu\u0131\u0500", "block.create.pink_seat": "\u0287\u0250\u01DDS \u029Eu\u0131\u0500", "block.create.pink_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u029Eu\u0131\u0500", "block.create.piston_extension_pole": "\u01DD\u05DFo\u0500 uo\u0131su\u01DD\u0287x\u018E uo\u0287s\u0131\u0500", @@ -311,9 +323,11 @@ "block.create.powered_toggle_latch": "\u0265\u0254\u0287\u0250\uA780 \u01DD\u05DFbbo\u27D8 p\u01DD\u0279\u01DD\u028Do\u0500", "block.create.pulley_magnet": "\u0287\u01DDub\u0250W \u028E\u01DD\u05DF\u05DFn\u0500", "block.create.pulse_repeater": "\u0279\u01DD\u0287\u0250\u01DDd\u01DD\u1D1A \u01DDs\u05DFn\u0500", + "block.create.purple_sail": "\u05DF\u0131\u0250S \u01DD\u05DFd\u0279n\u0500", "block.create.purple_seat": "\u0287\u0250\u01DDS \u01DD\u05DFd\u0279n\u0500", "block.create.purple_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u05DFd\u0279n\u0500", "block.create.radial_chassis": "s\u0131ss\u0250\u0265\u0186 \u05DF\u0250\u0131p\u0250\u1D1A", + "block.create.red_sail": "\u05DF\u0131\u0250S p\u01DD\u1D1A", "block.create.red_seat": "\u0287\u0250\u01DDS p\u01DD\u1D1A", "block.create.red_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B p\u01DD\u1D1A", "block.create.redstone_contact": "\u0287\u0254\u0250\u0287uo\u0186 \u01DDuo\u0287sp\u01DD\u1D1A", @@ -323,6 +337,7 @@ "block.create.rope": "\u01DDdo\u1D1A", "block.create.rope_pulley": "\u028E\u01DD\u05DF\u05DFn\u0500 \u01DDdo\u1D1A", "block.create.rotation_speed_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 p\u01DD\u01DDdS uo\u0131\u0287\u0250\u0287o\u1D1A", + "block.create.sail_frame": "\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0131\u0250S", "block.create.schematic_table": "\u01DD\u05DFq\u0250\u27D8 \u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S", "block.create.schematicannon": "uouu\u0250\u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S", "block.create.scoria": "\u0250\u0131\u0279o\u0254S", @@ -363,8 +378,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.weathered_limestone_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", "block.create.weathered_limestone_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 \u01DDuo\u0287s\u01DD\u026F\u0131\uA780 p\u01DD\u0279\u01DD\u0265\u0287\u0250\u01DDM", + "block.create.white_sail": "\u05DF\u0131\u0250S \u01DD\u0287\u0131\u0265M", "block.create.white_seat": "\u0287\u0250\u01DDS \u01DD\u0287\u0131\u0265M", "block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M", + "block.create.windmill_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u05DF\u05DF\u0131\u026Fpu\u0131M", + "block.create.yellow_sail": "\u05DF\u0131\u0250S \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_seat": "\u0287\u0250\u01DDS \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.zinc_block": "\u029E\u0254o\u05DF\u15FA \u0254u\u0131Z", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index c184a40f0..059d2b99f 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -26,9 +26,11 @@ "block.create.belt": "Belt", "block.create.birch_window": "Birch Window", "block.create.birch_window_pane": "Birch Window Pane", + "block.create.black_sail": "Black Sail", "block.create.black_seat": "Black Seat", "block.create.black_valve_handle": "Black Valve Handle", "block.create.blaze_burner": "Blaze Burner", + "block.create.blue_sail": "Blue Sail", "block.create.blue_seat": "Blue Seat", "block.create.blue_valve_handle": "Blue Valve Handle", "block.create.brass_belt_funnel": "Brass Belt Funnel", @@ -36,6 +38,7 @@ "block.create.brass_casing": "Brass Casing", "block.create.brass_funnel": "Brass Funnel", "block.create.brass_tunnel": "Brass Tunnel", + "block.create.brown_sail": "Brown Sail", "block.create.brown_seat": "Brown Seat", "block.create.brown_valve_handle": "Brown Valve Handle", "block.create.cart_assembler": "Cart Assembler", @@ -61,6 +64,7 @@ "block.create.crushing_wheel": "Crushing Wheel", "block.create.crushing_wheel_controller": "Crushing Wheel Controller", "block.create.cuckoo_clock": "Cuckoo Clock", + "block.create.cyan_sail": "Cyan Sail", "block.create.cyan_seat": "Cyan Seat", "block.create.cyan_valve_handle": "Cyan Valve Handle", "block.create.dark_oak_window": "Dark Oak Window", @@ -165,8 +169,10 @@ "block.create.granite_cobblestone_stairs": "Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "Granite Cobblestone Wall", "block.create.granite_pillar": "Granite Pillar", + "block.create.gray_sail": "Gray Sail", "block.create.gray_seat": "Gray Seat", "block.create.gray_valve_handle": "Gray Valve Handle", + "block.create.green_sail": "Green Sail", "block.create.green_seat": "Green Seat", "block.create.green_valve_handle": "Green Valve Handle", "block.create.hand_crank": "Hand Crank", @@ -184,10 +190,13 @@ "block.create.layered_limestone": "Layered Limestone", "block.create.layered_scoria": "Layered Scoria", "block.create.layered_weathered_limestone": "Layered Weathered Limestone", + "block.create.light_blue_sail": "Light Blue Sail", "block.create.light_blue_seat": "Light Blue Seat", "block.create.light_blue_valve_handle": "Light Blue Valve Handle", + "block.create.light_gray_sail": "Light Gray Sail", "block.create.light_gray_seat": "Light Gray Seat", "block.create.light_gray_valve_handle": "Light Gray Valve Handle", + "block.create.lime_sail": "Lime Sail", "block.create.lime_seat": "Lime Seat", "block.create.lime_valve_handle": "Lime Valve Handle", "block.create.limesand": "Limesand", @@ -202,6 +211,7 @@ "block.create.limestone_cobblestone_wall": "Limestone Cobblestone Wall", "block.create.limestone_pillar": "Limestone Pillar", "block.create.linear_chassis": "Linear Chassis", + "block.create.magenta_sail": "Magenta Sail", "block.create.magenta_seat": "Magenta Seat", "block.create.magenta_valve_handle": "Magenta Valve Handle", "block.create.mechanical_arm": "Mechanical Arm", @@ -233,6 +243,7 @@ "block.create.nozzle": "Nozzle", "block.create.oak_window": "Oak Window", "block.create.oak_window_pane": "Oak Window Pane", + "block.create.orange_sail": "Orange Sail", "block.create.orange_seat": "Orange Seat", "block.create.orange_valve_handle": "Orange Valve Handle", "block.create.ornate_iron_window": "Ornate Iron Window", @@ -282,6 +293,7 @@ "block.create.paved_weathered_limestone_slab": "Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "Paved Weathered Limestone Wall", + "block.create.pink_sail": "Pink Sail", "block.create.pink_seat": "Pink Seat", "block.create.pink_valve_handle": "Pink Valve Handle", "block.create.piston_extension_pole": "Piston Extension Pole", @@ -314,9 +326,11 @@ "block.create.powered_toggle_latch": "Powered Toggle Latch", "block.create.pulley_magnet": "Pulley Magnet", "block.create.pulse_repeater": "Pulse Repeater", + "block.create.purple_sail": "Purple Sail", "block.create.purple_seat": "Purple Seat", "block.create.purple_valve_handle": "Purple Valve Handle", "block.create.radial_chassis": "Radial Chassis", + "block.create.red_sail": "Red Sail", "block.create.red_seat": "Red Seat", "block.create.red_valve_handle": "Red Valve Handle", "block.create.redstone_contact": "Redstone Contact", @@ -326,6 +340,7 @@ "block.create.rope": "Rope", "block.create.rope_pulley": "Rope Pulley", "block.create.rotation_speed_controller": "Rotation Speed Controller", + "block.create.sail_frame": "Sail Frame", "block.create.schematic_table": "Schematic Table", "block.create.schematicannon": "Schematicannon", "block.create.scoria": "Scoria", @@ -366,8 +381,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Weathered Limestone Pillar", + "block.create.white_sail": "White Sail", "block.create.white_seat": "White Seat", "block.create.white_valve_handle": "White Valve Handle", + "block.create.windmill_bearing": "Windmill Bearing", + "block.create.yellow_sail": "Yellow Sail", "block.create.yellow_seat": "Yellow Seat", "block.create.yellow_valve_handle": "Yellow Valve Handle", "block.create.zinc_block": "Zinc Block", @@ -580,6 +598,8 @@ "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "Clockwise", + "create.generic.counter_clockwise": "Counter-Clockwise", "create.action.scroll": "Scroll", "create.action.confirm": "Confirm", @@ -673,6 +693,11 @@ "create.contraptions.cart_movement_mode.rotate": "Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation", + "create.contraptions.windmill.rotation_direction": "Rotation Direction", + "create.contraptions.clockwork.clock_hands": "Clock Hands", + "create.contraptions.clockwork.hour_first": "Hour hand first", + "create.contraptions.clockwork.minute_first": "Minute hand first", + "create.contraptions.clockwork.hour_first_24": "24-Hour hand first", "create.logistics.filter": "Filter", "create.logistics.recipe_filter": "Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 17953de60..237637680 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 996", + "_": "Missing Localizations: 1021", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "Mechanischer Riemen", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "Mahlwerkrad", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Kalksand", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "Kalksteinsäule", "block.create.linear_chassis": "Schubgerüst", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "UNLOCALIZED: Nozzle", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Kolben-Pleuelverlängerung", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Pulsierender Verstärker", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Drehgerüst", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Redstone-Kontakt", @@ -327,6 +341,7 @@ "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "Bauplantisch", "block.create.schematicannon": "Bauplankanone", "block.create.scoria": "UNLOCALIZED: Scoria", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Verwitterte Kalksteinsäule", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "Wechseln", "create.action.confirm": "Bestätigen", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Filter", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index ecc6b57fb..58317000e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 625", + "_": "Missing Localizations: 650", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "Tapis roulant", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "Boîtier en laiton", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Assembleur de wagon", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "Roue de concassage", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "Horloge à coucou", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "Manivelle", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Chaux", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "Pillier de calcaire", "block.create.linear_chassis": "Châssis linéaire", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "Buse", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Pôle d'extension de piston", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "Verrou alimenté à bascule", "block.create.pulley_magnet": "Aimant de poulie", "block.create.pulse_repeater": "Répéteur d'impulsions", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Châssis radial", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "redstone_contact Redstone", @@ -327,6 +341,7 @@ "block.create.rope": "Corde", "block.create.rope_pulley": "Poulie à corde", "block.create.rotation_speed_controller": "Contrôleur de vitesse de rotation", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "Table à schéma", "block.create.schematicannon": "Schémacanon", "block.create.scoria": "Scorie", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pillier de calcaire patinées", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "us", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "Faire défiler", "create.action.confirm": "Confirmer", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Filtre", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 080124ed4..cb9b93d62 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 609", + "_": "Missing Localizations: 634", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "Nastro Meccanico", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "Involucro di Ottone", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Assemblatore Carrello da Miniera", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "Ruota di Frantumazione", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "Orologio a Cucù", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "Manovella", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Silico Calcare", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "Pilastro di Calcare", "block.create.linear_chassis": "Telaio Lineare", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "Ugello", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Palo Pistome", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "Leva Alimentata Alterata", "block.create.pulley_magnet": "Magnete della Puleggia", "block.create.pulse_repeater": "Ripetitore di Impulsi", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Telaio Radiale", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Contatto Redstone", @@ -327,6 +341,7 @@ "block.create.rope": "Corda", "block.create.rope_pulley": "Puleggia della Corda", "block.create.rotation_speed_controller": "Regolatore di Velocità di Rotazione", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "Banco Schematico", "block.create.schematicannon": "Cannoneschematico", "block.create.scoria": "Scoria", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pilastro di Calcare Consumato", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "Blocco di Zinco", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "Scorri", "create.action.confirm": "Conferma", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Filtro", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 5e37f53cd..c26b4361c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 608", + "_": "Missing Localizations: 633", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "メカニカルベルト", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "真鍮ケーシング", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "カートアセンブラ", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "破砕ホイール", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "鳩時計", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "ハンドクランク", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "石灰砕砂", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "石灰岩の柱", "block.create.linear_chassis": "リニアシャーシ", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "ノズル", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "ピストン延長ポール", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "パワードトグルラッチ", "block.create.pulley_magnet": "プーリーマグネット", "block.create.pulse_repeater": "パルスリピーター", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "ラジアルシャーシ", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "レッドストーンコンタクト", @@ -327,6 +341,7 @@ "block.create.rope": "ロープ", "block.create.rope_pulley": "ローププーリー", "block.create.rotation_speed_controller": "回転速度制御器", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "概略図テーブル", "block.create.schematicannon": "概略図砲", "block.create.scoria": "スコリア", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "風化した石灰岩の柱", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "亜鉛ブロック", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "スクロール", "create.action.confirm": "確認", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "フィルタ", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index e35b31d80..8e7131853 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 609", + "_": "Missing Localizations: 634", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "컨베이어 벨트", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "황동 케이스", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "카트 조립기", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "분쇄 휠", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "뻐꾸기 시계", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "핸드 크랭크", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "석회모래", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "석회암 기둥", "block.create.linear_chassis": "직선 섀시", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "노즐", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "피스톤 연장 축", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "레드스톤 토글 걸쇠", "block.create.pulley_magnet": "도르래 자석", "block.create.pulse_repeater": "펄스 리피터", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "원형 섀시", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "동형 감지기", @@ -327,6 +341,7 @@ "block.create.rope": "밧줄", "block.create.rope_pulley": "밧줄 도르래", "block.create.rotation_speed_controller": "회전 속도 컨트롤러", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "청사진 테이블", "block.create.schematicannon": "청사진 대포", "block.create.scoria": "스코리아", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "풍화된 석회암 기둥", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "아연 블럭", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "스크롤하세요", "create.action.confirm": "확인", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "필터", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index ef18f898c..7cea32d18 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 937", + "_": "Missing Localizations: 962", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "Mechanische Transportband", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Kar Assembler", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "Verpulveraar", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Kalkzand", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "Kalksteen Pillar", "block.create.linear_chassis": "Lineaar Frame", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "UNLOCALIZED: Nozzle", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Zuiger Verlengpaal", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Pulse Versterker", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Rotation Frame", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Redstone redstone_contact", @@ -327,6 +341,7 @@ "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "Bouwtekening Tafel", "block.create.schematicannon": "Bouwtekeningkannon", "block.create.scoria": "UNLOCALIZED: Scoria", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Verweerde Kalksteen Pilaar", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "Scroll", "create.action.confirm": "Bevestigen", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Filter", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4911783fb..75331efd4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1003", + "_": "Missing Localizations: 1028", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "Esteira Mecânica", "block.create.birch_window": "UNLOCALIZED: Birch Window", "block.create.birch_window_pane": "UNLOCALIZED: Birch Window Pane", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "UNLOCALIZED: Brass Casing", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "UNLOCALIZED: Cart Assembler", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "Roda de Moer", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", "block.create.cuckoo_clock": "UNLOCALIZED: Cuckoo Clock", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "UNLOCALIZED: Dark Oak Window", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "UNLOCALIZED: Granite Cobblestone Stairs", "block.create.granite_cobblestone_wall": "UNLOCALIZED: Granite Cobblestone Wall", "block.create.granite_pillar": "UNLOCALIZED: Granite Pillar", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "UNLOCALIZED: Hand Crank", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "UNLOCALIZED: Layered Limestone", "block.create.layered_scoria": "UNLOCALIZED: Layered Scoria", "block.create.layered_weathered_limestone": "UNLOCALIZED: Layered Weathered Limestone", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Areia Calcária", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "UNLOCALIZED: Limestone Cobblestone Wall", "block.create.limestone_pillar": "Pilar de Calcário", "block.create.linear_chassis": "Chassis de Translado", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "UNLOCALIZED: Nozzle", "block.create.oak_window": "UNLOCALIZED: Oak Window", "block.create.oak_window_pane": "UNLOCALIZED: Oak Window Pane", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "UNLOCALIZED: Ornate Iron Window", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "UNLOCALIZED: Paved Weathered Limestone Slab", "block.create.paved_weathered_limestone_stairs": "UNLOCALIZED: Paved Weathered Limestone Stairs", "block.create.paved_weathered_limestone_wall": "UNLOCALIZED: Paved Weathered Limestone Wall", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Vara de Extensão do Pistão", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "UNLOCALIZED: Powered Toggle Latch", "block.create.pulley_magnet": "UNLOCALIZED: Pulley Magnet", "block.create.pulse_repeater": "Repetidor de Pulso", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Chassis de Rotação", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Contato de Redstone", @@ -327,6 +341,7 @@ "block.create.rope": "UNLOCALIZED: Rope", "block.create.rope_pulley": "UNLOCALIZED: Rope Pulley", "block.create.rotation_speed_controller": "UNLOCALIZED: Rotation Speed Controller", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "Mesa de Esquematizar", "block.create.schematicannon": "Esquemaannon", "block.create.scoria": "UNLOCALIZED: Scoria", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "UNLOCALIZED: Weathered Limestone Cobblestone Stairs", "block.create.weathered_limestone_cobblestone_wall": "UNLOCALIZED: Weathered Limestone Cobblestone Wall", "block.create.weathered_limestone_pillar": "Pilar de Calcário Resistido", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "UNLOCALIZED: Zinc Block", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "UNLOCALIZED: su", "create.generic.unit.degrees": "UNLOCALIZED: °", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "Rolar", "create.action.confirm": "Confirmar", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "UNLOCALIZED: Always face toward motion", "create.contraptions.cart_movement_mode.rotate_paused": "UNLOCALIZED: Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "UNLOCALIZED: Lock rotation", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Filtros", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 68c921001..b421ad0f6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 278", + "_": "Missing Localizations: 303", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "Конвейер", "block.create.birch_window": "Берёзовое окно", "block.create.birch_window_pane": "Панель берёзового окна", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "Латунный корпус", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "Сборщик вагонеток", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления", "block.create.cuckoo_clock": "Часы с кукушкой", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "Окно из тёмного дуба", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "Ступени из гранит-булыжника", "block.create.granite_cobblestone_wall": "Стена из гранит-булыжника", "block.create.granite_pillar": "Гранитная колонна", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "Рукоятка", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "Слоистый известняк", "block.create.layered_scoria": "Слоистый пепел", "block.create.layered_weathered_limestone": "Слоистый выветренный известняк", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "Известковый песок", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.limestone_pillar": "Известковая колонна", "block.create.linear_chassis": "Линейное шасси", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "Форсунка", "block.create.oak_window": "Дубовое окно", "block.create.oak_window_pane": "Панель из дубового окна", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "Украшенное железное окно", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "Плита из мощёного выветренного известняка", "block.create.paved_weathered_limestone_stairs": "Ступени из мощёного выветренного известняка", "block.create.paved_weathered_limestone_wall": "Стена из мощёного выветренного известняка", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "Удлинитель поршня", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "Механизированная рычаг-защёлка", "block.create.pulley_magnet": "Шкивный магнит", "block.create.pulse_repeater": "Импульсный повторитель", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "Радиальное шасси", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "Контакт сигнала красного камня", @@ -327,6 +341,7 @@ "block.create.rope": "Канат", "block.create.rope_pulley": "Лебёдка", "block.create.rotation_speed_controller": "Регулятор скорости вращения", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "Схематичный стол", "block.create.schematicannon": "Схематичная пушка", "block.create.scoria": "Пепел", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "Ступени из известняк-булыжника", "block.create.weathered_limestone_cobblestone_wall": "Стена из известняк-булыжника", "block.create.weathered_limestone_pillar": "Колонна из выветренного известняка", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "Цинковый блок", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "Н*м", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "Прокрутка", "create.action.confirm": "Подтвердить", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "Всегда лицом к движению", "create.contraptions.cart_movement_mode.rotate_paused": "Пауза во время вращения", "create.contraptions.cart_movement_mode.rotation_locked": "Блокировка вращения", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "Фильтр", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 74f907b4c..0370fa797 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 291", + "_": "Missing Localizations: 316", "_": "->------------------------] Game Elements [------------------------<-", @@ -27,9 +27,11 @@ "block.create.belt": "传送带", "block.create.birch_window": "白桦窗户", "block.create.birch_window_pane": "白桦窗户板", + "block.create.black_sail": "UNLOCALIZED: Black Sail", "block.create.black_seat": "UNLOCALIZED: Black Seat", "block.create.black_valve_handle": "UNLOCALIZED: Black Valve Handle", "block.create.blaze_burner": "UNLOCALIZED: Blaze Burner", + "block.create.blue_sail": "UNLOCALIZED: Blue Sail", "block.create.blue_seat": "UNLOCALIZED: Blue Seat", "block.create.blue_valve_handle": "UNLOCALIZED: Blue Valve Handle", "block.create.brass_belt_funnel": "UNLOCALIZED: Brass Belt Funnel", @@ -37,6 +39,7 @@ "block.create.brass_casing": "黄铜机壳", "block.create.brass_funnel": "UNLOCALIZED: Brass Funnel", "block.create.brass_tunnel": "UNLOCALIZED: Brass Tunnel", + "block.create.brown_sail": "UNLOCALIZED: Brown Sail", "block.create.brown_seat": "UNLOCALIZED: Brown Seat", "block.create.brown_valve_handle": "UNLOCALIZED: Brown Valve Handle", "block.create.cart_assembler": "矿车装配站", @@ -62,6 +65,7 @@ "block.create.crushing_wheel": "粉碎轮", "block.create.crushing_wheel_controller": "粉碎轮控制器", "block.create.cuckoo_clock": "布谷鸟闹钟", + "block.create.cyan_sail": "UNLOCALIZED: Cyan Sail", "block.create.cyan_seat": "UNLOCALIZED: Cyan Seat", "block.create.cyan_valve_handle": "UNLOCALIZED: Cyan Valve Handle", "block.create.dark_oak_window": "深色橡木窗户", @@ -166,8 +170,10 @@ "block.create.granite_cobblestone_stairs": "花岗岩圆石楼梯", "block.create.granite_cobblestone_wall": "花岗岩圆石墙", "block.create.granite_pillar": "竖纹花岗岩", + "block.create.gray_sail": "UNLOCALIZED: Gray Sail", "block.create.gray_seat": "UNLOCALIZED: Gray Seat", "block.create.gray_valve_handle": "UNLOCALIZED: Gray Valve Handle", + "block.create.green_sail": "UNLOCALIZED: Green Sail", "block.create.green_seat": "UNLOCALIZED: Green Seat", "block.create.green_valve_handle": "UNLOCALIZED: Green Valve Handle", "block.create.hand_crank": "手摇曲柄", @@ -185,10 +191,13 @@ "block.create.layered_limestone": "层叠石灰岩", "block.create.layered_scoria": "层叠熔渣", "block.create.layered_weathered_limestone": "层叠风化石灰岩", + "block.create.light_blue_sail": "UNLOCALIZED: Light Blue Sail", "block.create.light_blue_seat": "UNLOCALIZED: Light Blue Seat", "block.create.light_blue_valve_handle": "UNLOCALIZED: Light Blue Valve Handle", + "block.create.light_gray_sail": "UNLOCALIZED: Light Gray Sail", "block.create.light_gray_seat": "UNLOCALIZED: Light Gray Seat", "block.create.light_gray_valve_handle": "UNLOCALIZED: Light Gray Valve Handle", + "block.create.lime_sail": "UNLOCALIZED: Lime Sail", "block.create.lime_seat": "UNLOCALIZED: Lime Seat", "block.create.lime_valve_handle": "UNLOCALIZED: Lime Valve Handle", "block.create.limesand": "石灰沙", @@ -203,6 +212,7 @@ "block.create.limestone_cobblestone_wall": "石灰岩圆石墙", "block.create.limestone_pillar": "竖纹石灰岩", "block.create.linear_chassis": "机壳底盘", + "block.create.magenta_sail": "UNLOCALIZED: Magenta Sail", "block.create.magenta_seat": "UNLOCALIZED: Magenta Seat", "block.create.magenta_valve_handle": "UNLOCALIZED: Magenta Valve Handle", "block.create.mechanical_arm": "UNLOCALIZED: Mechanical Arm", @@ -234,6 +244,7 @@ "block.create.nozzle": "分散网", "block.create.oak_window": "橡木窗户", "block.create.oak_window_pane": "橡木窗户板", + "block.create.orange_sail": "UNLOCALIZED: Orange Sail", "block.create.orange_seat": "UNLOCALIZED: Orange Seat", "block.create.orange_valve_handle": "UNLOCALIZED: Orange Valve Handle", "block.create.ornate_iron_window": "华丽铁窗户", @@ -283,6 +294,7 @@ "block.create.paved_weathered_limestone_slab": "风化石灰岩铺路石台阶", "block.create.paved_weathered_limestone_stairs": "风化石灰岩铺路石楼梯", "block.create.paved_weathered_limestone_wall": "风化石灰岩铺路石墙", + "block.create.pink_sail": "UNLOCALIZED: Pink Sail", "block.create.pink_seat": "UNLOCALIZED: Pink Seat", "block.create.pink_valve_handle": "UNLOCALIZED: Pink Valve Handle", "block.create.piston_extension_pole": "活塞杆", @@ -315,9 +327,11 @@ "block.create.powered_toggle_latch": "T触发器", "block.create.pulley_magnet": "传送带磁铁", "block.create.pulse_repeater": "脉冲中继器", + "block.create.purple_sail": "UNLOCALIZED: Purple Sail", "block.create.purple_seat": "UNLOCALIZED: Purple Seat", "block.create.purple_valve_handle": "UNLOCALIZED: Purple Valve Handle", "block.create.radial_chassis": "旋转底盘", + "block.create.red_sail": "UNLOCALIZED: Red Sail", "block.create.red_seat": "UNLOCALIZED: Red Seat", "block.create.red_valve_handle": "UNLOCALIZED: Red Valve Handle", "block.create.redstone_contact": "信号检测器", @@ -327,6 +341,7 @@ "block.create.rope": "绳索", "block.create.rope_pulley": "绳索滑轮", "block.create.rotation_speed_controller": "转速控制器", + "block.create.sail_frame": "UNLOCALIZED: Sail Frame", "block.create.schematic_table": "蓝图桌", "block.create.schematicannon": "蓝图加农炮", "block.create.scoria": "熔渣", @@ -367,8 +382,11 @@ "block.create.weathered_limestone_cobblestone_stairs": "风化石灰岩圆石楼梯", "block.create.weathered_limestone_cobblestone_wall": "风化石灰岩圆石墙", "block.create.weathered_limestone_pillar": "竖纹风化石灰岩", + "block.create.white_sail": "UNLOCALIZED: White Sail", "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", + "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", "block.create.zinc_block": "锌块", @@ -581,6 +599,8 @@ "create.generic.unit.stress": "su", "create.generic.unit.degrees": "°", "create.generic.unit.millibuckets": "UNLOCALIZED: %1$smB", + "create.generic.clockwise": "UNLOCALIZED: Clockwise", + "create.generic.counter_clockwise": "UNLOCALIZED: Counter-Clockwise", "create.action.scroll": "滚轮", "create.action.confirm": "确认", @@ -674,6 +694,11 @@ "create.contraptions.cart_movement_mode.rotate": "结构与矿车保持相同方向", "create.contraptions.cart_movement_mode.rotate_paused": "矿车转向时机器停止工作", "create.contraptions.cart_movement_mode.rotation_locked": "结构方向保持不变", + "create.contraptions.windmill.rotation_direction": "UNLOCALIZED: Rotation Direction", + "create.contraptions.clockwork.clock_hands": "UNLOCALIZED: Clock Hands", + "create.contraptions.clockwork.hour_first": "UNLOCALIZED: Hour hand first", + "create.contraptions.clockwork.minute_first": "UNLOCALIZED: Minute hand first", + "create.contraptions.clockwork.hour_first_24": "UNLOCALIZED: 24-Hour hand first", "create.logistics.filter": "过滤器", "create.logistics.recipe_filter": "UNLOCALIZED: Recipe Filter", diff --git a/src/generated/resources/assets/create/models/block/black_sail.json b/src/generated/resources/assets/create/models/block/black_sail.json new file mode 100644 index 000000000..416fe2056 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/black_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_black" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/blue_sail.json b/src/generated/resources/assets/create/models/block/blue_sail.json new file mode 100644 index 000000000..90af507ee --- /dev/null +++ b/src/generated/resources/assets/create/models/block/blue_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brown_sail.json b/src/generated/resources/assets/create/models/block/brown_sail.json new file mode 100644 index 000000000..820d4147b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brown_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_brown" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/clockwork_bearing.json b/src/generated/resources/assets/create/models/block/clockwork_bearing.json index 144a26a78..918f089a7 100644 --- a/src/generated/resources/assets/create/models/block/clockwork_bearing.json +++ b/src/generated/resources/assets/create/models/block/clockwork_bearing.json @@ -2,6 +2,7 @@ "parent": "create:block/bearing/block", "textures": { "side": "create:block/clockwork_bearing_side", + "nook": "create:block/brass_casing", "back": "create:block/brass_gearbox" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/cyan_sail.json b/src/generated/resources/assets/create/models/block/cyan_sail.json new file mode 100644 index 000000000..9c514400b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/cyan_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_cyan" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/gray_sail.json b/src/generated/resources/assets/create/models/block/gray_sail.json new file mode 100644 index 000000000..eea66bdac --- /dev/null +++ b/src/generated/resources/assets/create/models/block/gray_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/green_sail.json b/src/generated/resources/assets/create/models/block/green_sail.json new file mode 100644 index 000000000..bc2e1d011 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/green_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_green" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_blue_sail.json b/src/generated/resources/assets/create/models/block/light_blue_sail.json new file mode 100644 index 000000000..cc8d5929b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_blue_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_light_blue" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/light_gray_sail.json b/src/generated/resources/assets/create/models/block/light_gray_sail.json new file mode 100644 index 000000000..aef702481 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/light_gray_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_light_gray" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/lime_sail.json b/src/generated/resources/assets/create/models/block/lime_sail.json new file mode 100644 index 000000000..d37b16ab1 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/lime_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_lime" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/magenta_sail.json b/src/generated/resources/assets/create/models/block/magenta_sail.json new file mode 100644 index 000000000..c94e50b4d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/magenta_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_magenta" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/mechanical_bearing.json b/src/generated/resources/assets/create/models/block/mechanical_bearing.json index 9e50b2ade..74a704e57 100644 --- a/src/generated/resources/assets/create/models/block/mechanical_bearing.json +++ b/src/generated/resources/assets/create/models/block/mechanical_bearing.json @@ -2,6 +2,7 @@ "parent": "create:block/bearing/block", "textures": { "side": "create:block/mechanical_bearing_side", + "nook": "create:block/brass_casing", "back": "create:block/gearbox" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/orange_sail.json b/src/generated/resources/assets/create/models/block/orange_sail.json new file mode 100644 index 000000000..9745df3fc --- /dev/null +++ b/src/generated/resources/assets/create/models/block/orange_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_orange" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/pink_sail.json b/src/generated/resources/assets/create/models/block/pink_sail.json new file mode 100644 index 000000000..104e8b335 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/pink_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_pink" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/purple_sail.json b/src/generated/resources/assets/create/models/block/purple_sail.json new file mode 100644 index 000000000..f42743d35 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/purple_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_purple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/red_sail.json b/src/generated/resources/assets/create/models/block/red_sail.json new file mode 100644 index 000000000..daa72d1bb --- /dev/null +++ b/src/generated/resources/assets/create/models/block/red_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_red" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/windmill_bearing.json b/src/generated/resources/assets/create/models/block/windmill_bearing.json new file mode 100644 index 000000000..1af6d6059 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/windmill_bearing.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/bearing/block", + "textures": { + "side": "create:block/windmill_bearing_side", + "nook": "create:block/andesite_casing", + "back": "create:block/gearbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/yellow_sail.json b/src/generated/resources/assets/create/models/block/yellow_sail.json new file mode 100644 index 000000000..f8873f47d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/yellow_sail.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/white_sail", + "textures": { + "0": "create:block/sail/canvas_yellow" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/clockwork_bearing.json b/src/generated/resources/assets/create/models/item/clockwork_bearing.json index 3272b7f57..908d1c4ce 100644 --- a/src/generated/resources/assets/create/models/item/clockwork_bearing.json +++ b/src/generated/resources/assets/create/models/item/clockwork_bearing.json @@ -1,6 +1,7 @@ { "parent": "create:block/bearing/item", "textures": { + "top": "create:block/bearing_top", "side": "create:block/clockwork_bearing_side", "back": "create:block/brass_gearbox" } diff --git a/src/generated/resources/assets/create/models/item/mechanical_bearing.json b/src/generated/resources/assets/create/models/item/mechanical_bearing.json index 868aa2268..6f845950f 100644 --- a/src/generated/resources/assets/create/models/item/mechanical_bearing.json +++ b/src/generated/resources/assets/create/models/item/mechanical_bearing.json @@ -1,6 +1,7 @@ { "parent": "create:block/bearing/item", "textures": { + "top": "create:block/bearing_top", "side": "create:block/mechanical_bearing_side", "back": "create:block/gearbox" } diff --git a/src/generated/resources/assets/create/models/item/sail_frame.json b/src/generated/resources/assets/create/models/item/sail_frame.json new file mode 100644 index 000000000..dc7fe7265 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/sail_frame.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/sail_frame" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/white_sail.json b/src/generated/resources/assets/create/models/item/white_sail.json new file mode 100644 index 000000000..303c0e83a --- /dev/null +++ b/src/generated/resources/assets/create/models/item/white_sail.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/white_sail" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/windmill_bearing.json b/src/generated/resources/assets/create/models/item/windmill_bearing.json new file mode 100644 index 000000000..434880d44 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/windmill_bearing.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/bearing/item", + "textures": { + "top": "create:block/bearing_top_wooden", + "side": "create:block/windmill_bearing_side", + "back": "create:block/gearbox" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sail_frame.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sail_frame.json new file mode 100644 index 000000000..bc975d517 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sail_frame.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/sail_frame" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/sail_frame" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.json new file mode 100644 index 000000000..57c62a793 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/white_sail.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/white_sail" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:sail_frame" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/white_sail" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/windmill_bearing.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/windmill_bearing.json new file mode 100644 index 000000000..56800919a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/windmill_bearing.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/windmill_bearing" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/windmill_bearing" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/black_sail.json b/src/generated/resources/data/create/loot_tables/blocks/black_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/black_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/blue_sail.json b/src/generated/resources/data/create/loot_tables/blocks/blue_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/blue_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/brown_sail.json b/src/generated/resources/data/create/loot_tables/blocks/brown_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/brown_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/cyan_sail.json b/src/generated/resources/data/create/loot_tables/blocks/cyan_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cyan_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/gray_sail.json b/src/generated/resources/data/create/loot_tables/blocks/gray_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/gray_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/green_sail.json b/src/generated/resources/data/create/loot_tables/blocks/green_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/green_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_blue_sail.json b/src/generated/resources/data/create/loot_tables/blocks/light_blue_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_blue_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/light_gray_sail.json b/src/generated/resources/data/create/loot_tables/blocks/light_gray_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/light_gray_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/lime_sail.json b/src/generated/resources/data/create/loot_tables/blocks/lime_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/lime_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/magenta_sail.json b/src/generated/resources/data/create/loot_tables/blocks/magenta_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/magenta_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/orange_sail.json b/src/generated/resources/data/create/loot_tables/blocks/orange_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/orange_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/pink_sail.json b/src/generated/resources/data/create/loot_tables/blocks/pink_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/pink_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/purple_sail.json b/src/generated/resources/data/create/loot_tables/blocks/purple_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/purple_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/red_sail.json b/src/generated/resources/data/create/loot_tables/blocks/red_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/red_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/sail_frame.json b/src/generated/resources/data/create/loot_tables/blocks/sail_frame.json new file mode 100644 index 000000000..40c31d6b4 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/sail_frame.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:sail_frame" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/white_sail.json b/src/generated/resources/data/create/loot_tables/blocks/white_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/white_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/windmill_bearing.json b/src/generated/resources/data/create/loot_tables/blocks/windmill_bearing.json new file mode 100644 index 000000000..779887744 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/windmill_bearing.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:windmill_bearing" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/yellow_sail.json b/src/generated/resources/data/create/loot_tables/blocks/yellow_sail.json new file mode 100644 index 000000000..c820422f1 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/yellow_sail.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:white_sail" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/sail_frame.json b/src/generated/resources/data/create/recipes/crafting/kinetics/sail_frame.json new file mode 100644 index 000000000..962b7a32c --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/sail_frame.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "SAS", + "SSS" + ], + "key": { + "A": { + "item": "create:andesite_alloy" + }, + "S": { + "tag": "forge:rods/wooden" + } + }, + "result": { + "item": "create:sail_frame", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/white_sail.json b/src/generated/resources/data/create/recipes/crafting/kinetics/white_sail.json new file mode 100644 index 000000000..9d48831b0 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/white_sail.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "FFF", + "FWF", + "FFF" + ], + "key": { + "F": { + "item": "create:sail_frame" + }, + "W": { + "tag": "minecraft:wool" + } + }, + "result": { + "item": "create:white_sail", + "count": 8 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/windmill_bearing.json b/src/generated/resources/data/create/recipes/crafting/kinetics/windmill_bearing.json new file mode 100644 index 000000000..8a210d190 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/windmill_bearing.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + " C ", + " I " + ], + "key": { + "I": { + "item": "create:shaft" + }, + "B": { + "item": "create:turntable" + }, + "C": { + "tag": "forge:stone" + } + }, + "result": { + "item": "create:windmill_bearing" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/fan_transparent.json b/src/generated/resources/data/create/tags/blocks/fan_transparent.json index 68f9d3c80..9c90933ae 100644 --- a/src/generated/resources/data/create/tags/blocks/fan_transparent.json +++ b/src/generated/resources/data/create/tags/blocks/fan_transparent.json @@ -2,6 +2,7 @@ "replace": false, "values": [ "create:blaze_burner", + "create:sail_frame", "#minecraft:fences", "minecraft:iron_bars" ] diff --git a/src/generated/resources/data/create/tags/blocks/sails.json b/src/generated/resources/data/create/tags/blocks/sails.json new file mode 100644 index 000000000..7dcca6319 --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/sails.json @@ -0,0 +1,20 @@ +{ + "replace": false, + "values": [ + "create:orange_sail", + "create:magenta_sail", + "create:light_blue_sail", + "create:yellow_sail", + "create:lime_sail", + "create:pink_sail", + "create:gray_sail", + "create:light_gray_sail", + "create:cyan_sail", + "create:purple_sail", + "create:blue_sail", + "create:brown_sail", + "create:green_sail", + "create:red_sail", + "create:black_sail" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/windmill_sails.json b/src/generated/resources/data/create/tags/blocks/windmill_sails.json index c35d84026..d4296265f 100644 --- a/src/generated/resources/data/create/tags/blocks/windmill_sails.json +++ b/src/generated/resources/data/create/tags/blocks/windmill_sails.json @@ -1,6 +1,23 @@ { "replace": false, "values": [ + "create:sail_frame", + "create:white_sail", + "create:orange_sail", + "create:magenta_sail", + "create:light_blue_sail", + "create:yellow_sail", + "create:lime_sail", + "create:pink_sail", + "create:gray_sail", + "create:light_gray_sail", + "create:cyan_sail", + "create:purple_sail", + "create:blue_sail", + "create:brown_sail", + "create:green_sail", + "create:red_sail", + "create:black_sail", "#minecraft:wool" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index a04c4a9eb..cfbf8af94 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -51,17 +51,16 @@ public class AllBlockPartials { SAW_BLADE_HORIZONTAL_REVERSED = get("mechanical_saw/blade_horizontal_reversed"), SAW_BLADE_VERTICAL_ACTIVE = get("mechanical_saw/blade_vertical_active"), SAW_BLADE_VERTICAL_INACTIVE = get("mechanical_saw/blade_vertical_inactive"), - SAW_BLADE_VERTICAL_REVERSED = get("mechanical_saw/blade_vertical_reversed"), - GAUGE_DIAL = get("gauge/dial"), + SAW_BLADE_VERTICAL_REVERSED = get("mechanical_saw/blade_vertical_reversed"), GAUGE_DIAL = get("gauge/dial"), GAUGE_INDICATOR = get("gauge/indicator"), GAUGE_HEAD_SPEED = get("gauge/speedometer/head"), GAUGE_HEAD_STRESS = get("gauge/stressometer/head"), BEARING_TOP = get("bearing/top"), - DRILL_HEAD = get("mechanical_drill/head"), HARVESTER_BLADE = get("mechanical_harvester/blade"), - DEPLOYER_POLE = get("deployer/pole"), DEPLOYER_HAND_POINTING = get("deployer/hand_pointing"), - DEPLOYER_HAND_PUNCHING = get("deployer/hand_punching"), DEPLOYER_HAND_HOLDING = get("deployer/hand_holding"), - ANALOG_LEVER_HANDLE = get("analog_lever/handle"), ANALOG_LEVER_INDICATOR = get("analog_lever/indicator"), - BELT_FUNNEL_FLAP = get("belt_funnel/flap"), BELT_TUNNEL_FLAP = get("belt_tunnel/flap"), - FLEXPEATER_INDICATOR = get("diodes/indicator"), FLYWHEEL = get("flywheel/wheel"), - FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"), + BEARING_TOP_WOODEN = get("bearing/top_wooden"), DRILL_HEAD = get("mechanical_drill/head"), + HARVESTER_BLADE = get("mechanical_harvester/blade"), DEPLOYER_POLE = get("deployer/pole"), + DEPLOYER_HAND_POINTING = get("deployer/hand_pointing"), DEPLOYER_HAND_PUNCHING = get("deployer/hand_punching"), + DEPLOYER_HAND_HOLDING = get("deployer/hand_holding"), ANALOG_LEVER_HANDLE = get("analog_lever/handle"), + ANALOG_LEVER_INDICATOR = get("analog_lever/indicator"), BELT_FUNNEL_FLAP = get("belt_funnel/flap"), + BELT_TUNNEL_FLAP = get("belt_tunnel/flap"), FLEXPEATER_INDICATOR = get("diodes/indicator"), + FLYWHEEL = get("flywheel/wheel"), FLYWHEEL_UPPER_ROTATING = get("flywheel/upper_rotating_connector"), FLYWHEEL_LOWER_ROTATING = get("flywheel/lower_rotating_connector"), FLYWHEEL_UPPER_SLIDING = get("flywheel/upper_sliding_connector"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index b3b0c72c1..78bb6b69a 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -48,6 +48,8 @@ import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.components.saw.SawGenerator; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; @@ -593,16 +595,21 @@ public class AllBlocks { .getName() + "/head")))) .register(); + public static final BlockEntry WINDMILL_BEARING = + REGISTRATE.block("windmill_bearing", WindmillBearingBlock::new) + .transform(BuilderTransformers.bearing("windmill", "gearbox", true)) + .transform(StressConfigDefaults.setCapacity(512.0)) + .register(); + public static final BlockEntry MECHANICAL_BEARING = REGISTRATE.block("mechanical_bearing", MechanicalBearingBlock::new) - .transform(BuilderTransformers.bearing("mechanical", "gearbox")) - .transform(StressConfigDefaults.setCapacity(512.0)) + .transform(BuilderTransformers.bearing("mechanical", "gearbox", false)) .transform(StressConfigDefaults.setImpact(4.0)) .register(); public static final BlockEntry CLOCKWORK_BEARING = REGISTRATE.block("clockwork_bearing", ClockworkBearingBlock::new) - .transform(BuilderTransformers.bearing("clockwork", "brass_gearbox")) + .transform(BuilderTransformers.bearing("clockwork", "brass_gearbox", false)) .transform(StressConfigDefaults.setImpact(4.0)) .register(); @@ -706,9 +713,7 @@ public class AllBlocks { .onRegister(addMovementBehaviour(new SawMovementBehaviour())) .addLayer(() -> RenderType::getCutoutMipped) .item() - .model((c, p) -> p.blockItem(() -> c.getEntry() - .getBlock(), "/horizontal")) - .build() + .transform(customItemModel()) .register(); public static final BlockEntry DEPLOYER = REGISTRATE.block("deployer", DeployerBlock::new) @@ -748,6 +753,7 @@ public class AllBlocks { .register(); static { + // SEATS for (DyeColor colour : DyeColor.values()) { String colourName = colour.getName(); SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); @@ -785,6 +791,46 @@ public class AllBlocks { } } + public static final BlockEntry SAIL_FRAME = REGISTRATE.block("sail_frame", p -> SailBlock.frame(p)) + .initialProperties(SharedProperties::wooden) + .properties(Block.Properties::nonOpaque) + .blockstate(BlockStateGen.directionalBlockProvider(false)) + .tag(AllBlockTags.WINDMILL_SAILS.tag) + .tag(AllBlockTags.FAN_TRANSPARENT.tag) + .simpleItem() + .register(); + + public static final BlockEntry[] DYED_SAILS = new BlockEntry[DyeColor.values().length]; + + public static final BlockEntry SAIL = REGISTRATE.block("white_sail", p -> SailBlock.withCanvas(p)) + .initialProperties(SharedProperties::wooden) + .properties(Block.Properties::nonOpaque) + .blockstate(BlockStateGen.directionalBlockProvider(false)) + .tag(AllBlockTags.WINDMILL_SAILS.tag) + .simpleItem() + .register(); + + static { + // DYED SAILS + for (DyeColor colour : DyeColor.values()) { + if (colour == DyeColor.WHITE) { + DYED_SAILS[colour.ordinal()] = SAIL; + continue; + } + String colourName = colour.getName(); + DYED_SAILS[colour.ordinal()] = REGISTRATE.block(colourName + "_sail", p -> SailBlock.withCanvas(p)) + .properties(Block.Properties::nonOpaque) + .initialProperties(SharedProperties::wooden) + .blockstate((c, p) -> p.directionalBlock(c.get(), p.models() + .withExistingParent(colourName + "_sail", p.modLoc("block/white_sail")) + .texture("0", p.modLoc("block/sail/canvas_" + colourName)))) + .tag(AllBlockTags.WINDMILL_SAILS.tag) + .tag(AllBlockTags.SAILS.tag) + .loot((p, b) -> p.registerDropping(b, SAIL.get())) + .register(); + } + } + public static final BlockEntry ANDESITE_CASING = REGISTRATE.block("andesite_casing", CasingBlock::new) .transform(BuilderTransformers.casing(AllSpriteShifts.ANDESITE_CASING)) .register(); diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index d17538bfb..186426e85 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -36,6 +36,9 @@ public class AllShapes { PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14) .add(0, 0, 14, 16, 16, 16) .forHorizontalAxis(), + SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14).forDirectional(), + SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), + SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(), SPEED_CONTROLLER = shape(0, 0, 0, 16, 2, 16).add(1, 1, 1, 15, 15, 15) .erase(0, 8, 5, 16, 16, 11) .add(2, 9, 2, 14, 14, 14) @@ -130,10 +133,12 @@ public class AllShapes { BASIN_BLOCK_SHAPE = shape(0, 2, 0, 16, 16, 16).erase(2, 2, 2, 14, 16, 14) .add(2, 0, 2, 14, 2, 14) - .build(), BASIN_COLLISION_SHAPE = - shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14) - .add(2, 0, 2, 14, 2, 14) + .build(), BASIN_RAYTRACE_SHAPE = + shape(0, 2, 0, 16, 16, 16).add(2, 0, 2, 14, 2, 14) .build(), + BASIN_COLLISION_SHAPE = shape(0, 2, 0, 16, 13, 16).erase(2, 5, 2, 14, 16, 14) + .add(2, 0, 2, 14, 2, 14) + .build(), HEATER_BLOCK_SHAPE = shape(2, 0, 2, 14, 14, 14).add(0, 0, 0, 16, 4, 16) .build(), HEATER_BLOCK_SPECIAL_COLLISION_SHAPE = shape(0, 0, 0, 16, 4, 16).build(), diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index e8b2158a8..779c00aff 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -103,7 +103,7 @@ public class AllTags { } public static enum AllBlockTags { - WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, VALVE_HANDLES, FAN_TRANSPARENT + WINDMILL_SAILS, FAN_HEATERS, WINDOWABLE, NON_MOVABLE, BRITTLE, SEATS, SAILS, VALVE_HANDLES, FAN_TRANSPARENT ; diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 6471eec40..f4eb24b27 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -37,6 +37,7 @@ import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonRenderer; @@ -278,6 +279,12 @@ public class AllTileEntities { .renderer(() -> MechanicalPistonRenderer::new) .register(); + public static final TileEntityEntry WINDMILL_BEARING = Create.registrate() + .tileEntity("windmill_bearing", WindmillBearingTileEntity::new) + .validBlocks(AllBlocks.WINDMILL_BEARING) + .renderer(() -> BearingRenderer::new) + .register(); + public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_BEARING) diff --git a/src/main/java/com/simibubi/create/content/AllSections.java b/src/main/java/com/simibubi/create/content/AllSections.java index 9cc4e920a..1dc2dfde0 100644 --- a/src/main/java/com/simibubi/create/content/AllSections.java +++ b/src/main/java/com/simibubi/create/content/AllSections.java @@ -16,9 +16,6 @@ public enum AllSections { /** Item transport and other Utility */ LOGISTICS(Palette.Yellow), - /** Helpful gadgets and other shenanigans */ - CURIOSITIES(Palette.Purple), - /** Tools for strucuture movement and replication */ SCHEMATICS(Palette.Blue), @@ -27,6 +24,9 @@ public enum AllSections { /** Base materials, ingredients and tools */ MATERIALS(Palette.Green), + + /** Helpful gadgets and other shenanigans */ + CURIOSITIES(Palette.Purple), /** Fallback section */ UNASSIGNED(Palette.Gray) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java index 2c86155b3..4c9e92062 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/BeltPressingCallbacks.java @@ -35,7 +35,7 @@ public class BeltPressingCallbacks { return PASS; if (!pressTe.running) return PASS; - if (pressTe.runningTicks != 30) + if (pressTe.runningTicks != MechanicalPressTileEntity.CYCLE / 2) return HOLD; Optional recipe = pressTe.getRecipe(transported.stack); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java index d5cc08418..25eb3eb20 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressBlock.java @@ -4,10 +4,8 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; -import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode; import com.simibubi.create.foundation.block.ITE; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItemUseContext; @@ -19,10 +17,8 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorldReader; -import net.minecraft.world.World; -public class MechanicalPressBlock extends HorizontalKineticBlock - implements ITE { +public class MechanicalPressBlock extends HorizontalKineticBlock implements ITE { public MechanicalPressBlock(Properties properties) { super(properties); @@ -32,7 +28,6 @@ public class MechanicalPressBlock extends HorizontalKineticBlock public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { if (context.getEntity() instanceof PlayerEntity) return AllShapes.CASING_14PX.get(Direction.DOWN); - return AllShapes.MECHANICAL_PROCESSOR_SHAPE; } @@ -41,22 +36,6 @@ public class MechanicalPressBlock extends HorizontalKineticBlock return !AllBlocks.BASIN.has(worldIn.getBlockState(pos.down())); } - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (worldIn.isRemote) - return; - - withTileEntityDo(worldIn, pos, te -> { - if (!worldIn.isBlockPowered(pos)) { - te.finished = false; - return; - } - if (!te.finished && !te.running && te.getSpeed() != 0) - te.start(Mode.WORLD); - }); - } - @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { return AllTileEntities.MECHANICAL_PRESS.create(); @@ -72,12 +51,14 @@ public class MechanicalPressBlock extends HorizontalKineticBlock @Override public Axis getRotationAxis(BlockState state) { - return state.get(HORIZONTAL_FACING).getAxis(); + return state.get(HORIZONTAL_FACING) + .getAxis(); } @Override public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(HORIZONTAL_FACING).getAxis(); + return face.getAxis() == state.get(HORIZONTAL_FACING) + .getAxis(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index bc8a0818d..b1546ae96 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; @@ -16,6 +17,7 @@ import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.SmartInventory; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; @@ -48,6 +50,8 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public int prevRunningTicks; public int runningTicks; static final int CYCLE = 240; + static final int ENTITY_SCAN = 10; + int entityScanCooldown; public boolean running; public Mode mode; @@ -56,6 +60,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public MechanicalPressTileEntity(TileEntityType type) { super(type); mode = Mode.WORLD; + entityScanCooldown = ENTITY_SCAN; } @Override @@ -105,10 +110,11 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public float getRenderedHeadOffset(float partialTicks) { if (!running) return 0; + int runningTicks = Math.abs(this.runningTicks); float ticks = MathHelper.lerp(partialTicks, prevRunningTicks, runningTicks); if (runningTicks < (CYCLE * 2) / 3) - return (float) MathHelper.clamp(Math.pow(ticks / CYCLE * 2, 3), 0, mode.headOffset); - return MathHelper.clamp((CYCLE - ticks) / CYCLE * 3 * mode.headOffset, 0, mode.headOffset); + return (float) MathHelper.clamp(Math.pow(ticks / CYCLE * 2, 3), 0, 1) * mode.headOffset; + return MathHelper.clamp((CYCLE - ticks) / CYCLE * 3, 0, 1) * mode.headOffset; } public void start(Mode mode) { @@ -131,8 +137,39 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { public void tick() { super.tick(); - if (!running || world == null) + if (!running || world == null) { + if (hasWorld() && !world.isRemote) { + + if (getSpeed() == 0) + return; + if (entityScanCooldown > 0) + entityScanCooldown--; + if (entityScanCooldown <= 0) { + entityScanCooldown = ENTITY_SCAN; + if (TileEntityBehaviour.get(world, pos.down(2), TransportedItemStackHandlerBehaviour.TYPE) != null) + return; + if (AllBlocks.BASIN.has(world.getBlockState(pos.down(2)))) + return; + + for (ItemEntity itemEntity : world.getEntitiesWithinAABB(ItemEntity.class, + new AxisAlignedBB(pos.down()).shrink(.125f))) { + ItemStack stack = itemEntity.getItem(); + Optional recipe = getRecipe(stack); + if (!recipe.isPresent()) + continue; + start(Mode.WORLD); + return; + } + } + + } return; + } + + if (world.isRemote && runningTicks == -CYCLE / 2) { + prevRunningTicks = CYCLE / 2; + return; + } if (runningTicks == CYCLE / 2) { if (inWorld()) @@ -149,8 +186,6 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { if (!world.isRemote && runningTicks > CYCLE) { finished = true; - if (inWorld()) - finished = world.isBlockPowered(pos); running = false; if (onBasin() && matchBasinRecipe(currentRecipe)) @@ -163,8 +198,12 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity { prevRunningTicks = runningTicks; runningTicks += getRunningTickSpeed(); - if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) + if (prevRunningTicks < CYCLE / 2 && runningTicks >= CYCLE / 2) { runningTicks = CYCLE / 2; + // Pause the ticks until a packet is received + if (world.isRemote) + runningTicks = -(CYCLE / 2); + } } protected void applyCompactingOnBasin() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index 880017bec..ee271473d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; @@ -175,14 +176,14 @@ public class BlockMovementTraits { return direction == state.get(EngineBlock.HORIZONTAL_FACING).getOpposite(); if (block instanceof BellBlock) { BellAttachment attachment = state.get(BlockStateProperties.BELL_ATTACHMENT); - if (attachment == BellAttachment.FLOOR) { + if (attachment == BellAttachment.FLOOR) return direction == Direction.DOWN; - } - if (attachment == BellAttachment.CEILING) { + if (attachment == BellAttachment.CEILING) return direction == Direction.UP; - } return direction == state.get(HorizontalBlock.HORIZONTAL_FACING); } + if (state.getBlock() instanceof SailBlock) + return direction.getAxis() != state.get(SailBlock.FACING).getAxis(); return false; } @@ -205,7 +206,9 @@ public class BlockMovementTraits { return facing == Direction.DOWN; if (state.getBlock() instanceof CarpetBlock) return facing == Direction.UP; + if (state.getBlock() instanceof SailBlock) + return facing.getAxis() == state.get(SailBlock.FACING).getAxis(); return isBrittle(state); } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java index 82c793e94..e1f7978f5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingRenderer.java @@ -27,7 +27,9 @@ public class BearingRenderer extends KineticTileEntityRenderer { IBearingTileEntity bearingTe = (IBearingTileEntity) te; final Direction facing = te.getBlockState() .get(BlockStateProperties.FACING); - SuperByteBuffer superBuffer = AllBlockPartials.BEARING_TOP.renderOn(te.getBlockState()); + AllBlockPartials top = + bearingTe.isWoodenTop() ? AllBlockPartials.BEARING_TOP_WOODEN : AllBlockPartials.BEARING_TOP; + SuperByteBuffer superBuffer = top.renderOn(te.getBlockState()); float interpolatedAngle = bearingTe.getInterpolatedAngle(partialTicks - 1); kineticRotationTransform(superBuffer, te, facing.getAxis(), (float) (interpolatedAngle / 180 * Math.PI), light); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index 440ed16b0..7c89c3e20 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -1,11 +1,18 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import java.util.List; + import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkContraption.HandType; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.nbt.CompoundNBT; @@ -30,11 +37,27 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe protected boolean running; protected boolean assembleNextTick; + protected ScrollOptionBehaviour operationMode; + public ClockworkBearingTileEntity(TileEntityType type) { super(type); setLazyTickRate(3); } + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + operationMode = new ScrollOptionBehaviour<>(ClockHands.class, + Lang.translate("contraptions.clockwork.clock_hands"), this, getMovementModeSlot()); + operationMode.requiresWrench(); + behaviours.add(operationMode); + } + + @Override + public boolean isWoodenTop() { + return false; + } + @Override public void tick() { super.tick(); @@ -50,9 +73,11 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe boolean canDisassemble = true; if (speed == 0 && (canDisassemble || hourHand == null || hourHand.getContraption().blocks.isEmpty())) { if (hourHand != null) - hourHand.getContraption().stop(world); + hourHand.getContraption() + .stop(world); if (minuteHand != null) - minuteHand.getContraption().stop(world); + minuteHand.getContraption() + .stop(world); disassemble(); } return; @@ -78,15 +103,18 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe } protected void applyRotations() { - Axis axis = getBlockState().get(BlockStateProperties.FACING).getAxis(); + Axis axis = getBlockState().get(BlockStateProperties.FACING) + .getAxis(); Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); Vec3d directionVec = new Vec3d(direction.getDirectionVec()); if (hourHand != null) { - Vec3d vec = new Vec3d(1, 1, 1).scale(hourAngle).mul(directionVec); + Vec3d vec = new Vec3d(1, 1, 1).scale(hourAngle) + .mul(directionVec); hourHand.rotateTo(vec.x, vec.y, vec.z); } if (minuteHand != null) { - Vec3d vec = new Vec3d(1, 1, 1).scale(minuteAngle).mul(directionVec); + Vec3d vec = new Vec3d(1, 1, 1).scale(minuteAngle) + .mul(directionVec); minuteHand.rotateTo(vec.x, vec.y, vec.z); } } @@ -102,10 +130,9 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe float speed = getAngularSpeed() / 2f; if (speed != 0) { - int dayTime = (int) (world.getDayTime() % 24000); - int hours = (dayTime / 1000 + 6) % 24; - int offset = getBlockState().get(ClockworkBearingBlock.FACING).getAxisDirection().getOffset(); - float hourTarget = (float) (offset * -360 / 12f * (hours % 12)); + ClockHands mode = ClockHands.values()[operationMode.getValue()]; + float hourTarget = mode == ClockHands.HOUR_FIRST ? getHourTarget(false) + : mode == ClockHands.MINUTE_FIRST ? getMinuteTarget() : getHourTarget(true); float shortestAngleDiff = AngleHelper.getShortestAngleDiff(hourAngle, hourTarget); if (shortestAngleDiff < 0) { speed = Math.max(speed, shortestAngleDiff); @@ -121,10 +148,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe float speed = getAngularSpeed(); if (speed != 0) { - int dayTime = (int) (world.getDayTime() % 24000); - int minutes = (dayTime % 1000) * 60 / 1000; - int offset = getBlockState().get(ClockworkBearingBlock.FACING).getAxisDirection().getOffset(); - float minuteTarget = (float) (offset * -360 / 60f * (minutes)); + ClockHands mode = ClockHands.values()[operationMode.getValue()]; + float minuteTarget = mode == ClockHands.MINUTE_FIRST ? getHourTarget(false) : getMinuteTarget(); float shortestAngleDiff = AngleHelper.getShortestAngleDiff(minuteAngle, minuteTarget); if (shortestAngleDiff < 0) { speed = Math.max(speed, shortestAngleDiff); @@ -136,6 +161,26 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe return speed + clientMinuteAngleDiff / 3f; } + protected float getHourTarget(boolean cycle24) { + int dayTime = (int) (world.getDayTime() % 24000); + int hours = (dayTime / 1000 + 6) % 24; + int offset = getBlockState().get(ClockworkBearingBlock.FACING) + .getAxisDirection() + .getOffset(); + float hourTarget = (float) (offset * -360 / (cycle24 ? 24f : 12f) * (hours % (cycle24 ? 24 : 12))); + return hourTarget; + } + + protected float getMinuteTarget() { + int dayTime = (int) (world.getDayTime() % 24000); + int minutes = (dayTime % 1000) * 60 / 1000; + int offset = getBlockState().get(ClockworkBearingBlock.FACING) + .getAxisDirection() + .getOffset(); + float minuteTarget = (float) (offset * -360 / 60f * (minutes)); + return minuteTarget; + } + public float getAngularSpeed() { float speed = -Math.abs(getSpeed() * 3 / 10f); if (world.isRemote) @@ -144,7 +189,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe } public void assemble() { - if (!(world.getBlockState(pos).getBlock() instanceof ClockworkBearingBlock)) + if (!(world.getBlockState(pos) + .getBlock() instanceof ClockworkBearingBlock)) return; Direction direction = getBlockState().get(BlockStateProperties.FACING); @@ -160,15 +206,19 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe return; BlockPos anchor = pos.offset(direction); - contraption.getLeft().removeBlocksFromWorld(world, BlockPos.ZERO); - hourHand = ContraptionEntity.createStationary(world, contraption.getLeft()).controlledBy(this); + contraption.getLeft() + .removeBlocksFromWorld(world, BlockPos.ZERO); + hourHand = ContraptionEntity.createStationary(world, contraption.getLeft()) + .controlledBy(this); hourHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); world.addEntity(hourHand); if (contraption.getRight() != null) { anchor = pos.offset(direction, contraption.getRight().offset + 1); - contraption.getRight().removeBlocksFromWorld(world, BlockPos.ZERO); - minuteHand = ContraptionEntity.createStationary(world, contraption.getRight()).controlledBy(this); + contraption.getRight() + .removeBlocksFromWorld(world, BlockPos.ZERO); + minuteHand = ContraptionEntity.createStationary(world, contraption.getRight()) + .controlledBy(this); minuteHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); world.addEntity(minuteHand); } @@ -234,15 +284,15 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe protected void read(CompoundNBT compound, boolean clientPacket) { float hourAngleBefore = hourAngle; float minuteAngleBefore = minuteAngle; - + running = compound.getBoolean("Running"); hourAngle = compound.getFloat("HourAngle"); minuteAngle = compound.getFloat("MinuteAngle"); super.read(compound, clientPacket); - + if (!clientPacket) return; - + if (running) { clientHourAngleDiff = AngleHelper.getShortestAngleDiff(hourAngleBefore, hourAngle); clientMinuteAngleDiff = AngleHelper.getShortestAngleDiff(minuteAngleBefore, minuteAngle); @@ -286,8 +336,7 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe } @Override - public void collided() { - } + public void collided() {} @Override public boolean isAttachedTo(ContraptionEntity contraption) { @@ -304,4 +353,32 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe return running; } + static enum ClockHands implements INamedIconOptions { + + HOUR_FIRST(AllIcons.I_HOUR_HAND_FIRST), + MINUTE_FIRST(AllIcons.I_MINUTE_HAND_FIRST), + HOUR_FIRST_24(AllIcons.I_HOUR_HAND_FIRST_24), + + ; + + private String translationKey; + private AllIcons icon; + + private ClockHands(AllIcons icon) { + this.icon = icon; + translationKey = "contraptions.clockwork." + Lang.asId(name()); + } + + @Override + public AllIcons getIcon() { + return icon; + } + + @Override + public String getTranslationKey() { + return translationKey; + } + + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java index efaad9ead..f2f9a475d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java @@ -1,9 +1,24 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import com.simibubi.create.content.contraptions.components.structureMovement.DirectionalExtenderScrollOptionSlot; import com.simibubi.create.content.contraptions.components.structureMovement.IControlContraption; +import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; + +import net.minecraft.util.Direction.Axis; public interface IBearingTileEntity extends IControlContraption { float getInterpolatedAngle(float partialTicks); + boolean isWoodenTop(); + + default ValueBoxTransform getMovementModeSlot() { + return new DirectionalExtenderScrollOptionSlot((state, d) -> { + Axis axis = d.getAxis(); + Axis bearingAxis = state.get(BearingBlock.FACING) + .getAxis(); + return bearingAxis != axis; + }); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java index 253a49a71..9bf59c537 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingBlock.java @@ -2,9 +2,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.AllTileEntities; import com.simibubi.create.foundation.block.ITE; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.tileentity.TileEntity; @@ -27,44 +25,28 @@ public class MechanicalBearingBlock extends BearingBlock implements ITE { - if (te.running) { - te.disassemble(); - return; - } - te.assembleNextTick = true; - }); - } + if (player.getHeldItem(handIn) + .isEmpty()) { + if (worldIn.isRemote) + return ActionResultType.SUCCESS; + withTileEntityDo(worldIn, pos, te -> { + if (te.running) { + te.disassemble(); + return; + } + te.assembleNextTick = true; + }); return ActionResultType.SUCCESS; } return ActionResultType.PASS; } - @Override - public void onBlockAdded(BlockState state, World worldIn, BlockPos pos, BlockState oldState, boolean isMoving) { - if (worldIn instanceof WrappedWorld) - return; - withTileEntityDo(worldIn, pos, MechanicalBearingTileEntity::neighbourChanged); - } - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (worldIn instanceof WrappedWorld) - return; - if (worldIn.isRemote) - return; - withTileEntityDo(worldIn, pos, MechanicalBearingTileEntity::neighbourChanged); - } - @Override public Class getTileEntityClass() { return MechanicalBearingTileEntity.class; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index 787e5f2ad..fda747d49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -6,9 +6,7 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.DirectionalExtenderScrollOptionSlot; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Lang; @@ -26,21 +24,23 @@ import net.minecraft.util.math.Vec3d; public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity implements IBearingTileEntity { - protected boolean isWindmill; + protected ScrollOptionBehaviour movementMode; protected ContraptionEntity movedContraption; protected float angle; protected boolean running; protected boolean assembleNextTick; protected float clientAngleDiff; - protected ScrollOptionBehaviour movementMode; - protected float lastGeneratedSpeed; public MechanicalBearingTileEntity(TileEntityType type) { super(type); - isWindmill = false; setLazyTickRate(3); } + @Override + public boolean isWoodenTop() { + return false; + } + @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); @@ -50,39 +50,6 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp behaviours.add(movementMode); } - @Override - public float calculateAddedStressCapacity() { - return isWindmill ? super.calculateAddedStressCapacity() : 0; - } - - @Override - public float calculateStressApplied() { - return isWindmill ? 0 : super.calculateStressApplied(); - } - - public void neighbourChanged() { - if (!hasWorld()) - return; - - boolean shouldWindmill = world.isBlockPowered(pos); - if (shouldWindmill == isWindmill) - return; - - isWindmill = shouldWindmill; - if (isWindmill && !running) - assembleNextTick = true; - if (isWindmill && running) - updateGeneratedRotation(); - - if (!isWindmill && running) { - updateGeneratedRotation(); - if (getSpeed() == 0) - assembleNextTick = true; - } - - sendData(); - } - @Override public void remove() { if (!world.isRemote) @@ -90,22 +57,10 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp super.remove(); } - @Override - public float getGeneratedSpeed() { - if (!running || !isWindmill) - return 0; - if (movedContraption == null) - return lastGeneratedSpeed; - int sails = ((BearingContraption) movedContraption.getContraption()).getSailBlocks() / 8; - return MathHelper.clamp(sails, 1, 16); - } - @Override public void write(CompoundNBT compound, boolean clientPacket) { compound.putBoolean("Running", running); - compound.putBoolean("Windmill", isWindmill); compound.putFloat("Angle", angle); - compound.putFloat("LastGenerated", lastGeneratedSpeed); super.write(compound, clientPacket); } @@ -113,11 +68,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp protected void read(CompoundNBT compound, boolean clientPacket) { float angleBefore = angle; running = compound.getBoolean("Running"); - isWindmill = compound.getBoolean("Windmill"); angle = compound.getFloat("Angle"); - lastGeneratedSpeed = compound.getFloat("LastGenerated"); super.read(compound, clientPacket); - if (!clientPacket) return; if (running) { @@ -141,7 +93,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp } public float getAngularSpeed() { - float speed = getSpeed() * 3 / 10f; + float speed = (isWindmill() ? getGeneratedSpeed() : getSpeed()) * 3 / 10f; if (world.isRemote) { speed *= ServerSpeedProvider.get(); speed += clientAngleDiff / 3f; @@ -149,9 +101,13 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp return speed; } + protected boolean isWindmill() { + return false; + } + public void assemble() { if (!(world.getBlockState(pos) - .getBlock() instanceof MechanicalBearingBlock)) + .getBlock() instanceof BearingBlock)) return; Direction direction = getBlockState().get(FACING); @@ -160,7 +116,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp BearingContraption contraption = BearingContraption.assembleBearingAt(world, pos, direction); if (contraption == null) return; - if (isWindmill && contraption.getSailBlocks() == 0) + if (isWindmill() && contraption.getSailBlocks() == 0) return; if (contraption.blocks.isEmpty()) return; @@ -179,21 +135,17 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp updateGeneratedRotation(); } - @Override - public void updateGeneratedRotation() { - super.updateGeneratedRotation(); - lastGeneratedSpeed = getGeneratedSpeed(); - } - public void disassemble() { if (!running && movedContraption == null) return; + angle = 0; + if (isWindmill()) + applyRotation(); if (movedContraption != null) movedContraption.disassemble(); movedContraption = null; running = false; - angle = 0; updateGeneratedRotation(); assembleNextTick = false; sendData(); @@ -220,7 +172,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp } return; } else { - if (speed == 0 && !isWindmill) + if (speed == 0 && !isWindmill()) return; assemble(); } @@ -290,15 +242,6 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp return !isRemoved(); } - protected ValueBoxTransform getMovementModeSlot() { - return new DirectionalExtenderScrollOptionSlot((state, d) -> { - Axis axis = d.getAxis(); - Axis bearingAxis = state.get(MechanicalBearingBlock.FACING) - .getAxis(); - return bearingAxis != axis; - }); - } - @Override public void collided() {} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java new file mode 100644 index 000000000..6496c6095 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -0,0 +1,198 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.bearing; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllShapes; +import com.simibubi.create.foundation.block.ProperDirectionalBlock; +import com.simibubi.create.foundation.utility.DyeHelper; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.DyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public class SailBlock extends ProperDirectionalBlock { + + public static SailBlock frame(Properties properties) { + return new SailBlock(properties, true); + } + + public static SailBlock withCanvas(Properties properties) { + return new SailBlock(properties, false); + } + + private boolean frame; + + protected SailBlock(Properties p_i48415_1_, boolean frame) { + super(p_i48415_1_); + this.frame = frame; + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + BlockState state = super.getStateForPlacement(context); + return state.with(FACING, state.get(FACING) + .getOpposite()); + } + + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult ray) { + ItemStack heldItem = player.getHeldItem(hand); + + if (AllBlocks.SAIL.isIn(heldItem) || AllBlocks.SAIL_FRAME.isIn(heldItem)) { + Direction offset = + SailBlockPlacementHelper.getPlacementOffset(world, state.get(FACING), pos, ray.getHitVec()); + if (offset == null) + return ActionResultType.SUCCESS; + BlockState blockState = ((BlockItem) heldItem.getItem()).getBlock() + .getDefaultState() + .with(FACING, state.get(FACING)); + BlockPos offsetPos = pos.offset(offset); + if (!world.isRemote && world.getBlockState(offsetPos) + .getMaterial() + .isReplaceable()) + world.setBlockState(offsetPos, blockState); + return ActionResultType.SUCCESS; + } + + if (frame) + return ActionResultType.PASS; + + for (DyeColor color : DyeColor.values()) { + if (!heldItem.getItem() + .isIn(DyeHelper.getTagOfDye(color))) + continue; + if (!world.isRemote) + applyDye(state, world, pos, color); + return ActionResultType.SUCCESS; + } + + return ActionResultType.PASS; + } + + protected void applyDye(BlockState state, World world, BlockPos pos, DyeColor color) { + BlockState newState = AllBlocks.DYED_SAILS[color.ordinal()].getDefaultState() + .with(FACING, state.get(FACING)); + + // Dye the block itself + if (state != newState) { + world.setBlockState(pos, newState); + return; + } + + // Dye all adjacent + for (Direction d : Iterate.directions) { + if (d.getAxis() == state.get(FACING) + .getAxis()) + continue; + BlockPos offset = pos.offset(d); + BlockState adjacentState = world.getBlockState(offset); + Block block = adjacentState.getBlock(); + if (!(block instanceof SailBlock) || ((SailBlock) block).frame) + continue; + if (state == adjacentState) + continue; + world.setBlockState(offset, newState); + return; + } + + // Dye all the things + List frontier = new ArrayList<>(); + frontier.add(pos); + Set visited = new HashSet<>(); + int timeout = 100; + while (!frontier.isEmpty()) { + if (timeout-- < 0) + break; + + BlockPos currentPos = frontier.remove(0); + visited.add(currentPos); + + for (Direction d : Iterate.directions) { + if (d.getAxis() == state.get(FACING) + .getAxis()) + continue; + BlockPos offset = currentPos.offset(d); + if (visited.contains(offset)) + continue; + BlockState adjacentState = world.getBlockState(offset); + Block block = adjacentState.getBlock(); + if (!(block instanceof SailBlock) || ((SailBlock) block).frame) + continue; + if (state != adjacentState) + world.setBlockState(offset, newState); + frontier.add(offset); + visited.add(offset); + } + } + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return (frame ? AllShapes.SAIL_FRAME : AllShapes.SAIL).get(state.get(FACING)); + } + + @Override + public VoxelShape getCollisionShape(BlockState state, IBlockReader p_220071_2_, BlockPos p_220071_3_, + ISelectionContext p_220071_4_) { + if (frame) + return AllShapes.SAIL_FRAME_COLLISION.get(state.get(FACING)); + return getShape(state, p_220071_2_, p_220071_3_, p_220071_4_); + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + ItemStack pickBlock = super.getPickBlock(state, target, world, pos, player); + if (pickBlock.isEmpty()) + return AllBlocks.SAIL.get().getPickBlock(state, target, world, pos, player); + return pickBlock; + } + + public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { + if (frame) + super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); + super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, 0); + } + + public void onLanded(IBlockReader p_176216_1_, Entity p_176216_2_) { + if (frame || p_176216_2_.bypassesLandingEffects()) { + super.onLanded(p_176216_1_, p_176216_2_); + } else { + this.bounce(p_176216_2_); + } + } + + private void bounce(Entity p_226860_1_) { + Vec3d vec3d = p_226860_1_.getMotion(); + if (vec3d.y < 0.0D) { + double d0 = p_226860_1_ instanceof LivingEntity ? 1.0D : 0.8D; + p_226860_1_.setMotion(vec3d.x, -vec3d.y * (double) 0.26F * d0, vec3d.z); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlockPlacementHelper.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlockPlacementHelper.java new file mode 100644 index 000000000..462b8bdef --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlockPlacementHelper.java @@ -0,0 +1,101 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.bearing; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class SailBlockPlacementHelper { + + @OnlyIn(Dist.CLIENT) + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + RayTraceResult objectMouseOver = mc.objectMouseOver; + ClientWorld world = mc.world; + ClientPlayerEntity player = mc.player; + if (!(objectMouseOver instanceof BlockRayTraceResult)) + return; + BlockRayTraceResult ray = (BlockRayTraceResult) objectMouseOver; + if (!isHoldingSail(player)) + return; + BlockPos pos = ray.getPos(); + BlockState blockState = world.getBlockState(pos); + if (!(blockState.getBlock() instanceof SailBlock)) + return; + + Direction sailFacing = blockState.get(SailBlock.FACING); + Direction offset = getPlacementOffset(world, sailFacing, pos, ray.getHitVec()); + if (offset == null) + return; + + Vec3d centerOf = VecHelper.getCenterOf(pos); + Vec3d offsetVec = new Vec3d(offset.getDirectionVec()); + + if (!world.getBlockState(pos.offset(offset)) + .getMaterial() + .isReplaceable()) + return; + + for (Direction caretDirection : Iterate.directions) { + if (caretDirection.getAxis() == offset.getAxis()) + continue; + if (caretDirection.getAxis() == sailFacing.getAxis()) + continue; + + Vec3d otherOffset = new Vec3d(caretDirection.getDirectionVec()).scale(.25f); + Vec3d start = offsetVec.scale(.75f) + .add(otherOffset); + Vec3d target = centerOf.add(offsetVec); + CreateClient.outliner.showLine("sailHelp" + caretDirection, centerOf.add(start), target) + .lineWidth(1 / 16f); + } + + return; + } + + public static boolean isHoldingSail(PlayerEntity player) { + for (Hand hand : Hand.values()) { + ItemStack heldItem = player.getHeldItem(hand); + if (AllBlocks.SAIL.isIn(heldItem) || AllBlocks.SAIL_FRAME.isIn(heldItem)) + return true; + } + return false; + } + + public static Direction getPlacementOffset(World world, Direction sailDirection, BlockPos pos, Vec3d hit) { + Direction argMin = null; + float min = Float.MAX_VALUE; + Vec3d diffFromCentre = hit.subtract(VecHelper.getCenterOf(pos)); + for (Direction side : Iterate.directions) { + if (side.getAxis() == sailDirection.getAxis()) + continue; + if (!world.getBlockState(pos.offset(side)) + .getMaterial() + .isReplaceable()) + continue; + float distance = (float) new Vec3d(side.getDirectionVec()).distanceTo(diffFromCentre); + if (distance > min) + continue; + min = distance; + argMin = side; + } + return argMin; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java new file mode 100644 index 000000000..0f5bb749f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingBlock.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.bearing; + +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public class WindmillBearingBlock extends BearingBlock implements ITE { + + public WindmillBearingBlock(Properties properties) { + super(properties); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.WINDMILL_BEARING.create(); + } + + @Override + public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + BlockRayTraceResult hit) { + if (!player.isAllowEdit()) + return ActionResultType.FAIL; + if (player.isSneaking()) + return ActionResultType.FAIL; + if (player.getHeldItem(handIn) + .isEmpty()) { + if (worldIn.isRemote) + return ActionResultType.SUCCESS; + withTileEntityDo(worldIn, pos, te -> { + if (te.running) { + te.disassemble(); + return; + } + te.assembleNextTick = true; + }); + return ActionResultType.SUCCESS; + } + return ActionResultType.PASS; + } + + @Override + public Class getTileEntityClass() { + return WindmillBearingTileEntity.class; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java new file mode 100644 index 000000000..2fef5b324 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/WindmillBearingTileEntity.java @@ -0,0 +1,111 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.bearing; + +import java.util.List; + +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.math.MathHelper; + +public class WindmillBearingTileEntity extends MechanicalBearingTileEntity { + + protected ScrollOptionBehaviour movementDirection; + protected float lastGeneratedSpeed; + + public WindmillBearingTileEntity(TileEntityType type) { + super(type); + } + + @Override + public void updateGeneratedRotation() { + super.updateGeneratedRotation(); + lastGeneratedSpeed = getGeneratedSpeed(); + } + + @Override + public float getGeneratedSpeed() { + if (!running) + return 0; + if (movedContraption == null) + return lastGeneratedSpeed; + int sails = ((BearingContraption) movedContraption.getContraption()).getSailBlocks() / 8; + return MathHelper.clamp(sails, 1, 16) * getAngleSpeedDirection(); + } + + @Override + protected boolean isWindmill() { + return true; + } + + protected float getAngleSpeedDirection() { + RotationDirection rotationDirection = RotationDirection.values()[movementDirection.getValue()]; + return (rotationDirection == RotationDirection.CLOCKWISE ? 1 : -1); + } + + @Override + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putFloat("LastGenerated", lastGeneratedSpeed); + super.write(compound, clientPacket); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + lastGeneratedSpeed = compound.getFloat("LastGenerated"); + super.read(compound, clientPacket); + } + + @Override + public void addBehaviours(List behaviours) { + super.addBehaviours(behaviours); + behaviours.remove(movementMode); + movementDirection = new ScrollOptionBehaviour<>(RotationDirection.class, + Lang.translate("contraptions.windmill.rotation_direction"), this, getMovementModeSlot()); + movementDirection.requiresWrench(); + movementDirection.withCallback($ -> onDirectionChanged()); + behaviours.add(movementDirection); + } + + private void onDirectionChanged() { + if (!running) + return; + if (!world.isRemote) + updateGeneratedRotation(); + } + + @Override + public boolean isWoodenTop() { + return true; + } + + static enum RotationDirection implements INamedIconOptions { + + CLOCKWISE(AllIcons.I_REFRESH), COUNTER_CLOCKWISE(AllIcons.I_ROTATE_CCW), + + ; + + private String translationKey; + private AllIcons icon; + + private RotationDirection(AllIcons icon) { + this.icon = icon; + translationKey = "generic." + Lang.asId(name()); + } + + @Override + public AllIcons getIcon() { + return icon; + } + + @Override + public String getTranslationKey() { + return translationKey; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java index e6b030e59..a18ffc858 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/GenericItemFilling.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.foundation.fluid.FluidHelper; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.potion.PotionUtils; @@ -43,8 +44,12 @@ public class GenericItemFilling { IFluidHandlerItem tank = capability.orElse(null); if (tank == null) return -1; - if (tank instanceof FluidBucketWrapper) + if (tank instanceof FluidBucketWrapper) { + Item filledBucket = availableFluid.getFluid().getFilledBucket(); + if (filledBucket == null || filledBucket == Items.AIR) + return -1; return 1000; + } int filled = tank.fill(availableFluid, FluidAction.SIMULATE); return filled == 0 ? -1 : filled; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 6925f7c67..2189fdb7e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -84,7 +84,11 @@ public class BasinBlock extends Block implements ITE, IWrenchab return ActionResultType.SUCCESS; if (tryFillItemFromBasin(worldIn, player, handIn, heldItem, te)) return ActionResultType.SUCCESS; - return ActionResultType.SUCCESS; + + if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem) + || GenericItemFilling.canItemBeFilled(worldIn, heldItem)) + return ActionResultType.SUCCESS; + return ActionResultType.PASS; } IItemHandlerModifiable inv = te.itemCapability.orElse(new ItemStackHandler(1)); @@ -149,18 +153,18 @@ public class BasinBlock extends Block implements ITE, IWrenchab continue; if (requiredAmountForItem > fluid.getAmount()) continue; - + if (world.isRemote) return true; if (player.isCreative()) heldItem = heldItem.copy(); ItemStack out = GenericItemFilling.fillItem(world, requiredAmountForItem, heldItem, fluid.copy()); - + FluidStack copy = fluid.copy(); copy.setAmount(requiredAmountForItem); tank.drain(copy, FluidAction.EXECUTE); - + if (!player.isCreative()) player.inventory.placeItemBackInInventory(world, out); te.notifyUpdate(); @@ -195,6 +199,11 @@ public class BasinBlock extends Block implements ITE, IWrenchab }); } + @Override + public VoxelShape getRaytraceShape(BlockState p_199600_1_, IBlockReader p_199600_2_, BlockPos p_199600_3_) { + return AllShapes.BASIN_RAYTRACE_SHAPE; + } + @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { return AllShapes.BASIN_BLOCK_SHAPE; diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index b14fb55de..4616710a1 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -8,6 +8,7 @@ import com.simibubi.create.Create; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlockPlacementHelper; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisRangeDisplay; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandlerClient; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingPhysics; @@ -93,6 +94,7 @@ public class ClientEvents { ExtendoGripRenderHandler.tick(); // CollisionDebugger.tick(); ArmInteractionPointHandler.tick(); + SailBlockPlacementHelper.tick(); CreateClient.outliner.tickOutlines(); } diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index e78fed99e..1b995a0e1 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -17,7 +17,7 @@ public class AllCommands { //Comment out for release .then(ClearBufferCacheCommand.register()) .then(ChunkUtilCommand.register()) - // .then(KillTPSCommand.register()) +// .then(KillTPSCommand.register()) ); } } diff --git a/src/main/java/com/simibubi/create/foundation/config/CClient.java b/src/main/java/com/simibubi/create/foundation/config/CClient.java index 0bd1eb895..b4aabef30 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -13,7 +13,7 @@ public class CClient extends ConfigBase { public ConfigBool rainbowDebug = b(true, "enableRainbowDebug", "Show colourful debug information while the F3-Menu is open."); - public ConfigInt overlayOffsetX = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); + public ConfigInt overlayOffsetX = i(20, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetX", "Offset the overlay from goggle- and hover- information by this many pixels on the X axis; Use /create overlay"); public ConfigInt overlayOffsetY = i(0, Integer.MIN_VALUE, Integer.MAX_VALUE, "overlayOffsetY", "Offset the overlay from goggle- and hover- information by this many pixels on the Y axis; Use /create overlay"); @Override diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 8db65d201..a3e2e4473 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -112,6 +112,7 @@ public class BuilderTransformers { String type, ResourceLocation particleTexture) { return b -> b.initialProperties(SharedProperties::stone) .addLayer(() -> RenderType::getCutoutMipped) + .properties(Block.Properties::nonOpaque) .blockstate((c, p) -> p.getVariantBuilder(c.get()) .forAllStates(state -> { String id = "block/" + type + "_tunnel"; @@ -151,19 +152,23 @@ public class BuilderTransformers { } public static NonNullUnaryOperator> bearing(String prefix, - String backTexture) { + String backTexture, boolean woodenTop) { ResourceLocation baseBlockModelLocation = Create.asResource("block/bearing/block"); ResourceLocation baseItemModelLocation = Create.asResource("block/bearing/item"); - ResourceLocation sideTextureLocation = Create.asResource("block/" + prefix + "_bearing_side"); + ResourceLocation topTextureLocation = Create.asResource("block/bearing_top" + (woodenTop ? "_wooden" : "")); + ResourceLocation nookTextureLocation = Create.asResource("block/" + (woodenTop ? "andesite" : "brass") + "_casing"); + ResourceLocation sideTextureLocation = Create.asResource("block/" + prefix + "_bearing_side"); ResourceLocation backTextureLocation = Create.asResource("block/" + backTexture); return b -> b.initialProperties(SharedProperties::stone) .properties(p -> p.nonOpaque()) .blockstate((c, p) -> p.directionalBlock(c.get(), p.models() .withExistingParent(c.getName(), baseBlockModelLocation) .texture("side", sideTextureLocation) + .texture("nook", nookTextureLocation) .texture("back", backTextureLocation))) .item() .model((c, p) -> p.withExistingParent(c.getName(), baseItemModelLocation) + .texture("top", topTextureLocation) .texture("side", sideTextureLocation) .texture("back", backTextureLocation)) .build(); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 89a7b4710..63bea93d4 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -397,6 +397,14 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("SCS") .patternLine(" R ")), + WINDMILL_BEARING = create(AllBlocks.WINDMILL_BEARING).unlockedBy(I::andesite) + .viaShaped(b -> b.key('I', I.shaft()) + .key('B', AllBlocks.TURNTABLE.get()) + .key('C', I.stone()) + .patternLine(" B ") + .patternLine(" C ") + .patternLine(" I ")), + MECHANICAL_BEARING = create(AllBlocks.MECHANICAL_BEARING).unlockedBy(I::andesiteCasing) .viaShaped(b -> b.key('I', I.shaft()) .key('S', I.andesite()) @@ -527,6 +535,22 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("SCS") .patternLine(" B ")), + SAIL_FRAME = create(AllBlocks.SAIL_FRAME).returns(8) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('A', I.andesite()) + .key('S', Tags.Items.RODS_WOODEN) + .patternLine("SSS") + .patternLine("SAS") + .patternLine("SSS")), + + SAIL = create(AllBlocks.SAIL).returns(8) + .unlockedBy(AllBlocks.SAIL_FRAME::get) + .viaShaped(b -> b.key('F', AllBlocks.SAIL_FRAME.get()) + .key('W', ItemTags.WOOL) + .patternLine("FFF") + .patternLine("FWF") + .patternLine("FFF")), + RADIAL_CHASIS = create(AllBlocks.RADIAL_CHASSIS).returns(3) .unlockedBy(I::andesite) .viaShaped(b -> b.key('P', I.andesite()) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index d542bfb31..c1279fce0 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -100,6 +100,10 @@ public class AllIcons { I_PAUSE = next(), I_STOP = next(), I_PLACEMENT_SETTINGS = next(), + I_ROTATE_CCW = next(), + I_HOUR_HAND_FIRST = next(), + I_MINUTE_HAND_FIRST = next(), + I_HOUR_HAND_FIRST_24 = next(), I_PATTERN_SOLID = newRow(), I_PATTERN_CHECKERED = next(), diff --git a/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java b/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java index c633efcbd..24595ff0a 100644 --- a/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java +++ b/src/main/java/com/simibubi/create/foundation/item/CreateItemGroupBase.java @@ -56,8 +56,9 @@ public abstract class CreateItemGroupBase extends ItemGroup { Item item = entry.get(); if (item instanceof BlockItem) continue; - IBakedModel model = itemRenderer.getItemModelWithOverrides(new ItemStack(item), world, null); - if (model.isGui3d() != specialItems) + ItemStack stack = new ItemStack(item); + IBakedModel model = itemRenderer.getItemModelWithOverrides(stack, world, null); + if ((model.isGui3d() && AllSections.of(stack) != AllSections.CURIOSITIES) != specialItems) continue; item.fillItemGroup(this, items); } diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index c9ecf6c6e..18eb79e92 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -53,6 +53,8 @@ "create.generic.unit.stress": "su", "create.generic.unit.degrees": "\u00B0", "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "Clockwise", + "create.generic.counter_clockwise": "Counter-Clockwise", "create.action.scroll": "Scroll", "create.action.confirm": "Confirm", @@ -147,6 +149,12 @@ "create.contraptions.cart_movement_mode.rotate_paused": "Pause actors while rotating", "create.contraptions.cart_movement_mode.rotation_locked": "Lock rotation", + "create.contraptions.windmill.rotation_direction": "Rotation Direction", + "create.contraptions.clockwork.clock_hands": "Clock Hands", + "create.contraptions.clockwork.hour_first": "Hour hand first", + "create.contraptions.clockwork.minute_first": "Minute hand first", + "create.contraptions.clockwork.hour_first_24": "24-Hour hand first", + "create.logistics.filter": "Filter", "create.logistics.recipe_filter": "Recipe Filter", "create.logistics.fluid_filter": "Fluid Filter", diff --git a/src/main/resources/assets/create/models/block/bearing/block.json b/src/main/resources/assets/create/models/block/bearing/block.json index 4671586a2..5fe9ff4cb 100644 --- a/src/main/resources/assets/create/models/block/bearing/block.json +++ b/src/main/resources/assets/create/models/block/bearing/block.json @@ -3,7 +3,7 @@ "particle": "#side", "gearbox": "#back", "bearing_side": "#side", - "brass_casing": "create:block/brass_casing" + "brass_casing": "#nook" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/bearing/item.json b/src/main/resources/assets/create/models/block/bearing/item.json index 88c82ddb0..c5b343fbc 100644 --- a/src/main/resources/assets/create/models/block/bearing/item.json +++ b/src/main/resources/assets/create/models/block/bearing/item.json @@ -3,7 +3,7 @@ "parent": "block/block", "textures": { "particle": "#side", - "bearing_top": "create:block/bearing_top", + "bearing_top": "#top", "gearbox": "#back", "bearing_side": "#side" }, diff --git a/src/main/resources/assets/create/models/block/bearing/top_wooden.json b/src/main/resources/assets/create/models/block/bearing/top_wooden.json new file mode 100644 index 000000000..05a0397c7 --- /dev/null +++ b/src/main/resources/assets/create/models/block/bearing/top_wooden.json @@ -0,0 +1,10 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:block/bearing/top", + "textures": { + "bearing_top": "create:block/bearing_top_wooden", + "particle": "create:block/windmill_bearing_side", + "bearing_side": "create:block/windmill_bearing_side", + "brass_casing": "create:block/andesite_casing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sail_frame.json b/src/main/resources/assets/create/models/block/sail_frame.json new file mode 100644 index 000000000..da4b090fe --- /dev/null +++ b/src/main/resources/assets/create/models/block/sail_frame.json @@ -0,0 +1,143 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "1": "create:block/sail/frame", + "particle": "#1" + }, + "elements": [ + { + "from": [0, 5, 13], + "to": [3, 9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, + "faces": { + "north": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "east": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "south": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "west": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#1"}, + "down": {"uv": [13, 13, 16, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 5, 0], + "to": [3, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, -5]}, + "faces": { + "north": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "east": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "south": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "west": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#1"}, + "down": {"uv": [13, 0, 16, 3], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 5, 13], + "to": [16, 9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [21, 14, 8]}, + "faces": { + "north": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "east": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "south": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "west": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#1"}, + "down": {"uv": [0, 13, 3, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 5, 0], + "to": [16, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [21, 14, -5]}, + "faces": { + "north": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "east": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "south": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "west": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#1"}, + "down": {"uv": [0, 0, 3, 3], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 14], + "to": [13, 9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 15, 8]}, + "faces": { + "north": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "east": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#1"}, + "south": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "west": {"uv": [0, 0, 3, 2], "rotation": 270, "texture": "#1"}, + "up": {"uv": [3, 14, 13, 16], "texture": "#1"}, + "down": {"uv": [3, 14, 13, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 6, 3], + "to": [2, 9, 13], + "faces": { + "north": {"uv": [0, 0, 3, 2], "rotation": 270, "texture": "#1"}, + "east": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#1"}, + "west": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "up": {"uv": [0, 3, 2, 13], "texture": "#1"}, + "down": {"uv": [14, 3, 16, 13], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 0], + "to": [13, 9, 2], + "faces": { + "north": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "east": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#1"}, + "south": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "west": {"uv": [0, 0, 3, 2], "rotation": 270, "texture": "#1"}, + "up": {"uv": [3, 0, 13, 2], "texture": "#1"}, + "down": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [14, 6, 3], + "to": [16, 9, 13], + "faces": { + "north": {"uv": [0, 0, 3, 2], "rotation": 270, "texture": "#1"}, + "east": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "south": {"uv": [0, 0, 3, 2], "rotation": 90, "texture": "#1"}, + "west": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "up": {"uv": [14, 3, 16, 13], "texture": "#1"}, + "down": {"uv": [0, 3, 2, 13], "rotation": 180, "texture": "#1"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -1.5], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/seat.json b/src/main/resources/assets/create/models/block/seat.json index 2f23ff9e9..7c162fe22 100644 --- a/src/main/resources/assets/create/models/block/seat.json +++ b/src/main/resources/assets/create/models/block/seat.json @@ -20,5 +20,37 @@ "down": {"uv": [0, 0, 16, 16], "texture": "#0"} } } - ] + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 2, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/white_sail.json b/src/main/resources/assets/create/models/block/white_sail.json new file mode 100644 index 000000000..413810a92 --- /dev/null +++ b/src/main/resources/assets/create/models/block/white_sail.json @@ -0,0 +1,141 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "create:block/sail/canvas_white", + "1": "create:block/sail/frame", + "particle": "#0" + }, + "elements": [ + { + "from": [0, 5, 13], + "to": [3, 9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, 8]}, + "faces": { + "north": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "east": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "south": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "west": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "down": {"uv": [13, 13, 16, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 5, 0], + "to": [3, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 14, -5]}, + "faces": { + "north": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "east": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "south": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "west": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "down": {"uv": [13, 0, 16, 3], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 5, 13], + "to": [16, 9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [21, 14, 8]}, + "faces": { + "north": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "east": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "south": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "west": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "down": {"uv": [0, 13, 3, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [13, 5, 0], + "to": [16, 9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [21, 14, -5]}, + "faces": { + "north": {"uv": [8, 9, 11, 13], "texture": "#1"}, + "east": {"uv": [11, 9, 14, 13], "texture": "#1"}, + "south": {"uv": [5, 9, 8, 13], "texture": "#1"}, + "west": {"uv": [2, 9, 5, 13], "texture": "#1"}, + "down": {"uv": [0, 0, 3, 3], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 14], + "to": [13, 9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 15, 8]}, + "faces": { + "north": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "south": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "down": {"uv": [3, 14, 13, 16], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [0, 6, 3], + "to": [2, 9, 13], + "faces": { + "east": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "west": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "down": {"uv": [14, 3, 16, 13], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [3, 6, 0], + "to": [13, 9, 2], + "faces": { + "north": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "south": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "down": {"uv": [3, 0, 13, 2], "rotation": 180, "texture": "#1"} + } + }, + { + "from": [14, 6, 3], + "to": [16, 9, 13], + "faces": { + "east": {"uv": [3, 3, 13, 6], "texture": "#1"}, + "west": {"uv": [3, 6, 13, 9], "texture": "#1"}, + "down": {"uv": [0, 3, 2, 13], "rotation": 180, "texture": "#1"} + } + }, + { + "name": "Sail", + "from": [0, 9, 0], + "to": [16, 10, 16], + "faces": { + "north": {"uv": [0, 0, 16, 1], "rotation": 180, "texture": "#0"}, + "east": {"uv": [15, 0, 16, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [0, 15, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [16, 16, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 16, 16], "rotation": 180, "texture": "#0"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -1.25], + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/bearing_top_wooden.png b/src/main/resources/assets/create/textures/block/bearing_top_wooden.png new file mode 100644 index 0000000000000000000000000000000000000000..f9977a98dbe41cc77c7848a5761ac406fa2bc023 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lgr0X`wFD_5?Z+TU-g$ZsIWXRRjatRvzdq~Y(P7;GUG(>$X`w#tyJuaUv`naxLqW9(A|Ham8`rKJ=_;7vT=dBRluPSyk5$HVzPgg&ebxsLQ E0IeLvssI20 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_black.png b/src/main/resources/assets/create/textures/block/sail/canvas_black.png new file mode 100644 index 0000000000000000000000000000000000000000..ad17781fa04c9883ddcbd0963f6796f631c686a4 GIT binary patch literal 459 zcmV;+0W|)JP)w3>PE_;GOcE0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOMM*?KR5;7Ul0QqsP!z>~ktEO6%bV(!hIxI3-Q%pDGspyY@kCN(xUNGqo8t*l_KNa^Aezl_U1!;siVqD}^1re2oofI9002ovPDHLkV1m1v Bzh(dc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_blue.png b/src/main/resources/assets/create/textures/block/sail/canvas_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f58f9703014a90fbd822fd55b5e6d9dbbacccbcc GIT binary patch literal 485 zcmVw3>PO5*xWe@0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOUr9tkR5;7Uk}*reP!xr~q}f6`v=J(8=x7m2v7(b8I2F4H zoy0%mU+_nC5{io;6a>Mwg1BUrCbXcbkVm9T-*ZTlrrPSz!2_2A_uhBkeeWEtbM>nD z2mv@YyWBtR(>`*!dpjeG*47QTk2Ox310JFa0F>ur@DZXsAArD~pqm!naEN;Mmj-y# zA-Z`$5KPjVj08r~AS1!^XczJe&LUgWw-SH!Wl&$nq*^Rvsn7l;y}pZy&kT?H+{jyVe~BP$K^9+1RIU_h_FAw9e&= zQl9_o&FeOikw9ld{Qm%>wRM9x9mX=Ql5YhP87q6v<}w;5%>h9W8%a|BQ%23oFB>V5 zF|l*5RAx5z$(71K*3Q;e%Gjv(Q6fw^8{ccG3Ww3>PFG6iG+T0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOh)G02R5;7clg(<|Koo^P+Zr=i1D0(yj!Q(-ZUW6Bm~M)f zg}y}}rklP^pQGClN{mAw1XNID97hf_@(_u%i&j(FX-ep-2QC-x-yF`J+xYzH!*{bT z0a$hSS)82^jVH8|Q|h=I9TFdZAv`#uySfA*&2l`mE=jW-08=heQt&N~@pZm2z?3mc z3a+o0*k3tq3z}7dwgu_=Y{S>Bo~y%Kb@wsll6f*?r{|-jK#c;nQN@NYpOI!cjW8m7 z(Z^eyouH&}&Ds_yDfkn7DKNHR7<4fDis|``W;C8))GqTI^Yf)gngNV0oOnj<^5)%p zymoSmuXA>KK2Jr(AU=+Ni}&pjx9Zg=6sg?F6s8y2R?7SEB%3D;Nfy2egMl$9bc# zSS+^I*a#zxEu630cFu{IX1P04~}UsinvHJ27|tf&2J1p04s;@`gIVS Qb^rhX07*qoM6N<$f*hgW+5i9m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_cyan.png b/src/main/resources/assets/create/textures/block/sail/canvas_cyan.png new file mode 100644 index 0000000000000000000000000000000000000000..d4828a95e6eacd8f8ff287adc0ce4daca6be4852 GIT binary patch literal 475 zcmV<10VMv3P)w3>POSU}2mF0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbORY^oaR5;7UlFMqsP!NW{qY=Dh5tCAaXqI*7!Urh$47${( z(_MAfZJ|%#!kwEek{~4*QAndGa=M5K@zNVz^oPU1%$%8j{u%N3^en|b0-(E?G8P(x z(t(lIB#Zuf&Tw0xC)Z4B?bx~TQN%uijSoN&tPoZm&zXU!o)z$17h$ys92+WezKlYY zBtb?YFR0`)Hj8X5pYbc*#grge#R+%!h_XuFQn^Ip%RiXN)f=6qjbZ30W1%6eI=LuB zlvU)(-b7J_U5L<4Udt*+$3_{H4tUNire>+1e+JmaVw3>PCY@Y(EB0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOSxH1eR5;7clFds3Q5400hA@r`KjuLY&MeyqwsE0CQ5#*< zMqIR!qLqs_{Z(xvS{ChsXlsAMB!cjC#)WU*$`&%u(d+}9h`bc^?B129mUn6k#9%kP1Bq6OFc_0BIEIr*YP)+Svmkv~agY)op8Mnr4wh}RYnNC@-1Cb2Oed1# zs*4Z~sgvgE+_G)7QY3j3tV|Xi%?yu*19rOY2KBNa3>LVo835CXq+S+WU!ARb z@YC?7OSDq#uqFP%f@aNIG4U^mP3*QC+sByhv<{GRym%y>Ut_c~+2tc0?Jr}DUo%$} zOed0DQG7W&scnq$xay*#nc-xuYsSR*iL_D(;V>Ewa6QlT;&MHY(Qtqej_E~_;uEFo V>%r3bN;3ce002ovPDHLkV1hjs$+-Xk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_green.png b/src/main/resources/assets/create/textures/block/sail/canvas_green.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6a29a9327508b20c60f22e6b2bc7c9181ce202 GIT binary patch literal 449 zcmV;y0Y3hTP)w3>PLDxErwS0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOJ4r-AR5;7UlQB-iKoCXWIF=lxNMS3Tm(Zo4NeZf@2Ck6{ z&?IG2g$ltHI1SX$Qc>7lWEU%0!iBvQPS!Sr2ni&SR%12JFFO7Io z$!YLGctBorxh-(lqZx4&RSE{3?~BLLCF zc8DYO2R1I%ge0jJiQOU{wb82;1ZRG2quuSkV06WwWw&yNY@GLokk{NiUvk!k{YT0T rLEuwv3qqxAY=1(fD7OVc;J4x*Fv`R>V=B*T00000NkvXXu0mjflKr$+ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_light_blue.png b/src/main/resources/assets/create/textures/block/sail/canvas_light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..4e751103ce2217c1be69d04906cc18b8757616b0 GIT binary patch literal 488 zcmVP)w3>PQ@to>Au0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOVo5|nR5;7Uk}+!nK@f#M!-7XnxZuUucu8SlWswvnNFaqp zigc;+2U6r$?u@?F~w1B9O~2Oim0nH&9s z*!@d$G3$H3-n?y-U@~Wq9r6DIM4?lo=QvA!H^{dMp^O>J+FeFb9My5{ZzEy+DWgbe zt40cC4DGC?4dlQ>OB+AdR%;t&%-K}}Uq)Gt^;)DtXrf>;$261p-60vvinuT`mWAIP eVwy>XmwW*%-}R-YP&g|90000w3>PC2%eTy%0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOWJyFpR5;7clTT~oFc8ImF^UvcwN2yX5E^4x*wcRA-OGNi zJrx#$Qxb68;3R^~B(yyQJLz8vd+7u5;LT|CG#d4O{r>ZK5CI@M&RI2c5?ZRj1BjItqS)mWS_NQ~f|L*&G7!P)_; zd*V1n)$#AHBFZOyG|brSHURH#22kAtu-!IjnDO&Rh6#F&_0g+4e}vXSxey}$6JMZ! zx9ew3{0!PA=94~Axj0~bL2{LJ1N9!P9du2!zTod|O*BfibMVm&w9jbmpmXs3W`KDx zQ>>2}`_t)dLL8^BY{zlhv8rR$T>J%q-f@Yl>-aOVDC`;M1&07*qoM6N<$f?zn-4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_lime.png b/src/main/resources/assets/create/textures/block/sail/canvas_lime.png new file mode 100644 index 0000000000000000000000000000000000000000..1585e226d959ce8efbb37fa328aa6bde3d7681cb GIT binary patch literal 479 zcmV<50U-W~P)w3>PK`LKKaU0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOSxH1eR5;7Ul0R$0P!z>~c?6i(u7_*kM2tz*iS^+li9BC@#Gu z6X?Z(BooB#I-&DQ-jpE&b#uBrZLoMV0d(CMq2vR|FWYMxMw1>C8GHW?W zCaCf;IEKb%t4fa7649OcxC4hgz1$7!#ASfZb~o%G)o=$6y@iAJ^xjwV^!J}nb&_NP z!I}8~2Xu4nrBM4HB=E&ww%JXB?I}?v+zeowoKVx(Zt?Zy>*S}*d*4b+) zf>gt6sDrkv-q9GFBa6*em0Yc#UYSC%L`f#FZHss!57UV V-I&TED7pXu002ovPDHLkV1fZF$mIY4 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_magenta.png b/src/main/resources/assets/create/textures/block/sail/canvas_magenta.png new file mode 100644 index 0000000000000000000000000000000000000000..519227c885b1c0f37c3ab31a95979fa00aa01f82 GIT binary patch literal 480 zcmV<60U!Q}P)w3>PRn^Z49`0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOT1iAfR5;7cl08eqP#A@umc*uoNNJWJ21KDthvMMiV8N|R z2Nx$N|C7I==%UcYxr;*zwS$X}ap-cxC4uxN8S0>kNewEvc;Is2z8}1tb87PPZmp6S zfSdlD!PLPW`ivgB6frq|=IFk|bl`EmI0QgO0h&r;WE21(gpZ*g@alQU$Sy5-^*l~= z8zKC>U!@7P<;C?{Mgb~KkgJe()6BVuV$I&R@&(#We~u77r?Y+9O%p@k!qzP|k^Swp zc92oXZEt~Pb*Md#uGWUWg-R2OTm?gKpwc+!Wgw`#L!WWiMXth+rt0DMlj9HZLdIQ} zm$S62!FR(|m#8$M&L8m)7EF$xOCtUTnTYPt|GSOabl`mk3G+uA4ZTqgQf6Zo&34N~ zMj`E%`Q_|ltw3>PH|7l@+q0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOWJyFpR5;7cl08eqU=)R)+9ajXSV)Gp(2Ool9ZKmaiqb)J z=py3cpYaDc7rMGQ=p+;eogAE9x(F2vLIN>qO1`LrO`6s!f{O<(2kzm$-1pp*v(EP> zksAPTA+|Vpx}o3baA@C>#Z_sC-N#F=H`^SA4*>XvhY+~|zTp92$`*M=;$=9*_q@3Q zFYiP0iiBxesTMl{xwo^eiEntsPJnNWDO8FnXOY$9jZ!*5xDZ>Ivc>V>jzXnKUXhR$ ziA5y6_3A4A>xf>tiKeUMo=@wOydn`h0a;!KVNE1*!<4;&%}T$~p)1$%jWNKtj{zb# z{QS=Ah^}1ce*a|NgP$HR+az`ZR`?_S!GNpM&YX$AL1JRR(fRush3m~Wra2ALFU}~e ziL)SWtFtpE(JV}pR;aFiSv#vOJ!7xjByz))v$d$DCMF?@od8W!@dh?ET~B*S)pQ+i gV54bj+Kb$f50IwzKY%`y#sB~S07*qoM6N<$g5wU+iU0rr literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/canvas_pink.png b/src/main/resources/assets/create/textures/block/sail/canvas_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..ae89cc05bf5919998c70dacfcbb9ce222d1275d4 GIT binary patch literal 502 zcmVw3>PRIR`O}>0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOa7jc#R5;7UlQB!fP!xr~N+Kpu2uZ=Efi87WFkKwF=qTua z@}Ic(546xF(5_wTpo1=jWRW(np~3gWht#2_O>3)yg9jc5?z!B1-#hn}?puSoeo+AQ zMTa13@Ob#d*}(-x3|@O2J=eJ_4>@OR zZGSGu({DTPnnX**9)HCD7cd5|J>oQ?nFU+z+lJi6s_#?k-L&RK`+j3%&a)`SxGN7y zlEor{_oI!bZLJom=B{ka6YPqMoCxfS`(^B+w$;Y)EksMTw3>PU6%U2n40000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOXGugsR5;7clCf*TU=YQBriqj&g zTIc?0{R4zh-ao1mAPLJ+u_LproZWtiz9 z-B?BRqy80|cvK2mfvudqwr%C4EYBv3XlISbbr*@kl(*k*E;Z2?FBMrS-HGd j;H+F`wwz#D#Z3GiUmM>n2s2rZ00000NkvXXu0mjfw3>PFZznFTI0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOM@d9MR5;7Uk}*reP!xr~G><^hED2pgU)K&rTofx(=ve69 zv2^U8@P9apIJp!D!BOxRbnI%%TO?URh_nfHNRvL>S_B0TJTBaG?&Z9Dukm|{qB{}2EmAy7lu?JyHLId*Ai_bHI0#XbDV`;;O-g}|B6oHyPz$K^ zThv?!w3>F6fQ7vcq0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbOM@d9MR4C82Q9VloK@gpI7q}Gy**kJEngc-uEd)s+M8saP z69jvImQ4x~go6k{TNO1zg7^b$j*Na166Fpv3Q-ekmcS0e&I zcyd_X*m}6X+TPiR51ciQS1X&%>+{{c0{~D`+8R+w2>?P!=CDo_QA+4UQFWaOAxT7y zneNl0k`gucmCAEYY#NMMD$P=ZH9t4qZr%9BAkR5-ST2{#+F28n7JPp&9Mr>_c`fQCT|Ns<5nZ5WUB=MCxE={=}%3MRz=H(1My z1#|Qtb#(M-)Sukem8BVaoSn6QH7ZFGhcTsOJ*>SB#k;NacFtX;Bw3>PIQQdj7I`oXJF_#)&U-6nZ`T^7 z0O$@X+#bEqTQ<2oeJ6?ju+G)N6PipF}eESvrmzq`HF&QhMAUzM}IMI%A?sCO;9ybj3!@ zJX%hTY}Q7|hcm4+CL&NI{Z^z+Sg6<=qX|ZD*`z%vBc|cIel3Qu7!Wg$_Mpt8b+^8Q zKa00aA_9fMp7{R;ss6Ce*mXl1OS|nLqOnjc?oVT?GjAZBP)Ou=pfPPGgmnH*VUi&%(1QlQ9YZH&<*T+S*MS)o|O7)?U`uVMs>FAP20 UT~KbQ>i_@%07*qoM6N<$f;yeSk^lez literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sail/frame.png b/src/main/resources/assets/create/textures/block/sail/frame.png new file mode 100644 index 0000000000000000000000000000000000000000..89f2270acc8793eebe773bc68ae5c475713ac6a1 GIT binary patch literal 718 zcmV;<0x|uGP)w3>F*%VG{k=0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbPNJ&INR5;6RlTB;eKoEu>*-|XYQqYG<5RF5=2n0jPrEPi% zA@>&g3kv-${RzF6o_gw`*FqtOUYgR23AiDlbxm9_Nh8VFv9yk5)I%&K3VkoTJ3I5v z%sac%r#CNCX88K2!iv#jSZT2BTmTToQ*^CNGg!bJx9D7XJY5=RA(Y}t1c0uUaa{+i zs-o#t{K1eYp5`Q)Ud5`axUQ4?1IQUu6i?Y|>`1D*ham)(y~|yc!w^+{gdqge_Q$+x zxp{8mx(-{79qG7rn9AqhP*(Su92^t~l+}GEzYjpz^8k(X55Kkg5XLqMDsH#d`{)K4>jGFQbAqL5KjbabtJ)BlVpgAjtt zxrfBb2zlGNAd070_Ab63&`!=cmn%$?vqDg2^W_SbZBuXmB$gxOOlbhuby(AuQKUMx z>#)#*GFPXbj!9xCw*i#0aok7NLbm@O`Xhn#5l}S zbyG#JA5dxr3pawy95u^8vy4La58su1|M`arKv&veSZN@=d;Ki+EGH+(9PgjAiDYX$ ziRh06rOuVdY3!jXI_|uAE9ksgu=#^wfux(P)4B4Hw--YoMAuBl-gBw8sv?9yvu(7j z0-zs;NUBO%2>g@xsX6}3=8}VaSK;H*ZPLAl0ZXZ`-Kc;qlL^oMyQ`2!h zlPI3v{zd@b59sv+;%JlyTU8aSs^&J|4+^9F2a?+aSu3j*D*ylh07*qoM6N<$f*w>p AEdT%j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/windmill_bearing_side.png b/src/main/resources/assets/create/textures/block/windmill_bearing_side.png new file mode 100644 index 0000000000000000000000000000000000000000..942e1dee83fdbb9d461852cc72f0d96cca6e5c1f GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LhP0G|-oZQHi>_4S!5@*BwU<>%*Hs|orWNd#L+MMg$isR-I>3VG^_J86r= zCB!GEB}c_Zb@unSb+p&iH#D`j)HgL%)>JmNx0O|v*SEA4l@(Rj)wi~{g@i{Wrl-fo z$F+5KSJc%_oIGj9?754VF6r)_(=}njidDO^a`Prkn%LUW<>Ka3TwWZ#)5iel9?k-f z$YKTtzWpG~Xu%q+0uEalo5p3$$E!1Sdqg~wBc<$z->;@x8k*ELvpFiVX<+<*< zS@y(BR?-RivWzAKWM(Nna8vvwQ3-n3!Xnxm_Nu07I|+<8{~-f!Mh z7pE;`rKf8Tqa WaP^P<-10yVFnGH9xvX+X*>C`Gsxrhwp)LuZ@>}K4|?2;{b`E^h1Gp7nA3Aua9^yb zp^I9Qi!5p-@tik2b{#=tFCR1NErK!EO$=!H;^& zJ9MpYTvV}^tIXa{F`drj{`%(Ix3&UO;o_nnCa?N=s3PxD1b25zRboh0a;29h>#cgg zU0Gew^zvm=oj0S8R@S7!A1hCz9))#pK6@Nf`bqzgiobb4U=c7%YA ztYA`wYJ3uB5JE)z;FkpEyDXZ zd+HX~U=IO#_98719jH@svb*6)I&%x77RHjMBD-jjc}JhAb+{X!!x_qu)f2lC=0Orgy8aO#0-12?&BDxd3cZ=ozd#YNE8 zHH6w9S4neoY6<^vZ6W#K92_o|C*yR;>>;XO?c4!zo#Bo{ykSY6U zE0!q_r|n8~Uu8lv9!ZI~5$bJjv_Je^a1GXF%CXw(w}3$IqV3_YX^H=HSN3J0;3fE?s<&%nV?2;#Y>22+b!MqmL_XK$(iDuufOX33jcaMOPRaoFNcs zd# zuS=O8YTa5?g73j$AB4h^oj%0NLp{)7BgT<$Nb}F|EAmuJt-BO~d>^N$3(g`FxS6PStfYh9QI->rzbn!bdr%BLp|x?0*X@#0 zIB=C!xS0<(bEv)idxn4Jg@A?@wqs@j+uyhv-~|H zhI5PV+pl5vv;|L(S>kw$6Lyo8iGCWm*vcDcX%XFjP%gx_HljR^bcN=Mg zxh2ExD|yMEEEl%5aNR`Pi!yR$`IvFr*7gq-tgEMX8FAx5(1H6jMlIB zFE?e=T+ijx_jUW%>k$*MXbB46Q8A(jo8h%!&hEEogwswY@kC9@Hd#stZr4jBhNaQs zgwU>twY&BxX33myO5R3#yt34h#yLA^OVh#oh%H5pTKbsKv@Bsca*B**Y)RF|chK`! zg7)k@Fz-gwvpc~y!#BsCp29o}>n#c1P0gDoX%w|NCH2~5cK9YJhlNfl!#?pt;TB5H z8++Ay?U1a^hC%QguxItn;&YAH>4m*WA?&St7`-sr(woL5aCrfVY_rLt zb>Mp|lM>U;LeiKH9@gAK8Ru||)=Y z)PL$PWuM4<7A3d!NGi?G%nZ~;EpDyE*Y!z*o&qcBrpql^YFNyzWr&@-GklEFh1{U!4;Oz_l;C zP@{j(o@*}fORCC|7K%-5t4IHC%i!F~qPGZA%lEcKmt2DVbPG10&4qw*1<-&Ddgb%HZX=1 zy*Pl7k+Nmuf2v5Oi+!pSRx28kn3aY31q2Ypzf9ba9x7IRct~5bG?M>PgqrfI7I`qx znsiET@zYH1BSDzec_uJZ$nEN3E(( z$kPcNu<|mhkLVSnhKpy9qxqh@WZR2?#f$um0F3y<51B!hZgiW3b$pGj5O{lsp~Yw> zlnb4Q+V@;uV}#mHk3$cu0+F{8G*SJBo4aeGk@d-8&&;88lmY2Z3!B~OqIMonIw8xx zjSMX#)mj9P1kkA&4et&C$CR7)kf#HS29;g)A_#Z~{g zLnX_1<#>NNi9z#!oiD^}ImpfVR%jCt6S1#Tw{x-^)bM5yYqE8tXVV2@@<+=<^7|2bP_V7g)4wNFQJN=4@dGf* z-CtZ;=NEs_!&9hUicqF81Y11J;XDGX0h(HQ?gjv>W{|m2b;8aGFp`kQl{WJr(bhFD zwah@WF+=hs!hsEX>`BDctty4!$-&hRQ@+zt-s-{~ z%Wrr0KTDZA^=l)9K9Oc)tf-g%}<2;>^GmdDKb?I*sP_waHNFa@!q9 zcoNp%G;{ultKZCYe^4!6aC0n)Y=8VW+TS9d-bZ8#SxRoqA~3ZcINB9GOFSIO5TE3c zdYpR<8LtP{Q}}YZ{EDw`ik1&{b9PhB#Tb)ob%P@}-xj}1A#}XU%<<4PW5=+$JI2>& z)OoOdu>l<-tlgI4*(8kv!3qZIA^kM*l(wZfB*qzlz$V5>MQVvamI zsGootCb>uqPfA4Mf(AT;6O9mbSzSwd<-JBrY`8(szt7OK%|ll#Sz?BKd#8G#%X4$S z7KXS&@JA;XWADhmhRWyxXYgB}`1=OvshZfW;^fyHv5gKf-F@&bug0RI z+!S-k;DCI$LpNUQDtHFZ&wqnpyN&X^leSi2#`Iekp+FiJUD|p@U8uACb$9g%9!VDu zdoq-Yi>bQ<54Fk-Lm@&rCIQ>@6NLJhzU#adWFlMOqYjfi%>%E7{t)O!ayravaCU6i^&sjIi?)WxAF1u5IzhmTl|vZT_@an z$0S+ZA;Q4_)T6M|Q?7wKI~P3WVdsdga(19W(<(#6lyBSm zjtUkFE{lb-U(FvL25pq{7fWMv=KRiNV7nIj#0lC&CH0}D{dOZvPQrsTjP>Q3tesjZ zX>XVxIia}oN^m=d4pL-0HU-!!S+Bx zOM*aP-54yp^pMj)XxKFrsWOX?x!E4LKMq6h2~>VE^I(eO#B8n$xLF_>CbQ%DRuM+* zm>RNVL2TZ*yKI4*fbXw~!3wU5BSGHT$jY+zOZ*`LdHubNvJ0AzT~!T$eHwrhK(Jid z4zSRZYCu$`5x_Fn048`QpiZNgvYF@zrUAFwYHT*G=A_^cU$!PNu>-84LO{#3_Rs@w zqkMEDmtF#el}as#)(d$u*_G;K#8sEupaa5b2+mZAGWunrGgysfdS|3H97EU!^8z}D z7b!sPMqllVro|;@2#p(iHvr5j3V;hbBsuZ0a0hFDApo$Yd-qK2_-@aCb+`awJ5$Zt z%c54?h#e~C!N%J~@9!<=&IK9U&ua;R_?Ubn9JyWn;pn5*4bK*JlZ@3&+Ee`t0o+8? z>JBGo`SAA=joVPS#v-A#v({BBa9>xQCbYSZdVG|WqB1una)mz;vmhiWsPoSnrp+0- zVdIYGzzQlh++ue_++fNNZw86Hd-?HKo}e*;3_md0%2JFwl$y9X8>zU6SKSlWs03xD zM}jK-uxa?RG@_u%>DXX7ZC2a5qAg|P#`Crc-+%k|`@OLRjRjt`w?VKnbKrk z8^^L|e~37{tmdG#iZE-5l}u%rjbXpOGCDKr2*z5VIyHf)fFUCsg{e$HDn7SJ#zvbz zwDt(SA=M-j)FE1Y0sX3`+AOEt6#+|*~issQlwkP zDlstm{%nf!o6z`Y#;Q_o0Gc>y2M501qGTy+d9anm0b{j~Q^YDeHO3OhcTM}lTC;4D zd~RfFp%=zvtgcE0Stade6qw>mo3R>0@wMyw9v3wS?bQlOYl39J9p<{>l6bTH!b7_) zNvkW8Yem@Qp;4beY@Fl+G4Ly87N^;)*m)|M)Fn@JRtZcJw~x}tlWieVZa|`_){K2w z%>S#m2=vE76Jve$2}p)-avO7@$9CXPB70TcUb?4Q3M$~wXE-c7JB-P@B3HpF3Uhg9 z?|1*aic|^H==;kohWX7IU|qk=+*Dcg#SHp27r-sN-it#T027R2Re)78eAm{J(SyXLNKGXbfodK50W;Ui(r4oKLtNuRePI G&wl~&$vRO0 literal 8608 zcmcIq1ydYBl%B=igUe!p4el1)f;)sD!QEW~ED0V0A-F?ucMt9mT!TZf0E-4) z{D8ae>Y7*G^WK~Krr+07UrnUCsysFZIR*d#*a~lCGywqgY=QtZl;?|~Td@@Y5PJG) zzxB{G^#;4RIa}E}Sb{x#T`a+tKDN(`K1;AP{UnOEMA;{7Hk`vmRw(Sl21yUY9SIQfhpe;yC_4*72G zvpOF_CN8pL+D@G5t0EWvUP_8)JFCPbi+4<(@7>&8xGo$WsvKnpcNpFBm`o?qJB#gI zPDnrksc^H`S8qNz@6se)+`dn9&gN*(&JLRRVsg~u18Mcqe3P|TOgO#pRAPSOyU#$) zlQ`?6TJk9Db?n^@H#)k%r&J5V3B9;mtn;*^eQ;w+|9f1G3O@<1yJ^T!gY%GS zIGK~+$=pY-eo8fm9|JaA?dGBlg5Tq!zSdH24kXDfv3t6iS+KbZ24*YyEKr^J5ew_B z1@oAjRG*&T%=A7SY;>OAh)uS?TE+YDM9s4MLdQ>8I(3G}I_|5BI2Rj7$H``3F~yU# z86g=f$Inb;)y|Hvw~Y5127h*hT#e6u-B!(`IR>GCWenRmQ@;*Dt7sF|KRI(X;zgJ< ziN~i7Cj6#D%uQ(i)V3Yg$|NLuu=JrQ)Z2;m?2vO(iVmPk%a6}hsC8qXRU6GDPh(6x zQiL?rPmeO!6{gvjG&H`7PGf6WQ7o%ySd&W^ybteBnPYrvKnR-=mfahwEczmqW~NGZ!9*$iofb{4#hML_5*Z{ggvK zS}4r>#TmEMZZRVnZoBgN5Jd+2TxKB=W^)V9Y`jtIb@yxe-AAW2!{H!^^O<+5yW(mm zy}N1&+~U~z;_7ob?3R?V9jOHKg;q9um)A0RLqbQda06PUNs=qEWWeA>jSgcZhj^h$YAC67+@Jtxei<*S@*i4Vwf3DBC;kdFDI@|lx z=~X#LryRKQoY}_&RO~P@4c50#6|k@lS=ZMtF!vYXdsP`SCrR4%;uREbUVK4;haI_n zmQ;UR+e}2Y@#0TPn|{%?$`L^{|8lBX{X4CnpW=a1L@Sz#k9HK}G)XF%I?Y~vwc{;y zHO2$h`MOH=Jy4;B04JfEGC=-yz_^rMcZS=7SnscS&zq$+#v&%n{qT7&3avYfdBtu# zyK{>&np(Z)7;vDSoy0t(gU|X)6a?|{&G53r+#4;H!*A%$k#@{^**tIlsC+4>1r5C` zsM|V9Y(23&5i`oSM`1JPNf_S<>F^q0Gv^JBzF`e|$*{%tEmqp6oVFM(ZI|+pl#j^$ zcS7JpezE*?blxv=(3Y^N`sXZ-KNP}gXNq%^`K|+Run8^dBn&9+)-y>ig_GFKEB)nr zT1Ryx3upH;HG4}_zb>`5#k}=Toi!zDH4Iu3wuNu;nr~4_Gr96wEPZvHPkE)YeG@WXgLM;=?=5gZN0E$mTzDzN(Ca zvk%R%eK$-KXgGeJhiQaCJKw$vDV2#tj%KE+>U08+d|3JLPxFGd-Ba%RuFWQ(GTu}kTuGq9#b1U(rXRGmr$%_@xlSk%(o zW&Q21E2%b7ag?DwE5JY5Z~AQ9+YBAG^(LSL*WpxOI#_q{Zkn`b=HOq-8C)$-lOe#@ z$M^~*FLW)iHtc^h2rQfBUJQ13#)>*bwgmW6Ve=|`PJVIyxOuByy&>$W&~7a+R_r~( zYUb1Bu4rByZ(ZUQqt5cE7b4)R3WhH;X5$nRPtRq9Woqa_ti5jzwBB zNSDhM1eNOBk`U#GUgXbB?xH7o8^`tP&SW677JJ{7w5D7Ja06`)tyB-m#L=GK0>@zx=a zp0j4FCn~v;V}DhRO1(QTup~%0%ip`r`gY1jFkLPbRq;pjOlXwH0KS|f64(8F&&xVO zUV%@m`>86sYH8Xk>?lWEJUcWD7H%@A-Ntu$MIXlXdr5hhBHCxVGq;pClAGjcJL!I^ zi#pQk1B>2zJ@$j+egiwHBp_&(vEu4d%l4!NE3^sDc zEkaUTVTTjW6@;QfV+}Nz%j@DYXa)F3EPjP6Z9L_2L)+TX`;yEKqp4FRRu!N3Y+Xy# zmt9yh2y3vy6=yu2V+Osrx7__bFGP4!Gkhm5oxagnZ6kM46<}6ydvGu(R;xYjG^b|u z?L-7$EZU^cgb~I(ah_hg;wzpOXum^BI9Fhk>9p-;UzNAek$;1H8nJ~a*9>Nx0!ak2 z*AO8ygeoVp)_8&5@hbt=2qpK(Q(uRN7L z3Ld zU%bLT)4iCBr}yFIua*qKp0D)s!cIV(k%IOqN9J++HmvHLhE&^liGMj3>&@#1za*X= zD9jRgXUgw_wId_X-zwms9@}6X+$$N+skbxFc?v_iPD2wGO*QHh5T{jp zM5OM&?z;LIU*1VJaDx5304mI5&_tray~{uzE5o=~*d~ za9HzR(YPW$XqxWFskY2ide@5?BvEb5rg4%S_OQ1ZfNQSR-#ckO1y7S$D!|k^ikT`6 z1qKr`>RSFPk{C7<7$~yZlq5zl!3fUtREUYA2cmN`DbFAYm$IEQg;21fb_Z$lTbOg% zjVnH4+AHvh3*rF^Ujh~$0#<0?HYYWwu>1gI+>Te)^m4yddaHtS`frnzf1{E*~Hr`lxa3q`9GKz)Ih#Lx!hz^jzfq+~W3V>%v+ zztal{Z?_;zlK(!5ug}ytCT00{vDzsoPnJONRlo(Ml8(--`$V%?q?Y`yBCxGnpNW=6 zalTR4BxF%HF^bXElzqQ}uHaqK-vR+zbQ5fhRMZUMH@BAq4hbYhf?1GI6jKV>&K+OE zW4i~2p1Yg*iM3N~bSYDMa^^HHak@|4o^uw>OwifS4BhwjE$AyRR*E6`n6=;+L01-a zvQjLs+9&g8`Hl+#9BqR%&9ShSM-EAkUcl!-U@*7<2+ zw(Lg*qa?5>u)0!T=>F1P)52q*Z66w0sNQ|Q<%y)h7x?SlpUYm{A|YF=rE@;R!<=WKn9r7P^cu6a==LCM4ZF6N+ecItZ*`2#y4V$uvX zv)qS1u1OG%7*7*_O>>`>Lv8eAn#w_O@qIlRnzG;}FAn{9)Ep!vOc;Bjy2JK!l8v5z zz7H1KAj2jf;|#u#Yq5o>#sN-a*C9HEj_u?|oycSt=`#g_r|rJHBw$ma@`UJ6(O z{Wh3{M%aeS7e)4cTYBk3)ikA7cAPi)5usS0>?T5Y1aIdIP4JIT!lu~b$!AWiVOnO9 z5~PH>suP~=FfR~vn7DygN-f+N$wcGY1t-;tpsu@&I{>w1iZY<@_u)7Eg>XRvZ4)eg z-i=-nlNQahYUa)mFg+nLLqvq8Q{hlQ<$X+f|7eG+c&}!LvbEtHX!kIDm?$+n8n1uG z6I+;>4Evxp!6dD-Ij51Z!$`9qnZcZp{|?(0ZrVFh`I2tF+hP){w)J&IjCg77YNTCn zN4f{)#&Df*p?RQ4C-iFRZCJ8vtG=Tan%5lh8>Hn^1f$cxmHehQRVciU^6fswl{$Kz zhMDkpJoTnGi|pJ8AOE@gls}VB(kpeBg^Em0eL3I+^EDUc3bIz$y{th4|&lI!FGn| zT&3;Qj-AnnztSgT)pFVgm?o!o^B%=ozp2`acgop4b(b}uxYrdYer=Pk-Bp~GU8pC-f=Xfjf=o6W;F|8!|-FL%~go@ zdQo&QGQe@{_K5r9 znauEQHiX$r9cFpM!%d_!S$Sl(6$bv|^1fJlF|*r#7$GTb^sZn3+auyzmBQB+yr_y{ z9cnfXWV~i_*fB;f<;qb9s8?sjTqlQX!~3{HmYtU2@iRFH#r#r8XHols8PU>{&sxI<^|?q6*} zV@~VJ=_KbddAljeI1^;#qOA+)yw!CZSRF^R*uyDKTT&_t&+tCHVADePnlvK9$f5r_ zspr{!vTyUYlz%cE4Wb-z$5YcOlZg~V)Ib8Qidd@VVn9*(jM_uO4-*Y$7u4yQ$OYdH z(t2P%@_8N@qVpBtK&p9u!E-^GYa!f>`wUFPR+X$DFq5WT=(WvyHOh&r>3EsHl&;Rb zA!y~7uSH8@wK0DU95xqVKJ`{+&Di8xmUP9{%y4>)_uCIsG5pxhE#Nt) zq#9O+yw4|J`eR4sBECNI7ZiprI$B@-o-mg_J($&(0)uA?Dfv?6Tw`^BGwV(8w@?)# zx(pC9Rxw!uXPCX-?&>6~l)kQEDb z>Ja4G{CO$4ewPPkB{V72LUx%qn$VN2oba~Br6GUi`xTO zE^L3{MWA3a<72)?P`4q6ec0sGt#qeneo4;Ds;(fV{Ub-DDLa7uX@=#QF`3x8JdFCM ztEg0(ICp2(wj;fAbiO+|lOpk2qTct+!KB~U_O!?D)E217%~Vs~2rxs@_w@Lk?gQYxK=p>u$cP-q z*5%3JS)fi2lyM{Dv5bnKI8472n(ez@n5w{9lrOORWCgpDY5e&eSD@1vZi;#FbbePB z?53daz2x(mC12l3DrXewz$(;A*;kzqSy7&SakP1$>A7ps*)BUbn7(7x9V50QF9T@K%@K2!bXp3?KccmOGm@CRp} z3i|okURxcglAXV70b0zgiXPQN5F#*b%nbQhw=v#9MXi5x)GJ^L1bji^n+Z)}CQo7A zZzLrw9PkhUCFZUEDKX-_I5B8xWLc)|jZ1RM$yN0C@j5Q@a_#(+-FbiTX!F_woBD{^ zrpM+Zf4##`sk`rHeK@a|XVZ&af>{r?D?}4^yVUv-FX{%DlT<+jFQF)eXJg2L4Md#qR5?hk>ymnp4k54 zrx+X-?=&UGy86_hQw;y1v4x!(!s{0e=f}WQCMQ4*-IgH#t#TJ>9N6?>1cgb?d3+nY zBGu8cqnFIZ_jHN@#kQ89czW{eOpJet zphcQx=jxO9sA?0bRm&=^`2H2*q-5}4iVsqG(DqlCrET)0cv5-d>Y9Ofy$49@c@m!s zQR>u|aqNzf2gRm%Lk=a5b+#a~A z*kpXs1d`&aMqHIr9YweqeF%|O(9qnK%@b?&!!q8vIO2nK&J)((C;J?)6YAq25DO|a zd67NhpB#r`rX()|JpJoA?M3m=Gw3dF^xXjfr}Ezb<>}`B6Yx+y6jWqUw=oEbg&54a z3RIpYy>bN^N$qEiZnZ7SP>*=v%;@_i60)i?SzlMasxaqJ9KAe7^d&-t1n$Pq$;cOK z+i#sWhHy8AJ`Rv#VNhaWA@HHl?(3zbbqS|UPqn~CTjo!2Wxe&XJuCeK{9&F~mfo+a z5uq2`Sq4A`2Z=fC=IZL|)8v+m;89^m^8w|qAb+(VXvj6ELD*=SuS!FCE%V~cMQ}x_ z1+`>?eqXVe57VkZE9*7oJOXb3+BO8 zniV6jboV|tIuP9tz~LGfo$aVCd0c3SWrq{Vv+8&auzqT*Yy$RH!m@b6r!#ftZ5skSd`m@~M%)Eg<;{qQ%_dB-$DiT=R<@AX8s}CG&ve?&9XxpM zLN;BY5Y9@2QIDAFgu4r^1L1hcA?_u)NdMWvc=mJ%sT+=pnSSY*xE1m?pGhoX@(?0J z{koXT^icRyu#0wXkON4V66Zv`Wb?7DaB$<$*=;=KrD6KR*VE1_bk2NA-iInXxp{Fe zORJyzbv}e(0fe`j`!p1fNva6M4sw*{-=HU1dO8>Kp(iIXZDk?m#|zypDiN*Be;GN$ z8K{@9xWYRPS?56RX?R??#ls3}gz}KkrjkYl{HX*=2|WVNbH^Urc++bq8fp5}-_K|t z*Z<+vSro~KkeaU($JPJhqhcwv74?*D8GhOIr`N`Pcac(F3avf8WmkM2!{sC$+UP&` zqR~s1s-(fw$?<(HI=+&@tj}E}q{+Ol87*hbRnz$Qj<8E5xtilbqBOHcj-rsf@^-@A zPeoZLMkH~s>^WcMDO+1TKhDW-e!+h*u#{N=VE)qr^jV6Q002DTr`r3fnq2shDC&gi zn!n%`Pjl0(RMjc=VPI=LLJIs|agnfU(=dN+qsF-6@-jz}Dq6F&i^D|QWI9mMyISAQ zkxb-XWM`$2I__;xM+Bf;Q3@fH^6=b^X!nKixj;aWIp3lXp1!p@F5!!OZE8kY4sR^U za?YJ45)x<$(?CRKbM8c?7+2qH51$O>-CZs&)p&-Mi6YT`1~>OY^Aqirv^5L)Xh%Y` zEM^zwcs37@vX+Wwt(*#e^@{J`G!(hZU*58uM#%N8Pc>H%{AJQBp*V?!s}kubrN!7e zq-H&}j-Rl5t=YaB^paU~Trz;bzr$#c$AePlJ#6-R#k^;+#T|hW=H^bT^~+iofXqlZ zCQipcD_lYFG*T5lllQPGfe_(>D_f=g!tn`Gf1H{tBaN}INWW9A%p<#UAl-#-j|7f6 zjUSVQij2S}@Fd_7H#@r)Qh-vBKt9X8aMrX& zSnJKHuGkI1ZymQ>*S#@EHi2A~An+GmB)hdvD}8bnLsf6hBud9jSq_X&Gsl5zUYzqq zs#it~?25a&p$T2*c4(gHx&tIe0^&R07wq0wF)m>^|IDWn3guk5Rh-LkkGAEo<=7;F z0DFqdKUoTTZ(8go6a3?rp3H2oS}cQs3iFzC=lM&trF3 zpYIJ4)IHyaz$M}WH(4S>bVbkd>D4kD%AK~f@#3dCcuAnHW-yLFGew8ogF}I z+!;uP6E0m9ueY4_NF_z;(0PXj_N0c=dKuCBz9-qr#mQRs^eV4zo5)QjXv~i3DX&Uw z9*}xG-R#|8Y9k2N+FO4Iqv`2W=%O{Bb4SH5AfAQXt!9s_aSog<>()|zyRrASK@5V7jef{np8rj|9UGU z)i#Eh?fjjaAmK1Z@<5YN{gV1l3HwEa)?kFK(n6Eai_ngKn&g)V(lT{y7&dVK{dRk| zN4`jj=nFl*!1mp$$2B^V5>t0YT2gKqpPz~PTIZyfr$0EfX_m!aK7I2$Nn3ifSG;TY zIiq|1;fAwpw<@D^1aX$|lfh~DBAV3B; z2Y^@v_cLYIy(A&0|;@e;u(A$p}$u7ox;-|C~pMvKF zj}4n~i3k874FJ#p;9tr9qsGRUfMeMZ7EFG<(MVDJex(C`_lQUb0BrlHKm;&gi%{N< z4syuc!u-_7>LT8on;o$H1mJh|DCiebN?0I$Jv1r0 za_lUUBbEV}N4HQA=cvT=IA5EAzoWaf);j&c6SL|p`W`pkAh19!IErRso1m=dw<4j2 z#Ce@yqB5S&LJg#~>|^F>Nu8{C`Cr!ADppmR&o)IippF{@imF5SaAK1q)+bwIKthes zWat_)7EFuZm2!&&1euEg5=j4jXne+#T7*rqj-rs|{#C19acpG)r_F#jt((nW8*M9 zshdAV*=tQtLAN`}*TY>Wolj!_;;D&0B%lEl8(XutG_QT|9&difo(?l*hm@6-;q|N! zcR6=HTm^`2%$4a47O7<)OQCI!r3)N`tFO>De$`pG?M-Bd>s1+tI(OW@{1E`>55emh z8yh=@EjOKHKHXmI{ioB~58vL~VC+*#aj1MOHC6U&UjpjqTpf1@WkxR^gC1}9Xat`i zcOZZQAKHp`bPYd+pLB*l1IKcI+Kby(_%0g&CWzl!sJ)#?Ae cnIZIqD7^1%n_Z5g1UxqdSyh=zDU*-?0r5oaC;$Ke From b2cd378b52fa90917a7d426f15a12f4bcbbf748f Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 22 Oct 2020 01:48:24 +0200 Subject: [PATCH 28/36] Back in the early game - Hand cranks can now be made without the need of brass - Fixed tooltip referrals - Crafters can no longer be covered when while they are holding an item - Pushed some numbers around --- src/generated/resources/.cache/cache | 2 +- .../create/recipes/crafting/kinetics/hand_crank.json | 10 +++++----- src/main/java/com/simibubi/create/AllBlocks.java | 2 +- .../components/crafter/MechanicalCrafterBlock.java | 2 ++ .../components/crank/HandCrankTileEntity.java | 3 ++- .../components/waterwheel/WaterWheelBlock.java | 3 ++- .../components/waterwheel/WaterWheelTileEntity.java | 3 +++ .../simibubi/create/foundation/config/CKinetics.java | 8 +++++--- .../foundation/data/recipe/StandardRecipeGen.java | 8 ++++---- .../create/foundation/item/ItemDescription.java | 5 +++-- .../simibubi/create/foundation/item/TooltipHelper.java | 2 +- .../assets/create/models/block/hand_crank/handle.json | 6 +++--- .../assets/create/models/block/hand_crank/item.json | 4 ++-- 13 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 07521487a..471841780 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -2566,7 +2566,7 @@ b7fa20d10c0e0e7270b1c0d6f3881b8e25b39bea data/create/recipes/crafting/kinetics/g 9899501f18e7f3452d4ab4bf658079ab414aa176 data/create/recipes/crafting/kinetics/green_seat.json 6f65a84e00f25d956a6ae834678ff781569b243a data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json 63edaccace961a65aa7bd406d36894c7ca4816b8 data/create/recipes/crafting/kinetics/green_valve_handle_from_other_valve_handle.json -9af4b862db77034f61d2d35e45db00f8dda6dc4b data/create/recipes/crafting/kinetics/hand_crank.json +9f08bdaeec88e04a43c2dc103869f9648deee079 data/create/recipes/crafting/kinetics/hand_crank.json 237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json 958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json b/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json index b8aea7ca0..98ccb51ed 100644 --- a/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/hand_crank.json @@ -1,19 +1,19 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - " B ", + " S ", "CCC", - " S" + " A" ], "key": { - "S": { + "A": { "item": "create:andesite_alloy" }, "C": { "tag": "minecraft:planks" }, - "B": { - "tag": "forge:ingots/brass" + "S": { + "item": "create:shaft" } }, "result": { diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 78bb6b69a..3ebd6e98b 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -348,7 +348,7 @@ public class AllBlocks { public static final BlockEntry HAND_CRANK = REGISTRATE.block("hand_crank", HandCrankBlock::new) .initialProperties(SharedProperties::wooden) .blockstate(BlockStateGen.directionalBlockProvider(true)) - .transform(StressConfigDefaults.setCapacity(32.0)) + .transform(StressConfigDefaults.setCapacity(8.0)) .tag(AllBlockTags.BRITTLE.tag) .item() .transform(customItemModel()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java index 3dbb19558..6ee0720c8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -186,6 +186,8 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT if (AllItems.CRAFTER_SLOT_COVER.isIn(heldItem)) { if (crafter.covered) return ActionResultType.PASS; + if (!crafter.inventory.isEmpty()) + return ActionResultType.PASS; crafter.covered = true; crafter.markDirty(); crafter.sendData(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java index 5ed68e2b4..d861d3cac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankTileEntity.java @@ -67,9 +67,10 @@ public class HandCrankTileEntity extends GeneratingKineticTileEntity { updateGeneratedRotation(); } } - + @Override protected Block getStressConfigKey() { return AllBlocks.HAND_CRANK.get(); } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java index e5923468e..850051626 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/waterwheel/WaterWheelBlock.java @@ -119,7 +119,8 @@ public class WaterWheelBlock extends HorizontalKineticBlock implements ITE ignoreDeployerAttacks = @@ -19,7 +20,7 @@ public class CKinetics extends ConfigBase { public ConfigInt fanPullDistance = i(20, 5, "fanPullDistance", Comments.fanPullDistance); public ConfigInt fanBlockCheckRate = i(30, 10, "fanBlockCheckRate", Comments.fanBlockCheckRate); public ConfigInt fanRotationArgmax = i(256, 64, "fanRotationArgmax", Comments.rpm, Comments.fanRotationArgmax); - public ConfigInt generatingFanSpeed = i(16, 0, "generatingFanSpeed", Comments.rpm, Comments.generatingFanSpeed); + public ConfigInt generatingFanSpeed = i(4, 0, "generatingFanSpeed", Comments.rpm, Comments.generatingFanSpeed); public ConfigInt inWorldProcessingTime = i(150, 0, "inWorldProcessingTime", Comments.inWorldProcessingTime); public ConfigGroup contraptions = group(1, "contraptions", "Moving Contraptions"); @@ -73,7 +74,8 @@ public class CKinetics extends ConfigBase { static String highCapacity = "Minimum added Capacity by sources to be considered 'high'"; static String stress = "Fine tune the kinetic stats of individual components"; static String ignoreDeployerAttacks = "Select what mobs should ignore Deployers when attacked by them."; - static String waterWheelSpeed = "Rotation speed gained by a water wheel for each side with running water. (halved if not against blades)"; + static String waterWheelBaseSpeed = "Added rotation speed by a water wheel when at least one flow is present."; + static String waterWheelFlowSpeed = "Rotation speed gained by a water wheel for each side with running fluids. (halved if not against blades)"; static String furnaceEngineSpeed = "Base rotation speed for the furnace engine generator"; static String disableStress = "Disable the Stress mechanic altogether."; static String kineticValidationFrequency = "Game ticks between Kinetic Blocks checking whether their source is still valid."; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 63bea93d4..e3e1d7b78 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -330,12 +330,12 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("L L")), HAND_CRANK = create(AllBlocks.HAND_CRANK).unlockedBy(I::andesite) - .viaShaped(b -> b.key('S', I.andesite()) + .viaShaped(b -> b.key('A', I.andesite()) .key('C', ItemTags.PLANKS) - .key('B', I.brass()) - .patternLine(" B ") + .key('S', I.shaft()) + .patternLine(" S ") .patternLine("CCC") - .patternLine(" S")), + .patternLine(" A")), COPPER_VALVE_HANDLE = create(AllBlocks.COPPER_VALVE_HANDLE).unlockedByTag(I::copper) .viaShaped(b -> b.key('S', I.andesite()) diff --git a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java index c93f6d243..9a3d19da8 100644 --- a/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java +++ b/src/main/java/com/simibubi/create/foundation/item/ItemDescription.java @@ -290,8 +290,9 @@ public class ItemDescription { String value = ""; if (block instanceof WaterWheelBlock) { - int baseSpeed = AllConfigs.SERVER.kinetics.waterWheelSpeed.get(); - value = baseSpeed + "-" + (baseSpeed * 3); + int baseSpeed = AllConfigs.SERVER.kinetics.waterWheelBaseSpeed.get(); + int speedmod = AllConfigs.SERVER.kinetics.waterWheelFlowSpeed.get(); + value = (speedmod + baseSpeed) + "-" + (baseSpeed + (speedmod * 3)); } else if (block instanceof EncasedFanBlock) diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index 092ae6f40..fea30a1d3 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -196,7 +196,7 @@ public class TooltipHelper { } if (tooltipReferrals.containsKey(item)) - return tooltipReferrals.get(item) + ".tooltip"; + return tooltipReferrals.get(item).get() + ".tooltip"; return item.getTranslationKey(stack) + ".tooltip"; } diff --git a/src/main/resources/assets/create/models/block/hand_crank/handle.json b/src/main/resources/assets/create/models/block/hand_crank/handle.json index afb058158..df816830a 100644 --- a/src/main/resources/assets/create/models/block/hand_crank/handle.json +++ b/src/main/resources/assets/create/models/block/hand_crank/handle.json @@ -4,7 +4,7 @@ "textures": { "0": "create:block/axis", "2": "create:block/andesite_casing_short", - "3": "create:block/brass_block", + "3": "create:block/smooth_dark_log_top", "particle": "create:block/axis" }, "elements": [ @@ -13,9 +13,9 @@ "from": [5, 5, 11], "to": [11, 11, 14], "faces": { - "north": {"uv": [5, 0, 11, 6], "texture": "#3"}, + "north": {"uv": [5, 5, 11, 11], "texture": "#3"}, "east": {"uv": [13, 6, 16, 12], "texture": "#3"}, - "south": {"uv": [3, 4, 9, 10], "texture": "#3"}, + "south": {"uv": [5, 5, 11, 11], "texture": "#3"}, "west": {"uv": [0, 3, 3, 9], "texture": "#3"}, "up": {"uv": [6, 0, 12, 3], "texture": "#3"}, "down": {"uv": [6, 13, 12, 16], "texture": "#3"} diff --git a/src/main/resources/assets/create/models/block/hand_crank/item.json b/src/main/resources/assets/create/models/block/hand_crank/item.json index e186eb59e..5a8af5816 100644 --- a/src/main/resources/assets/create/models/block/hand_crank/item.json +++ b/src/main/resources/assets/create/models/block/hand_crank/item.json @@ -5,7 +5,7 @@ "0": "create:block/axis", "1": "create:block/axis_top", "2": "create:block/andesite_casing_short", - "4": "create:block/brass_block", + "4": "create:block/smooth_dark_log_top", "particle": "create:block/axis" }, "elements": [ @@ -27,7 +27,7 @@ "from": [5, 5, 11], "to": [11, 11, 14], "faces": { - "north": {"uv": [0, 0, 6, 6], "texture": "#4"}, + "north": {"uv": [5, 5, 11, 11], "texture": "#4"}, "east": {"uv": [13, 5, 16, 11], "texture": "#4"}, "south": {"uv": [5, 5, 11, 11], "texture": "#4"}, "west": {"uv": [0, 5, 3, 11], "texture": "#4"}, From c63d0980ed9c44dacba49253047c6f76ac71d490 Mon Sep 17 00:00:00 2001 From: Lucas Barcellos Date: Wed, 28 Oct 2020 22:21:03 -0300 Subject: [PATCH 29/36] Update assets for Cinderflour and Blaze Cake --- .../assets/create/textures/item/blaze_cake.png | Bin 441 -> 436 bytes .../create/textures/item/cinder_flour.png | Bin 246 -> 389 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/item/blaze_cake.png b/src/main/resources/assets/create/textures/item/blaze_cake.png index 91a6e3d4a0898e8099721faca35c7273f36162eb..14c6ab057a6c36cd9e9f00217038946ac9f616ac 100644 GIT binary patch delta 421 zcmV;W0b2gK1GEE>8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00C}EL_t(Ijm?ogPr^_X zhMz)_q)CPFQ3Mh+x)@muabR(PK_?SuHh+YZjQSHCoY)u~Obn9_Ft|7v;^N1m2`oVQ zNU=!=0qa28(3V}_@!b17=bU@tuOlogJ{@eE%j$dg@1FaPf`0`{xhcxgI?+s#VY?21 zT5Dl6MUO~Wgx#Q8YuWN-JOV(cKf-8=wnT8l{zsioe?&4KVV0LYvSd8skoXo?uwcLe z`yX{1p5svnVzBqjz(NI-E0Jta?&7r1IiWvZG9j@9_ z07NrI0NySu7=KNXt2S(;Qk>Q6b3s8-%#*br9=>D9l4OhAsSYG`!(e}9K&9)Wp{jyt z9o`Isl(X>KZBrd&h=#)sc&KUYPTTBcVw}GOfr;}Q3yNZf0s%G?2}&^oDK~WpjHXC+ zAo1DjF`i6lsH)%)SQ3CxAV6H6?=MU9vHQBtcrx#5!5$ugTjb6n_NS%Li00G|+7ApLNP|FvSJs|Cu(ojEVWikuA>dNj-GW`psSEUCNwo+sS7j=OQ) zs8BiX%yHU}_d=}D_ z&DASC!s|YeL>`wY=Wp={s-B_ZiIjA}P7x`PZjh4BM@F zcot7`%la)L%Mezvk3qNRTI7M1v1jZUie&r@4UhQPwLF+xR@pkU!$xr5M5zrrTMU$* tZmE+}*4456cxSeipTTgxWr0D$L4<0|ALz<(7&y)>JMrG&*8bV9B| zYJi{4Cg=D{)AH>Sqylh-P-&LIrWC6@hfOH}z+&twL^}_Y!9b0>U99pPv6L`5$LD^J zhgJ)7&np*nLU1e!ETTxOB-kVgW>=0076LsGM+r9u`rg>4d0N zo@4HLSP}w@F>VB5SQ-GpW2b|U?Y7>*)N#~gIKC^#vYwfNfk8u;KNv_c76-XIF|0c$^AgBmNq6*hWMJ6X&;2Kn708ze@Ck7R z(lPS#GXwov938zyMRRm?3|K*unYoo0ffPqckYDhB2w=F^yf+dk##!JISAd9 From 5abfc15e9ee7925beb67459d0c35a9802c578fc3 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 30 Oct 2020 02:16:08 +0100 Subject: [PATCH 30/36] Destroyer of Lakes - Added the hose pulley - Added creative tanks - Fixed sails not getting consumed when placed against each other - Items can now be inserted onto belts regardless of it moving or not - Fixed item duplication on stopped belts - Refactored fluid block rendering in JEI - Reworked model of the schematic table --- src/generated/resources/.cache/cache | 57 ++- .../blockstates/creative_fluid_tank.json | 76 ++++ .../create/blockstates/hose_pulley.json | 19 + .../assets/create/blockstates/item_drain.json | 7 + .../resources/assets/create/lang/en_ud.json | 3 + .../resources/assets/create/lang/en_us.json | 3 + .../assets/create/lang/unfinished/de_de.json | 5 +- .../assets/create/lang/unfinished/fr_fr.json | 5 +- .../assets/create/lang/unfinished/it_it.json | 5 +- .../assets/create/lang/unfinished/ja_jp.json | 5 +- .../assets/create/lang/unfinished/ko_kr.json | 5 +- .../assets/create/lang/unfinished/nl_nl.json | 5 +- .../assets/create/lang/unfinished/pt_br.json | 5 +- .../assets/create/lang/unfinished/ru_ru.json | 5 +- .../assets/create/lang/unfinished/zh_cn.json | 5 +- .../create/models/block/creative_bottom.json | 10 + .../models/block/creative_bottom_window.json | 10 + .../block/creative_bottom_window_ne.json | 10 + .../block/creative_bottom_window_nw.json | 10 + .../block/creative_bottom_window_se.json | 10 + .../block/creative_bottom_window_sw.json | 10 + .../create/models/block/creative_middle.json | 10 + .../models/block/creative_middle_window.json | 10 + .../block/creative_middle_window_ne.json | 10 + .../block/creative_middle_window_nw.json | 10 + .../block/creative_middle_window_se.json | 10 + .../block/creative_middle_window_sw.json | 10 + .../create/models/block/creative_single.json | 10 + .../models/block/creative_single_window.json | 10 + .../block/creative_single_window_ne.json | 10 + .../block/creative_single_window_nw.json | 10 + .../block/creative_single_window_se.json | 10 + .../block/creative_single_window_sw.json | 10 + .../create/models/block/creative_top.json | 10 + .../models/block/creative_top_window.json | 10 + .../models/block/creative_top_window_ne.json | 10 + .../models/block/creative_top_window_nw.json | 10 + .../models/block/creative_top_window_se.json | 10 + .../models/block/creative_top_window_sw.json | 10 + .../models/item/creative_fluid_tank.json | 8 + .../create/models/item/hose_pulley.json | 3 + .../assets/create/models/item/item_drain.json | 3 + .../crafting/kinetics/hose_pulley.json | 32 ++ .../blocks/creative_fluid_tank.json | 19 + .../loot_tables/blocks/hose_pulley.json | 19 + .../create/loot_tables/blocks/item_drain.json | 19 + .../crafting/kinetics/hose_pulley.json | 28 ++ .../com/simibubi/create/AllBlockPartials.java | 14 +- .../java/com/simibubi/create/AllBlocks.java | 38 +- .../java/com/simibubi/create/AllShapes.java | 13 +- .../com/simibubi/create/AllSpriteShifts.java | 6 +- .../com/simibubi/create/AllTileEntities.java | 22 +- .../base/HorizontalKineticBlock.java | 18 +- .../structureMovement/ContraptionEntity.java | 2 +- .../structureMovement/bearing/SailBlock.java | 5 +- .../pulley/PulleyRenderer.java | 24 +- .../content/contraptions/fluids/FluidFX.java | 51 +++ .../fluids/FluidPipeAttachmentBehaviour.java | 4 +- .../fluids/actors/FluidDrainingBehaviour.java | 347 ++++++++++++++++ .../fluids/actors/FluidFillingBehaviour.java | 265 ++++++++++++ .../actors/FluidManipulationBehaviour.java | 222 ++++++++++ .../fluids/actors/FluidSplashPacket.java | 49 +++ .../fluids/actors/HosePulleyBlock.java | 107 +++++ .../fluids/actors/HosePulleyFluidHandler.java | 123 ++++++ .../fluids/actors/HosePulleyRenderer.java | 70 ++++ .../fluids/actors/HosePulleyTileEntity.java | 171 ++++++++ .../fluids/actors/ItemDrainBlock.java | 31 ++ .../tank/CreativeFluidTankTileEntity.java | 56 +++ .../fluids/tank/FluidTankBlock.java | 82 ++-- .../tank/FluidTankConnectivityHandler.java | 35 +- .../fluids/tank/FluidTankGenerator.java | 24 +- .../fluids/tank/FluidTankItem.java | 10 +- .../fluids/tank/FluidTankModel.java | 9 +- .../fluids/tank/FluidTankRenderer.java | 3 + .../fluids/tank/FluidTankTileEntity.java | 26 +- .../contraptions/processing/BasinBlock.java | 84 +--- .../contraptions/relays/belt/BeltBlock.java | 2 +- .../relays/belt/BeltTileEntity.java | 5 +- .../relays/belt/transport/BeltInventory.java | 19 +- .../data/recipe/StandardRecipeGen.java | 11 + .../create/foundation/fluid/FluidHelper.java | 85 +++- .../create/foundation/gui/GuiGameElement.java | 70 +--- .../foundation/networking/AllPackets.java | 27 +- .../resources/META-INF/accesstransformer.cfg | 4 + .../block/fluid_tank/block_single_window.json | 2 +- .../models/block/hose_pulley/block.json | 271 +++++++++++++ .../block/hose_pulley/copper_pulley.bbmodel | 1 + .../hose_pulley/copper_pulley_rope.bbmodel | 1 + .../create/models/block/hose_pulley/item.json | 381 ++++++++++++++++++ .../block/hose_pulley/pulley_magnet.json | 101 +++++ .../create/models/block/hose_pulley/rope.json | 7 + .../models/block/hose_pulley/rope_coil.json | 49 +++ .../models/block/hose_pulley/rope_half.json | 7 + .../block/hose_pulley/rope_half_magnet.json | 101 +++++ .../create/models/block/item_drain.json | 79 ++++ .../models/block/rope_pulley/block.json | 14 +- .../create/models/block/rope_pulley/item.json | 18 +- .../create/models/block/schematic_table.json | 129 +++--- .../create/textures/block/copper_gearbox.png | Bin 0 -> 367 bytes .../create/textures/block/crate_creative.png | Bin 1004 -> 821 bytes .../textures/block/crate_creative_side.png | Bin 1238 -> 794 bytes .../create/textures/block/creative_casing.png | Bin 437 -> 326 bytes .../block/creative_casing_connected.png | Bin 0 -> 726 bytes .../textures/block/creative_fluid_tank.png | Bin 0 -> 375 bytes .../block/creative_fluid_tank_connected.png | Bin 0 -> 1060 bytes .../block/creative_fluid_tank_window.png | Bin 0 -> 258 bytes .../creative_fluid_tank_window_single.png | Bin 0 -> 205 bytes .../create/textures/block/creative_motor.png | Bin 583 -> 558 bytes .../textures/block/hose_pulley_magnet.png | Bin 0 -> 2025 bytes .../textures/block/hose_pulley_rope.png | Bin 0 -> 1196 bytes .../create/textures/block/item_drain_side.png | Bin 0 -> 1991 bytes .../create/textures/block/item_drain_top.png | Bin 0 -> 291 bytes .../textures/block/schematic_table_side.png | Bin 440 -> 422 bytes .../textures/block/schematic_table_top.png | Bin 328 -> 432 bytes 114 files changed, 3509 insertions(+), 367 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/creative_fluid_tank.json create mode 100644 src/generated/resources/assets/create/blockstates/hose_pulley.json create mode 100644 src/generated/resources/assets/create/blockstates/item_drain.json create mode 100644 src/generated/resources/assets/create/models/block/creative_bottom.json create mode 100644 src/generated/resources/assets/create/models/block/creative_bottom_window.json create mode 100644 src/generated/resources/assets/create/models/block/creative_bottom_window_ne.json create mode 100644 src/generated/resources/assets/create/models/block/creative_bottom_window_nw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_bottom_window_se.json create mode 100644 src/generated/resources/assets/create/models/block/creative_bottom_window_sw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_middle.json create mode 100644 src/generated/resources/assets/create/models/block/creative_middle_window.json create mode 100644 src/generated/resources/assets/create/models/block/creative_middle_window_ne.json create mode 100644 src/generated/resources/assets/create/models/block/creative_middle_window_nw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_middle_window_se.json create mode 100644 src/generated/resources/assets/create/models/block/creative_middle_window_sw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_single.json create mode 100644 src/generated/resources/assets/create/models/block/creative_single_window.json create mode 100644 src/generated/resources/assets/create/models/block/creative_single_window_ne.json create mode 100644 src/generated/resources/assets/create/models/block/creative_single_window_nw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_single_window_se.json create mode 100644 src/generated/resources/assets/create/models/block/creative_single_window_sw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_top.json create mode 100644 src/generated/resources/assets/create/models/block/creative_top_window.json create mode 100644 src/generated/resources/assets/create/models/block/creative_top_window_ne.json create mode 100644 src/generated/resources/assets/create/models/block/creative_top_window_nw.json create mode 100644 src/generated/resources/assets/create/models/block/creative_top_window_se.json create mode 100644 src/generated/resources/assets/create/models/block/creative_top_window_sw.json create mode 100644 src/generated/resources/assets/create/models/item/creative_fluid_tank.json create mode 100644 src/generated/resources/assets/create/models/item/hose_pulley.json create mode 100644 src/generated/resources/assets/create/models/item/item_drain.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/creative_fluid_tank.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/hose_pulley.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/item_drain.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/hose_pulley.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/tank/CreativeFluidTankTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/block.json create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/copper_pulley.bbmodel create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/copper_pulley_rope.bbmodel create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/item.json create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/rope.json create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/rope_half.json create mode 100644 src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json create mode 100644 src/main/resources/assets/create/models/block/item_drain.json create mode 100644 src/main/resources/assets/create/textures/block/copper_gearbox.png create mode 100644 src/main/resources/assets/create/textures/block/creative_casing_connected.png create mode 100644 src/main/resources/assets/create/textures/block/creative_fluid_tank.png create mode 100644 src/main/resources/assets/create/textures/block/creative_fluid_tank_connected.png create mode 100644 src/main/resources/assets/create/textures/block/creative_fluid_tank_window.png create mode 100644 src/main/resources/assets/create/textures/block/creative_fluid_tank_window_single.png create mode 100644 src/main/resources/assets/create/textures/block/hose_pulley_magnet.png create mode 100644 src/main/resources/assets/create/textures/block/hose_pulley_rope.png create mode 100644 src/main/resources/assets/create/textures/block/item_drain_side.png create mode 100644 src/main/resources/assets/create/textures/block/item_drain_top.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 471841780..c1a39e1d7 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -56,6 +56,7 @@ dc76bca1fdd41c8e6ada27fd59a2b73d7adc9596 assets/create/blockstates/copper_shingl ecf4a72411870bfdbf8a59469b114cd77621c343 assets/create/blockstates/copper_tiles.json 890be245b914c1a9f29f48a8c5d325640b5be160 assets/create/blockstates/copper_valve_handle.json 3df0d5d5170a2f6cbab0f8a9bc8f2d64229589af assets/create/blockstates/creative_crate.json +da3f1203dd0b0096ce19e09705060a0ed0478bee assets/create/blockstates/creative_fluid_tank.json f0031f5e970b3d5695472ed384950b8631b015ed assets/create/blockstates/creative_motor.json fe2f78b94c20944399101e7369e2d43324297fb6 assets/create/blockstates/crushing_wheel.json a1dd6cb3daa97ea871290ef7b178d28b564ee2a2 assets/create/blockstates/crushing_wheel_controller.json @@ -174,6 +175,8 @@ f4a0fc68e8daaa0a47cdc951ced4310057a874b0 assets/create/blockstates/green_valve_h 6ab675fa06317e6d07c0c1a453e7bb43e3f46b3b assets/create/blockstates/hand_crank.json be3bef7e091d8b50bfc1c6b7275946d1f636aefd assets/create/blockstates/horizontal_framed_glass.json 18d9fdaa1352a7e2ec91135e46dae5c02ccd8f8f assets/create/blockstates/horizontal_framed_glass_pane.json +30ec347dfc827a9ae52cf3da964b828005acede1 assets/create/blockstates/hose_pulley.json +6651c84ea621777d572a3d7aa13b75d9f061191b assets/create/blockstates/item_drain.json 5d851c90d23de5087ce546d4bbe509e112b84c49 assets/create/blockstates/jungle_window.json b15bea757ef981e0ca60f740ca234ee2014eb7b7 assets/create/blockstates/jungle_window_pane.json f651091db216b009b3379b2f48d56d03481c8675 assets/create/blockstates/large_cogwheel.json @@ -386,17 +389,17 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -ad168f04d430ebd783a845e5928c3273da3f0074 assets/create/lang/en_ud.json -25b02b7b025f988b0cda9655b2c586c82dfd369c assets/create/lang/en_us.json -cf9075cacdbd171b33fa0b6cb68365e2c3614b40 assets/create/lang/unfinished/de_de.json -87ea3d2da2863fa61c5d5b9f535aac8c1703be28 assets/create/lang/unfinished/fr_fr.json -3349f2726256c99abd7e5268faa806b628d91e4d assets/create/lang/unfinished/it_it.json -3cf205e25543b7860d6b00f2f91dd799333b9d74 assets/create/lang/unfinished/ja_jp.json -d112e8b804ca16511c4096b328f3635b4c84a3e9 assets/create/lang/unfinished/ko_kr.json -78791855041e56a27fb3520b289ca8a144de98ad assets/create/lang/unfinished/nl_nl.json -d92ac1ec1ebbad873dd6563509767428603b6ba2 assets/create/lang/unfinished/pt_br.json -5d4f30e05fea3bec9c6c85a5f7767eb3dd0a7dfe assets/create/lang/unfinished/ru_ru.json -46996569e164858a5f9dc7f60731707d3517b888 assets/create/lang/unfinished/zh_cn.json +6fe6c50ae75a9c89c90d3423bc74f3e628bc213a assets/create/lang/en_ud.json +b054eb6cf72ac04fbb2512569effa84768adef74 assets/create/lang/en_us.json +cf432c7dcf9b91769a570242a59c12ecca79a091 assets/create/lang/unfinished/de_de.json +5a2e2499696f45b1f95feeaa702119b8e1b371eb assets/create/lang/unfinished/fr_fr.json +12ac01a6f21c536aa09599c36139f593cbbf7d1f assets/create/lang/unfinished/it_it.json +3e65e163c658e4f34124807716b009e1907187cc assets/create/lang/unfinished/ja_jp.json +4dfeba1d56d8ad688442d2ca026dfa16147178ef assets/create/lang/unfinished/ko_kr.json +3d114a874d1c198ecf0978fd13b98249536cc684 assets/create/lang/unfinished/nl_nl.json +3434f2d429bdf64dcbc915c0365e20250b64d819 assets/create/lang/unfinished/pt_br.json +0bfd9476411fc565a3011ffc43eecaca3f0e53ff assets/create/lang/unfinished/ru_ru.json +d7150e9c65d74f41e2dc65daadf003dc200e512c assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -503,6 +506,30 @@ a09f639bde4c61d68592eb06c807e7a6791ff950 assets/create/models/block/crate/brass/ 7635211e4d833748acaea37ea48b1f749c32ea5f assets/create/models/block/crate/creative/right.json a123e3c8a9e2ea1665f268cf3991aa7e4b3119c6 assets/create/models/block/crate/creative/single.json 29ab5cfe7aed1271ede125e91bf78c1372b5f96e assets/create/models/block/crate/creative/top.json +e04c4987746379ec24c63929abf0df4e41e13e6a assets/create/models/block/creative_bottom.json +5b1f6d98adf1e92f678a59b7eef720deeeda2795 assets/create/models/block/creative_bottom_window.json +6dd1cf78624d5ce69259fc723e9700bd842c94c8 assets/create/models/block/creative_bottom_window_ne.json +c0dfda633c3158633814e9a6cd4f4dba793ad4c8 assets/create/models/block/creative_bottom_window_nw.json +e30b13d2ae9a437664792c16be537cea73552cf8 assets/create/models/block/creative_bottom_window_se.json +8d68f53dfa4d17f8193cd8df693e340ac7a1b92e assets/create/models/block/creative_bottom_window_sw.json +77a84b8ca790ddef80e792beb79c2ae0db78005b assets/create/models/block/creative_middle.json +179f6208a04832141d83f9a6bef96334cf4fe4aa assets/create/models/block/creative_middle_window.json +cadd6df93f6ba708a3c92a958e88531cbc1d6ebf assets/create/models/block/creative_middle_window_ne.json +75b37b07555312798a519bea3325d4af6a57eb86 assets/create/models/block/creative_middle_window_nw.json +d9d6b61ba21270c83361b3ee2391161125dfc6f0 assets/create/models/block/creative_middle_window_se.json +73696b00c063cdf6c5a492eac7e5e06062abad88 assets/create/models/block/creative_middle_window_sw.json +3af304cfaa0cdba11c120e85cea88d96c986eebc assets/create/models/block/creative_single.json +feed58a4ad7d7a9e855f0cd7b3fc720616120b4b assets/create/models/block/creative_single_window.json +4f8753ba3a04853fb006be37e15d760cc154d937 assets/create/models/block/creative_single_window_ne.json +39ee24e3b1e06d38bfa4ef36aa4f89577c7f6eab assets/create/models/block/creative_single_window_nw.json +81250161ba79b846614859fe8c991c9e18bf77ba assets/create/models/block/creative_single_window_se.json +0fdca0706c76794586199287f1e29c8e87ef6385 assets/create/models/block/creative_single_window_sw.json +873b263b688f191a927a63b2d873a797eab801e1 assets/create/models/block/creative_top.json +723c5db04011eeb1f2e0483f3466bf05432c5f4c assets/create/models/block/creative_top_window.json +0994ef30adac0d9faa19d06fd933eb16b11d1ef3 assets/create/models/block/creative_top_window_ne.json +59c43cc18525792ca96026c966076f52cf7ebef7 assets/create/models/block/creative_top_window_nw.json +a6eea01609266b757342984889af16234ecd5189 assets/create/models/block/creative_top_window_se.json +6e1d2fb66291f2a3e3a213f43b47fb9760cb959f assets/create/models/block/creative_top_window_sw.json 68843a02a32c156afad85830877b83f9b51c5147 assets/create/models/block/cyan_sail.json 6704782830b3d872321e895b6903709c18e3778f assets/create/models/block/cyan_seat.json f45ef4a5f0aa8482d493661673b1c0ab6d061157 assets/create/models/block/cyan_valve_handle.json @@ -1124,6 +1151,7 @@ f56bf22324faf8958eaef4d94b958f1108d52e5a assets/create/models/item/copper_tiles. 5583368909c319acfcf0f7a419bedf23272fe613 assets/create/models/item/copper_valve_handle.json 4e9126b349d55c65aa5407f05700579e52101c1f assets/create/models/item/crafter_slot_cover.json 7b333dea353afaa27b182aedc647c9e9e34e92ef assets/create/models/item/creative_crate.json +f7d06c52c3ca8c22ad67f5741471f06ac22e7fcb assets/create/models/item/creative_fluid_tank.json 5b39403f6c81f05e566b621b62e267267de47c41 assets/create/models/item/creative_motor.json 19c8492ced64a872a040005dd212a9a14e20477c assets/create/models/item/crushed_brass.json 8167f2a6d05d65a4ebd809b9c114027862afb38e assets/create/models/item/crushed_copper_ore.json @@ -1250,8 +1278,10 @@ cfab82a2cf7495d21778c1de9730a26afbdd523d assets/create/models/item/handheld_bloc dee43bf1a9c211a752fac2c07aeba123f7f0c914 assets/create/models/item/handheld_worldshaper.json e7ec65ad5be13cae5f7d60836b8df9e4a5baad56 assets/create/models/item/horizontal_framed_glass.json f0e3b2b8a553b6e61746c922c27302dabfff71b6 assets/create/models/item/horizontal_framed_glass_pane.json +ff92f6a9dfb73a6ee1eaaed3279c89390ff04a80 assets/create/models/item/hose_pulley.json 771d439eac70b52f593fa7381f2c48729fbdaec7 assets/create/models/item/integrated_circuit.json d254f47bc185f2a2f01608a875aa63ed2c4ceb0f assets/create/models/item/iron_sheet.json +52e435014cb03e93411666c4799ebff206e55fc9 assets/create/models/item/item_drain.json 83fa8699318e51f838b483b40b3e897c34ed53d1 assets/create/models/item/jungle_window.json 34dc05da3edef554dad1cfde834773aecd861293 assets/create/models/item/jungle_window_pane.json 0c9b16c3f5f0a5f77110b3fc2467bde8c1b288b7 assets/create/models/item/lapis_sheet.json @@ -1566,6 +1596,7 @@ c023b9221d7983487d21e5ecc7d92246cfc7e791 data/create/advancements/recipes/create 2ba23f019a110a3e035a49e56ee8156fc11d74c0 data/create/advancements/recipes/create.base/crafting/kinetics/green_seat_from_other_seat.json 9af3d92d11c3f520df3e22f3069042bf34585010 data/create/advancements/recipes/create.base/crafting/kinetics/green_valve_handle_from_other_valve_handle.json dbb96a4db4ef8172af73a626bed9727278d804bd data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json +21cd686e1f3a4004d8e9bd3d92675bd61fb2b4db data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json a71b626b6ee58a4eabee56f67c48f041a1323506 data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json eb007bb079bbe6b6aaad2ca90f5af84261e3f8ea data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json 571da50fbf5f2fcd3363b3dab91e7233e0ebffa0 data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json @@ -2147,6 +2178,7 @@ a5a7ba88a1d38da83b37bbe842dc7cc0544f37be data/create/loot_tables/blocks/copper_s c013613df278f6e8b4c9dad5f16e0ec6c3e992e3 data/create/loot_tables/blocks/copper_tiles.json 5c15f22db359a2af8efa18561e080cdf361a0100 data/create/loot_tables/blocks/copper_valve_handle.json b160899aa785dc54d8c6cc095337f70b81f3e44f data/create/loot_tables/blocks/creative_crate.json +51d66e32581b87beb871d99b93cb45d45eada8dd data/create/loot_tables/blocks/creative_fluid_tank.json d8f2f8921b9200b1d9476a77ee1be32c25308ac3 data/create/loot_tables/blocks/creative_motor.json c28fa42746a4d5ca2f824001b67e58673810169e data/create/loot_tables/blocks/crushing_wheel.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/crushing_wheel_controller.json @@ -2265,6 +2297,8 @@ a71599eecd3f1179e3d0367623460e798828aa6d data/create/loot_tables/blocks/green_se 9bdc47ea3ffc52f037f12f40f387e6b72a352c4e data/create/loot_tables/blocks/hand_crank.json 22012e7759f1dbccbb06bcaf0311a54190270825 data/create/loot_tables/blocks/horizontal_framed_glass.json 5d3f585539942f13bbc458a0a002849c1f034fc1 data/create/loot_tables/blocks/horizontal_framed_glass_pane.json +1b28cc5e1e535aa0c62d4a75ad76fcb40bf6232c data/create/loot_tables/blocks/hose_pulley.json +ef3890c4fa262959cf31a0063fd21919da86eda1 data/create/loot_tables/blocks/item_drain.json cf2bfae903e7f8510962e672b6266c0e74176aae data/create/loot_tables/blocks/jungle_window.json 1a3a19517f95fc632286d3cc693bfee4a59dfa0a data/create/loot_tables/blocks/jungle_window_pane.json 4d948f80fb7a8b6b99897544681f43fe3d2058f0 data/create/loot_tables/blocks/large_cogwheel.json @@ -2567,6 +2601,7 @@ b7fa20d10c0e0e7270b1c0d6f3881b8e25b39bea data/create/recipes/crafting/kinetics/g 6f65a84e00f25d956a6ae834678ff781569b243a data/create/recipes/crafting/kinetics/green_seat_from_other_seat.json 63edaccace961a65aa7bd406d36894c7ca4816b8 data/create/recipes/crafting/kinetics/green_valve_handle_from_other_valve_handle.json 9f08bdaeec88e04a43c2dc103869f9648deee079 data/create/recipes/crafting/kinetics/hand_crank.json +d10639b0c3999481531fe0a9383a1bb4af60225e data/create/recipes/crafting/kinetics/hose_pulley.json 237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json 958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json diff --git a/src/generated/resources/assets/create/blockstates/creative_fluid_tank.json b/src/generated/resources/assets/create/blockstates/creative_fluid_tank.json new file mode 100644 index 000000000..45118d24e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/creative_fluid_tank.json @@ -0,0 +1,76 @@ +{ + "variants": { + "bottom=false,shape=plain,top=false": { + "model": "create:block/creative_middle" + }, + "bottom=true,shape=plain,top=false": { + "model": "create:block/creative_bottom" + }, + "bottom=false,shape=window,top=false": { + "model": "create:block/creative_middle_window" + }, + "bottom=true,shape=window,top=false": { + "model": "create:block/creative_bottom_window" + }, + "bottom=false,shape=window_nw,top=false": { + "model": "create:block/creative_middle_window_nw" + }, + "bottom=true,shape=window_nw,top=false": { + "model": "create:block/creative_bottom_window_nw" + }, + "bottom=false,shape=window_sw,top=false": { + "model": "create:block/creative_middle_window_sw" + }, + "bottom=true,shape=window_sw,top=false": { + "model": "create:block/creative_bottom_window_sw" + }, + "bottom=false,shape=window_ne,top=false": { + "model": "create:block/creative_middle_window_ne" + }, + "bottom=true,shape=window_ne,top=false": { + "model": "create:block/creative_bottom_window_ne" + }, + "bottom=false,shape=window_se,top=false": { + "model": "create:block/creative_middle_window_se" + }, + "bottom=true,shape=window_se,top=false": { + "model": "create:block/creative_bottom_window_se" + }, + "bottom=false,shape=plain,top=true": { + "model": "create:block/creative_top" + }, + "bottom=true,shape=plain,top=true": { + "model": "create:block/creative_single" + }, + "bottom=false,shape=window,top=true": { + "model": "create:block/creative_top_window" + }, + "bottom=true,shape=window,top=true": { + "model": "create:block/creative_single_window" + }, + "bottom=false,shape=window_nw,top=true": { + "model": "create:block/creative_top_window_nw" + }, + "bottom=true,shape=window_nw,top=true": { + "model": "create:block/creative_single_window_nw" + }, + "bottom=false,shape=window_sw,top=true": { + "model": "create:block/creative_top_window_sw" + }, + "bottom=true,shape=window_sw,top=true": { + "model": "create:block/creative_single_window_sw" + }, + "bottom=false,shape=window_ne,top=true": { + "model": "create:block/creative_top_window_ne" + }, + "bottom=true,shape=window_ne,top=true": { + "model": "create:block/creative_single_window_ne" + }, + "bottom=false,shape=window_se,top=true": { + "model": "create:block/creative_top_window_se" + }, + "bottom=true,shape=window_se,top=true": { + "model": "create:block/creative_single_window_se" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/hose_pulley.json b/src/generated/resources/assets/create/blockstates/hose_pulley.json new file mode 100644 index 000000000..b69e3b7db --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/hose_pulley.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=north": { + "model": "create:block/hose_pulley/block" + }, + "facing=south": { + "model": "create:block/hose_pulley/block", + "y": 180 + }, + "facing=west": { + "model": "create:block/hose_pulley/block", + "y": 270 + }, + "facing=east": { + "model": "create:block/hose_pulley/block", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/item_drain.json b/src/generated/resources/assets/create/blockstates/item_drain.json new file mode 100644 index 000000000..139085ae4 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/item_drain.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "create:block/item_drain" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 337d05b48..bd2daac3a 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -57,6 +57,7 @@ "block.create.copper_tiles": "s\u01DD\u05DF\u0131\u27D8 \u0279\u01DDddo\u0186", "block.create.copper_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u0279\u01DDddo\u0186", "block.create.creative_crate": "\u01DD\u0287\u0250\u0279\u0186 \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", + "block.create.creative_fluid_tank": "\u029Eu\u0250\u27D8 p\u0131n\u05DF\u2132 \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "block.create.creative_motor": "\u0279o\u0287oW \u01DD\u028C\u0131\u0287\u0250\u01DD\u0279\u0186", "block.create.crushing_wheel": "\u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", "block.create.crushing_wheel_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 \u05DF\u01DD\u01DD\u0265M bu\u0131\u0265sn\u0279\u0186", @@ -175,6 +176,8 @@ "block.create.hand_crank": "\u029Eu\u0250\u0279\u0186 pu\u0250H", "block.create.horizontal_framed_glass": "ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH", "block.create.horizontal_framed_glass_pane": "\u01DDu\u0250\u0500 ss\u0250\u05DF\u2141 p\u01DD\u026F\u0250\u0279\u2132 \u05DF\u0250\u0287uoz\u0131\u0279oH", + "block.create.hose_pulley": "\u028E\u01DD\u05DF\u05DFn\u0500 \u01DDsoH", + "block.create.item_drain": "u\u0131\u0250\u0279\u15E1 \u026F\u01DD\u0287I", "block.create.jungle_window": "\u028Dopu\u0131M \u01DD\u05DFbun\u017F", "block.create.jungle_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u05DFbun\u017F", "block.create.large_cogwheel": "\u05DF\u01DD\u01DD\u0265\u028Dbo\u0186 \u01DDb\u0279\u0250\uA780", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 059d2b99f..371acaa8d 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -60,6 +60,7 @@ "block.create.copper_tiles": "Copper Tiles", "block.create.copper_valve_handle": "Copper Valve Handle", "block.create.creative_crate": "Creative Crate", + "block.create.creative_fluid_tank": "Creative Fluid Tank", "block.create.creative_motor": "Creative Motor", "block.create.crushing_wheel": "Crushing Wheel", "block.create.crushing_wheel_controller": "Crushing Wheel Controller", @@ -178,6 +179,8 @@ "block.create.hand_crank": "Hand Crank", "block.create.horizontal_framed_glass": "Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "Horizontal Framed Glass Pane", + "block.create.hose_pulley": "Hose Pulley", + "block.create.item_drain": "Item Drain", "block.create.jungle_window": "Jungle Window", "block.create.jungle_window_pane": "Jungle Window Pane", "block.create.large_cogwheel": "Large Cogwheel", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 237637680..3983b7fa6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1021", + "_": "Missing Localizations: 1024", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Bauplankanonenmacher", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Mahlwerkrad", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "Großes Zahnrad", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 58317000e..8e8f1a140 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 650", + "_": "Missing Localizations: 653", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Créateur de schémacanon", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "Moteur", "block.create.crushing_wheel": "Roue de concassage", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "Manivelle", "block.create.horizontal_framed_glass": "Fenêtre en verre horizontale", "block.create.horizontal_framed_glass_pane": "Vitre encadrée horizontale", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "Grande roue dentée", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index cb9b93d62..826981954 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 634", + "_": "Missing Localizations: 637", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Creatore Cannoneschematico", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "Motore", "block.create.crushing_wheel": "Ruota di Frantumazione", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "Manovella", "block.create.horizontal_framed_glass": "Finestra Orizzontale Vetro", "block.create.horizontal_framed_glass_pane": "Pannello di Finestra Orizzontale Vetro", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "Ruota Dentata Grande", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index c26b4361c..e3ac8dfe3 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 633", + "_": "Missing Localizations: 636", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "概略図砲クリエティフィアー", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "モーター", "block.create.crushing_wheel": "破砕ホイール", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "ハンドクランク", "block.create.horizontal_framed_glass": "横型ガラス窓", "block.create.horizontal_framed_glass_pane": "横型ガラス窓板", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "大きな歯車", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 8e7131853..a2f0c077e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 634", + "_": "Missing Localizations: 637", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "청사진 대포 지원기", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "모터", "block.create.crushing_wheel": "분쇄 휠", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "핸드 크랭크", "block.create.horizontal_framed_glass": "수평 유리", "block.create.horizontal_framed_glass_pane": "수평 유리판", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "큰 톱니바퀴", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 7cea32d18..634c6597a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 962", + "_": "Missing Localizations: 965", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Bouwtekeningkannon Creatiefeerder", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Verpulveraar", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "Groot Tandwiel", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 75331efd4..cc6f316b1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1028", + "_": "Missing Localizations: 1031", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Criativador Esquemaannon", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "UNLOCALIZED: Creative Motor", "block.create.crushing_wheel": "Roda de Moer", "block.create.crushing_wheel_controller": "UNLOCALIZED: Crushing Wheel Controller", @@ -179,6 +180,8 @@ "block.create.hand_crank": "UNLOCALIZED: Hand Crank", "block.create.horizontal_framed_glass": "UNLOCALIZED: Horizontal Framed Glass", "block.create.horizontal_framed_glass_pane": "UNLOCALIZED: Horizontal Framed Glass Pane", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "UNLOCALIZED: Jungle Window", "block.create.jungle_window_pane": "UNLOCALIZED: Jungle Window Pane", "block.create.large_cogwheel": "Roda Dentada Grande", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index b421ad0f6..2a67cb74f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 303", + "_": "Missing Localizations: 306", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "Творческий ящик", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "Творческий мотор", "block.create.crushing_wheel": "Колесо дробления", "block.create.crushing_wheel_controller": "Контроллер колеса дробления", @@ -179,6 +180,8 @@ "block.create.hand_crank": "Рукоятка", "block.create.horizontal_framed_glass": "Горизонтальное обрамлённое стекло", "block.create.horizontal_framed_glass_pane": "Горизонтальная обрамлённая стеклянная панель", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "Окно из тропического дерева", "block.create.jungle_window_pane": "Панель окна из тропического дерева", "block.create.large_cogwheel": "Большая шестерня", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 0370fa797..76108fbca 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 316", + "_": "Missing Localizations: 319", "_": "->------------------------] Game Elements [------------------------<-", @@ -61,6 +61,7 @@ "block.create.copper_tiles": "UNLOCALIZED: Copper Tiles", "block.create.copper_valve_handle": "UNLOCALIZED: Copper Valve Handle", "block.create.creative_crate": "创造板条箱", + "block.create.creative_fluid_tank": "UNLOCALIZED: Creative Fluid Tank", "block.create.creative_motor": "创造马达", "block.create.crushing_wheel": "粉碎轮", "block.create.crushing_wheel_controller": "粉碎轮控制器", @@ -179,6 +180,8 @@ "block.create.hand_crank": "手摇曲柄", "block.create.horizontal_framed_glass": "竖直边框玻璃", "block.create.horizontal_framed_glass_pane": "竖直边框玻璃板", + "block.create.hose_pulley": "UNLOCALIZED: Hose Pulley", + "block.create.item_drain": "UNLOCALIZED: Item Drain", "block.create.jungle_window": "丛林窗户", "block.create.jungle_window_pane": "丛林窗户板", "block.create.large_cogwheel": "大齿轮", diff --git a/src/generated/resources/assets/create/models/block/creative_bottom.json b/src/generated/resources/assets/create/models/block/creative_bottom.json new file mode 100644 index 000000000..f78fb4955 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_bottom.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_bottom", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_bottom_window.json b/src/generated/resources/assets/create/models/block/creative_bottom_window.json new file mode 100644 index 000000000..2e1ca750d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_bottom_window.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_bottom_window", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_bottom_window_ne.json b/src/generated/resources/assets/create/models/block/creative_bottom_window_ne.json new file mode 100644 index 000000000..2deff3002 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_bottom_window_ne.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_bottom_window_ne", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_bottom_window_nw.json b/src/generated/resources/assets/create/models/block/creative_bottom_window_nw.json new file mode 100644 index 000000000..0731ad052 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_bottom_window_nw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_bottom_window_nw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_bottom_window_se.json b/src/generated/resources/assets/create/models/block/creative_bottom_window_se.json new file mode 100644 index 000000000..d96fd2319 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_bottom_window_se.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_bottom_window_se", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_bottom_window_sw.json b/src/generated/resources/assets/create/models/block/creative_bottom_window_sw.json new file mode 100644 index 000000000..5dc3463d8 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_bottom_window_sw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_bottom_window_sw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_middle.json b/src/generated/resources/assets/create/models/block/creative_middle.json new file mode 100644 index 000000000..71eca1c08 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_middle.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_middle", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_middle_window.json b/src/generated/resources/assets/create/models/block/creative_middle_window.json new file mode 100644 index 000000000..21ce237ea --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_middle_window.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_middle_window", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_middle_window_ne.json b/src/generated/resources/assets/create/models/block/creative_middle_window_ne.json new file mode 100644 index 000000000..9e320a620 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_middle_window_ne.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_middle_window_ne", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_middle_window_nw.json b/src/generated/resources/assets/create/models/block/creative_middle_window_nw.json new file mode 100644 index 000000000..020d67af6 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_middle_window_nw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_middle_window_nw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_middle_window_se.json b/src/generated/resources/assets/create/models/block/creative_middle_window_se.json new file mode 100644 index 000000000..d93c8f60b --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_middle_window_se.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_middle_window_se", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_middle_window_sw.json b/src/generated/resources/assets/create/models/block/creative_middle_window_sw.json new file mode 100644 index 000000000..b1616aea4 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_middle_window_sw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_middle_window_sw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_single.json b/src/generated/resources/assets/create/models/block/creative_single.json new file mode 100644 index 000000000..e4ddf2442 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_single.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_single", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_single_window.json b/src/generated/resources/assets/create/models/block/creative_single_window.json new file mode 100644 index 000000000..48f6d55f6 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_single_window.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_single_window", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_single_window_ne.json b/src/generated/resources/assets/create/models/block/creative_single_window_ne.json new file mode 100644 index 000000000..04e396d6d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_single_window_ne.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_single_window_ne", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_single_window_nw.json b/src/generated/resources/assets/create/models/block/creative_single_window_nw.json new file mode 100644 index 000000000..95627be45 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_single_window_nw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_single_window_nw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_single_window_se.json b/src/generated/resources/assets/create/models/block/creative_single_window_se.json new file mode 100644 index 000000000..6298b347c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_single_window_se.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_single_window_se", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_single_window_sw.json b/src/generated/resources/assets/create/models/block/creative_single_window_sw.json new file mode 100644 index 000000000..2922d5194 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_single_window_sw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_single_window_sw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_top.json b/src/generated/resources/assets/create/models/block/creative_top.json new file mode 100644 index 000000000..df3680697 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_top.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_top", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_top_window.json b/src/generated/resources/assets/create/models/block/creative_top_window.json new file mode 100644 index 000000000..a04004a03 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_top_window.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_top_window", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_top_window_ne.json b/src/generated/resources/assets/create/models/block/creative_top_window_ne.json new file mode 100644 index 000000000..9d23dea7c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_top_window_ne.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_top_window_ne", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_top_window_nw.json b/src/generated/resources/assets/create/models/block/creative_top_window_nw.json new file mode 100644 index 000000000..adbfc257c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_top_window_nw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_top_window_nw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_top_window_se.json b/src/generated/resources/assets/create/models/block/creative_top_window_se.json new file mode 100644 index 000000000..01f3e593c --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_top_window_se.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_top_window_se", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/creative_top_window_sw.json b/src/generated/resources/assets/create/models/block/creative_top_window_sw.json new file mode 100644 index 000000000..cc741f226 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/creative_top_window_sw.json @@ -0,0 +1,10 @@ +{ + "parent": "create:block/fluid_tank/block_top_window_sw", + "textures": { + "0": "create:block/creative_casing", + "1": "create:block/creative_fluid_tank", + "3": "create:block/creative_fluid_tank_window", + "4": "create:block/creative_fluid_tank_window_single", + "particle": "create:block/creative_fluid_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/creative_fluid_tank.json b/src/generated/resources/assets/create/models/item/creative_fluid_tank.json new file mode 100644 index 000000000..d021bc2a6 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/creative_fluid_tank.json @@ -0,0 +1,8 @@ +{ + "parent": "create:block/fluid_tank/block_single_window", + "textures": { + "5": "create:block/creative_fluid_tank_window_single", + "1": "create:block/creative_fluid_tank", + "0": "create:block/creative_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/hose_pulley.json b/src/generated/resources/assets/create/models/item/hose_pulley.json new file mode 100644 index 000000000..234080247 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/hose_pulley.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/hose_pulley/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/item_drain.json b/src/generated/resources/assets/create/models/item/item_drain.json new file mode 100644 index 000000000..9490da25f --- /dev/null +++ b/src/generated/resources/assets/create/models/item/item_drain.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/item_drain" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json new file mode 100644 index 000000000..bf53aa381 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/hose_pulley" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "tag": "forge:ingots/copper" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/hose_pulley" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/creative_fluid_tank.json b/src/generated/resources/data/create/loot_tables/blocks/creative_fluid_tank.json new file mode 100644 index 000000000..0135c3367 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/creative_fluid_tank.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:creative_fluid_tank" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/hose_pulley.json b/src/generated/resources/data/create/loot_tables/blocks/hose_pulley.json new file mode 100644 index 000000000..7be8a0b31 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/hose_pulley.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:hose_pulley" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/item_drain.json b/src/generated/resources/data/create/loot_tables/blocks/item_drain.json new file mode 100644 index 000000000..08949a5af --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/item_drain.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:item_drain" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/hose_pulley.json b/src/generated/resources/data/create/recipes/crafting/kinetics/hose_pulley.json new file mode 100644 index 000000000..ae6b27994 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/hose_pulley.json @@ -0,0 +1,28 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " B ", + "SCP", + " I " + ], + "key": { + "S": { + "item": "create:shaft" + }, + "P": { + "item": "create:fluid_pipe" + }, + "B": { + "item": "create:copper_casing" + }, + "C": { + "item": "minecraft:dried_kelp" + }, + "I": { + "tag": "forge:plates/copper" + } + }, + "result": { + "item": "create:hose_pulley" + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index cfbf8af94..4cfe13d22 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -68,8 +68,18 @@ public class AllBlockPartials { FURNACE_GENERATOR_FRAME = get("furnace_engine/frame"), CUCKOO_MINUTE_HAND = get("cuckoo_clock/minute_hand"), CUCKOO_HOUR_HAND = get("cuckoo_clock/hour_hand"), CUCKOO_LEFT_DOOR = get("cuckoo_clock/left_door"), CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"), - CUCKOO_CREEPER = get("cuckoo_clock/creeper"), ROPE_COIL = get("rope_pulley/rope_coil"), - ROPE_HALF = get("rope_pulley/rope_half"), ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"), + CUCKOO_CREEPER = get("cuckoo_clock/creeper"), + + ROPE_COIL = get("rope_pulley/rope_coil"), + ROPE_HALF = get("rope_pulley/rope_half"), + ROPE_HALF_MAGNET = get("rope_pulley/rope_half_magnet"), + + HOSE_COIL = get("hose_pulley/rope_coil"), + HOSE = get("hose_pulley/rope"), + HOSE_MAGNET = get("hose_pulley/pulley_magnet"), + HOSE_HALF = get("hose_pulley/rope_half"), + HOSE_HALF_MAGNET = get("hose_pulley/rope_half_magnet"), + MILLSTONE_COG = get("millstone/inner"), SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 3ebd6e98b..b7f73ff3f 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -65,6 +65,8 @@ import com.simibubi.create.content.contraptions.components.turntable.TurntableBl import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; import com.simibubi.create.content.contraptions.fluids.PipeAttachmentModel; import com.simibubi.create.content.contraptions.fluids.PumpBlock; +import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlock; +import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainBlock; import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock; import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; @@ -548,17 +550,49 @@ public class AllBlocks { } } - public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::new) + public static final BlockEntry FLUID_TANK = REGISTRATE.block("fluid_tank", FluidTankBlock::regular) .initialProperties(SharedProperties::softMetal) .properties(Block.Properties::nonOpaque) .blockstate(new FluidTankGenerator()::generate) - .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::new)) + .onRegister(CreateRegistrate + .blockModel(() -> m -> new FluidTankModel(m, AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING))) .addLayer(() -> RenderType::getCutoutMipped) .item(FluidTankItem::new) .model(AssetLookup.customItemModel("_", "block_single_window")) .build() .register(); + public static final BlockEntry CREATIVE_FLUID_TANK = + REGISTRATE.block("creative_fluid_tank", FluidTankBlock::creative) + .initialProperties(SharedProperties::softMetal) + .properties(Block.Properties::nonOpaque) + .blockstate(new FluidTankGenerator("creative_")::generate) + .onRegister(CreateRegistrate.blockModel( + () -> m -> new FluidTankModel(m, AllSpriteShifts.CREATIVE_FLUID_TANK, AllSpriteShifts.CREATIVE_CASING))) + .addLayer(() -> RenderType::getCutoutMipped) + .item(FluidTankItem::new) + .model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/fluid_tank/block_single_window")) + .texture("5", p.modLoc("block/creative_fluid_tank_window_single")) + .texture("1", p.modLoc("block/creative_fluid_tank")) + .texture("0", p.modLoc("block/creative_casing"))) + .build() + .register(); + + public static final BlockEntry HOSE_PULLEY = REGISTRATE.block("hose_pulley", HosePulleyBlock::new) + .initialProperties(SharedProperties::softMetal) + .blockstate(BlockStateGen.horizontalBlockProvider(true)) + .transform(StressConfigDefaults.setImpact(4.0)) + .item() + .transform(customItemModel()) + .register(); + + public static final BlockEntry ITEM_DRAIN = REGISTRATE.block("item_drain", ItemDrainBlock::new) + .initialProperties(SharedProperties::softMetal) + .addLayer(() -> RenderType::getCutoutMipped) + .blockstate((c, p) -> p.simpleBlock(c.get(), AssetLookup.standardModel(c, p))) + .simpleItem() + .register(); + public static final BlockEntry SPOUT = REGISTRATE.block("spout", SpoutBlock::new) .initialProperties(SharedProperties::softMetal) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 186426e85..60f71a3e8 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -25,6 +25,7 @@ public class AllShapes { public static final VoxelShaper CASING_14PX = shape(0, 0, 0, 16, 14, 16).forDirectional(), + CASING_13PX = shape(0, 0, 0, 16, 13, 16).forDirectional(), CASING_12PX = shape(0, 0, 0, 16, 12, 16).forDirectional(), CASING_11PX = shape(0, 0, 0, 16, 11, 16).forDirectional(), MOTOR_BLOCK = shape(3, 0, 3, 13, 14, 13).forDirectional(), @@ -34,11 +35,12 @@ public class AllShapes { .forHorizontal(Direction.SOUTH), PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 14, 16).forDirectional(), PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14) + .add(2, 13, 2, 14, 16, 14) .add(0, 0, 14, 16, 16, 16) .forHorizontalAxis(), - SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14).forDirectional(), - SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), - SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(), + SAIL_FRAME_COLLISION = shape(0, 5, 0, 16, 9, 16).erase(2, 0, 2, 14, 16, 14) + .forDirectional(), + SAIL_FRAME = shape(0, 5, 0, 16, 9, 16).forDirectional(), SAIL = shape(0, 5, 0, 16, 10, 16).forDirectional(), SPEED_CONTROLLER = shape(0, 0, 0, 16, 2, 16).add(1, 1, 1, 15, 15, 15) .erase(0, 8, 5, 16, 16, 11) .add(2, 9, 2, 14, 14, 14) @@ -121,9 +123,6 @@ public class AllShapes { LOGISTICS_TABLE_SLOPE = shape(0, 10, 15, 16, 14, 10.667).add(0, 12, 10.667, 16, 16, 6.333) .add(0, 14, 6.333, 16, 18, 2) .build(), - SCHEMATICS_TABLE_SLOPE = shape(0, 10, 16, 16, 14, 11).add(0, 12, 11, 16, 16, 6) - .add(0, 14, 6, 16, 18, 1) - .build(), TANK_BOTTOM_LID = shape(0, 0, 0, 16, 4, 16).build(), TANK_TOP_LID = shape(0, 12, 0, 16, 16, 16).build() ; @@ -196,7 +195,7 @@ public class AllShapes { .withVerticalShapes(LOGISTICAL_CONTROLLER.get(UP)), LOGISTICS_TABLE = shape(TABLE_POLE_SHAPE).add(LOGISTICS_TABLE_SLOPE) .forHorizontal(SOUTH), - SCHEMATICS_TABLE = shape(TABLE_POLE_SHAPE).add(SCHEMATICS_TABLE_SLOPE) + SCHEMATICS_TABLE = shape(4, 0, 4, 12, 12, 12).add(0, 11, 2, 16, 14, 14) .forDirectional(SOUTH), CHUTE_SLOPE = shape(ChuteShapes.createSlope()).forHorizontal(SOUTH) diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 5fa92ea72..9d8fee9b0 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -42,7 +42,8 @@ public class AllSpriteShifts { BRASS_CASING = omni("brass_casing"), COPPER_CASING = omni("copper_casing"), SHADOW_STEEL_CASING = omni("shadow_steel_casing"), - REFINED_RADIANCE_CASING = omni("refined_radiance_casing"); + REFINED_RADIANCE_CASING = omni("refined_radiance_casing"), + CREATIVE_CASING = getCT(CTType.CROSS, "creative_casing"); public static final CTSpriteShiftEntry CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"), @@ -50,7 +51,8 @@ public class AllSpriteShifts { public static final CTSpriteShiftEntry BRASS_TUNNEL_TOP = vertical("brass_tunnel_top"), - FLUID_TANK = getCT(CTType.CROSS, "fluid_tank"); + FLUID_TANK = getCT(CTType.CROSS, "fluid_tank"), + CREATIVE_FLUID_TANK = getCT(CTType.CROSS, "creative_fluid_tank"); public static final SpriteShiftEntry BELT = SpriteShifter.get("block/belt", "block/belt_animated"), diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index f4eb24b27..e9fe27c1f 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -48,6 +48,8 @@ import com.simibubi.create.content.contraptions.components.turntable.TurntableTi import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelTileEntity; import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; +import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; @@ -56,6 +58,7 @@ import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntit import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer; +import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; import com.simibubi.create.content.contraptions.processing.BasinRenderer; @@ -120,7 +123,6 @@ public class AllTileEntities { public static final TileEntityEntry SCHEMATIC_TABLE = Create.registrate() .tileEntity("schematic_table", SchematicTableTileEntity::new) .validBlocks(AllBlocks.SCHEMATIC_TABLE) - // .renderer(() -> renderer) .register(); // Kinetics @@ -202,7 +204,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.MECHANICAL_PUMP) .renderer(() -> PumpRenderer::new) .register(); - + public static final TileEntityEntry SMART_FLUID_PIPE = Create.registrate() .tileEntity("smart_fluid_pipe", SmartFluidPipeTileEntity::new) .validBlocks(AllBlocks.SMART_FLUID_PIPE) @@ -224,7 +226,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.GLASS_FLUID_PIPE) .renderer(() -> TransparentStraightPipeRenderer::new) .register(); - + public static final TileEntityEntry FLUID_VALVE = Create.registrate() .tileEntity("fluid_valve", FluidValveTileEntity::new) .validBlocks(AllBlocks.FLUID_VALVE) @@ -237,6 +239,18 @@ public class AllTileEntities { .renderer(() -> FluidTankRenderer::new) .register(); + public static final TileEntityEntry CREATIVE_FLUID_TANK = Create.registrate() + .tileEntity("creative_fluid_tank", CreativeFluidTankTileEntity::new) + .validBlocks(AllBlocks.CREATIVE_FLUID_TANK) + .renderer(() -> FluidTankRenderer::new) + .register(); + + public static final TileEntityEntry HOSE_PULLEY = Create.registrate() + .tileEntity("hose_pulley", HosePulleyTileEntity::new) + .validBlocks(AllBlocks.HOSE_PULLEY) + .renderer(() -> HosePulleyRenderer::new) + .register(); + public static final TileEntityEntry SPOUT = Create.registrate() .tileEntity("spout", SpoutTileEntity::new) .validBlocks(AllBlocks.SPOUT) @@ -284,7 +298,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.WINDMILL_BEARING) .renderer(() -> BearingRenderer::new) .register(); - + public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_BEARING) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java index 0de1bc213..dad00ef95 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalKineticBlock.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.contraptions.base; +import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItemUseContext; @@ -26,18 +28,20 @@ public abstract class HorizontalKineticBlock extends KineticBlock { @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - return this.getDefaultState().with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing().getOpposite()); + return this.getDefaultState() + .with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing() + .getOpposite()); } public Direction getPreferredHorizontalFacing(BlockItemUseContext context) { Direction prefferedSide = null; - for (Direction side : Direction.values()) { - if (side.getAxis().isVertical()) - continue; - BlockState blockState = context.getWorld().getBlockState(context.getPos().offset(side)); + for (Direction side : Iterate.horizontalDirections) { + BlockState blockState = context.getWorld() + .getBlockState(context.getPos() + .offset(side)); if (blockState.getBlock() instanceof IRotate) { - if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos().offset(side), - blockState, side.getOpposite())) + if (((IRotate) blockState.getBlock()).hasShaftTowards(context.getWorld(), context.getPos() + .offset(side), blockState, side.getOpposite())) if (prefferedSide != null && prefferedSide.getAxis() != side.getAxis()) { prefferedSide = null; break; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java index ea4a3e165..80abce264 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntity.java @@ -1020,5 +1020,5 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD public boolean isOnePlayerRiding() { return false; } - + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index 6496c6095..2fb7a5ed1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -72,8 +72,11 @@ public class SailBlock extends ProperDirectionalBlock { BlockPos offsetPos = pos.offset(offset); if (!world.isRemote && world.getBlockState(offsetPos) .getMaterial() - .isReplaceable()) + .isReplaceable()) { world.setBlockState(offsetPos, blockState); + if (!player.isCreative()) + heldItem.shrink(1); + } return ActionResultType.SUCCESS; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index 6365ac1ae..7fb9d23a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -20,6 +20,7 @@ import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.IWorld; +import net.minecraft.world.World; public class PulleyRenderer extends KineticTileEntityRenderer { @@ -38,6 +39,7 @@ public class PulleyRenderer extends KineticTileEntityRenderer { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); PulleyTileEntity pulley = (PulleyTileEntity) te; + World world = te.getWorld(); BlockState blockState = te.getBlockState(); BlockPos pos = te.getPos(); @@ -46,7 +48,8 @@ public class PulleyRenderer extends KineticTileEntityRenderer { SuperByteBuffer magnet = CreateClient.bufferCache.renderBlock(AllBlocks.PULLEY_MAGNET.getDefaultState()); SuperByteBuffer rope = CreateClient.bufferCache.renderBlock(AllBlocks.ROPE.getDefaultState()); - boolean moving = pulley.running && (pulley.movedContraption == null || !pulley.movedContraption.isStalled()); + boolean running = pulley.running; + boolean moving = running && (pulley.movedContraption == null || !pulley.movedContraption.isStalled()); float offset = pulley.getInterpolatedOffset(moving ? partialTicks : 0.5f); if (pulley.movedContraption != null) { @@ -56,23 +59,28 @@ public class PulleyRenderer extends KineticTileEntityRenderer { offset = (float) -(entityPos - c.getAnchor().getY() - c.initialOffset); } + renderPulleyRope(ms, buffer, world, pos, halfMagnet, halfRope, magnet, rope, running, offset); + } + + public static void renderPulleyRope(MatrixStack ms, IRenderTypeBuffer buffer, World world, BlockPos pos, + SuperByteBuffer halfMagnet, SuperByteBuffer halfRope, SuperByteBuffer magnet, SuperByteBuffer rope, + boolean running, float offset) { IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - - if (pulley.running || pulley.offset == 0) - renderAt(te.getWorld(), offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb); + if (running || offset == 0) + renderAt(world, offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb); float f = offset % 1; if (offset > .75f && (f < .25f || f > .75f)) - renderAt(te.getWorld(), halfRope, f > .75f ? f - 1 : f, pos, ms, vb); + renderAt(world, halfRope, f > .75f ? f - 1 : f, pos, ms, vb); - if (!pulley.running) + if (!running) return; for (int i = 0; i < offset - 1.25f; i++) - renderAt(te.getWorld(), rope, offset - i - 1, pos, ms, vb); + renderAt(world, rope, offset - i - 1, pos, ms, vb); } - public void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos, + public static void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos, MatrixStack ms, IVertexBuilder buffer) { BlockPos actualPos = pulleyPos.down((int) offset); int light = WorldRenderer.getLightmapCoordinates(world, world.getBlockState(actualPos), actualPos); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java new file mode 100644 index 000000000..8cf78dbd7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java @@ -0,0 +1,51 @@ +package com.simibubi.create.content.contraptions.fluids; + +import java.util.Random; + +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +public class FluidFX { + + static Random r = new Random(); + + public static void splash(BlockPos pos, FluidStack fluidStack) { + Fluid fluid = fluidStack.getFluid(); + if (fluid == Fluids.EMPTY) + return; + + IFluidState defaultState = fluid.getDefaultState(); + if (defaultState == null || defaultState.isEmpty()) { + return; + } + + BlockParticleData blockParticleData = new BlockParticleData(ParticleTypes.BLOCK, defaultState.getBlockState()); + Vec3d center = VecHelper.getCenterOf(pos); + + for (int i = 0; i < 20; i++) { + Vec3d v = VecHelper.offsetRandomly(Vec3d.ZERO, r, .25f); + particle(blockParticleData, center.add(v), v); + } + + } + + private static void particle(IParticleData data, Vec3d pos, Vec3d motion) { + world().addParticle(data, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); + } + + private static World world() { + return Minecraft.getInstance().world; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java index 0edd0cfd0..07cd96b44 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.fluids; +import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; @@ -24,7 +25,8 @@ public class FluidPipeAttachmentBehaviour extends TileEntityBehaviour { .getAxis() == direction.getAxis()) return AttachmentTypes.NONE; - if (FluidPropagator.hasFluidCapability(facingState, world, offsetPos, direction)) + if (FluidPropagator.hasFluidCapability(facingState, world, offsetPos, direction) + && !AllBlocks.HOSE_PULLEY.has(facingState)) return AttachmentTypes.DRAIN; return AttachmentTypes.RIM; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java new file mode 100644 index 000000000..f2fff1737 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -0,0 +1,347 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.utility.Debug; + +import it.unimi.dsi.fastutil.PriorityQueue; +import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +public class FluidDrainingBehaviour extends FluidManipulationBehaviour { + + Fluid fluid; + + // Execution + Set validationSet; + PriorityQueue queue; + boolean isValid; + + // Validation + List validationFrontier; + Set validationVisited; + Set newValidationSet; + + public FluidDrainingBehaviour(SmartTileEntity te) { + super(te); + validationVisited = new HashSet<>(); + validationFrontier = new ArrayList<>(); + validationSet = new HashSet<>(); + newValidationSet = new HashSet<>(); + queue = new ObjectHeapPriorityQueue<>(this::comparePositions); + } + + @Nullable + public boolean pullNext(BlockPos root, boolean simulate) { + if (!frontier.isEmpty()) + return false; + if (!Objects.equals(root, rootPos)) { + rebuildContext(root); + return false; + } + + if (counterpartActed) { + Debug.debugChat(" Counterpart acted"); + counterpartActed = false; + softReset(root); + return false; + } + + if (affectedArea == null) + affectedArea = new MutableBoundingBox(root, root); + + World world = getWorld(); + if (!queue.isEmpty() && !isValid) { + rebuildContext(root); + return false; + } + + if (validationFrontier.isEmpty() && !queue.isEmpty() && !simulate && revalidateIn == 0) + revalidate(root); + + while (!queue.isEmpty()) { + // Dont dequeue here, so we can decide not to dequeue a valid entry when + // simulating + BlockPos currentPos = queue.first().pos; + BlockState blockState = world.getBlockState(currentPos); + BlockState emptied = blockState; + Fluid fluid = Fluids.EMPTY; + + if (blockState.has(BlockStateProperties.WATERLOGGED) && blockState.get(BlockStateProperties.WATERLOGGED)) { + emptied = blockState.with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(false)); + fluid = Fluids.WATER; + } else if (blockState.getBlock() instanceof FlowingFluidBlock) { + FlowingFluidBlock flowingFluid = (FlowingFluidBlock) blockState.getBlock(); + emptied = Blocks.AIR.getDefaultState(); + if (blockState.get(FlowingFluidBlock.LEVEL) == 0) + fluid = flowingFluid.getFluid(); + else { + affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos)); + world.setBlockState(currentPos, emptied, 2 | 16); + queue.dequeue(); + if (queue.isEmpty()) { + isValid = checkValid(world, rootPos); + reset(); + } + continue; + } + } else if (blockState.getFluidState() + .getFluid() != Fluids.EMPTY + && blockState.getCollisionShape(world, currentPos, ISelectionContext.dummy()) + .isEmpty()) { + fluid = blockState.getFluidState() + .getFluid(); + emptied = Blocks.AIR.getDefaultState(); + } + + if (this.fluid == null) + this.fluid = fluid; + + if (!this.fluid.isEquivalentTo(fluid)) { + queue.dequeue(); + if (queue.isEmpty()) { + isValid = checkValid(world, rootPos); + reset(); + } + continue; + } + + if (simulate) + return true; + + playEffect(world, currentPos, fluid, true); + + if (infinite) + return true; + + world.setBlockState(currentPos, emptied, 2 | 16); + affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos)); + + queue.dequeue(); + if (queue.isEmpty()) { + isValid = checkValid(world, rootPos); + reset(); + } else if (!validationSet.contains(currentPos)) { + Debug.debugChat(" Drained unreachable fluid - rebuilding"); + reset(); + } + return true; + } + + if (rootPos == null) + return false; + + if (isValid) + rebuildContext(root); + + return false; + } + + protected void softReset(BlockPos root) { + queue.clear(); + validationSet.clear(); + newValidationSet.clear(); + validationFrontier.clear(); + validationVisited.clear(); + visited.clear(); + infinite = false; + setValidationTimer(); + frontier.add(new BlockPosEntry(root, 0)); + } + + protected boolean checkValid(World world, BlockPos root) { + BlockPos currentPos = root; + for (int timeout = 1000; timeout > 0 && !root.equals(tileEntity.getPos()); timeout--) { + FluidBlockType canPullFluidsFrom = canPullFluidsFrom(world.getBlockState(currentPos), currentPos); + if (canPullFluidsFrom == FluidBlockType.FLOWING) { + currentPos = currentPos.up(); + continue; + } + if (canPullFluidsFrom == FluidBlockType.SOURCE) + return true; + break; + } + return false; + } + + enum FluidBlockType { + NONE, SOURCE, FLOWING; + } + + @Override + public void read(CompoundNBT nbt, boolean clientPacket) { + super.read(nbt, clientPacket); + if (!clientPacket && affectedArea != null) + frontier.add(new BlockPosEntry(rootPos, 0)); + } + + protected FluidBlockType canPullFluidsFrom(BlockState blockState, BlockPos pos) { + if (blockState.has(BlockStateProperties.WATERLOGGED) && blockState.get(BlockStateProperties.WATERLOGGED)) + return FluidBlockType.SOURCE; + if (blockState.getBlock() instanceof FlowingFluidBlock) + return blockState.get(FlowingFluidBlock.LEVEL) == 0 ? FluidBlockType.SOURCE : FluidBlockType.FLOWING; + if (blockState.getFluidState() + .getFluid() != Fluids.EMPTY && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.dummy()) + .isEmpty()) + return FluidBlockType.SOURCE; + return FluidBlockType.NONE; + } + + @Override + public void tick() { + super.tick(); + if (rootPos != null) + isValid = checkValid(getWorld(), rootPos); + if (!frontier.isEmpty()) { + continueSearch(); + return; + } + if (!validationFrontier.isEmpty()) { + continueValidation(); + return; + } + if (revalidateIn > 0) + revalidateIn--; + } + + @Override + public void lazyTick() { + super.lazyTick(); + } + + public void rebuildContext(BlockPos root) { + reset(); + Debug.debugChat("Rebuilding!"); + rootPos = root; + affectedArea = new MutableBoundingBox(rootPos, rootPos); + if (isValid) + frontier.add(new BlockPosEntry(root, 0)); + } + + public void revalidate(BlockPos root) { + Debug.debugChat("Revalidating!"); + validationFrontier.clear(); + validationVisited.clear(); + newValidationSet.clear(); + validationFrontier.add(new BlockPosEntry(root, 0)); + setValidationTimer(); + } + + private void continueSearch() { + search(fluid, frontier, visited, (e, d) -> { + queue.enqueue(new BlockPosEntry(e, d)); + validationSet.add(e); + }, false); + Debug.debugChat("<...> Building - queue size " + queue.size()); + + World world = getWorld(); + int maxBlocks = maxBlocks(); + if (visited.size() > maxBlocks) { + infinite = true; + // Find first block with valid fluid + while (true) { + BlockPos first = queue.first().pos; + if (canPullFluidsFrom(world.getBlockState(first), first) != FluidBlockType.SOURCE) { + queue.dequeue(); + continue; + } + break; + } + BlockPos firstValid = queue.first().pos; + frontier.clear(); + visited.clear(); + queue.clear(); + queue.enqueue(new BlockPosEntry(firstValid, 0)); + tileEntity.sendData(); + Debug.debugChat(" Build complete - infinite"); + return; + } + + if (!frontier.isEmpty()) + return; + + Debug.debugChat(" Build complete - queue size " + queue.size()); + tileEntity.sendData(); + visited.clear(); + } + + private void continueValidation() { + search(fluid, validationFrontier, validationVisited, (e, d) -> newValidationSet.add(e), false); + Debug.debugChat("<...> Validating - set size " + newValidationSet.size()); + + int maxBlocks = maxBlocks(); + if (validationVisited.size() > maxBlocks) { + if (!infinite) { + Debug.debugChat(" Validation complete - now infinite"); + reset(); + } + Debug.debugChat("Validation complete - still infinite"); + validationFrontier.clear(); + setLongValidationTimer(); + return; + } + + if (!validationFrontier.isEmpty()) + return; + if (infinite) { + Debug.debugChat(" Validation complete - no longer infinite"); + reset(); + return; + } + + Debug.debugChat("Validation complete - set size " + newValidationSet.size()); + validationSet = newValidationSet; + newValidationSet = new HashSet<>(); + validationVisited.clear(); + } + + @Override + public void reset() { + Debug.debugChat(" RESET"); + super.reset(); + + fluid = null; + rootPos = null; + queue.clear(); + validationSet.clear(); + newValidationSet.clear(); + validationFrontier.clear(); + validationVisited.clear(); + } + + public static BehaviourType TYPE = new BehaviourType<>(); + + @Override + public BehaviourType getType() { + return TYPE; + } + + protected boolean isSearching() { + return !frontier.isEmpty(); + } + + public FluidStack getDrainableFluid(BlockPos rootPos) { + return fluid == null || isSearching() || !pullNext(rootPos, true) ? FluidStack.EMPTY + : new FluidStack(fluid, 1000); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java new file mode 100644 index 000000000..f9254dbac --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -0,0 +1,265 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.utility.Debug; +import com.simibubi.create.foundation.utility.Iterate; + +import it.unimi.dsi.fastutil.PriorityQueue; +import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; +import net.minecraft.block.BlockState; +import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.Fluids; +import net.minecraft.fluid.IFluidState; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.world.ITickList; +import net.minecraft.world.NextTickListEntry; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerTickList; + +public class FluidFillingBehaviour extends FluidManipulationBehaviour { + + PriorityQueue queue; + + List infinityCheckFrontier; + Set infinityCheckVisited; + + public FluidFillingBehaviour(SmartTileEntity te) { + super(te); + queue = new ObjectHeapPriorityQueue<>((p, p2) -> -comparePositions(p, p2)); + revalidateIn = 1; + infinityCheckFrontier = new ArrayList<>(); + infinityCheckVisited = new HashSet<>(); + } + + @Override + public void tick() { + super.tick(); + if (!infinityCheckFrontier.isEmpty() && rootPos != null) { + Fluid fluid = getWorld().getFluidState(rootPos) + .getFluid(); + if (fluid != Fluids.EMPTY) + continueValidation(fluid); + } + if (revalidateIn > 0) + revalidateIn--; + } + + protected void continueValidation(Fluid fluid) { + search(fluid, infinityCheckFrontier, infinityCheckVisited, + (p, d) -> infinityCheckFrontier.add(new BlockPosEntry(p, d)), true); + int maxBlocks = maxBlocks(); + + if (infinityCheckVisited.size() > maxBlocks) { + if (!infinite) { + Debug.debugChat(" Filler Validation complete - now infinite"); + reset(); + infinite = true; + } + Debug.debugChat("Filler Validation complete - still infinite"); + infinityCheckFrontier.clear(); + setLongValidationTimer(); + return; + } + + if (!infinityCheckFrontier.isEmpty()) + return; + if (infinite) { + Debug.debugChat(" Filler Validation complete - no longer infinite"); + reset(); + return; + } + + infinityCheckVisited.clear(); + } + + public boolean tryDeposit(Fluid fluid, BlockPos root, boolean simulate) { + if (!Objects.equals(root, rootPos)) { + reset(); + rootPos = root; + queue.enqueue(new BlockPosEntry(root, 0)); + affectedArea = new MutableBoundingBox(rootPos, rootPos); + return false; + } + + if (counterpartActed) { + Debug.debugChat(" Counterpart acted"); + counterpartActed = false; + softReset(root); + return false; + } + + if (affectedArea == null) + affectedArea = new MutableBoundingBox(root, root); + + if (revalidateIn == 0) { + visited.clear(); + infinityCheckFrontier.clear(); + infinityCheckVisited.clear(); + infinityCheckFrontier.add(new BlockPosEntry(root, 0)); + setValidationTimer(); + softReset(root); + } + + World world = getWorld(); + int maxRange = maxRange(); + int maxRangeSq = maxRange * maxRange; + int maxBlocks = maxBlocks(); + + if (infinite) { + IFluidState fluidState = world.getFluidState(rootPos); + boolean equivalentTo = fluidState.getFluid() + .isEquivalentTo(fluid); + if (!equivalentTo) + return false; + if (simulate) + return true; + playEffect(world, BlockPos.ZERO, fluid, false); + return true; + } + + boolean success = false; + for (int i = 0; !success && !queue.isEmpty() && i < searchedPerTick; i++) { + BlockPosEntry entry = queue.first(); + BlockPos currentPos = entry.pos; + + if (visited.contains(currentPos)) { + queue.dequeue(); + continue; + } + + if (!simulate) + visited.add(currentPos); + + if (visited.size() >= maxBlocks) { + Debug.debugChat(" Search exceeded - now infinite"); + infinite = true; + visited.clear(); + queue.clear(); + return false; + } + + SpaceType spaceType = getAtPos(world, currentPos, fluid); + if (spaceType == SpaceType.BLOCKING) + continue; + if (spaceType == SpaceType.FILLABLE) { + success = true; + if (!simulate) { + playEffect(world, currentPos, fluid, false); + + BlockState blockState = world.getBlockState(currentPos); + if (blockState.has(BlockStateProperties.WATERLOGGED) && fluid.isEquivalentTo(Fluids.WATER)) { + world.setBlockState(currentPos, blockState.with(BlockStateProperties.WATERLOGGED, true), + 2 | 16); + } else { + world.setBlockState(currentPos, fluid.getDefaultState() + .getBlockState(), 2 | 16); + } + + ITickList pendingFluidTicks = world.getPendingFluidTicks(); + if (pendingFluidTicks instanceof ServerTickList) { + ServerTickList serverTickList = (ServerTickList) pendingFluidTicks; + NextTickListEntry removedEntry = null; + for (NextTickListEntry nextTickListEntry : serverTickList.pendingTickListEntriesHashSet) { + if (nextTickListEntry.position.equals(currentPos)) { + removedEntry = nextTickListEntry; + break; + } + } + if (removedEntry != null) { + serverTickList.pendingTickListEntriesHashSet.remove(removedEntry); + serverTickList.pendingTickListEntriesTreeSet.remove(removedEntry); + } + } + + affectedArea.expandTo(new MutableBoundingBox(currentPos, currentPos)); + } + } + + if (simulate && success) + return true; + + visited.add(currentPos); + queue.dequeue(); + + for (Direction side : Iterate.directions) { + if (side == Direction.UP) + continue; + + BlockPos offsetPos = currentPos.offset(side); + if (visited.contains(offsetPos)) + continue; + if (offsetPos.distanceSq(rootPos) > maxRangeSq) + continue; + + SpaceType nextSpaceType = getAtPos(world, offsetPos, fluid); + if (nextSpaceType != SpaceType.BLOCKING) + queue.enqueue(new BlockPosEntry(offsetPos, entry.distance + 1)); + } + } + + return success; + } + + protected void softReset(BlockPos root) { + visited.clear(); + queue.clear(); + queue.enqueue(new BlockPosEntry(root, 0)); + infinite = false; + setValidationTimer(); + } + + enum SpaceType { + FILLABLE, FILLED, BLOCKING + } + + protected SpaceType getAtPos(World world, BlockPos pos, Fluid toFill) { + BlockState blockState = world.getBlockState(pos); + IFluidState fluidState = blockState.getFluidState(); + + if (blockState.has(BlockStateProperties.WATERLOGGED)) + return toFill.isEquivalentTo(Fluids.WATER) + ? blockState.get(BlockStateProperties.WATERLOGGED) ? SpaceType.FILLED : SpaceType.FILLABLE + : SpaceType.BLOCKING; + + if (blockState.getBlock() instanceof FlowingFluidBlock) + return blockState.get(FlowingFluidBlock.LEVEL) == 0 + ? toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING + : SpaceType.FILLABLE; + + if (fluidState.getFluid() != Fluids.EMPTY + && blockState.getCollisionShape(getWorld(), pos, ISelectionContext.dummy()) + .isEmpty()) + return toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING; + + return blockState.getMaterial() + .isReplaceable() ? SpaceType.FILLABLE : SpaceType.BLOCKING; + } + + @Override + public void reset() { + super.reset(); + queue.clear(); + infinityCheckFrontier.clear(); + infinityCheckVisited.clear(); + } + + public static BehaviourType TYPE = new BehaviourType<>(); + + @Override + public BehaviourType getType() { + return TYPE; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java new file mode 100644 index 000000000..3150c6011 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java @@ -0,0 +1,222 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; + +import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.IFluidState; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvent; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; +import net.minecraftforge.fluids.FluidStack; + +public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { + + protected static class BlockPosEntry { + public BlockPos pos; + public int distance; + + public BlockPosEntry(BlockPos pos, int distance) { + this.pos = pos; + this.distance = distance; + } + } + + MutableBoundingBox affectedArea; + BlockPos rootPos; + boolean infinite; + protected boolean counterpartActed; + + // Search + static final int searchedPerTick = 256; + List frontier; + Set visited; + + static final int validationTimer = 160; + int revalidateIn; + + public FluidManipulationBehaviour(SmartTileEntity te) { + super(te); + setValidationTimer(); + infinite = false; + visited = new HashSet<>(); + frontier = new ArrayList<>(); + } + + public void counterpartActed() { + counterpartActed = true; + } + + protected int setValidationTimer() { + return revalidateIn = validationTimer; + } + + protected int setLongValidationTimer() { + return revalidateIn = validationTimer * 2; + } + + protected int maxRange() { + return 128; + } + + protected int maxBlocks() { + return 10000; + } + + public void reset() { + if (affectedArea != null) + scheduleUpdatesInAffectedArea(); + affectedArea = null; + setValidationTimer(); + frontier.clear(); + visited.clear(); + infinite = false; + } + + @Override + public void destroy() { + reset(); + super.destroy(); + } + + protected void scheduleUpdatesInAffectedArea() { + World world = getWorld(); + affectedArea = new MutableBoundingBox(affectedArea.minX - 1, affectedArea.minY - 1, affectedArea.minZ - 1, + affectedArea.maxX + 1, affectedArea.maxY + 1, affectedArea.maxZ + 1); + BlockPos.func_229383_a_(affectedArea) + .forEach(pos -> { + IFluidState nextFluidState = world.getFluidState(pos); + if (nextFluidState.isEmpty()) + return; + world.getPendingFluidTicks() + .scheduleTick(pos, nextFluidState.getFluid(), world.getRandom() + .nextInt(5)); + }); + } + + protected int comparePositions(BlockPosEntry e1, BlockPosEntry e2) { + Vec3d centerOfRoot = VecHelper.getCenterOf(rootPos); + BlockPos pos2 = e2.pos; + BlockPos pos1 = e1.pos; + if (pos1.getY() != pos2.getY()) + return Integer.compare(pos2.getY(), pos1.getY()); + int compareDistance = Integer.compare(e2.distance, e1.distance); + if (compareDistance != 0) + return compareDistance; + return Double.compare(VecHelper.getCenterOf(pos2) + .squareDistanceTo(centerOfRoot), + VecHelper.getCenterOf(pos1) + .squareDistanceTo(centerOfRoot)); + } + + protected void search(Fluid fluid, List frontier, Set visited, + BiConsumer add, boolean searchDownward) { + World world = getWorld(); + int maxBlocks = maxBlocks(); + int maxRange = maxRange(); + int maxRangeSq = maxRange * maxRange; + int i; + + for (i = 0; i < searchedPerTick && !frontier.isEmpty() && visited.size() <= maxBlocks; i++) { + BlockPosEntry entry = frontier.remove(0); + BlockPos currentPos = entry.pos; + if (visited.contains(currentPos)) + continue; + visited.add(currentPos); + + IFluidState fluidState = world.getFluidState(currentPos); + if (fluidState.isEmpty()) + continue; + + Fluid currentFluid = FluidHelper.convertToStill(fluidState.getFluid()); + if (fluid == null) + fluid = currentFluid; + if (!currentFluid.isEquivalentTo(fluid)) + continue; + + add.accept(currentPos, entry.distance); + + for (Direction side : Iterate.directions) { + if (!searchDownward && side == Direction.DOWN) + continue; + + BlockPos offsetPos = currentPos.offset(side); + if (visited.contains(offsetPos)) + continue; + if (offsetPos.distanceSq(rootPos) > maxRangeSq) + continue; + + IFluidState nextFluidState = world.getFluidState(offsetPos); + if (nextFluidState.isEmpty()) + continue; + Fluid nextFluid = nextFluidState.getFluid(); + if (nextFluid == FluidHelper.convertToFlowing(nextFluid) && side == Direction.UP + && !VecHelper.onSameAxis(rootPos, offsetPos, Axis.Y)) + continue; + + frontier.add(new BlockPosEntry(offsetPos, entry.distance + 1)); + } + } + } + + protected void playEffect(World world, BlockPos pos, Fluid fluid, boolean fillSound) { + BlockPos splooshPos = infinite ? tileEntity.getPos() : pos; + + SoundEvent soundevent = fillSound ? fluid.getAttributes() + .getFillSound() + : fluid.getAttributes() + .getEmptySound(); + if (soundevent == null) + soundevent = fluid.isIn(FluidTags.LAVA) + ? fillSound ? SoundEvents.ITEM_BUCKET_FILL_LAVA : SoundEvents.ITEM_BUCKET_EMPTY_LAVA + : fillSound ? SoundEvents.ITEM_BUCKET_FILL : SoundEvents.ITEM_BUCKET_EMPTY; + + world.playSound(null, splooshPos, soundevent, SoundCategory.BLOCKS, 0.3F, 1.0F); + if (world instanceof ServerWorld) + AllPackets.sendToNear(world, splooshPos, 10, new FluidSplashPacket(splooshPos, new FluidStack(fluid, 1))); + } + + @Override + public void write(CompoundNBT nbt, boolean clientPacket) { + if (rootPos != null) + nbt.put("LastPos", NBTUtil.writeBlockPos(rootPos)); + if (affectedArea != null) { + nbt.put("AffectedAreaFrom", + NBTUtil.writeBlockPos(new BlockPos(affectedArea.minX, affectedArea.minY, affectedArea.minZ))); + nbt.put("AffectedAreaTo", + NBTUtil.writeBlockPos(new BlockPos(affectedArea.maxX, affectedArea.maxY, affectedArea.maxZ))); + } + super.write(nbt, clientPacket); + } + + @Override + public void read(CompoundNBT nbt, boolean clientPacket) { + if (nbt.contains("LastPos")) + rootPos = NBTUtil.readBlockPos(nbt.getCompound("LastPos")); + if (nbt.contains("AffectedAreaFrom") && nbt.contains("AffectedAreaTo")) + affectedArea = new MutableBoundingBox(NBTUtil.readBlockPos(nbt.getCompound("AffectedAreaFrom")), + NBTUtil.readBlockPos(nbt.getCompound("AffectedAreaTo"))); + super.read(nbt, clientPacket); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java new file mode 100644 index 000000000..1489e52b7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidSplashPacket.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.function.Supplier; + +import com.simibubi.create.content.contraptions.fluids.FluidFX; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class FluidSplashPacket extends SimplePacketBase { + + private BlockPos pos; + private FluidStack fluid; + + public FluidSplashPacket(BlockPos pos, FluidStack fluid) { + this.pos = pos; + this.fluid = fluid; + } + + public FluidSplashPacket(PacketBuffer buffer) { + pos = buffer.readBlockPos(); + fluid = buffer.readFluidStack(); + } + + public void write(PacketBuffer buffer) { + buffer.writeBlockPos(pos); + buffer.writeFluidStack(fluid); + } + + public void handle(Supplier ctx) { + ctx.get() + .enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + if (Minecraft.getInstance().player.getPositionVector() + .distanceTo(new Vec3d(pos)) > 100) + return; + FluidFX.splash(pos, fluid); + })); + ctx.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java new file mode 100644 index 000000000..7ec814a63 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyBlock.java @@ -0,0 +1,107 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.base.HorizontalKineticBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; + +public class HosePulleyBlock extends HorizontalKineticBlock implements ITE { + + public HosePulleyBlock(Properties properties) { + super(properties); + } + + @Override + public Axis getRotationAxis(BlockState state) { + return state.get(HORIZONTAL_FACING) + .rotateY() + .getAxis(); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + Direction preferredHorizontalFacing = getPreferredHorizontalFacing(context); + return this.getDefaultState() + .with(HORIZONTAL_FACING, + preferredHorizontalFacing != null ? preferredHorizontalFacing.rotateYCCW() + : context.getPlacementHorizontalFacing() + .getOpposite()); + } + + @Override + public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { + return state.get(HORIZONTAL_FACING) + .rotateY() == face; + } + + public static boolean hasPipeTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { + return state.get(HORIZONTAL_FACING) + .rotateYCCW() == face; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.HOSE_PULLEY.create(); + } + + @Override + public Direction getPreferredHorizontalFacing(BlockItemUseContext context) { + Direction fromParent = super.getPreferredHorizontalFacing(context); + if (fromParent != null) + return fromParent; + + Direction prefferedSide = null; + for (Direction facing : Iterate.horizontalDirections) { + BlockPos pos = context.getPos() + .offset(facing); + BlockState blockState = context.getWorld() + .getBlockState(pos); + if (FluidPipeBlock.canConnectTo(context.getWorld(), pos, blockState, facing)) + if (prefferedSide != null && prefferedSide.getAxis() != facing.getAxis()) { + prefferedSide = null; + break; + } else + prefferedSide = facing; + } + return prefferedSide == null ? null : prefferedSide.getOpposite(); + } + + @Override + public void onReplaced(BlockState p_196243_1_, World world, BlockPos pos, BlockState p_196243_4_, + boolean p_196243_5_) { + if (p_196243_1_.hasTileEntity() + && (p_196243_1_.getBlock() != p_196243_4_.getBlock() || !p_196243_4_.hasTileEntity())) { + TileEntityBehaviour.destroy(world, pos, FluidDrainingBehaviour.TYPE); + TileEntityBehaviour.destroy(world, pos, FluidFillingBehaviour.TYPE); + world.removeTileEntity(pos); + } + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.PULLEY.get(state.get(HORIZONTAL_FACING) + .rotateY() + .getAxis()); + } + + @Override + public Class getTileEntityClass() { + return HosePulleyTileEntity.class; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java new file mode 100644 index 000000000..043c23985 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java @@ -0,0 +1,123 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.function.Supplier; + +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.fluid.SmartFluidTank; + +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public class HosePulleyFluidHandler implements IFluidHandler { + + // The dynamic interface + + @Override + public int fill(FluidStack resource, FluidAction action) { + if (!internalTank.isEmpty() && !resource.isFluidEqual(internalTank.getFluid())) + return 0; + + int diff = resource.getAmount(); + int totalAmountAfterFill = diff + internalTank.getFluidAmount(); + FluidStack remaining = resource.copy(); + + if (predicate.get() && totalAmountAfterFill >= 1000) { + if (filler.tryDeposit(resource.getFluid(), rootPosGetter.get(), action.simulate())) { + drainer.counterpartActed(); + remaining.shrink(1000); + diff -= 1000; + } + } + + if (action.simulate()) + return diff <= 0 ? resource.getAmount() : internalTank.fill(remaining, action); + if (diff <= 0) { + internalTank.drain(-diff, FluidAction.EXECUTE); + return resource.getAmount(); + } + + return internalTank.fill(remaining, action); + } + + @Override + public FluidStack getFluidInTank(int tank) { + if (internalTank.isEmpty()) + return drainer.getDrainableFluid(rootPosGetter.get()); + return internalTank.getFluidInTank(tank); + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + return drainInternal(resource.getAmount(), resource, action); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + return drainInternal(maxDrain, null, action); + } + + private FluidStack drainInternal(int maxDrain, @Nullable FluidStack resource, FluidAction action) { + if (resource != null && !internalTank.isEmpty() && !resource.isFluidEqual(internalTank.getFluid())) + return FluidStack.EMPTY; + if (internalTank.getFluidAmount() >= 1000) + return internalTank.drain(maxDrain, action); + BlockPos pos = rootPosGetter.get(); + FluidStack returned = drainer.getDrainableFluid(pos); + if (!predicate.get() || !drainer.pullNext(pos, action.simulate())) + return internalTank.drain(maxDrain, action); + + filler.counterpartActed(); + FluidStack leftover = returned.copy(); + int available = 1000 + internalTank.getFluidAmount(); + int drained; + + if (!internalTank.isEmpty() && !internalTank.getFluid() + .isFluidEqual(returned) || returned.isEmpty()) + return internalTank.drain(maxDrain, action); + + if (resource != null && !returned.isFluidEqual(resource)) + return FluidStack.EMPTY; + + drained = Math.min(maxDrain, available); + returned.setAmount(drained); + leftover.setAmount(available - drained); + if (action.execute() && !leftover.isEmpty()) + internalTank.setFluid(leftover); + return returned; + } + + // + + private SmartFluidTank internalTank; + private FluidFillingBehaviour filler; + private FluidDrainingBehaviour drainer; + private Supplier rootPosGetter; + private Supplier predicate; + + public HosePulleyFluidHandler(SmartFluidTank internalTank, FluidFillingBehaviour filler, + FluidDrainingBehaviour drainer, Supplier rootPosGetter, Supplier predicate) { + this.internalTank = internalTank; + this.filler = filler; + this.drainer = drainer; + this.rootPosGetter = rootPosGetter; + this.predicate = predicate; + } + + @Override + public int getTanks() { + return internalTank.getTanks(); + } + + @Override + public int getTankCapacity(int tank) { + return internalTank.getTankCapacity(tank); + } + + @Override + public boolean isFluidValid(int tank, FluidStack stack) { + return internalTank.isFluidValid(tank, stack); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java new file mode 100644 index 000000000..2fc5797bf --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -0,0 +1,70 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class HosePulleyRenderer extends KineticTileEntityRenderer { + + public HosePulleyRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { + return true; + } + + @Override + protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + HosePulleyTileEntity pulley = (HosePulleyTileEntity) te; + float offset = pulley.getInterpolatedOffset(partialTicks); + + Axis rotationAxis = ((IRotate) te.getBlockState() + .getBlock()).getRotationAxis(te.getBlockState()); + kineticRotationTransform(getRotatedCoil(te), te, rotationAxis, AngleHelper.rad(offset * 180), light).renderInto(ms, + buffer.getBuffer(RenderType.getSolid())); + + World world = te.getWorld(); + BlockState blockState = te.getBlockState(); + BlockPos pos = te.getPos(); + + SuperByteBuffer halfMagnet = AllBlockPartials.HOSE_HALF_MAGNET.renderOn(blockState); + SuperByteBuffer halfRope = AllBlockPartials.HOSE_HALF.renderOn(blockState); + SuperByteBuffer magnet = AllBlockPartials.HOSE_MAGNET.renderOn(blockState); + SuperByteBuffer rope = AllBlockPartials.HOSE.renderOn(blockState); + + PulleyRenderer.renderPulleyRope(ms, buffer, world, pos, halfMagnet, halfRope, magnet, rope, true, offset); + } + + @Override + protected BlockState getRenderedBlockState(KineticTileEntity te) { + return shaft(te.getBlockState() + .get(HosePulleyBlock.HORIZONTAL_FACING) + .rotateY() + .getAxis()); + } + + protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { + BlockState blockState = te.getBlockState(); + return AllBlockPartials.HOSE_COIL.renderOnDirectionalSouth(blockState, + blockState.get(HosePulleyBlock.HORIZONTAL_FACING) + .rotateY()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java new file mode 100644 index 000000000..b53a36bff --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java @@ -0,0 +1,171 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.List; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.fluid.SmartFluidTank; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.ServerSpeedProvider; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +public class HosePulleyTileEntity extends KineticTileEntity { + + LerpedFloat offset; + boolean isMoving; + + private SmartFluidTank internalTank; + private LazyOptional capability; + private FluidDrainingBehaviour drainer; + private FluidFillingBehaviour filler; + + public HosePulleyTileEntity(TileEntityType typeIn) { + super(typeIn); + offset = LerpedFloat.linear() + .startWithValue(0); + isMoving = true; + internalTank = new SmartFluidTank(1500, this::onTankContentsChanged); + IFluidHandler handler = new HosePulleyFluidHandler(internalTank, filler, drainer, + () -> pos.down((int) Math.ceil(offset.getValue())), () -> !this.isMoving); + capability = LazyOptional.of(() -> handler); + } + + @Override + public void addBehaviours(List behaviours) { + drainer = new FluidDrainingBehaviour(this); + filler = new FluidFillingBehaviour(this); + behaviours.add(drainer); + behaviours.add(filler); + super.addBehaviours(behaviours); + } + + protected void onTankContentsChanged(FluidStack contents) {} + + @Override + public void onSpeedChanged(float previousSpeed) { + isMoving = true; + if (getSpeed() == 0) { + offset.forceNextSync(); + offset.setValue(Math.round(offset.getValue())); + isMoving = false; + } + + if (isMoving) { + float newOffset = offset.getValue() + getMovementSpeed(); + if (newOffset < 0) + isMoving = false; + if (!world.getBlockState(pos.down((int) Math.ceil(newOffset))) + .getMaterial() + .isReplaceable()) { + isMoving = false; + } + if (isMoving) { + drainer.reset(); + filler.reset(); + } + } + + super.onSpeedChanged(previousSpeed); + } + + @Override + @OnlyIn(Dist.CLIENT) + public AxisAlignedBB getRenderBoundingBox() { + return super.getRenderBoundingBox().expand(0, -offset.getValue(), 0); + } + + @Override + @OnlyIn(Dist.CLIENT) + public double getMaxRenderDistanceSquared() { + return super.getMaxRenderDistanceSquared() + offset.getValue() * offset.getValue(); + } + + @Override + public void tick() { + super.tick(); + float newOffset = offset.getValue() + getMovementSpeed(); + if (newOffset < 0) { + newOffset = 0; + isMoving = false; + } + if (!world.getBlockState(pos.down((int) Math.ceil(newOffset))) + .getMaterial() + .isReplaceable()) { + newOffset = (int) newOffset; + isMoving = false; + } + if (getSpeed() == 0) + isMoving = false; + + offset.setValue(newOffset); + } + + @Override + public void lazyTick() { + super.lazyTick(); + if (world.isRemote) + return; + if (isMoving) + return; + + int ceil = (int) Math.ceil(offset.getValue() + getMovementSpeed()); + if (getMovementSpeed() > 0 && world.getBlockState(pos.down(ceil)) + .getMaterial() + .isReplaceable()) { + isMoving = true; + drainer.reset(); + filler.reset(); + return; + } + } + + @Override + protected void write(CompoundNBT compound, boolean clientPacket) { + compound.put("Offset", offset.writeNBT()); + compound.put("Tank", internalTank.writeToNBT(new CompoundNBT())); + super.write(compound, clientPacket); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + offset.readNBT(compound.getCompound("Offset"), clientPacket); + internalTank.readFromNBT(compound.getCompound("Tank")); + super.read(compound, clientPacket); + } + + @Override + public void remove() { + super.remove(); + capability.invalidate(); + } + + public float getMovementSpeed() { + float movementSpeed = getSpeed() / 512f; + if (world.isRemote) + movementSpeed *= ServerSpeedProvider.get(); + return movementSpeed; + } + + public float getInterpolatedOffset(float pt) { + return offset.getValue(pt); + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (isFluidHandlerCap(cap) + && (side == null || HosePulleyBlock.hasPipeTowards(world, pos, getBlockState(), side))) + return this.capability.cast(); + return super.getCapability(cap, side); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java new file mode 100644 index 000000000..9ea0ab495 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -0,0 +1,31 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.simibubi.create.AllShapes; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; + +public class ItemDrainBlock extends Block { + + public ItemDrainBlock(Properties p_i48440_1_) { + super(p_i48440_1_); + } + + @Override + public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, + ISelectionContext p_220053_4_) { + return AllShapes.CASING_13PX.get(Direction.UP); + } + + @Override + public void fillItemGroup(ItemGroup p_149666_1_, NonNullList p_149666_2_) {} + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/CreativeFluidTankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/CreativeFluidTankTileEntity.java new file mode 100644 index 000000000..aeb03c5f5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/CreativeFluidTankTileEntity.java @@ -0,0 +1,56 @@ +package com.simibubi.create.content.contraptions.fluids.tank; + +import java.util.function.Consumer; + +import com.simibubi.create.foundation.fluid.SmartFluidTank; + +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.fluids.FluidStack; + +public class CreativeFluidTankTileEntity extends FluidTankTileEntity { + + public CreativeFluidTankTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + } + + @Override + protected SmartFluidTank createInventory() { + return new CreativeSmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged); + } + + class CreativeSmartFluidTank extends SmartFluidTank { + + public CreativeSmartFluidTank(int capacity, Consumer updateCallback) { + super(capacity, updateCallback); + } + + @Override + public int getFluidAmount() { + return getFluid().isEmpty() ? 0 : getTankCapacity(0); + } + + public void setContainedFluid(FluidStack fluidStack) { + fluid = fluidStack.copy(); + if (!fluidStack.isEmpty()) + fluid.setAmount(getTankCapacity(0)); + notifyUpdate(); + } + + @Override + public int fill(FluidStack resource, FluidAction action) { + return resource.getAmount(); + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + return super.drain(resource, FluidAction.SIMULATE); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + return super.drain(maxDrain, FluidAction.SIMULATE); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index f761f9d5a..c77744f36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -1,6 +1,9 @@ package com.simibubi.create.content.contraptions.fluids.tank; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling; +import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity.CreativeSmartFluidTank; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.fluid.FluidHelper; @@ -38,9 +41,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; public class FluidTankBlock extends Block implements IWrenchable, ITE { @@ -48,8 +49,19 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE SHAPE = EnumProperty.create("shape", Shape.class); - public FluidTankBlock(Properties p_i48440_1_) { + private boolean creative; + + public static FluidTankBlock regular(Properties p_i48440_1_) { + return new FluidTankBlock(p_i48440_1_, false); + } + + public static FluidTankBlock creative(Properties p_i48440_1_) { + return new FluidTankBlock(p_i48440_1_, true); + } + + protected FluidTankBlock(Properties p_i48440_1_, boolean creative) { super(p_i48440_1_); + this.creative = creative; setDefaultState(getDefaultState().with(TOP, true) .with(BOTTOM, true) .with(SHAPE, Shape.WINDOW)); @@ -73,7 +85,7 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE capability = - copy.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY); - if (!capability.isPresent()) - return ActionResultType.PASS; - - if (!player.isCreative()) - return ActionResultType.FAIL; - - TileEntity te = world.getTileEntity(pos); - LazyOptional tankCapability = - te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, ray.getFace()); - if (!tankCapability.isPresent()) - return ActionResultType.PASS; boolean onClient = world.isRemote; - IFluidHandlerItem fluidItem = capability.orElse(null); + if (heldItem.isEmpty()) + return ActionResultType.PASS; + if (!player.isCreative()) + return ActionResultType.PASS; + + FluidExchange exchange = null; + FluidTankTileEntity te = FluidTankConnectivityHandler.anyTankAt(world, pos); + if (te == null) + return ActionResultType.FAIL; + + LazyOptional tankCapability = te.fluidCapability; + if (!tankCapability.isPresent()) + return ActionResultType.PASS; IFluidHandler fluidTank = tankCapability.orElse(null); FluidStack prevFluidInTank = fluidTank.getFluidInTank(0) .copy(); - FluidExchange exchange = FluidHelper.exchange(fluidTank, fluidItem, FluidExchange.TANK_TO_ITEM, 1000); + if (FluidHelper.tryEmptyItemIntoTE(world, player, hand, heldItem, te)) + exchange = FluidExchange.ITEM_TO_TANK; + else if (FluidHelper.tryFillItemFromTE(world, player, hand, heldItem, te)) + exchange = FluidExchange.TANK_TO_ITEM; - FluidStack fluidInTank = fluidTank.getFluidInTank(0); - if (!player.isCreative() && !onClient) { - if (heldItem.getCount() > 1) { - heldItem.shrink(1); - player.addItemStackToInventory(fluidItem.getContainer()); - } else { - player.setHeldItem(hand, fluidItem.getContainer()); - } + if (exchange == null) { + if (EmptyingByBasin.canItemBeEmptied(world, heldItem) + || GenericItemFilling.canItemBeFilled(world, heldItem)) + return ActionResultType.SUCCESS; + return ActionResultType.PASS; } SoundEvent soundevent = null; BlockState fluidState = null; + FluidStack fluidInTank = tankCapability.map(fh -> fh.getFluidInTank(0)) + .orElse(FluidStack.EMPTY); if (exchange == FluidExchange.ITEM_TO_TANK) { + if (creative && !onClient) { + FluidStack fluidInItem = EmptyingByBasin.emptyItem(world, heldItem, true).getFirst(); + if (!fluidInItem.isEmpty() && fluidTank instanceof CreativeSmartFluidTank) + ((CreativeSmartFluidTank) fluidTank).setContainedFluid(fluidInItem); + } + Fluid fluid = fluidInTank.getFluid(); fluidState = fluid.getDefaultState() .getBlockState(); @@ -141,6 +157,10 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE frontier = new ArrayList<>(); frontier.add(te); - formTanks(te.getWorld(), cache, frontier); + formTanks(te.getType(), te.getWorld(), cache, frontier); } - private static void formTanks(IBlockReader world, TankSearchCache cache, List frontier) { + private static void formTanks(TileEntityType type, IBlockReader world, TankSearchCache cache, + List frontier) { PriorityQueue> creationQueue = makeCreationQueue(); Set visited = new HashSet<>(); @@ -70,7 +72,7 @@ public class FluidTankConnectivityHandler { continue; if (visited.contains(next)) continue; - FluidTankTileEntity nextTank = tankAt(world, next); + FluidTankTileEntity nextTank = tankAt(type, world, next); if (nextTank == null) continue; if (nextTank.isRemoved()) @@ -142,6 +144,7 @@ public class FluidTankConnectivityHandler { boolean simulate) { int amount = 0; int height = 0; + TileEntityType type = te.getType(); World world = te.getWorld(); BlockPos origin = te.getPos(); FluidStack fluid = te.getTankInventory() @@ -154,7 +157,7 @@ public class FluidTankConnectivityHandler { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = origin.add(xOffset, yOffset, zOffset); - Optional tank = cache.getOrCache(world, pos); + Optional tank = cache.getOrCache(type, world, pos); if (!tank.isPresent()) break Search; @@ -194,15 +197,15 @@ public class FluidTankConnectivityHandler { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = origin.add(xOffset, yOffset, zOffset); - FluidTankTileEntity tank = tankAt(world, pos); + FluidTankTileEntity tank = tankAt(type, world, pos); if (tank == te) continue; - + if (tank.isController()) { te.tankInventory.fill(tank.tankInventory.getFluid(), FluidAction.EXECUTE); tank.tankInventory.setFluid(FluidStack.EMPTY); } - + splitTankAndInvalidate(tank, cache, false); tank.setController(origin); tank.updateConnectivity = false; @@ -248,7 +251,7 @@ public class FluidTankConnectivityHandler { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = origin.add(xOffset, yOffset, zOffset); - FluidTankTileEntity tankAt = tankAt(world, pos); + FluidTankTileEntity tankAt = tankAt(te.getType(), world, pos); if (tankAt == null) continue; if (!tankAt.getController() @@ -278,7 +281,7 @@ public class FluidTankConnectivityHandler { te.fluidCapability.invalidate(); if (tryReconnect) - formTanks(world, cache == null ? new TankSearchCache() : cache, frontier); + formTanks(te.getType(), world, cache == null ? new TankSearchCache() : cache, frontier); } private static PriorityQueue> makeCreationQueue() { @@ -291,7 +294,15 @@ public class FluidTankConnectivityHandler { } @Nullable - public static FluidTankTileEntity tankAt(IBlockReader world, BlockPos pos) { + public static FluidTankTileEntity tankAt(TileEntityType type, IBlockReader world, BlockPos pos) { + TileEntity te = world.getTileEntity(pos); + if (te instanceof FluidTankTileEntity && te.getType() == type) + return (FluidTankTileEntity) te; + return null; + } + + @Nullable + public static FluidTankTileEntity anyTankAt(IBlockReader world, BlockPos pos) { TileEntity te = world.getTileEntity(pos); if (te instanceof FluidTankTileEntity) return (FluidTankTileEntity) te; @@ -317,10 +328,10 @@ public class FluidTankConnectivityHandler { return controllerMap.containsKey(pos); } - Optional getOrCache(IBlockReader world, BlockPos pos) { + Optional getOrCache(TileEntityType type, IBlockReader world, BlockPos pos) { if (hasVisited(pos)) return controllerMap.get(pos); - FluidTankTileEntity tankAt = tankAt(world, pos); + FluidTankTileEntity tankAt = tankAt(type, world, pos); if (tankAt == null) { putEmpty(pos); return Optional.empty(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java index 70fdd24b3..f8f589966 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankGenerator.java @@ -12,6 +12,16 @@ import net.minecraftforge.client.model.generators.ModelFile; public class FluidTankGenerator extends SpecialBlockStateGen { + private String prefix; + + public FluidTankGenerator() { + this(""); + } + + public FluidTankGenerator(String prefix) { + this.prefix = prefix; + } + @Override protected int getXRotation(BlockState state) { return 0; @@ -37,8 +47,18 @@ public class FluidTankGenerator extends SpecialBlockStateGen { else if (bottom) shapeName = "bottom"; - return AssetLookup.partialBaseModel(ctx, prov, - shapeName + (shape == Shape.PLAIN ? "" : "_" + shape.getName())); + String modelName = shapeName + (shape == Shape.PLAIN ? "" : "_" + shape.getName()); + + if (!prefix.isEmpty()) + return prov.models() + .withExistingParent(prefix + modelName, prov.modLoc("block/fluid_tank/block_" + modelName)) + .texture("0", prov.modLoc("block/" + prefix + "casing")) + .texture("1", prov.modLoc("block/" + prefix + "fluid_tank")) + .texture("3", prov.modLoc("block/" + prefix + "fluid_tank_window")) + .texture("4", prov.modLoc("block/" + prefix + "fluid_tank_window_single")) + .texture("particle", prov.modLoc("block/" + prefix + "fluid_tank")); + + return AssetLookup.partialBaseModel(ctx, prov, modelName); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java index 9205c1be9..9dfc502dc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankItem.java @@ -44,7 +44,7 @@ public class FluidTankItem extends BlockItem { if (!FluidTankBlock.isTank(placedOnState)) return; - FluidTankTileEntity tankAt = FluidTankConnectivityHandler.tankAt(world, placedOnPos); + FluidTankTileEntity tankAt = FluidTankConnectivityHandler.anyTankAt(world, placedOnPos); if (tankAt == null) return; FluidTankTileEntity controllerTE = tankAt.getControllerTE(); @@ -60,7 +60,7 @@ public class FluidTankItem extends BlockItem { .down() : controllerTE.getPos() .up(controllerTE.height); - + if (startPos.getY() != pos.getY()) return; @@ -87,9 +87,11 @@ public class FluidTankItem extends BlockItem { if (FluidTankBlock.isTank(blockState)) continue; BlockItemUseContext context = BlockItemUseContext.func_221536_a(ctx, offsetPos, face); - player.getPersistentData().putBoolean("SilenceTankSound", true); + player.getPersistentData() + .putBoolean("SilenceTankSound", true); super.tryPlace(context); - player.getPersistentData().remove("SilenceTankSound"); + player.getPersistentData() + .remove("SilenceTankSound"); } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java index bad2f0500..93fda0b22 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java @@ -6,9 +6,8 @@ import java.util.Collections; import java.util.List; import java.util.Random; -import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.foundation.block.connected.CTModel; -import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; +import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; @@ -23,11 +22,9 @@ import net.minecraftforge.client.model.data.ModelProperty; public class FluidTankModel extends CTModel { protected static ModelProperty CULL_PROPERTY = new ModelProperty<>(); - static ConnectedTextureBehaviour CT_BEHAVIOUR = - new FluidTankCTBehaviour(AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING); - public FluidTankModel(IBakedModel originalModel) { - super(originalModel, CT_BEHAVIOUR); + public FluidTankModel(IBakedModel originalModel, CTSpriteShiftEntry side, CTSpriteShiftEntry top) { + super(originalModel, new FluidTankCTBehaviour(side, top)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java index f5f35b886..25531875b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankRenderer.java @@ -42,6 +42,9 @@ public class FluidTankRenderer extends SafeTileEntityRenderer tileEntityTypeIn) { super(tileEntityTypeIn); - tankInventory = new SmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged); + tankInventory = createInventory(); fluidCapability = LazyOptional.of(() -> tankInventory); forceFluidLevelUpdate = true; updateConnectivity = false; @@ -67,6 +67,10 @@ public class FluidTankTileEntity extends SmartTileEntity { refreshCapability(); } + protected SmartFluidTank createInventory() { + return new SmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged); + } + protected void updateConnectivity() { updateConnectivity = false; if (world.isRemote) @@ -117,7 +121,7 @@ public class FluidTankTileEntity extends SmartTileEntity { for (int xOffset = 0; xOffset < width; xOffset++) { for (int zOffset = 0; zOffset < width; zOffset++) { BlockPos pos = this.pos.add(xOffset, yOffset, zOffset); - FluidTankTileEntity tankAt = FluidTankConnectivityHandler.tankAt(world, pos); + FluidTankTileEntity tankAt = FluidTankConnectivityHandler.anyTankAt(world, pos); if (tankAt == null) continue; if (tankAt.luminosity == actualLuminosity) @@ -279,12 +283,12 @@ public class FluidTankTileEntity extends SmartTileEntity { @Override protected void read(CompoundNBT compound, boolean clientPacket) { super.read(compound, clientPacket); - + BlockPos controllerBefore = controller; int prevSize = width; int prevHeight = height; int prevLum = luminosity; - + updateConnectivity = compound.contains("Uninitialized"); luminosity = compound.getInt("Luminosity"); controller = null; @@ -305,10 +309,10 @@ public class FluidTankTileEntity extends SmartTileEntity { if (compound.contains("ForceFluidLevel") || fluidLevel == null) fluidLevel = new InterpolatedChasingValue().start(getFillState()) .withSpeed(1 / 2f); - + if (!clientPacket) return; - + boolean changeOfController = controllerBefore == null ? controller != null : !controllerBefore.equals(controller); if (changeOfController || prevSize != width || prevHeight != height) { @@ -325,9 +329,9 @@ public class FluidTankTileEntity extends SmartTileEntity { } if (luminosity != prevLum && hasWorld()) world.getChunkProvider() - .getLightManager() - .checkBlock(pos); - + .getLightManager() + .checkBlock(pos); + if (compound.contains("LazySync")) fluidLevel.withSpeed(compound.contains("LazySync") ? 1 / 8f : 1 / 2f); } @@ -350,7 +354,7 @@ public class FluidTankTileEntity extends SmartTileEntity { } compound.putInt("Luminosity", luminosity); super.write(compound, clientPacket); - + if (!clientPacket) return; if (forceFluidLevelUpdate) @@ -365,7 +369,7 @@ public class FluidTankTileEntity extends SmartTileEntity { public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { if (!fluidCapability.isPresent()) refreshCapability(); - if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) + if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) return fluidCapability.cast(); return super.getCapability(cap, side); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 2189fdb7e..afbbde0fa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -7,11 +7,11 @@ import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Pair; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -34,11 +34,6 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; @@ -80,9 +75,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab try { BasinTileEntity te = getTileEntity(worldIn, pos); if (!heldItem.isEmpty()) { - if (tryEmptyItemIntoBasin(worldIn, player, handIn, heldItem, te)) + if (FluidHelper.tryEmptyItemIntoTE(worldIn, player, handIn, heldItem, te)) return ActionResultType.SUCCESS; - if (tryFillItemFromBasin(worldIn, player, handIn, heldItem, te)) + if (FluidHelper.tryFillItemFromTE(worldIn, player, handIn, heldItem, te)) return ActionResultType.SUCCESS; if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem) @@ -103,77 +98,6 @@ public class BasinBlock extends Block implements ITE, IWrenchab return ActionResultType.SUCCESS; } - protected boolean tryEmptyItemIntoBasin(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem, - BasinTileEntity te) { - if (!EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)) - return false; - - Pair emptyingResult = EmptyingByBasin.emptyItem(worldIn, heldItem, true); - LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); - IFluidHandler tank = capability.orElse(null); - FluidStack fluidStack = emptyingResult.getFirst(); - - if (tank == null || fluidStack.getAmount() != tank.fill(fluidStack, FluidAction.SIMULATE)) - return false; - if (worldIn.isRemote) - return true; - - ItemStack copyOfHeld = heldItem.copy(); - emptyingResult = EmptyingByBasin.emptyItem(worldIn, copyOfHeld, false); - tank.fill(fluidStack, FluidAction.EXECUTE); - - if (!player.isCreative()) { - if (copyOfHeld.isEmpty()) - player.setHeldItem(handIn, emptyingResult.getSecond()); - else { - player.setHeldItem(handIn, copyOfHeld); - player.inventory.placeItemBackInInventory(worldIn, emptyingResult.getSecond()); - } - } - return true; - } - - protected boolean tryFillItemFromBasin(World world, PlayerEntity player, Hand handIn, ItemStack heldItem, - BasinTileEntity te) { - if (!GenericItemFilling.canItemBeFilled(world, heldItem)) - return false; - - LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); - IFluidHandler tank = capability.orElse(null); - - if (tank == null) - return false; - - for (int i = 0; i < tank.getTanks(); i++) { - FluidStack fluid = tank.getFluidInTank(i); - if (fluid.isEmpty()) - continue; - int requiredAmountForItem = GenericItemFilling.getRequiredAmountForItem(world, heldItem, fluid.copy()); - if (requiredAmountForItem == -1) - continue; - if (requiredAmountForItem > fluid.getAmount()) - continue; - - if (world.isRemote) - return true; - - if (player.isCreative()) - heldItem = heldItem.copy(); - ItemStack out = GenericItemFilling.fillItem(world, requiredAmountForItem, heldItem, fluid.copy()); - - FluidStack copy = fluid.copy(); - copy.setAmount(requiredAmountForItem); - tank.drain(copy, FluidAction.EXECUTE); - - if (!player.isCreative()) - player.inventory.placeItemBackInInventory(world, out); - te.notifyUpdate(); - return true; - } - - return false; - } - @Override public void onLanded(IBlockReader worldIn, Entity entityIn) { super.onLanded(worldIn, entityIn); @@ -203,7 +127,7 @@ public class BasinBlock extends Block implements ITE, IWrenchab public VoxelShape getRaytraceShape(BlockState p_199600_1_, IBlockReader p_199600_2_, BlockPos p_199600_3_) { return AllShapes.BASIN_RAYTRACE_SHAPE; } - + @Override public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { return AllShapes.BASIN_BLOCK_SHAPE; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java index 586082bdb..bcc525775 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltBlock.java @@ -170,7 +170,7 @@ public class BeltBlock extends HorizontalKineticBlock implements ITE 0) { - beltMovementPositive = !beltMovementPositive; - Collections.reverse(items); - belt.markDirty(); - belt.sendData(); - } - // Added/Removed items from previous cycle if (!toInsert.isEmpty() || !toRemove.isEmpty()) { toInsert.forEach(this::insert); @@ -67,6 +59,17 @@ public class BeltInventory { belt.markDirty(); belt.sendData(); } + + if (belt.getSpeed() == 0) + return; + + // Reverse item collection if belt just reversed + if (beltMovementPositive != belt.getDirectionAwareBeltMovementSpeed() > 0) { + beltMovementPositive = !beltMovementPositive; + Collections.reverse(items); + belt.markDirty(); + belt.sendData(); + } // Assuming the first entry is furthest on the belt TransportedItemStack stackInFront = null; diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index e3e1d7b78..d9bc7d81d 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -492,6 +492,17 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("SCS") .patternLine(" I ")), + HOSE_PULLEY = create(AllBlocks.HOSE_PULLEY).unlockedByTag(I::copper) + .viaShaped(b -> b + .key('S', I.shaft()) + .key('P', AllBlocks.FLUID_PIPE.get()) + .key('B', I.copperCasing()) + .key('C', Items.DRIED_KELP) + .key('I', I.copperSheet()) + .patternLine(" B ") + .patternLine("SCP") + .patternLine(" I ")), + EMPTY_BLAZE_BURNER = create(AllItems.EMPTY_BLAZE_BURNER).unlockedByTag(I::iron) .viaShaped(b -> b.key('A', Blocks.IRON_BARS) .key('I', I.ironSheet()) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index 581e9c087..d740798a3 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -7,14 +7,24 @@ import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.utility.Pair; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.JsonToNBT; +import net.minecraft.util.Hand; import net.minecraft.util.JSONUtils; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.IFluidHandlerItem; @@ -74,9 +84,9 @@ public class FluidHelper { int amount = JSONUtils.getInt(json, "amount"); FluidStack stack = new FluidStack(fluid, amount); - if (!json.has("nbt")) + if (!json.has("nbt")) return stack; - + try { JsonElement element = json.get("nbt"); stack.setTag(JsonToNBT.getTagFromJson( @@ -89,6 +99,77 @@ public class FluidHelper { return stack; } + public static boolean tryEmptyItemIntoTE(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem, + SmartTileEntity te) { + if (!EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)) + return false; + + Pair emptyingResult = EmptyingByBasin.emptyItem(worldIn, heldItem, true); + LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); + IFluidHandler tank = capability.orElse(null); + FluidStack fluidStack = emptyingResult.getFirst(); + + if (tank == null || fluidStack.getAmount() != tank.fill(fluidStack, FluidAction.SIMULATE)) + return false; + if (worldIn.isRemote) + return true; + + ItemStack copyOfHeld = heldItem.copy(); + emptyingResult = EmptyingByBasin.emptyItem(worldIn, copyOfHeld, false); + tank.fill(fluidStack, FluidAction.EXECUTE); + + if (!player.isCreative()) { + if (copyOfHeld.isEmpty()) + player.setHeldItem(handIn, emptyingResult.getSecond()); + else { + player.setHeldItem(handIn, copyOfHeld); + player.inventory.placeItemBackInInventory(worldIn, emptyingResult.getSecond()); + } + } + return true; + } + + public static boolean tryFillItemFromTE(World world, PlayerEntity player, Hand handIn, ItemStack heldItem, + SmartTileEntity te) { + if (!GenericItemFilling.canItemBeFilled(world, heldItem)) + return false; + + LazyOptional capability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); + IFluidHandler tank = capability.orElse(null); + + if (tank == null) + return false; + + for (int i = 0; i < tank.getTanks(); i++) { + FluidStack fluid = tank.getFluidInTank(i); + if (fluid.isEmpty()) + continue; + int requiredAmountForItem = GenericItemFilling.getRequiredAmountForItem(world, heldItem, fluid.copy()); + if (requiredAmountForItem == -1) + continue; + if (requiredAmountForItem > fluid.getAmount()) + continue; + + if (world.isRemote) + return true; + + if (player.isCreative()) + heldItem = heldItem.copy(); + ItemStack out = GenericItemFilling.fillItem(world, requiredAmountForItem, heldItem, fluid.copy()); + + FluidStack copy = fluid.copy(); + copy.setAmount(requiredAmountForItem); + tank.drain(copy, FluidAction.EXECUTE); + + if (!player.isCreative()) + player.inventory.placeItemBackInInventory(world, out); + te.notifyUpdate(); + return true; + } + + return false; + } + @Nullable public static FluidExchange exchange(IFluidHandler fluidTank, IFluidHandlerItem fluidItem, FluidExchange preferred, int maxAmount) { diff --git a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java index 6c23fa6d3..bffc55da2 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java @@ -8,11 +8,9 @@ import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.VecHelper; -import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -27,18 +25,14 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.world.ClientWorld; import net.minecraft.fluid.Fluid; import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.item.ItemStack; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.IItemProvider; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.LightType; -import net.minecraft.world.World; import net.minecraftforge.client.model.data.EmptyModelData; +import net.minecraftforge.fluids.FluidStack; public class GuiGameElement { @@ -212,36 +206,13 @@ public class GuiGameElement { .isEmpty()) return; - for (RenderType type : RenderType.getBlockLayers()) { - if (!RenderTypeLookup.canRenderInLayer(blockState.getFluidState(), type)) - continue; - - RenderSystem.pushMatrix(); - RenderHelper.disableStandardItemLighting(); - - ClientWorld world = Minecraft.getInstance().world; - if (renderWorld == null || renderWorld.getWorld() != world) - renderWorld = new FluidRenderWorld(world); - - for (Direction d : Iterate.directions) { - vb = buffer.getBuffer(type); - if (d.getAxisDirection() == AxisDirection.POSITIVE) - continue; - - RenderSystem.pushMatrix(); - RenderSystem.translated(.5, .5, .5); - RenderSystem.rotatef(AngleHelper.horizontalAngle(d), 0, 1, 0); - RenderSystem.rotatef(AngleHelper.verticalAngle(d) - 90, 0, 0, 1); - RenderSystem.translated(-.5, -.5, -.5); - blockRenderer.renderFluid(new BlockPos(0, 1, 0), renderWorld, vb, blockState.getFluidState()); - buffer.draw(type); - RenderSystem.popMatrix(); - } - - RenderHelper.enable(); - RenderSystem.popMatrix(); - break; - } + RenderSystem.pushMatrix(); + RenderHelper.disableStandardItemLighting(); + FluidRenderer.renderTiledFluidBB(new FluidStack(blockState.getFluidState() + .getFluid(), 1000), 0, 0, 0, 1.0001f, 1.0001f, 1.0001f, buffer, ms, 0xf000f0, true); + buffer.draw(RenderType.getTranslucent()); + RenderHelper.enable(); + RenderSystem.popMatrix(); } } @@ -271,29 +242,12 @@ public class GuiGameElement { transform(); RenderSystem.scaled(1, -1, 1); RenderSystem.translated(0, 0, -75); - Minecraft.getInstance().getItemRenderer().renderItemIntoGUI(stack, 0, 0); + Minecraft.getInstance() + .getItemRenderer() + .renderItemIntoGUI(stack, 0, 0); cleanUp(); } } - private static FluidRenderWorld renderWorld; - - private static class FluidRenderWorld extends WrappedWorld { - - public FluidRenderWorld(World world) { - super(world); - } - - @Override - public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { - return 15; - } - - @Override - public BlockState getBlockState(BlockPos pos) { - return Blocks.AIR.getDefaultState(); - } - - } } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 6f59dd299..f1dad8e0e 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -13,6 +13,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.syn import com.simibubi.create.content.contraptions.components.structureMovement.sync.LimbSwingUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingCreationPacket; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket; +import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket; import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket; import com.simibubi.create.content.curiosities.symmetry.SymmetryEffectPacket; import com.simibubi.create.content.curiosities.tools.ExtendoGripInteractionPacket; @@ -32,8 +33,12 @@ import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import net.minecraftforge.fml.network.NetworkEvent.Context; import net.minecraftforge.fml.network.NetworkRegistry; +import net.minecraftforge.fml.network.PacketDistributor; +import net.minecraftforge.fml.network.PacketDistributor.TargetPoint; import net.minecraftforge.fml.network.simple.SimpleChannel; public enum AllPackets { @@ -66,7 +71,8 @@ public enum AllPackets { CONTRAPTION_SEAT_MAPPING(ContraptionSeatMappingPacket.class, ContraptionSeatMappingPacket::new), LIMBSWING_UPDATE(LimbSwingUpdatePacket.class, LimbSwingUpdatePacket::new), MINECART_CONTROLLER(MinecartControllerUpdatePacket.class, MinecartControllerUpdatePacket::new), - + FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new), + ; public static final ResourceLocation CHANNEL_NAME = new ResourceLocation(Create.ID, "network"); @@ -80,11 +86,20 @@ public enum AllPackets { } public static void registerPackets() { - channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME).serverAcceptedVersions(s -> true) - .clientAcceptedVersions(s -> true).networkProtocolVersion(() -> NETWORK_VERSION).simpleChannel(); + channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME) + .serverAcceptedVersions(s -> true) + .clientAcceptedVersions(s -> true) + .networkProtocolVersion(() -> NETWORK_VERSION) + .simpleChannel(); for (AllPackets packet : values()) packet.packet.register(); + } + public static void sendToNear(World world, BlockPos pos, int range, Object message) { + channel.send( + PacketDistributor.NEAR.with(TargetPoint.p(pos.getX(), pos.getY(), pos.getZ(), range, world.getDimension() + .getType())), + message); } private static class LoadedPacket { @@ -102,7 +117,11 @@ public enum AllPackets { } private void register() { - channel.messageBuilder(type, index++).encoder(encoder).decoder(decoder).consumer(handler).add(); + channel.messageBuilder(type, index++) + .encoder(encoder) + .decoder(decoder) + .consumer(handler) + .add(); } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index b8f87e003..98de531a9 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -20,3 +20,7 @@ public net.minecraft.potion.PotionBrewing field_185215_c # POTION_ITEMS # Beacon public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments + +# Server Tick List (For stopping placed fluids from spilling) +public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet +public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json index 10732b44a..fb5f533ee 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json @@ -5,7 +5,7 @@ "0": "create:block/copper_casing", "1": "create:block/fluid_tank", "5": "create:block/fluid_tank_window_single", - "particle": "create:block/fluid_tank" + "particle": "#1" }, "elements": [ { diff --git a/src/main/resources/assets/create/models/block/hose_pulley/block.json b/src/main/resources/assets/create/models/block/hose_pulley/block.json new file mode 100644 index 000000000..4e251b554 --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/block.json @@ -0,0 +1,271 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "create:block/copper_gearbox", + "8": "create:block/oxidized/copper_block_0", + "9": "create:block/fluid_pipe", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "side", + "from": [14, 2, 2], + "to": [15, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "east": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "west": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "down": {"uv": [2, 11, 14, 12], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "side", + "from": [1, 2, 2], + "to": [2, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "east": {"uv": [14, 2, 2, 14], "texture": "#8"}, + "west": {"uv": [14, 2, 2, 14], "texture": "#8"}, + "down": {"uv": [2, 12, 14, 11], "rotation": 90, "texture": "#4"} + } + }, + { + "name": "side", + "from": [-1.1, 2.9, 2.9], + "to": [1, 13.1, 13.1], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -7, 7]}, + "faces": { + "north": {"uv": [11, 5, 6, 6], "rotation": 90, "texture": "#9"}, + "south": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"}, + "west": {"uv": [11, 0, 6, 5], "texture": "#9"}, + "up": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"}, + "down": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"} + } + }, + { + "name": "side_frame", + "from": [14, 2, 14], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [0, 2, 2, 14], "texture": "#8"}, + "east": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"}, + "south": {"uv": [14, 2, 16, 14], "texture": "#8"}, + "west": {"uv": [14, 2, 16, 14], "texture": "#8"}, + "up": {"uv": [0, 14, 2, 16], "rotation": 270, "texture": "#8"}, + "down": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 2, 14], + "to": [2, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [2, 2, 0, 14], "texture": "#8"}, + "east": {"uv": [16, 2, 14, 14], "texture": "#8"}, + "south": {"uv": [16, 2, 14, 14], "texture": "#8"}, + "west": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"}, + "up": {"uv": [0, 16, 2, 14], "rotation": 270, "texture": "#8"}, + "down": {"uv": [0, 2, 2, 0], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [14, 2, 0], + "to": [16, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [16, 2, 14, 14], "texture": "#8"}, + "east": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"}, + "south": {"uv": [2, 2, 0, 14], "texture": "#8"}, + "west": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#8"}, + "up": {"uv": [2, 14, 0, 16], "rotation": 270, "texture": "#8"}, + "down": {"uv": [2, 0, 0, 2], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 2, 0], + "to": [2, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [14, 2, 16, 14], "texture": "#8"}, + "east": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#8"}, + "south": {"uv": [0, 2, 2, 14], "texture": "#8"}, + "west": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"}, + "up": {"uv": [2, 16, 0, 14], "rotation": 270, "texture": "#8"}, + "down": {"uv": [2, 2, 0, 0], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [14, 0, 0], + "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [0, 14, 2, 16], "texture": "#8"}, + "east": {"uv": [0, 14, 16, 16], "texture": "#8"}, + "south": {"uv": [14, 14, 16, 16], "texture": "#8"}, + "west": {"uv": [0, 14, 16, 16], "texture": "#8"}, + "up": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [14, 14, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [0, 16, 2, 14], "texture": "#8"}, + "east": {"uv": [0, 16, 16, 14], "texture": "#8"}, + "south": {"uv": [14, 16, 16, 14], "texture": "#8"}, + "west": {"uv": [0, 16, 16, 14], "texture": "#8"}, + "up": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#8"}, + "down": {"uv": [0, 16, 16, 14], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 0, 0], + "to": [2, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [2, 14, 0, 16], "texture": "#8"}, + "east": {"uv": [16, 14, 0, 16], "texture": "#8"}, + "south": {"uv": [16, 14, 14, 16], "texture": "#8"}, + "west": {"uv": [16, 14, 0, 16], "texture": "#8"}, + "up": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 14, 0], + "to": [2, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [2, 16, 0, 14], "texture": "#8"}, + "east": {"uv": [16, 16, 0, 14], "texture": "#8"}, + "south": {"uv": [16, 16, 14, 14], "texture": "#8"}, + "west": {"uv": [16, 16, 0, 14], "texture": "#8"}, + "up": {"uv": [0, 16, 16, 14], "rotation": 270, "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "front", + "from": [2, 1, 13], + "to": [14, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#8"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "south": {"uv": [2, 14, 14, 16], "texture": "#8"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "up": {"uv": [2, 0, 14, 2], "rotation": 180, "texture": "#8"}, + "down": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#8"} + } + }, + { + "name": "front", + "from": [2, 1, 1], + "to": [14, 3, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [14, 14, 2, 16], "texture": "#8"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "south": {"uv": [14, 14, 2, 16], "rotation": 180, "texture": "#8"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "up": {"uv": [2, 2, 14, 0], "texture": "#8"}, + "down": {"uv": [2, 16, 14, 14], "rotation": 180, "texture": "#8"} + } + }, + { + "name": "front", + "from": [2, 13, 1], + "to": [14, 15, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "faces": { + "north": {"uv": [14, 16, 2, 14], "texture": "#8"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "south": {"uv": [14, 2, 2, 0], "texture": "#8"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "up": {"uv": [14, 15, 2, 13], "texture": "#8"}, + "down": {"uv": [14, 2, 2, 0], "rotation": 180, "texture": "#8"} + } + }, + { + "name": "front", + "from": [2, 13, 13], + "to": [14, 15, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "faces": { + "north": {"uv": [2, 2, 14, 0], "texture": "#8"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "south": {"uv": [2, 16, 14, 14], "texture": "#8"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "up": {"uv": [14, 13, 2, 15], "texture": "#8"}, + "down": {"uv": [14, 0, 2, 2], "texture": "#8"} + } + }, + { + "name": "top", + "from": [2, 14, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "faces": { + "north": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"}, + "east": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "south": {"uv": [2, 13, 14, 15], "texture": "#8"}, + "west": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#8"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 180, "texture": "#8"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [] + }, + { + "name": "rope_half_magnet", + "origin": [8, 8, 8], + "children": [] + }, 15] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/copper_pulley.bbmodel b/src/main/resources/assets/create/models/block/hose_pulley/copper_pulley.bbmodel new file mode 100644 index 000000000..341190326 --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/copper_pulley.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.2","model_format":"java_block","box_uv":false},"name":"item","parent":"block/block","ambientocclusion":true,"resolution":{"width":16,"height":16},"elements":[{"name":"coil","from":[4,4,2],"to":[12,12,14],"autouv":0,"color":6,"rotation":[0,0,-45],"origin":[8,8,-10],"faces":{"north":{"uv":[0,0,0,0],"texture":null},"east":{"uv":[2,1,14,9],"texture":3},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[2,1,14,9],"rotation":180,"texture":3},"up":{"uv":[2,1,14,9],"rotation":270,"texture":3},"down":{"uv":[2,1,14,9],"rotation":90,"texture":3}},"uuid":"c6880831-d683-f703-04a3-fd39148ebb5c"},{"name":"coil","from":[3.5,3.5,3],"to":[12.5,12.5,7],"autouv":0,"color":6,"rotation":[0,0,45],"origin":[8,8,-10],"faces":{"north":{"uv":[0,0,1,1],"texture":3},"east":{"uv":[0,3,4,12],"rotation":180,"texture":3},"south":{"uv":[0,0,1,1],"texture":3},"west":{"uv":[0,3,4,12],"texture":3},"up":{"uv":[0,3,4,12],"rotation":90,"texture":3},"down":{"uv":[0,3,4,12],"rotation":270,"texture":3}},"uuid":"d93793b9-dd62-5818-2564-da40eed87601"},{"name":"side","from":[2,2,14],"to":[14,14,15],"autouv":0,"color":2,"origin":[8,-8,8],"faces":{"north":{"uv":[2,2,14,14],"texture":2},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[2,2,14,14],"texture":2},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[0,0,1,12],"rotation":270},"down":{"uv":[2,11,14,12],"texture":2}},"uuid":"50235661-64a5-c971-c6e6-0975baa71d99"},{"name":"side","from":[2,2,1],"to":[14,14,2],"autouv":0,"color":3,"origin":[8,-8,8],"faces":{"north":{"uv":[14,2,2,14],"texture":5},"east":{"uv":[0,0,0,0],"texture":null},"south":{"uv":[14,2,2,14],"texture":5},"west":{"uv":[0,0,0,0],"texture":null},"up":{"uv":[1,0,0,12],"rotation":270},"down":{"uv":[2,12,14,11],"texture":2}},"uuid":"f16b6f4f-7c00-62c6-e29b-a9d790a92d84"},{"name":"side_frame","from":[0,2,14],"to":[2,14,16],"autouv":0,"color":3,"origin":[8,1,8],"faces":{"north":{"uv":[14,2,16,14],"texture":5},"east":{"uv":[0,2,2,14],"texture":5},"south":{"uv":[14,2,16,14],"rotation":180,"texture":5},"west":{"uv":[14,2,16,14],"texture":5},"up":{"uv":[0,14,2,16],"texture":5},"down":{"uv":[0,0,2,2],"texture":5}},"uuid":"8e0b92f4-fea1-c76e-eec7-fa197247034b"},{"name":"side_frame","from":[0,2,0],"to":[2,14,2],"autouv":0,"color":6,"origin":[8,1,8],"faces":{"north":{"uv":[16,2,14,14],"rotation":180,"texture":5},"east":{"uv":[2,2,0,14],"texture":5},"south":{"uv":[16,2,14,14],"texture":5},"west":{"uv":[16,2,14,14],"texture":5},"up":{"uv":[0,16,2,14],"texture":5},"down":{"uv":[0,2,2,0],"texture":5}},"uuid":"c6e4de46-37af-8304-d04a-e3a06202a6d1"},{"name":"side_frame","from":[14,2,14],"to":[16,14,16],"autouv":0,"color":7,"origin":[8,1,8],"faces":{"north":{"uv":[2,2,0,14],"rotation":180,"texture":5},"east":{"uv":[16,2,14,14],"texture":5},"south":{"uv":[16,2,14,14],"rotation":180,"texture":5},"west":{"uv":[2,2,0,14],"texture":5},"up":{"uv":[2,14,0,16],"texture":5},"down":{"uv":[2,0,0,2],"texture":5}},"uuid":"22157158-613c-9abb-d3b9-2a2d576e1f98"},{"name":"side_frame","from":[14,2,0],"to":[16,14,2],"autouv":0,"color":5,"origin":[8,1,8],"faces":{"north":{"uv":[14,2,16,14],"rotation":180,"texture":5},"east":{"uv":[14,2,16,14],"texture":5},"south":{"uv":[0,2,2,14],"rotation":180,"texture":5},"west":{"uv":[0,2,2,14],"texture":5},"up":{"uv":[2,16,0,14],"texture":5},"down":{"uv":[2,2,0,0],"texture":5}},"uuid":"82c9a138-92db-c34a-f8e7-45283db7413d"},{"name":"side_frame","from":[0,0,14],"to":[16,2,16],"autouv":0,"color":3,"origin":[8,1,8],"faces":{"north":{"uv":[0,14,16,16],"texture":5},"east":{"uv":[0,14,2,16],"texture":5},"south":{"uv":[0,14,16,16],"texture":5},"west":{"uv":[14,14,16,16],"texture":5},"up":{"uv":[0,14,16,16],"rotation":180,"texture":5},"down":{"uv":[0,14,16,16],"rotation":180,"texture":5}},"uuid":"6965d55e-49aa-ab6d-4568-5de4c1501c57"},{"name":"side_frame","from":[0,14,14],"to":[16,16,16],"autouv":0,"color":2,"origin":[8,15,8],"faces":{"north":{"uv":[0,16,16,14],"texture":5},"east":{"uv":[0,16,2,14],"texture":5},"south":{"uv":[0,16,16,14],"texture":5},"west":{"uv":[14,16,16,14],"texture":5},"up":{"uv":[0,16,16,14],"rotation":180,"texture":5},"down":{"uv":[0,16,16,14],"rotation":180,"texture":5}},"uuid":"639134c9-125c-c945-7ece-ee0b946543c7"},{"name":"side_frame","from":[0,0,0],"to":[16,2,2],"autouv":0,"color":2,"origin":[8,1,8],"faces":{"north":{"uv":[16,14,0,16],"texture":5},"east":{"uv":[2,14,0,16],"texture":5},"south":{"uv":[16,14,0,16],"texture":5},"west":{"uv":[16,14,14,16],"texture":5},"up":{"uv":[0,16,16,14],"rotation":180,"texture":5},"down":{"uv":[0,14,16,16],"texture":5}},"uuid":"b27e1c88-26b6-190b-f005-a259810655a1"},{"name":"side_frame","from":[0,14,0],"to":[16,16,2],"autouv":0,"color":6,"origin":[8,15,8],"faces":{"north":{"uv":[16,16,0,14],"texture":5},"east":{"uv":[2,16,0,14],"texture":5},"south":{"uv":[16,16,0,14],"texture":5},"west":{"uv":[16,16,14,14],"texture":5},"up":{"uv":[0,16,16,14],"texture":5},"down":{"uv":[0,14,16,16],"rotation":180,"texture":5}},"uuid":"e06d0f90-92de-1302-190a-fbd10c267e74"},{"name":"front","from":[1,1,2],"to":[3,3,14],"autouv":0,"color":1,"origin":[8,-8,8],"faces":{"north":{"uv":[0,0,0,0],"texture":5},"east":{"uv":[2,14,14,16],"rotation":180,"texture":5},"south":{"uv":[0,0,0,0],"texture":5},"west":{"uv":[2,14,14,16],"texture":5},"up":{"uv":[2,0,14,2],"rotation":270,"texture":5},"down":{"uv":[2,14,14,16],"rotation":90,"texture":5}},"uuid":"8f39075d-3ce3-b4f6-6ef0-6bb131af4333"},{"name":"front","from":[13,1,2],"to":[15,3,14],"autouv":0,"color":1,"origin":[8,-8,8],"faces":{"north":{"uv":[0,0,0,0],"texture":5},"east":{"uv":[14,14,2,16],"texture":5},"south":{"uv":[0,0,0,0],"texture":5},"west":{"uv":[14,14,2,16],"rotation":180,"texture":5},"up":{"uv":[2,2,14,0],"rotation":90,"texture":5},"down":{"uv":[2,16,14,14],"rotation":90,"texture":5}},"uuid":"4af7b711-49e2-96cc-804f-025c079ee52f"},{"name":"front","from":[13,13,2],"to":[15,15,14],"autouv":0,"color":1,"origin":[8,10,8],"faces":{"north":{"uv":[0,0,0,0],"texture":5},"east":{"uv":[14,16,2,14],"texture":5},"south":{"uv":[0,0,0,0],"texture":5},"west":{"uv":[14,2,2,0],"texture":5},"up":{"uv":[14,15,2,13],"rotation":90,"texture":5},"down":{"uv":[14,2,2,0],"rotation":90,"texture":5}},"uuid":"ecde023c-1297-0247-44c2-571ac0de9df1"},{"name":"front","from":[1,13,2],"to":[3,15,14],"autouv":0,"color":0,"origin":[8,10,8],"faces":{"north":{"uv":[0,0,0,0],"texture":5},"east":{"uv":[2,2,14,0],"texture":5},"south":{"uv":[0,0,0,0],"texture":5},"west":{"uv":[2,16,14,14],"texture":5},"up":{"uv":[14,13,2,15],"rotation":90,"texture":5},"down":{"uv":[14,0,2,2],"rotation":270,"texture":5}},"uuid":"b062f25c-f8f3-548b-2f46-fc6bb96083b3"},{"name":"Axis","from":[6,6,8],"to":[10,10,16],"autouv":0,"color":5,"origin":[8,1,16],"faces":{"north":{"uv":[0,0,0,0],"rotation":180,"texture":null},"east":{"uv":[6,8,10,16],"rotation":90,"texture":0},"south":{"uv":[6,6,10,10],"texture":1},"west":{"uv":[6,8,10,16],"rotation":270,"texture":0},"up":{"uv":[6,8,10,16],"texture":0},"down":{"uv":[6,8,10,16],"rotation":180,"texture":0}},"uuid":"e3b9c976-9f92-23c7-9744-b6d5f4bca3b8"},{"name":"rope","from":[6,2,6],"to":[10,8,10],"autouv":0,"color":6,"origin":[7.75,13,8],"faces":{"north":{"uv":[12,10,16,16],"texture":4},"east":{"uv":[12,10,16,16],"texture":4},"south":{"uv":[12,10,16,16],"texture":4},"west":{"uv":[12,10,16,16],"texture":4},"up":{"uv":[12,0,16,4],"rotation":90,"texture":4},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"ffe805a0-fba3-54be-ff6f-ea4d1c3bd848"},{"name":"top","from":[2,14,2],"to":[14,16,14],"autouv":0,"color":6,"origin":[8,10,8],"faces":{"north":{"uv":[0,0,0,0],"texture":5},"east":{"uv":[2,1,14,3],"rotation":180,"texture":5},"south":{"uv":[0,0,0,0],"texture":5},"west":{"uv":[2,13,14,15],"texture":5},"up":{"uv":[2,2,14,14],"rotation":90,"texture":5},"down":{"uv":[2,2,14,14],"rotation":90,"texture":5}},"uuid":"06ae5406-365f-7935-e0d8-7832b0a3aaf9"},{"name":"coil","from":[3.5,3.5,9],"to":[12.5,12.5,13],"autouv":0,"color":6,"rotation":[0,0,45],"origin":[8,8,-4],"faces":{"north":{"uv":[0,0,1,1],"texture":3},"east":{"uv":[0,3,4,12],"rotation":180,"texture":3},"south":{"uv":[0,0,1,1],"texture":3},"west":{"uv":[0,3,4,12],"texture":3},"up":{"uv":[0,3,4,12],"rotation":90,"texture":3},"down":{"uv":[0,3,4,12],"rotation":270,"texture":3}},"uuid":"4a787d9b-a04d-eafd-9dc3-ae1b61869b56"},{"name":"side","from":[3,3,-1],"to":[13,13,1],"autouv":0,"color":3,"origin":[9,-7,7],"faces":{"north":{"uv":[11,0,6,5],"texture":6},"east":{"uv":[11,5,6,6],"rotation":90,"texture":6},"south":{"uv":[0,0,0,0],"texture":null},"west":{"uv":[11,5,6,6],"rotation":270,"texture":6},"up":{"uv":[11,5,6,6],"texture":6},"down":{"uv":[11,5,6,6],"rotation":180,"texture":6}},"uuid":"79d24535-547d-b692-62e2-bcb231a40b02"},{"name":"drain 1","from":[4.5,0,4.5],"to":[11.5,2,11.5],"autouv":0,"color":6,"origin":[6.75,14,6],"faces":{"north":{"uv":[0,0,7,2],"texture":4},"east":{"uv":[0,0,7,2],"texture":4},"south":{"uv":[0,0,7,2],"texture":4},"west":{"uv":[0,0,7,2],"texture":4},"up":{"uv":[0,0,0,0],"rotation":90,"texture":null},"down":{"uv":[0,2,7,9],"texture":4}},"uuid":"6bb4086f-6bf3-c374-3149-743ee69bfa01"},{"name":"drain 2","from":[4.5,2,4.5],"to":[11.5,3,11.5],"autouv":0,"color":6,"origin":[6.75,16,6],"faces":{"north":{"uv":[0,1,7,2],"texture":4},"east":{"uv":[0,1,7,2],"texture":4},"south":{"uv":[0,1,7,2],"texture":4},"west":{"uv":[0,1,7,2],"texture":4},"up":{"uv":[0,2,7,9],"rotation":90,"texture":4},"down":{"uv":[0,9,7,16],"texture":4}},"uuid":"fb8d9297-4cd4-2fe4-bca4-663c7a4bdb9d"},{"name":"drain 3","from":[5.5,2,5.5],"to":[10.5,5,10.5],"autouv":0,"color":6,"origin":[7.75,16,7],"faces":{"north":{"uv":[7,2,10,7],"rotation":270,"texture":4},"east":{"uv":[7,2,10,7],"rotation":270,"texture":4},"south":{"uv":[7,2,10,7],"rotation":270,"texture":4},"west":{"uv":[7,2,10,7],"rotation":270,"texture":4},"up":{"uv":[1,3,6,8],"rotation":90,"texture":4},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"f725e5f1-25eb-7f7a-da81-22f68d165e4b"}],"outliner":["c6880831-d683-f703-04a3-fd39148ebb5c","d93793b9-dd62-5818-2564-da40eed87601","4a787d9b-a04d-eafd-9dc3-ae1b61869b56","50235661-64a5-c971-c6e6-0975baa71d99","f16b6f4f-7c00-62c6-e29b-a9d790a92d84","79d24535-547d-b692-62e2-bcb231a40b02","8e0b92f4-fea1-c76e-eec7-fa197247034b","c6e4de46-37af-8304-d04a-e3a06202a6d1","22157158-613c-9abb-d3b9-2a2d576e1f98","82c9a138-92db-c34a-f8e7-45283db7413d","6965d55e-49aa-ab6d-4568-5de4c1501c57","639134c9-125c-c945-7ece-ee0b946543c7","b27e1c88-26b6-190b-f005-a259810655a1","e06d0f90-92de-1302-190a-fbd10c267e74","8f39075d-3ce3-b4f6-6ef0-6bb131af4333","4af7b711-49e2-96cc-804f-025c079ee52f","ecde023c-1297-0247-44c2-571ac0de9df1","b062f25c-f8f3-548b-2f46-fc6bb96083b3",{"name":"shaft","uuid":"93605e08-38e8-a8a7-4837-dba968998c73","export":true,"isOpen":false,"visibility":true,"autouv":0,"origin":[8,8,8],"children":["e3b9c976-9f92-23c7-9744-b6d5f4bca3b8"]},{"name":"rope_half_magnet","uuid":"4fe97f9a-28c6-d38d-a405-2cdf8eca9b88","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[8,8,8],"children":["ffe805a0-fba3-54be-ff6f-ea4d1c3bd848","6bb4086f-6bf3-c374-3149-743ee69bfa01","fb8d9297-4cd4-2fe4-bca4-663c7a4bdb9d","f725e5f1-25eb-7f7a-da81-22f68d165e4b"]},"06ae5406-365f-7935-e0d8-7832b0a3aaf9"],"textures":[{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\axis.png","name":"axis.png","folder":"block","namespace":"create","id":"0","particle":false,"mode":"bitmap","saved":true,"uuid":"3faf49c5-68db-fed3-b4ca-030214e86e3e","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAo0lEQVQ4T6WTIQ4EIQxFO4IRIECAgLshMBwKO+fCggWDZVOSSVbMJjulkpTH/+X3gB/lvZ/WWhhjQO8drus6nlofD7ExhDCFEOsOGcAYA+cc5JzfK4gxTnxdKQW1VhrgPE/QWu8pQAulFEgpvRvit4XWGg2AFjjnQAJgDqSUawYkC3eQUAEJgEEyxiwLpBxsA/AXMERYW0FCCyTAvUxkwL/r/AGRGnYRGJZooQAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\axis_top.png","name":"axis_top.png","folder":"block","namespace":"create","id":"1","particle":false,"mode":"bitmap","saved":true,"uuid":"8065816d-f585-f9e5-bf22-5659e0bd657b","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAaklEQVQ4T+2SMQ4AERBFv16h5W5atcohVGrXJBOhmL3A2rBa089L/ssTODxx+I8LwNyBc46VUui9g4iQc371NZXovWdjDFprqLUixrgHCCGwlBJjDJRSkFLaA1hrWWv9f8JqYDekj5BWJT4NbygR50R18wAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\copper_gearbox.png","name":"copper_gearbox.png","folder":"block","namespace":"create","id":"4","particle":false,"mode":"bitmap","saved":true,"uuid":"374c5dbd-5856-5c1a-324e-d8464907f61e","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB/0lEQVQ4T42TQWsTQRTH/7PpbjRxd000TVYaIghWWSjSetBDLdSoICzaDyPevflJ/AA59eihkiiIRCSoBLu6dtNsm6VJU7JJN5GZYbKbhoBzmXnvzfzm/+bNI29flieIjeBsjGRKmnqoTUfcJ4I0Rt483Z7sWGtxBlufDLozvvA4YHbiWpLNnd8+9hpdDth+chOVXRurGYXfphA2B0MuTtiCWD8M2N5Gux8B7C8tFm96gzk1wkHTWEnzSyh8CthaN+D88dnhfj9E08ih5bpQFAWaroMQgkQigVuuh2xOxt2iCudvgF/HpyCvy48nz+8XpoDq0iV28GOthsN2m92WX16GUSiw9YtcBvdWdQawu0EEaHfO0Ng/wR6R8bVex4HrzqRywzBgmiY2pTEDHLUG+O4P5xV8TmmoVCoIw3AGQFOwLAsPcYoHd/JoNjscIKrg/vSZgv8FfPvh8xQEgFbB6Q9RJSpq1erCFMpXwBRQAHvEi4BPS1dx4DjYt+2ZR1zf2MCR52HHUOcBooxUQccb4f35ALIsI5PNQpIkVsbRaATT76GUT8O8nYkU0DJaz0oQH4lCxFAl/mniQ78MrBRjAJoCVfDug43NogY1m4SeTi38jTRA965d16KPVNJ4g/TG0e3Ujiu4GKOd2AvOQV5tPWId05vwtmUHCW/nuG+RpH+o0xp0yccJugAAAABJRU5ErkJggg=="},{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\hose_pulley_rope.png","name":"hose_pulley_rope.png","folder":"block","namespace":"create","id":"5","particle":false,"mode":"bitmap","saved":true,"uuid":"36d79924-56fb-920d-44b5-79ac193e75bc","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAX0lEQVQ4T2M00tP4z8fLwfDp8w+GX7//MLCxsjCQwmfU0VT5r6IgwfDh0xe4IaTwGUddwEB5GLS1tf2Xl5dn0NDQYLhx4wbDw4cPGUjhMy5duvQ/uZpBlo2mgz/DIQwAKD7WmGK5ZIUAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\hose_pulley_magnet.png","name":"hose_pulley_magnet.png","folder":"block","namespace":"create","id":"6","particle":false,"mode":"bitmap","saved":true,"uuid":"e708a585-d298-4e3f-e1a3-6fe62e93581b","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABTElEQVQ4T2NkYGBgSLC2+r/g6DFGdBokhw6M9DT+8/FyMHz6/IPh1+8/DIwHK6L/f/z6jYGfm4uBWZid4e/bnwwwvn3HUkZ0A3Q0Vf6rKEgwfPj0BWwIXgNABl46/oJBVISdIXTWerBhGC7YlBv4/8nTnwwczP8Z2NkYGX7++s/w4y8jg4w0O4OQnCDYABDbbzLEAKwuuHv3HYOyshDcCzA+SAOILSLBATcAwwVHupP+P7zwgkHeQIKBn4OP4f6thwyf3/0E80HhATMMFh54XQALPHQXgFwHM4CkMID5GzkmSIoFbNFI/XQAisYLNz8yLD95CO7SSHM7BgN1fnjII3sBqwsypq/ESLIzMsPhAYcs2dbW9l9eXp5BQ0OD4caNGwyMoGhMbVmEYcDsmjgGm9J5GEl56dKl/2GaHz58CEnKpLgAIxaoEgaU5EYA9eFAmHAG4o8AAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\oxidized\\copper_block_0.png","name":"copper_block_0.png","folder":"block/oxidized","namespace":"create","id":"8","particle":true,"mode":"bitmap","saved":true,"uuid":"7dd1a067-4a71-cdfe-245e-baad08910bcc","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB9ElEQVQ4T22TXUsbURCG31VIaswmTRS/SKqInxRikF4UwQ9sqlAQWuhfKb3vXf+GNyJ4pwiCiFD0SsEWNK0aNDGtaRqzJtss2dQYmTk9m93EuTl75uw8552ZM8rnt7EabGYa93B7WiwP7cnsPnlIZ8qnhfnau6WIncHfhXLR4avemLxv7XDzmk9p2IsXBWD+9QDWt5IYDbjEbS6FV7MixMm9JH77bfK/8WypDkgeZfg88afcpEY6KI1Qu7iE4BZgdrIX6SuNgyd6vA5Au8fJO8wYGA+rSP80cXHzF8rH2Kvamxc9DsDZrYHpaBB6VqhRu57gy1Ee72PPsLxxieionwHJolkHZPMG4pcFTA16OaB6+w9GpcrfQ9Fe6Gkdv841bH8vMCCXKeOHVmlWQACPq9UK7u704vwkZ/kohZdj3Ugk8gIgu3B9prECqgHlTZC+oQC+HuR4T0oItrqTYsDxqSZSkADqQrpUwZjPwwFkJQOOYPLZAVzExwBUxOGnAiRvXttOcREfBcg2koK5SJClcvVDqqOHVMjN3QyejwQ4BauNS4v9kA+JINLUFvFo7OZvA0JhG4BSIAUr+0lMh31Qg274G19PA4T+jXT66gr6fWJA9Pv67ZyCTUHjGU2ibt5B+TA7wxOj18TYcqAixtnua8rlv+MBPoIXdEHcqvMAAAAASUVORK5CYII="},{"path":"C:\\Users\\simon\\Desktop\\Forge 15\\Create\\src\\main\\resources\\assets\\create\\textures\\block\\fluid_pipe.png","name":"fluid_pipe.png","folder":"block","namespace":"create","id":"9","particle":false,"mode":"bitmap","saved":true,"uuid":"e238433b-c06e-b068-b8f7-ba0f778775f1","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE+ElEQVRYR5VX32scVRT+NunubHa7s9lJtj/MtrEGk0o1KkitaCu0WjAPIkKRUuiDoNT+A30pPkgffBdUFAQLoRSxfRAUFPpgHqxvsiBitPRHNk3MZnfNrpNkdpOMfHd6pncn093Z+3KzM3fu+c4533fOSeyjk8ddeysGrnSfq3ZZ8lx+b7VaeK6wE4m0oR4Z3oZsOqX2peqq2pu2g5U1IDvw8C7+Pn/te8+QtmIEUMgaMBKxtosdx7uIiwYbtXX8sWTj8MSQMmztz6l3mxXvDFf/kIHqvRrk28kj4yjenIXsZ6YfAWAsn8RtewM3654HiUTc86TZUvsRM4UD6R34rfSfArD3yRxu/HQHV379uc2b0y8ew/HXH8fCXzUFPmMZKM07KIwYaFQddARw+V4V6fQAjHgcZsZEvVFXlzutFmx7DWf3W5iZq2Pq2bwK+bnPrgajqX5/efGsH4XysoPJl/ag+Msi8sMGTn1xPTwFjMCVhToy6RSq/9bx/NNPobbSwJ25EqxBEw17FVODJorL0QEQDL0XAIzCm5+EALjw2gl3creBbytryvvRwggcp4lBM4M1x8Hd0rwCcHqv6UeA+X/v0uXQCHz+wTtYsb1ULi+uY2zMwq1bVQzvSYYDOHfsFffEwTy+/ruMYSsHI2Egl82oCDhNB47j+ADIgaOTQ4qA3QAwTTQsALi/+vH09hQQwOHdGVyrNNpSsFhexsI/ZT8F7x/KY6ZYUSQ8+Mworn9X7EjCXVZEAEzBRC6Bq4s1xOM7lAKYCiEgldBqbfgkZLQowwPjo6jOl335ZZMmVtbrPgEJ4PfZms+BQ+O58AgQwAtPmPhzycZMxWM+gXDRMNfLAymQqFTB0X2mqgsEQb3rxYiFSGoHv4skQ4lAKKO0h/dbmyhVV3sCEKkQkQPdjOvvC1YKVp8XIZZap+l9vr4ZQ7LfVXt1a0OdiVSKP317yuWHmVyyDQdLLy8L1u/pM1NulF4QVvXCHFW9oC/leSSe0QOurdUNfPjjjW3S6SVi3c7Geo1Atwt7fa8AsE6TzdJWeQkZzVoe1kJ7NdLpfOyrU2+4bMWUjN5iowKQFDJ9TN1j8X7fHjnERY7JEpJKin0AJBaLhzWSx+3Zu0rjUSIQNk+IMdYEUYlOcnlOaSsA/IDNgingUMF+zkUlvPvNDx1JSAAsUoygkuaD6UgakjzjvRxe5DnnA05JoRxg+GmcqxuAIIdoKGyxVEvpJgiJsALAglHYl1Pey4jFThYFACPI8DJ9QeM0ysUewXv194wyndwGgB/wcFQShgHQjYlDNC4NS+73AVCGQkC9o0UhoZ4CURGdkOGUf4vEBQRTIQ4qEjKEeovVc9StDgQBCNFkMqYKgikiOE5LlKRPQk66QhRRgsz3uo51PSuGD3hju3BAQi4eyvlgLZDnbQAk/4o4D5hKEDSga1r/HyIYYrmjNFdTMpNCpH8jd/kR0FWgE0WACFpqnMBk13XPv4XljIIOgPezTujf+XXg0lsn3Yld6TYZ6fIJapqXs1qKtHTDQZaTxFzBXtNWB3QSSiXUjYqkJLdiXD8T1LsY4JjH3iAk1KPnk5AR4L9deimVg+IdWauHWy/XusREftwlxEJUPQWiEFWKCYAoSRIuIZxMPeKpPmzKM5FY2Bm+Y7NhlwxOXG0k7NRO9TBLaw3KSp8F5Z0+UQ3v9Ea9R8nwf4KEhTJhQYO9AAAAAElFTkSuQmCC"}],"display":{"thirdperson_righthand":{"rotation":[75,45,0],"translation":[0,2.5,0],"scale":[0.375,0.375,0.375]},"thirdperson_lefthand":{"rotation":[75,45,0],"translation":[0,2.5,0],"scale":[0.375,0.375,0.375]},"firstperson_righthand":{"rotation":[0,45,0],"scale":[0.4,0.4,0.4]},"firstperson_lefthand":{"rotation":[0,225,0],"scale":[0.4,0.4,0.4]},"ground":{"translation":[0,3,0],"scale":[0.25,0.25,0.25]},"gui":{"rotation":[30,225,0],"scale":[0.625,0.625,0.625]},"fixed":{"scale":[0.5,0.5,0.5]}}} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/copper_pulley_rope.bbmodel b/src/main/resources/assets/create/models/block/hose_pulley/copper_pulley_rope.bbmodel new file mode 100644 index 000000000..38a0b1b92 --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/copper_pulley_rope.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.2","model_format":"java_block","box_uv":false},"name":"rope","parent":"block/block","ambientocclusion":true,"front_gui_light":false,"resolution":{"width":16,"height":16},"elements":[{"name":"rope","from":[6,0,6],"to":[10,16,10],"autouv":0,"color":6,"locked":false,"origin":[7.75,0,8],"faces":{"north":{"uv":[0,0,4,16],"texture":0},"east":{"uv":[0,0,4,16],"texture":0},"south":{"uv":[0,0,4,16],"texture":0},"west":{"uv":[0,0,4,16],"texture":0},"up":{"uv":[0,0,4,4],"rotation":90,"texture":0},"down":{"uv":[0,0,4,4],"texture":0}},"uuid":"3f245b42-dde8-d34f-9f25-ae6eb2f322ae"}],"outliner":["3f245b42-dde8-d34f-9f25-ae6eb2f322ae"],"textures":[{"path":"C:\\Users\\krypp\\Documents\\Pixel Art\\Create Mod\\Pulley Pump\\copper_pulley_rope.png","name":"copper_pulley_rope.png","folder":"Pulley Pump","namespace":"create","id":"5","particle":true,"mode":"bitmap","saved":true,"uuid":"8ffc2f62-b5b6-1af9-ecc1-e22a9ae075aa","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAX0lEQVQ4T2M00tP4z8fLwfDp8w+GX7//MLCxsjCQwmfU0VT5r6IgwfDh0xe4IaTwGUddwEB5GLS1tf2Xl5dn0NDQYLhx4wbDw4cPGUjhMy5duvQ/uZpBlo2mgz/DIQwAKD7WmGK5ZIUAAAAASUVORK5CYII="}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/item.json b/src/main/resources/assets/create/models/block/hose_pulley/item.json new file mode 100644 index 000000000..b8c30a0cd --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/item.json @@ -0,0 +1,381 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/axis", + "1": "create:block/axis_top", + "4": "create:block/copper_gearbox", + "5": "create:block/hose_pulley_rope", + "6": "create:block/hose_pulley_magnet", + "8": "create:block/oxidized/copper_block_0", + "9": "create:block/fluid_pipe", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "coil", + "from": [4, 4, 2], + "to": [12, 12, 14], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, + "faces": { + "east": {"uv": [2, 1, 14, 9], "texture": "#5"}, + "west": {"uv": [2, 1, 14, 9], "rotation": 180, "texture": "#5"}, + "up": {"uv": [2, 1, 14, 9], "rotation": 270, "texture": "#5"}, + "down": {"uv": [2, 1, 14, 9], "rotation": 90, "texture": "#5"} + } + }, + { + "name": "coil", + "from": [3.5, 3.5, 3], + "to": [12.5, 12.5, 7], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]}, + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "west": {"uv": [0, 3, 4, 12], "texture": "#5"}, + "up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"} + } + }, + { + "name": "coil", + "from": [3.5, 3.5, 9], + "to": [12.5, 12.5, 13], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -4]}, + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "west": {"uv": [0, 3, 4, 12], "texture": "#5"}, + "up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"} + } + }, + { + "name": "side", + "from": [2, 2, 14], + "to": [14, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#4"}, + "down": {"uv": [2, 11, 14, 12], "texture": "#4"} + } + }, + { + "name": "side", + "from": [2, 2, 1], + "to": [14, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [14, 2, 2, 14], "texture": "#8"}, + "south": {"uv": [14, 2, 2, 14], "texture": "#8"}, + "down": {"uv": [2, 12, 14, 11], "texture": "#4"} + } + }, + { + "name": "side", + "from": [3, 3, -1], + "to": [13, 13, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [9, -7, 7]}, + "faces": { + "north": {"uv": [11, 0, 6, 5], "texture": "#9"}, + "east": {"uv": [11, 5, 6, 6], "rotation": 90, "texture": "#9"}, + "west": {"uv": [11, 5, 6, 6], "rotation": 270, "texture": "#9"}, + "up": {"uv": [11, 5, 6, 6], "texture": "#9"}, + "down": {"uv": [11, 5, 6, 6], "rotation": 180, "texture": "#9"} + } + }, + { + "name": "side_frame", + "from": [0, 2, 14], + "to": [2, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [14, 2, 16, 14], "texture": "#8"}, + "east": {"uv": [0, 2, 2, 14], "texture": "#8"}, + "south": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"}, + "west": {"uv": [14, 2, 16, 14], "texture": "#8"}, + "up": {"uv": [0, 14, 2, 16], "texture": "#8"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 2, 0], + "to": [2, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"}, + "east": {"uv": [2, 2, 0, 14], "texture": "#8"}, + "south": {"uv": [16, 2, 14, 14], "texture": "#8"}, + "west": {"uv": [16, 2, 14, 14], "texture": "#8"}, + "up": {"uv": [0, 16, 2, 14], "texture": "#8"}, + "down": {"uv": [0, 2, 2, 0], "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [14, 2, 14], + "to": [16, 14, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [2, 2, 0, 14], "rotation": 180, "texture": "#8"}, + "east": {"uv": [16, 2, 14, 14], "texture": "#8"}, + "south": {"uv": [16, 2, 14, 14], "rotation": 180, "texture": "#8"}, + "west": {"uv": [2, 2, 0, 14], "texture": "#8"}, + "up": {"uv": [2, 14, 0, 16], "texture": "#8"}, + "down": {"uv": [2, 0, 0, 2], "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [14, 2, 0], + "to": [16, 14, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [14, 2, 16, 14], "rotation": 180, "texture": "#8"}, + "east": {"uv": [14, 2, 16, 14], "texture": "#8"}, + "south": {"uv": [0, 2, 2, 14], "rotation": 180, "texture": "#8"}, + "west": {"uv": [0, 2, 2, 14], "texture": "#8"}, + "up": {"uv": [2, 16, 0, 14], "texture": "#8"}, + "down": {"uv": [2, 2, 0, 0], "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 0, 14], + "to": [16, 2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [0, 14, 16, 16], "texture": "#8"}, + "east": {"uv": [0, 14, 2, 16], "texture": "#8"}, + "south": {"uv": [0, 14, 16, 16], "texture": "#8"}, + "west": {"uv": [14, 14, 16, 16], "texture": "#8"}, + "up": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 14, 14], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [0, 16, 16, 14], "texture": "#8"}, + "east": {"uv": [0, 16, 2, 14], "texture": "#8"}, + "south": {"uv": [0, 16, 16, 14], "texture": "#8"}, + "west": {"uv": [14, 16, 16, 14], "texture": "#8"}, + "up": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#8"}, + "down": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 0, 0], + "to": [16, 2, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 8]}, + "faces": { + "north": {"uv": [16, 14, 0, 16], "texture": "#8"}, + "east": {"uv": [2, 14, 0, 16], "texture": "#8"}, + "south": {"uv": [16, 14, 0, 16], "texture": "#8"}, + "west": {"uv": [16, 14, 14, 16], "texture": "#8"}, + "up": {"uv": [0, 16, 16, 14], "rotation": 180, "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#8"} + } + }, + { + "name": "side_frame", + "from": [0, 14, 0], + "to": [16, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 15, 8]}, + "faces": { + "north": {"uv": [16, 16, 0, 14], "texture": "#8"}, + "east": {"uv": [2, 16, 0, 14], "texture": "#8"}, + "south": {"uv": [16, 16, 0, 14], "texture": "#8"}, + "west": {"uv": [16, 16, 14, 14], "texture": "#8"}, + "up": {"uv": [0, 16, 16, 14], "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#8"} + } + }, + { + "name": "front", + "from": [1, 1, 2], + "to": [3, 3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "east": {"uv": [2, 14, 14, 16], "rotation": 180, "texture": "#8"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "west": {"uv": [2, 14, 14, 16], "texture": "#8"}, + "up": {"uv": [2, 0, 14, 2], "rotation": 270, "texture": "#8"}, + "down": {"uv": [2, 14, 14, 16], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "front", + "from": [13, 1, 2], + "to": [15, 3, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "east": {"uv": [14, 14, 2, 16], "texture": "#8"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "west": {"uv": [14, 14, 2, 16], "rotation": 180, "texture": "#8"}, + "up": {"uv": [2, 2, 14, 0], "rotation": 90, "texture": "#8"}, + "down": {"uv": [2, 16, 14, 14], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "front", + "from": [13, 13, 2], + "to": [15, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "east": {"uv": [14, 16, 2, 14], "texture": "#8"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "west": {"uv": [14, 2, 2, 0], "texture": "#8"}, + "up": {"uv": [14, 15, 2, 13], "rotation": 90, "texture": "#8"}, + "down": {"uv": [14, 2, 2, 0], "rotation": 90, "texture": "#8"} + } + }, + { + "name": "front", + "from": [1, 13, 2], + "to": [3, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "east": {"uv": [2, 2, 14, 0], "texture": "#8"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "west": {"uv": [2, 16, 14, 14], "texture": "#8"}, + "up": {"uv": [14, 13, 2, 15], "rotation": 90, "texture": "#8"}, + "down": {"uv": [14, 0, 2, 2], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "Axis", + "from": [6, 6, 8], + "to": [10, 10, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1, 16]}, + "faces": { + "east": {"uv": [6, 8, 10, 16], "rotation": 90, "texture": "#0"}, + "south": {"uv": [6, 6, 10, 10], "texture": "#1"}, + "west": {"uv": [6, 8, 10, 16], "rotation": 270, "texture": "#0"}, + "up": {"uv": [6, 8, 10, 16], "texture": "#0"}, + "down": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#0"} + } + }, + { + "name": "rope", + "from": [6, 2, 6], + "to": [10, 8, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]}, + "faces": { + "north": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "east": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "south": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "west": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "drain 1", + "from": [4.5, 0, 4.5], + "to": [11.5, 2, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]}, + "faces": { + "north": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "east": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "south": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "west": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#6"} + } + }, + { + "name": "drain 2", + "from": [4.5, 2, 4.5], + "to": [11.5, 3, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]}, + "faces": { + "north": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "east": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "south": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "west": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"}, + "down": {"uv": [0, 9, 7, 16], "texture": "#6"} + } + }, + { + "name": "drain 3", + "from": [5.5, 2, 5.5], + "to": [10.5, 5, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]}, + "faces": { + "north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "top", + "from": [2, 14, 2], + "to": [14, 16, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, + "faces": { + "north": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#8"}, + "west": {"uv": [2, 13, 14, 15], "texture": "#8"}, + "up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + { + "name": "shaft", + "origin": [8, 8, 8], + "children": [18] + }, + { + "name": "rope_half_magnet", + "origin": [8, 8, 8], + "children": [19, 20, 21, 22] + }, 23] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json b/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json new file mode 100644 index 000000000..65a249d9c --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/pulley_magnet.json @@ -0,0 +1,101 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "6": "create:block/hose_pulley_magnet", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "rope", + "from": [6, 2, 6], + "to": [10, 16, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]}, + "faces": { + "north": {"uv": [12, 2, 16, 16], "texture": "#6"}, + "east": {"uv": [12, 2, 16, 16], "texture": "#6"}, + "south": {"uv": [12, 2, 16, 16], "texture": "#6"}, + "west": {"uv": [12, 2, 16, 16], "texture": "#6"}, + "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "drain 1", + "from": [4.5, 0, 4.5], + "to": [11.5, 2, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]}, + "faces": { + "north": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "east": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "south": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "west": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#6"} + } + }, + { + "name": "drain 2", + "from": [4.5, 2, 4.5], + "to": [11.5, 3, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]}, + "faces": { + "north": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "east": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "south": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "west": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"}, + "down": {"uv": [0, 9, 7, 16], "texture": "#6"} + } + }, + { + "name": "drain 3", + "from": [5.5, 2, 5.5], + "to": [10.5, 5, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]}, + "faces": { + "north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "rope_half_magnet", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope.json b/src/main/resources/assets/create/models/block/hose_pulley/rope.json new file mode 100644 index 000000000..2995519fd --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/rope_pulley/rope", + "textures": { + "5": "create:block/hose_pulley_rope", + "particle": "create:block/hose_pulley_rope" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json b/src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json new file mode 100644 index 000000000..f4d01993a --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope_coil.json @@ -0,0 +1,49 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "5": "create:block/hose_pulley_rope" + }, + "elements": [ + { + "name": "coil", + "from": [4, 4, 2], + "to": [12, 12, 14], + "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, + "faces": { + "east": {"uv": [2, 1, 14, 9], "texture": "#5"}, + "west": {"uv": [2, 1, 14, 9], "rotation": 180, "texture": "#5"}, + "up": {"uv": [2, 1, 14, 9], "rotation": 270, "texture": "#5"}, + "down": {"uv": [2, 1, 14, 9], "rotation": 90, "texture": "#5"} + } + }, + { + "name": "coil", + "from": [3.5, 3.5, 3], + "to": [12.5, 12.5, 7], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]}, + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "west": {"uv": [0, 3, 4, 12], "texture": "#5"}, + "up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"} + } + }, + { + "name": "coil", + "from": [3.5, 3.5, 9], + "to": [12.5, 12.5, 13], + "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -4]}, + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "east": {"uv": [0, 3, 4, 12], "rotation": 180, "texture": "#5"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "west": {"uv": [0, 3, 4, 12], "texture": "#5"}, + "up": {"uv": [0, 3, 4, 12], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 3, 4, 12], "rotation": 270, "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json b/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json new file mode 100644 index 000000000..facd4b8b8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope_half.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/rope_pulley/rope_half", + "textures": { + "5": "create:block/hose_pulley_rope", + "particle": "create:block/hose_pulley_rope" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json b/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json new file mode 100644 index 000000000..665d0ab7e --- /dev/null +++ b/src/main/resources/assets/create/models/block/hose_pulley/rope_half_magnet.json @@ -0,0 +1,101 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "6": "create:block/hose_pulley_magnet", + "particle": "create:block/oxidized/copper_block_0" + }, + "elements": [ + { + "name": "rope", + "from": [6, 2, 6], + "to": [10, 8, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 13, 8]}, + "faces": { + "north": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "east": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "south": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "west": {"uv": [12, 10, 16, 16], "texture": "#6"}, + "up": {"uv": [12, 0, 16, 4], "rotation": 90, "texture": "#6"} + } + }, + { + "name": "drain 1", + "from": [4.5, 0, 4.5], + "to": [11.5, 2, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 14, 6]}, + "faces": { + "north": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "east": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "south": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "west": {"uv": [0, 0, 7, 2], "texture": "#6"}, + "down": {"uv": [0, 2, 7, 9], "texture": "#6"} + } + }, + { + "name": "drain 2", + "from": [4.5, 2, 4.5], + "to": [11.5, 3, 11.5], + "rotation": {"angle": 0, "axis": "y", "origin": [6.75, 16, 6]}, + "faces": { + "north": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "east": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "south": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "west": {"uv": [0, 1, 7, 2], "texture": "#6"}, + "up": {"uv": [0, 2, 7, 9], "rotation": 90, "texture": "#6"}, + "down": {"uv": [0, 9, 7, 16], "texture": "#6"} + } + }, + { + "name": "drain 3", + "from": [5.5, 2, 5.5], + "to": [10.5, 5, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7.75, 16, 7]}, + "faces": { + "north": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "east": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "south": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "west": {"uv": [7, 2, 10, 7], "rotation": 270, "texture": "#6"}, + "up": {"uv": [1, 3, 6, 8], "rotation": 90, "texture": "#6"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "thirdperson_lefthand": { + "rotation": [75, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [0, 45, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "scale": [0.4, 0.4, 0.4] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.25, 0.25, 0.25] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "rope_half_magnet", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/item_drain.json b/src/main/resources/assets/create/models/block/item_drain.json new file mode 100644 index 000000000..60751792d --- /dev/null +++ b/src/main/resources/assets/create/models/block/item_drain.json @@ -0,0 +1,79 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "create:block/item_drain_side", + "1": "create:block/item_drain_top", + "2": "create:block/copper_casing", + "3": "create:block/pump", + "particle": "create:block/item_drain_side" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 2, 16], + "faces": { + "north": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "east": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "south": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "west": {"uv": [0, 14, 16, 16], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#2"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [0, 2, 0], + "to": [16, 13, 2], + "faces": { + "north": {"uv": [0, 3, 16, 14], "texture": "#0"}, + "east": {"uv": [14, 3, 16, 14], "texture": "#0"}, + "south": {"uv": [0, 3, 16, 14], "texture": "#0"}, + "west": {"uv": [0, 3, 2, 14], "texture": "#0"}, + "up": {"uv": [0, 0, 16, 2], "texture": "#1"} + } + }, + { + "from": [0, 2, 14], + "to": [16, 13, 16], + "faces": { + "north": {"uv": [0, 3, 16, 14], "texture": "#0"}, + "east": {"uv": [0, 3, 2, 14], "texture": "#0"}, + "south": {"uv": [0, 3, 16, 14], "texture": "#0"}, + "west": {"uv": [14, 3, 16, 14], "texture": "#0"}, + "up": {"uv": [0, 14, 16, 16], "texture": "#1"} + } + }, + { + "from": [14, 2, 2], + "to": [16, 13, 14], + "faces": { + "east": {"uv": [2, 3, 14, 14], "texture": "#0"}, + "west": {"uv": [2, 3, 14, 14], "texture": "#0"}, + "up": {"uv": [14, 2, 16, 14], "texture": "#1"} + } + }, + { + "from": [0, 2, 2], + "to": [2, 13, 14], + "faces": { + "east": {"uv": [2, 3, 14, 14], "texture": "#0"}, + "west": {"uv": [2, 3, 14, 14], "texture": "#0"}, + "up": {"uv": [0, 2, 2, 14], "texture": "#1"} + } + }, + { + "from": [2, 12, 2], + "to": [14, 13, 14], + "faces": { + "up": {"uv": [2, 2, 14, 14], "texture": "#1"} + } + }, + { + "from": [2, 4, 2], + "to": [14, 5, 14], + "faces": { + "up": {"uv": [0, 0, 12, 12], "texture": "#3"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/rope_pulley/block.json b/src/main/resources/assets/create/models/block/rope_pulley/block.json index 11317a92c..a7d302af7 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/block.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/block.json @@ -4,7 +4,7 @@ "textures": { "3": "create:block/gearbox_top", "4": "create:block/gearbox", - "5": "create:block/andesite_casing_short", + "6": "create:block/andesite_casing", "particle": "create:block/pulley_rope" }, "elements": [ @@ -194,14 +194,14 @@ }, { "name": "top", - "from": [3, 14, 2], - "to": [13, 16, 14], + "from": [2, 14, 2], + "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, "faces": { - "east": {"uv": [2, 14, 14, 16], "texture": "#3"}, - "west": {"uv": [2, 14, 14, 16], "texture": "#3"}, - "up": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#5"}, - "down": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#5"} + "east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#6"}, + "west": {"uv": [2, 13, 14, 15], "texture": "#6"}, + "up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#6"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#6"} } } ] diff --git a/src/main/resources/assets/create/models/block/rope_pulley/item.json b/src/main/resources/assets/create/models/block/rope_pulley/item.json index 0127c7ca6..d0d9994c9 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/item.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/item.json @@ -8,8 +8,8 @@ "4": "create:block/gearbox", "5": "create:block/pulley_rope", "6": "create:block/pulley_magnet", - "7": "create:block/andesite_casing_short", - "particle": "create:block/pulley_magnet" + "8": "create:block/andesite_casing", + "particle": "create:block/andesite_casing" }, "elements": [ { @@ -279,16 +279,14 @@ }, { "name": "top", - "from": [3, 14, 2], - "to": [13, 16, 14], + "from": [2, 14, 2], + "to": [14, 16, 14], "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 8]}, "faces": { - "north": {"uv": [0, 0, 0, 0], "texture": "#7"}, - "east": {"uv": [2, 14, 14, 16], "texture": "#7"}, - "south": {"uv": [0, 0, 0, 0], "texture": "#7"}, - "west": {"uv": [2, 14, 14, 16], "texture": "#7"}, - "up": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#7"}, - "down": {"uv": [2, 5, 14, 15], "rotation": 90, "texture": "#7"} + "east": {"uv": [2, 1, 14, 3], "rotation": 180, "texture": "#8"}, + "west": {"uv": [2, 13, 14, 15], "texture": "#8"}, + "up": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 90, "texture": "#8"} } } ], diff --git a/src/main/resources/assets/create/models/block/schematic_table.json b/src/main/resources/assets/create/models/block/schematic_table.json index 70f25af30..e41f18686 100644 --- a/src/main/resources/assets/create/models/block/schematic_table.json +++ b/src/main/resources/assets/create/models/block/schematic_table.json @@ -1,77 +1,60 @@ { - "__comment": "Model generated using MrCrayfish's Model Creator (http://mrcrayfish.com/modelcreator/)", + "credit": "Made with Blockbench", "parent": "block/block", - "textures": { - "0": "create:block/schematic_table_side", - "1": "create:block/schematic_table_top", + "textures": { + "0": "create:block/schematic_table_side", + "1": "create:block/schematic_table_top", "particle": "create:block/schematic_table_side" - }, - "elements": [ - { - "name": "base", - "from": [ 5.0, 0.0, 5.0 ], - "to": [ 11.0, 12.0, 11.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] }, - "east": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] }, - "south": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] }, - "west": { "texture": "#0", "uv": [ 5.0, 4.0, 11.0, 16.0 ] }, - "up": { "texture": "#0", "uv": [ 0.0, 0.0, 6.0, 6.0 ] }, - "down": { "texture": "#0", "uv": [ 5.0, 6.0, 11.0, 12.0 ] } - } - }, - { - "name": "Top", - "from": [ 0.0, 12.0, -2.0 ], - "to": [ 16.0, 15.0, 14.0 ], - "rotation": { "origin": [ 8.0, 8.0, 8.0 ], "axis": "x", "angle": 22.5 }, - "faces": { - "north": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "east": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "south": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "west": { "texture": "#0", "uv": [ 0.0, 0.0, 16.0, 3.0 ] }, - "up": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] }, - "down": { "texture": "#1", "uv": [ 0.0, 0.0, 16.0, 16.0 ] } - } - }, - { - "name": "Cube", - "from": [ 4.0, 11.0, 4.0 ], - "to": [ 12.0, 14.0, 11.0 ], - "faces": { - "north": { "texture": "#1", "uv": [ 4.0, 1.0, 12.0, 4.0 ] }, - "east": { "texture": "#1", "uv": [ 4.0, 1.0, 11.0, 4.0 ] }, - "south": { "texture": "#1", "uv": [ 4.0, 1.0, 12.0, 4.0 ] }, - "west": { "texture": "#1", "uv": [ 4.0, 1.0, 11.0, 4.0 ] }, - "down": { "texture": "#1", "uv": [ 4.0, 4.0, 12.0, 11.0 ] } - } - }, - { - "name": "Cube", - "from": [ 1.0, 12.0, 15.0 ], - "to": [ 15.0, 13.0, 16.0 ], - "rotation": { "origin": [ 8.0, 14.0, 16.0 ], "axis": "x", "angle": 22.5 }, - "faces": { - "north": { "texture": "#0", "uv": [ 1.0, 12.0, 15.0, 13.0 ] }, - "east": { "texture": "#0", "uv": [ 6.0, 14.0, 7.0, 15.0 ] }, - "south": { "texture": "#0", "uv": [ 1.0, 14.0, 15.0, 15.0 ] }, - "west": { "texture": "#0", "uv": [ 7.0, 14.0, 8.0, 15.0 ] }, - "up": { "texture": "#0", "uv": [ 1.0, 13.0, 15.0, 14.0 ] }, - "down": { "texture": "#0", "uv": [ 1.0, 14.0, 15.0, 15.0 ] } - } - }, - { - "name": "Cube", - "from": [ 4.0, 0.0, 4.0 ], - "to": [ 12.0, 2.0, 12.0 ], - "faces": { - "north": { "texture": "#0", "uv": [ 5.0, 14.0, 13.0, 16.0 ] }, - "east": { "texture": "#0", "uv": [ 6.0, 14.0, 14.0, 16.0 ] }, - "south": { "texture": "#0", "uv": [ 1.0, 14.0, 9.0, 16.0 ] }, - "west": { "texture": "#0", "uv": [ 4.0, 14.0, 12.0, 16.0 ] }, - "up": { "texture": "#0", "uv": [ 0.0, 5.0, 8.0, 13.0 ] }, - "down": { "texture": "#0", "uv": [ 4.0, 5.0, 12.0, 13.0 ] } - } - } - ] + }, + "elements": [ + { + "name": "base", + "from": [5, 0, 5], + "to": [11, 12, 11], + "faces": { + "north": {"uv": [0, 3, 6, 15], "texture": "#0"}, + "east": {"uv": [0, 3, 6, 15], "texture": "#0"}, + "south": {"uv": [0, 3, 6, 15], "texture": "#0"}, + "west": {"uv": [0, 3, 6, 15], "texture": "#0"} + } + }, + { + "name": "Top", + "from": [0, 11, 2], + "to": [16, 14, 14], + "faces": { + "north": {"uv": [0, 0, 16, 3], "texture": "#0"}, + "east": {"uv": [0, 0, 12, 3], "texture": "#0"}, + "south": {"uv": [0, 0, 16, 3], "texture": "#0"}, + "west": {"uv": [0, 0, 12, 3], "texture": "#0"}, + "up": {"uv": [0, 2, 16, 14], "texture": "#1"}, + "down": {"uv": [0, 2, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 9, 4], + "to": [12, 11, 12], + "faces": { + "north": {"uv": [4, 2, 12, 4], "texture": "#1"}, + "east": {"uv": [4, 2, 12, 4], "texture": "#1"}, + "south": {"uv": [4, 2, 12, 4], "texture": "#1"}, + "west": {"uv": [4, 2, 12, 4], "texture": "#1"}, + "down": {"uv": [4, 4, 12, 12], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [5, 14, 13, 16], "texture": "#0"}, + "east": {"uv": [6, 14, 14, 16], "texture": "#0"}, + "south": {"uv": [1, 14, 9, 16], "texture": "#0"}, + "west": {"uv": [4, 14, 12, 16], "texture": "#0"}, + "up": {"uv": [6, 5, 14, 13], "texture": "#0"}, + "down": {"uv": [6, 5, 14, 13], "texture": "#0"} + } + } + ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/copper_gearbox.png b/src/main/resources/assets/create/textures/block/copper_gearbox.png new file mode 100644 index 0000000000000000000000000000000000000000..458265dd3aeff47e5816d33c82465a0b16647c07 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Li60G|-o&H$GtH>b;!3yyRr9ju7nlp9#?;yf?Zb7{0!sl8pfwS7oPh>f+i zlcQrmKtNz%;ItqwAdr%jWM*bIHZ)wF7U=Ho4m8Zw#l_0P!pFzQ!ra`}#>UUjFT>8} za`^=@pd4p`M`SSr1K%MKW)#)%Y5)q(_H=O!(FpeKzbSNBfx~rSUPjc`StXuP|Nk3T zdw#lL%=}o!u|?$Cg(dF$G}t1tdp;jI)~>Kf@sV?jz(eMy_6>(Jcik(RDYR4Sr1PEP z*L%+z?|!8yR<}hxL%+Le9Z2?hf7%PajG8BnGBw;elF{r5}E)4 CA%CF& literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/crate_creative.png b/src/main/resources/assets/create/textures/block/crate_creative.png index 18803da2651a9c138b7204d80cf6cd749c568c93..45bf70fcbac217e89826e9cb643270c8a6e08fd7 100644 GIT binary patch literal 821 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCim71o(uw0%;>@8y5}#5WUz~)6A)X)8@y{-;lRrTF`W7b-#Hr^91-+G*m5w z1XRUDH5nO1Sy?2dBy{DZ^@DX|*5@u)S22?m(_&!Y6BX9rQs-<(89|(c|NjSC$8=6q#*0d6V19YY7)yRhqY0ubQbfVW;PY*=Catd+*+Ew|0T%^ke?} zD+CL=BpY@FZkIegDuupb88Nje? z*~6~aJB{0nv=~l3X-(49I6rObBT0tYGxr9knlad)XJAMzcq(r!;C_H<{^w`Bp>`pw zxUU{v>Xo~5naFvDh@V%YzC=vjWEDN_M&B>S^(B$YulO7OSo<(Ny&)8>^7uf=nM9@^ zllUcyQcc&iXTR>+k>VgyIceWpCFW>l!zo&&|Qw_s{7}mr~S!dceMd@jJADWQ* dH)>8j)8+XkH;+3Or~spY!PC{xWt~$(69BAnYhVBX delta 965 zcmV;$13LV*2J8or83+ad0047(di0SYAb$yPNLh0L01mu=-A#7JUd zaAhzOjSEqOB7sr?NtIvQ!In=8LdUt+&iGoe4wYEX=JdWhuXEnq``$YyMNv>ruz!FP zM^7n@+qd$-d}@(dge=SO`~A6SElSNl=(=NK0jE!1Q1)$UMnz>Mva74P^iSBWHl&v_ zxo9m)&A;e>j;F6WP3Bz8FTZ~O213DV%)}B1)&$n@)J%L+@@J2q%e_^7Z;pB87E2Yv zkr9}y%orIPXQtR@voT99=ceSvuYaryAo#r=csw3vx67r+lH18_w_7(QPsnCW%q)PK zgh1-(D`@J8HPv>j1>sLa%*FCX=8IqfT89>@Cw4gO@OiyzPJ-7HWGE349S(c3#i>2#IE`#3i0S!C#(Srj!DVRO@2nW zZwM0;6BrmALOdSF@bEBV@dQ5ff8=ou8}$<+xCD=buQ4?p!=>mMc&rj8KYqonY!^Z< zp`Ip{-MM;Js`Z?UqkjX}_)iM`#LD*-okc&8Uiyt67z{^P@qvc@IJB<~J9q5V>#41T zm}2p67eU=_WDYSstAPb*%H>%Z=LasUpZJ4bKjPojQv_`_BXfwwZOH=YVN%?lyvYi$ zF5hGRQ#}h|WX`&N!0mG6-QD6!irwvnFfwP|9vF&53hwSNhBCZ?hK>3O5oJ4y^ZWo^ nCb@COM(%UsQvJk#;0J&oU0Ls!vPKcF00000NkvXXu0mjfbz8;9 diff --git a/src/main/resources/assets/create/textures/block/crate_creative_side.png b/src/main/resources/assets/create/textures/block/crate_creative_side.png index ba4103477a060858d9e09c52ce43df85ae2ae2ef..00018a60dbff9a92c048985f3461904d0c28e8c4 100644 GIT binary patch literal 794 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCily2Ka=yg4AmGhv>z|nr6j4mIqJTJGLyo??npS-fX z0W*`xY}3h`+*V#oxY#OJ+auR}IB4fw)yb!WkIYt{xY=suGX1&d!jI1~owU(rdACaQ z7VA|rwI=NJ+;G@?_jbFr3pA%6^WQ()Y*K|_L6>C1j^GWGBs)3<>t`rUZs)I^DAC?6 z+R`Xfp`~smB%nG)wR^t$Q~`b!4OI(922n9l&65H94|;58Ws#JU(3O+cU!*l-vUI1q zikYmmfuxug0|TF^um&fG3=@;6xTqErleoN$0Xv%vGn2T4xHdbRw5ozJ(5HK>l8*x^ z|B@iT;Qv$w47On#HUo|3Ebxdd2D;`T2s7@OnEe(Q3DKS|jv*HQtwEhZhYUoPWUgMj z$U*y2<5xW`xdoZ4BUt$b0zdzs|M+y|vuhSJ$E}_L)6}j9EW(;%AmDAlBTHfx} zxM9z6`|ROs7e98MS#HCm@XqC6WQ|<8-mdB4*JEeqSFkv&m%nrG;ga+D{ccxPB^WZr z?%Jnl-f^5}=d^78n<9n>Pc$pV`VDp$v0QOx=wY+0XE68w`tIq}q63G`KZ||*S)1j#?LVOc`tG5Ll;xGEI#{Q6fXMGZf>K}#g`9&B0G(0buP$#fIwMgU70k>H) zTbP0 Hl+XkK+XPz_ delta 1201 zcmV;i1Wx;!2G$9X83+ad0047(di0SYAb$yPNLh0L01mWK7_J|tKob}T`#W7V!;fx1E}Z1@3ekPw0e z`$j@SVuh%>KuAD~LLZ79y`J`k#b7qdeIe+JP zW^9ZxyhsQF@4j_Ium~tV>{hB`p&i9y5s^qld?ufE^z!dUd%OhMe*9&@CJ20eYk}?6 z_OM&4;-J}Vx%7a|2EVtHfMdh~pU2zMOjPSNA)QVq_V#vB+pi0~8=rplfl1)Ze!OZQ$Q#-X!qN)i0PH zj^X7~GlJQ7cNXA=3)e1RMKZe#TFb9)V{Yyu78ma$uE+6&XErmF!2Okbeb?`;{EmyK zFZHxv|LsGYoxZTVwF6c?zz;uvkCk*vkO&5XsMc!M8lm1gT8G1dMx(*?`hSt@{MHV& z3mg42o)mD9X(BO|z@OQNn7=ZQyLawlzf^}&H`iF5;b}98Qo%rVuZjkLEA{YS4R04i+ z0)jv&6hcG|p;#*7{l_2U!NUham-eu#3KuvUf}AH)z~gEWrz(!oQlCClCzy;P?9ltI=q*BYz9BcT4FvXk3Wb z0k2092Ov(sZr7NuC79i=vojMHnAO=EVv8KT7eN zuf5&T5)bOFD$xUWPiOb+_N8^QN!brS{c+nQ@FMYC2+T}hW5rSh(THjlqFz$hc++b6 zt!3AFsn41xaFTgILVxyi`fRtw*jPM{jm=GH+9>jQqeGTTI|%a*NxJl#96yD%^+l5a zJwmZ-3nzI*B*W@7YcIbt>t5xz{WOy4Urhpi=Ya~Befl{Opr2OupIpzZ+vS)Z1Np^c z8aB4qc?l@nL^u3o><08i*E|q4=YgecsV3Q3oKUauE+ z$B2j(Z(xvlfPWqm^>f-}m^W~&d7xiECk)e!jx`VT?dKdrzXAFJ%JNqEOOf4Yjck2sOCIl7o1APQxo!IoJ|XlQ0^O5S P00000NkvXXu0mjfMw&!P diff --git a/src/main/resources/assets/create/textures/block/creative_casing.png b/src/main/resources/assets/create/textures/block/creative_casing.png index 7ce4d7a7441e9551054e6aebb9e56cb2dc261639..30257a61cabd78ae5227aed5fc8d9a5c067356dd 100644 GIT binary patch delta 282 zcmV+#0p za8GX}MUar>V g0L$NT^ZCFVyiW@4xwXYw00000Ne4wvM6N<$f*Dw3p8x;= delta 393 zcmV;40e1ez0<{B>83+OZ005AYXf}}{Ab$yPNLh0L01m?d01m?e$8V@)0003>Nkl4H8-8WwZ!G9ovKSO_pf5zdXZxcirQv_vwo0{8no*pMRS> z#^UzUM>R1A$1bkU18ndeDv7jAA;nQ#=m4tVmE6ai4 zMNvEs@2G@20G3N3rPNAhX$t(pMaIKG!fi3}d^86J0VEmRKLlZL+aFjC6e-6|+>RP$ z=F=!3@U1*BN#a~7Aukk4<>*zKwvhT-t@1lX$5R}ui-u7wuk?H nzV2nW4xq<|;pK_^XpDUVysN+JimdS?00000NkvXXu0mjf4^^rZ diff --git a/src/main/resources/assets/create/textures/block/creative_casing_connected.png b/src/main/resources/assets/create/textures/block/creative_casing_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9e526b577685a7667483f6a0479e293afee969 GIT binary patch literal 726 zcmV;{0xA88P)Px#1ZP1_K>z@;j|==^1poj5MNmvsMKT*aL?};GE?r$UX;Up+uWhFe3my;;Bq${~ z000fJZm5+}mY-dpmQt4h000&hDFFZ#000p~Cr+MRo?J9&000C91Q|}~G#vl{010qN zS#tmY4#EHc4#EKyC`y0;00J6GL_t(oN8OfflbbLMgk_uLitD>vTGIdjQ@e6rSP4&z z`P8X*VCI=60x1YfL_&x$VZ|7N$aFe?{CH~4vG4yZB|lavpAz%e<@>2?PV(9DfBl}% zt4dh%{JO!%Ij2zG`x46a74Y&^Ldwh<;Jv@e$#cx_eV-G4Fvj9@@|-%p_?$)=0ZdM~ zV2lyqcKP!Z{?`sK-bWElPAJkCBY?>X7rf)s=LO*?z;)I?&!kKl*ZwD}EGIOH9=fzyJo62kHJIX(^mw+bXUe!;gVzUS ziIW~??}PgO`U$H~Z}vW@>)ZKYKAXJ{vh%^#xAOsH_CBcR+xYdEj>S+^qr61G+r>_rSB6 z2lV8*TZ8*mI6eBEf>-r?o)2ojQ}C+0Raet@^TBLO46&zTPi4P(2W0n!1G4kM0om{V z0sR9t;P?87{)ZZH@3+MHwq)i3U7qP?O__N>Po6p7tuEhx0Szvz9G5`uasU7T07*qo IM6N<$g2B8>ng9R* literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/creative_fluid_tank.png b/src/main/resources/assets/create/textures/block/creative_fluid_tank.png new file mode 100644 index 0000000000000000000000000000000000000000..10e0a6f2eaf5d9e345d9c7a8d5b49a2f287d6cc5 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh<0G|-o68oBILDT2Q&fk!?!bsZ2MZ-TtFE-XRGux_IRaifXA*xNGZm!{! zxvG;-2OpWOJaMzt%4Pa<&xIeKWjbl1RL5kQo@9ooa?ZRt>XQz8@7`{=c7f*fWB&VR zn@#E#Y3dPe^LW{56j$?g=apP@9loxgUXM0>YrOQTFh8AE;oL-d2CZt_6Ka29w( z7BevL9R^{> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/creative_fluid_tank_connected.png b/src/main/resources/assets/create/textures/block/creative_fluid_tank_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..1b6877624ecfa0c8c2bcc507e0981eb4421902db GIT binary patch literal 1060 zcmV+<1l#+GP)Px#1ZP1_K>z@;j|==^1poj5mQYMoMRY%WmQt6WU7xUSs4^QoL?};GE?sLnb6quQ zB@-`V09uA1ew{Itoh6gYQ^cDik+V9frZ1h&SI3$)l93vSlN^j=09tnmZk#8Q!%Mrj zKCPfBm&Q-On>Lb*6oQNug-QTHV*p!q1Z#;Af0!bZhYx*`7>A1$gn=A*b^vc+09%Vi zjC??RfI5H?U9LtU3v8-S*7NX8sYv9inN{=1C+KC|@%TE%6%3wu> zK9?Y};_g^(gV+YG9x@5cSe-t5e)i)0<;APlc)odiDj7kW^(a|gzI%W6;r!#(r_XqP z`Fbh2JA&(P-+%0X-rVl*@ci}rT5?`C`k_Ht#>@|iK|SP#n`Bx`o>hUlA+GaL{P>+X zjaK^*ti{Xw;7xD=9hhCuugF7A4GRKiVue4k0^x4ap9G@62>7-_?4jpZ(T*Qhjh1aE zdsy;s>Jg;+5s9}_fFlqxliw{1U__n;att&YL_gYOt~&r{0rU{3RF5DUm`R}K;;#hC z6ac|EXGSxQQIO_bGYMoy5aZ|!^FcB-pgHqWmVJ;}apsr&mz*1rs+d9wB4>Wdf5}w? zD}oqV-K5Mf`7e3afJealAO(?vhpUdkjF$v>A0&aeQL1E-TnQ}4K{z@+24xCGpm5p;GFcXqCoWr_bLK3VzEpV+ z&|a6EcV3=zW){#75GX@tfjQ?Rtz1}QYDaf0vbkK+ucU!Fl_y^HuL<-xm2s|FVUc#!b*iTPDXyw e{lCe?Jm`PdUE!N2ejM=t0000NS%G|&0G|-oJhvKe^N0|eq$HQZ?t^E6!WUk>Tyf!M^}6jV(^l^++X@tUeQvQ5 zkm4x`@(cct01QI+&z%E`a~60+7BevL9R^{>E{-7@!AtwS`5Fv3Smozm z2zp;1Z^)7z_1MjfM>vjyp`(-GqVg#gpR}_b`Hd|*0}WjFFL=9Xk^aQcKRZ4NYMzig lzbh-eK1NVp`I(5C`a%@e^|pvBe5fYTd_%!f zA>lx~G!8`SFdJjERPAug`i* vJbU*pnT7iSL(hU03s`!N9WpRzXk=vI%FUaelBMMVw2i^j)z4*}Q$iB}!k<9# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/creative_motor.png b/src/main/resources/assets/create/textures/block/creative_motor.png index 897bf9e1ddff0e17a99957700e74115af66ad956..dcb6c401a8b2be9d4772785fb36fddb7a0c1e4f1 100644 GIT binary patch literal 558 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LiR0X`wFM$$Ge8vY@Av92yI=4NItE-v2Q-ctjo&5xbGA#cUBpy{rzu8Il@ z%*@P^5)u|>X3pw<^J3-+@T;h+m}#h52nnb9F_i?RIMyXih)ozkiZsN25%|45i8K{IwG$+Pg(tfY!yP{#gN}Y)gXt zg8x$h7&!IU!~+fDEbxdd272HS2s4Umcr^e8w|lxchG+!G_I2|$8SuF7=G?XLbK@Qs z(W#A1TwVGB|Nig3<7RTqY-jGRWzU%yoFtT0X7w#AcYP`7q^ZdEg}sN@-C*8~;LDqI zn`EBtI>YF)XXbNuJI5;P16L-on;pG1XXDWzo%x delta 541 zcmV+&0^nubnQhcx^CllLn98nU9`yw|%5zlpW)E0DqtcFJY!S1RmF#N&9L$v`E8 zk{7-$A{jSvRBs@ac#2y6SOkq=ZhD>*dZIWb6BBCnI$q}UkjbFVx)wrdXPbFhvwvsIK8llXgCak}rHHyVc&&kz zu(|v2aEw`hH^{MjtrGM9r+&~GSJzkjPawbrd>u%v+mOwrnFAB7eOUH>RDVjC$h^VU z)}~N8g+G5!kjv$<@pC=kA0KS015yANkvXXu0mjf!}a{q diff --git a/src/main/resources/assets/create/textures/block/hose_pulley_magnet.png b/src/main/resources/assets/create/textures/block/hose_pulley_magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..34bed613cf99cfd68917bd9d744cffa20752d6f8 GIT binary patch literal 2025 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvmg6=I{O2ih1Ogzq9Ea_wt85Bz(%>LTngKg36|4!& ze8)m--n8bc6ftun^kjlF!iZl^^UnB_^L8}GlrE8tH&%#?r=}6cWNu#33xv=(nCilJ zo#sI|_JLRdgSudjSYWngyC_N@+LFbypr2Z2>`n~|?Kl8Lm|GDH2^g@RM9Gs4C>BJ( zF@m3r$XOg0FhHu@$P92J$b`U==iC?*X!T{~ZANJU5h`8+s7aDRmU9aI1Q(&9tfJ1S zs@I@VlV&g8dG+20KWkJD5?s*WLkKaXkfTHwHToE0j49^CNl?Nx`4miwDW#k-X@={J z(HT8*E?lIzqQ#d`Vo4=e$fvrh)z?sCO*J=e(vbemw_sXqspU=`QtGa2_dWF3Q_llh z8#3I`;YS#8q>*pd4y(_s(F=3GXN?YPlQFmYg%8$X4&ib^vz+MU42-cOFdilY5HwHD zY$WG+GB-K1iIEh_V2yN=(`YgV23;rCK{t0F%>9-(qwbG*ByS z8`fH0JBloVW)@CNtqc@4)cu(8K^5DL>V|WrIVGokh$uEF-8K|4_$ndXMV{E~A9( zIXz1Y+c>z6Oe+HO5(4*)<=i%81(R#5Uo5M7)T247RZRyZZ$&EYsfSunZkM}=eSGXy z%I$!`hwC3>6bfQ!`M!X@=3D>!UktX(a^N1Btxxhgh(QzEe zKX&PM_X)X&IxaOBg1)c$n*C75UQv$jK$T(~@U!($rXG6Oa_o_@K$G`FctY<(6N21X zgR@1_A7LTIZse}t&Fr8@>Dcw{$%Yo7n|S3;FWYmi7p*S(k5EwymaT43JE`A$MTIXvsV!^OLXgsWw4IMNozAe1a@l6-ara2CIuq&07LceKN2mFTnk zvpmhSK7TGx^Q_NLv5Dft}W*CWE0005ZNklBgaYRgV*U51hnHy`3%uFlapSI;@`Q5uZ~-Z+q#`}dTcpFeW15CVWSO=-8= z092n;WMS80GEJCWU8BEzRFGk$<2piWwF+5~%5eV^x=lB-u7zpn zs9BJb&Lmlo^6jgS>)4BUo!0Ik$rSqiF~U?B{YpqOg)oYF`+2IAN+sTR2HSVQ!42ko z2VoTBIyR-!9+qWoC)j4=U@*Wi3=G5AOb|vfpT2~gc0MeMTD3aIM_`&JK<bvJkDOGS42M3dn!mND&z@5*m#I`L^m;w?WxJN8d4g`YyOLjS_I)3HlU zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YulH@83{MRYw2uMOK$H5B`?*{MqlVHkSi)*^< zZWFe#NF>M^eg^uI^&jkxE;=)zkLK5 zi@~1?$*QalPiawfy9@4wCu;zRRZ;i-Dayy((O!KbZ?8RZ=gP3_BNgPr0E8!whMn!n zu6r1HR_zw~p~1Y1?*6*tuGS^hx^A;8K7gq}V^X)N^csK@sMOvqphVn;dh8{mBusIJ zVhhxqP-f!H0=6rAUbt}OwZCVcF+?w`M7%|2u-t4(qhy)2N#I-IDp9j81a(AbsHQN> zJ{InAbB{N3Lga;k6oxZKkC#G6#w%raRBKCJW|wxZFfM61jbSw9+7l=U!gX+Jo!?&Q zE^pkOunGmO)0{BD;-<~TWc-y|+I3do%z1L#(%`rZ2cQVC4TE8Y0xqx`2X;{;GK0qi zeF{b{>SclgY$gj+g*J+n5G6^AjXse(R!lZCwiXCs8Z<(htOa6uZ^)nM6LP4SVm~so zV9}CgD?x(~7D9-j?NKFa^wDC7F{YSfNt%4J6jDqnQH07zxNT1oyHitRRY0h(5WYGo7e+f&ZB`tX=E3ZhU)vvaOHLhvR zYpKY!s?}Gkp~jkOu4PwksQRcHKPmTb)p)4Z6!RSyzf^-c#+wUn+le*JpqO}u;;|`! zgqEh6OYFTg<(g(L3l@b5RAX!6EZh`>f_`PO%DZ-7%KcL}GJi@pd8ZsT>3%~wYSInm zUUfTAZ7Kak(JoM1g^g3E6&qWXwMZ(6E{N)lJ($jZP0bpxQhIAnZK<@@UmGB#OT@B>Dum z;^b*{&;D%!(DkkC(IZ{m9G}-MU0-UCD7tp|yslgN`6}By(=Tj}-6NepFOC-^oj)&* zQFQ*iI8GA!h0U>hr1R&+ai-7@en1{abpE_J9zR{Av5DY67Gv5!40001ENklXw z($nDM<@ogZ$FJXi*jQNzvRQup{v*K0!@$4*;S*#t%Seg+XZQy5gR2u;1rM1Y@pm?|d0000< KMNUMnLSTa0#Wx24 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/item_drain_side.png b/src/main/resources/assets/create/textures/block/item_drain_side.png new file mode 100644 index 0000000000000000000000000000000000000000..bd768538d0946d6a9f4bcce4c800ab49744ed62d GIT binary patch literal 1991 zcmV;&2RQhNP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YUmMbR={AU$e0uqSFa(JGT9c1|_K;0gDJaZ>E z`HOq(1_6?&k_2PMUw=;X2R=-hjhC204#DE%v(H@6NcMcro2=iz+Ob#TNp9`|hREUV zPB#plUm%yqg6LIVpXDYt)ss}wrCAlaWtq{?c}W#HK628&$-1ui58Kgijw;i!*S?Pc zqYLyoHar|Ti(g(=-1(Lz!!J8tlh7;Zr!8^su`_q`1-!fUf}JfYch6858+1Z=!ARvK z@3Gqmy|8v!ej13`M*H#e0lPVSnsc1p6(4|9FuJL0E4zh>6;K{D0-lJkpdI&<@g!`q zfw2xYE1qU369d^vo;nqpH1@kugNvRAN4%LE5MQ$7B4=)Zo}6C~O^z@ZKPHyZ8~yD9)guq|+g92l^HoKPSenIjQ! zOyH-$b9SC97$6buWG1+AE`XfG%Qn_T+H+a>h*4TVgt*`$sL8H?Ebj&J6MaGq6>;K? zhy;m}Bufb{_#h#K7*>rc(M2C6h8SatIhN#-Pm)54DW#lB=Il_yB!?VLPC4gNV6;GW z!Rmq;rBtr2`YJWlSX0flG=xv{O4TRG0Lq-^Jq>)FN zh_&gapEARYGtE59&6=|M%o@Eg_dRQ*tS!d;o);giK^)_yf>t?^#Tgi5PhdPQ1`yD^ zIJ1eo=f&LO%x07*Ck)m|7CD_3V_?t^VwrSv_h9Z@-i-Kv#2bIboLSWU7tEPOoig{C zw>PZyvQHGZ30hgWFtu)?uwhc+gg?~d-+!BbtKk2x$c>nGv$pC+vZHP}_(f>8T6Skj z8&4-Z+|y_Jz_o$Nj*+vKVzCg>JkoqizquDbw^yc3%((BmTM-J zW_v>!IevOHIqbzqc|K}NOAp!W{#kaz6kO8yOiJY*e52qYbM->5q1p0LR3nZ9cl_z8 z`95`LfELHZ*-CX8N8}kG7btHS9Jko_{!(Jow3)x6?g7S|^$!=!H$J4(MwyhlRp9>6 zQCZySgxq|XTcxyOLJ{@Z6E3%VsrT8Pu)uX~sP*zG%G@#3VX=x)w^>!^l$t6osih}x z^MSQi!~w_M&X)SIX{7n(aQ_9cC2h z-SRN64ulaB7H+9+$5Q~WgUPs`!2E-tFz=({i=Zg+*bjnZM_uu>VKUFL!dVf@oDPb( zyef+!@a@|A7a(dW@UFBWMn{Ij){f=Mc8nvQ&aROwe*CIvXHr|acl<-8$rt?@|B1Y& z*p>F-E>!)*Ao*~Zm5SeXrg?+&@+?6aaL?{uj5k1B6q3TOXc0+i(QtYLtYwrv-Cx8F z4+rdF&V#vAvnu{kN_WD4Q6+Fcx{E_AmupM8x)X2-$r=g(z99s)EWwmkQE~s5WSNuq3Tq_7`u;=3Y%Nr*cqSQZ6J#>zfaxC<3ee*o;(j z9Adg`f7t4)>TloXn+ew~;H{N7ai7e%Jp2u&5gcVm2SdF8000SaNLh0L01m$Z01m$a zI0aKA00007bV*G`2jmJC6$lqEB#nXq00Fy6L_t(I%cYY)kJCU9#ea4dud(BcNOYX& z5Pyo3kf4F$J^?MFrlq7o;;YcmQ6WS}MT>MoP|(mN7n;*qBq$--th2i~w-mmZL?NQc zG&{39?`hr}ZQ#9Umk8N0b|whkK7Hix-?_r;cYTg8$3#*B;H=%6AI%L<9^c^0w=u$L z%UN&Ctn?hs4Kp>TDT0cAZU`iJTjjIT(-Z--(sR}uB}vo(AZtt1$P%RzDWR1nHNgOIShBVxR}KJUO2Rl68^)}H z8y(4DR3O&}B8eKru^=?2-0EuYj=K!N}m{#vk<(w$mv1LrchaKCESxuH9?9JXVODH;C!4S>kfs!?f= z)0V^QEu^fbS!!>k34>9=O&Q>{MQIOv6-EF&eD;95$9-PDIU!36HaDZ{wJGg+@%$d@ zRB`gYUlDwK^%-5jt^Ed9_nQASY%rbCNNS%G}r0G|-o)oFnbCM7l7JNWziM@B@vU6@=Z|9Vr zmv%dUz#oy4p_5B4*#;WZ17_QXM Q0@}ym>FVdQ&MBb@04FbLNB{r; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/schematic_table_side.png b/src/main/resources/assets/create/textures/block/schematic_table_side.png index 08468449c5b99ad8b6fb149cd49cbf2901115505..739e96a144d096ce16df4ec7a29f527dcd4cf378 100644 GIT binary patch delta 378 zcmdnNyo`B*BnLAC1A~SxfAB;_h5FI}pAgq5d*vKI-Kr>)rbMfX2(yA9y;M&PM_th% zTa`p_y(kxzP%C*Ka~V4gAsOaK3;kjj&l3O8J`ay3GlQ(nn>RN%H|OW)mzS6K_Vxme zo;GdTEalo5!~B*m#DI7jxhu1G zSqn;Xnv~7riQ4j;Z}I1Qk>01yvHvgRn>b}I|K~ThN}9iSb|{}w{8U|DA?>t;%W%?# qO%4$=Q++i*rf^74_SVZu{mmqORZL=;k(M6NO$?r{elF{r5}E)B`>GfK delta 396 zcmV;70dxMQ1Goc_83+OZ005AYXf}}{Ab$yPNLh0L01m?d01m?e$8V@)0000ObVXQn zQ*UN;cVTj60B~VxZgehgWpp4kE-@}P{Z0w!0003gNklR`%L<8bNun+`6P$P6%DELD?Gj~#_qKC)Jo%`m_B!4mO z?au4fCjD2<&2Wk~NB86C`u*f-ayFXo4?m;9$Kl-=y?gm~aPx(rwCB9}?mth>u(vkY zTc$3ym*`rmhmJI5xaHw=o&J(;NK1rHsLk=#3RT9d|A~3YF-_A%QPg+z9MXVhB;+G( zpe)OxDCkfH$jP#dsWuR^0T#I7KzTyAl!r@fz#mvu;n-WqKUQ;;AK{?b$KH5`RbQ4~I;pU^F-WCTGR3{JOlOo6yZR~Vr;}oId zhNFFr5fg+OQXj4@ew!s;egB^Pzn81OetmyCx0?C)Z_!}KTlPFa*D`pz`njxgN@xNA DZ%Lo+ delta 284 zcmV+%0ptF#1IPl983+OZ005AYXf}}{Ab$yPNLh0L01m?d01m?e$8V@)0000ObVXQn zQ*UN;cVTj60B~VxZgehgWpp4kE-@}P{Z0w!0002FNkloU%_@h_^L#z+9)Fkp zYGK3N0*LqhNE(zRuYGJSfQEsd{#9v<01N1{00Jfv8F`@-a3(T>Bw~X^0H&!rs2Yn4 zh`iufha7aYAt0-P Date: Fri, 30 Oct 2020 02:17:58 +0100 Subject: [PATCH 31/36] Silence! - Removed leftovers from debugging --- .../fluids/actors/FluidDrainingBehaviour.java | 14 -------------- .../fluids/actors/FluidFillingBehaviour.java | 6 ------ 2 files changed, 20 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index f2fff1737..6a44ca97a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -10,7 +10,6 @@ import javax.annotation.Nullable; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.Debug; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; @@ -60,7 +59,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { } if (counterpartActed) { - Debug.debugChat(" Counterpart acted"); counterpartActed = false; softReset(root); return false; @@ -141,7 +139,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { isValid = checkValid(world, rootPos); reset(); } else if (!validationSet.contains(currentPos)) { - Debug.debugChat(" Drained unreachable fluid - rebuilding"); reset(); } return true; @@ -230,7 +227,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { public void rebuildContext(BlockPos root) { reset(); - Debug.debugChat("Rebuilding!"); rootPos = root; affectedArea = new MutableBoundingBox(rootPos, rootPos); if (isValid) @@ -238,7 +234,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { } public void revalidate(BlockPos root) { - Debug.debugChat("Revalidating!"); validationFrontier.clear(); validationVisited.clear(); newValidationSet.clear(); @@ -251,7 +246,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { queue.enqueue(new BlockPosEntry(e, d)); validationSet.add(e); }, false); - Debug.debugChat("<...> Building - queue size " + queue.size()); World world = getWorld(); int maxBlocks = maxBlocks(); @@ -272,29 +266,24 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { queue.clear(); queue.enqueue(new BlockPosEntry(firstValid, 0)); tileEntity.sendData(); - Debug.debugChat(" Build complete - infinite"); return; } if (!frontier.isEmpty()) return; - Debug.debugChat(" Build complete - queue size " + queue.size()); tileEntity.sendData(); visited.clear(); } private void continueValidation() { search(fluid, validationFrontier, validationVisited, (e, d) -> newValidationSet.add(e), false); - Debug.debugChat("<...> Validating - set size " + newValidationSet.size()); int maxBlocks = maxBlocks(); if (validationVisited.size() > maxBlocks) { if (!infinite) { - Debug.debugChat(" Validation complete - now infinite"); reset(); } - Debug.debugChat("Validation complete - still infinite"); validationFrontier.clear(); setLongValidationTimer(); return; @@ -303,12 +292,10 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { if (!validationFrontier.isEmpty()) return; if (infinite) { - Debug.debugChat(" Validation complete - no longer infinite"); reset(); return; } - Debug.debugChat("Validation complete - set size " + newValidationSet.size()); validationSet = newValidationSet; newValidationSet = new HashSet<>(); validationVisited.clear(); @@ -316,7 +303,6 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { @Override public void reset() { - Debug.debugChat(" RESET"); super.reset(); fluid = null; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java index f9254dbac..7764001a0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -8,7 +8,6 @@ import java.util.Set; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.Debug; import com.simibubi.create.foundation.utility.Iterate; import it.unimi.dsi.fastutil.PriorityQueue; @@ -63,11 +62,9 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { if (infinityCheckVisited.size() > maxBlocks) { if (!infinite) { - Debug.debugChat(" Filler Validation complete - now infinite"); reset(); infinite = true; } - Debug.debugChat("Filler Validation complete - still infinite"); infinityCheckFrontier.clear(); setLongValidationTimer(); return; @@ -76,7 +73,6 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { if (!infinityCheckFrontier.isEmpty()) return; if (infinite) { - Debug.debugChat(" Filler Validation complete - no longer infinite"); reset(); return; } @@ -94,7 +90,6 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { } if (counterpartActed) { - Debug.debugChat(" Counterpart acted"); counterpartActed = false; softReset(root); return false; @@ -143,7 +138,6 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { visited.add(currentPos); if (visited.size() >= maxBlocks) { - Debug.debugChat(" Search exceeded - now infinite"); infinite = true; visited.clear(); queue.clear(); From e701569feea593ec67c5a8409bd27606e2cfe37b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 30 Oct 2020 19:28:33 +0100 Subject: [PATCH 32/36] Automatic Acrobatics - Added the item drain - Refactored pulley renderers - Fixed belt funnel not dropping filters - Fixed funnel filter slot positioning on upward facing funnels - Sails can now be sheared - Fixed the kinetic connectivity of the rotation speed controller - Valve handles can now by dyed in world - Seats can now be dyed in world - Fixed Stockpile Switch emitting redstone power towards its detection target - Organized Imports - Fixed server launch issues --- src/generated/resources/.cache/cache | 4 +- .../crafting/kinetics/item_drain.json | 32 +++ .../crafting/kinetics/encased_fan.json | 9 +- .../recipes/crafting/kinetics/item_drain.json | 18 ++ .../java/com/simibubi/create/AllBlocks.java | 71 ++--- .../com/simibubi/create/AllTileEntities.java | 8 + .../jei/FilterGhostIngredientHandler.java | 13 +- .../contraptions/RotationPropagator.java | 25 +- .../components/actors/SeatBlock.java | 21 +- .../components/crank/ValveHandleBlock.java | 39 ++- .../contraptions/components/saw/SawBlock.java | 3 - .../components/saw/SawRenderer.java | 5 +- .../structureMovement/Contraption.java | 1 - .../structureMovement/bearing/SailBlock.java | 23 +- .../pulley/AbstractPulleyRenderer.java | 109 ++++++++ .../pulley/PulleyRenderer.java | 93 ++----- .../contraptions/fluids/OpenEndedPipe.java | 1 - .../fluids/actors/HosePulleyRenderer.java | 84 +++--- .../fluids/actors/ItemDrainBlock.java | 79 +++++- .../fluids/actors/ItemDrainItemHandler.java | 70 +++++ .../fluids/actors/ItemDrainRenderer.java | 182 +++++++++++++ .../fluids/actors/ItemDrainTileEntity.java | 257 ++++++++++++++++++ .../fluids/actors/SpoutTileEntity.java | 4 +- .../fluids/tank/FluidTankModel.java | 11 +- .../curiosities/ChromaticCompoundItem.java | 13 +- .../logistics/block/depot/DepotBlock.java | 4 +- .../logistics/block/depot/DepotRenderer.java | 2 +- .../block/funnel/BeltFunnelBlock.java | 15 +- .../funnel/FunnelFilterSlotPositioning.java | 4 +- .../mechanicalArm/ArmInteractionPoint.java | 2 +- .../block/mechanicalArm/ArmTileEntity.java | 10 +- .../block/redstone/StockpileSwitchBlock.java | 2 + .../item/filter/FilterScreenPacket.java | 5 +- .../logistics/item/filter/ItemAttribute.java | 16 +- .../filter/attribute/BookAuthorAttribute.java | 12 +- .../filter/attribute/BookCopyAttribute.java | 12 +- .../filter/attribute/EnchantAttribute.java | 10 +- .../attribute/FluidContentsAttribute.java | 12 +- .../filter/attribute/ItemNameAttribute.java | 16 +- .../AstralSorceryAmuletAttribute.java | 7 +- .../AstralSorceryAttunementAttribute.java | 7 +- .../AstralSorceryCrystalAttribute.java | 7 +- .../AstralSorceryPerkGemAttribute.java | 7 +- .../data/recipe/StandardRecipeGen.java | 14 +- .../fluid/SmartFluidTankBehaviour.java | 2 +- .../models/block/rope_pulley/rope_coil.json | 19 +- 46 files changed, 1072 insertions(+), 288 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/item_drain.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/item_drain.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainItemHandler.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index c1a39e1d7..6035cda1c 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1597,6 +1597,7 @@ c023b9221d7983487d21e5ecc7d92246cfc7e791 data/create/advancements/recipes/create 9af3d92d11c3f520df3e22f3069042bf34585010 data/create/advancements/recipes/create.base/crafting/kinetics/green_valve_handle_from_other_valve_handle.json dbb96a4db4ef8172af73a626bed9727278d804bd data/create/advancements/recipes/create.base/crafting/kinetics/hand_crank.json 21cd686e1f3a4004d8e9bd3d92675bd61fb2b4db data/create/advancements/recipes/create.base/crafting/kinetics/hose_pulley.json +58450edb1767e9d56256186acba954ca09481548 data/create/advancements/recipes/create.base/crafting/kinetics/item_drain.json a71b626b6ee58a4eabee56f67c48f041a1323506 data/create/advancements/recipes/create.base/crafting/kinetics/large_cogwheel.json eb007bb079bbe6b6aaad2ca90f5af84261e3f8ea data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat.json 571da50fbf5f2fcd3363b3dab91e7233e0ebffa0 data/create/advancements/recipes/create.base/crafting/kinetics/light_blue_seat_from_other_seat.json @@ -2584,7 +2585,7 @@ ad1c3ce1e98b8483512bdd754f2e5930c7b3ae85 data/create/recipes/crafting/kinetics/d be86df1c4d7af14bc5dcfe044d07c03b6c6d2a75 data/create/recipes/crafting/kinetics/depot.json 9c5d30f25a130d591b924c50e5c83e3b787c2758 data/create/recipes/crafting/kinetics/empty_blaze_burner.json 860f9c4aa677d2354bcf5fe3e6d28cc7cf56dd06 data/create/recipes/crafting/kinetics/encased_belt.json -e416a453316cc6a2f68795b0ab9c91a842d72510 data/create/recipes/crafting/kinetics/encased_fan.json +b07496e4ba5bc56a2c5a395b612c68ba21328867 data/create/recipes/crafting/kinetics/encased_fan.json 0dd0cc11eaa6789fc612af3231ed247893852178 data/create/recipes/crafting/kinetics/filter.json 30ae02825e54c0cc07be8f4decf9d432e7d61ba2 data/create/recipes/crafting/kinetics/fluid_pipe.json 86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json @@ -2602,6 +2603,7 @@ b7fa20d10c0e0e7270b1c0d6f3881b8e25b39bea data/create/recipes/crafting/kinetics/g 63edaccace961a65aa7bd406d36894c7ca4816b8 data/create/recipes/crafting/kinetics/green_valve_handle_from_other_valve_handle.json 9f08bdaeec88e04a43c2dc103869f9648deee079 data/create/recipes/crafting/kinetics/hand_crank.json d10639b0c3999481531fe0a9383a1bb4af60225e data/create/recipes/crafting/kinetics/hose_pulley.json +f4fbb11ef55f3431bd387f3f6f258513bfbc8011 data/create/recipes/crafting/kinetics/item_drain.json 237541c1c318b8426734c1c43be31fbd01413d39 data/create/recipes/crafting/kinetics/large_cogwheel.json a33e3301fc6d3a446e61a1c4b8a93aff079baeba data/create/recipes/crafting/kinetics/light_blue_seat.json 958bb5d3aeb8d8e5dbf5d97cf5fd9ff5151575dc data/create/recipes/crafting/kinetics/light_blue_seat_from_other_seat.json diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/item_drain.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/item_drain.json new file mode 100644 index 000000000..7f33fb16a --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/item_drain.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/item_drain" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:copper_casing" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/item_drain" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json index 467bb81a7..677c6d765 100644 --- a/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/encased_fan.json @@ -3,20 +3,17 @@ "pattern": [ " S ", "RAR", - "BPB" + " P " ], "key": { "S": { "item": "create:shaft" }, "A": { - "item": "create:andesite_alloy" + "item": "create:andesite_casing" }, "R": { - "tag": "minecraft:planks" - }, - "B": { - "item": "minecraft:iron_bars" + "item": "create:cogwheel" }, "P": { "item": "create:propeller" diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/item_drain.json b/src/generated/resources/data/create/recipes/crafting/kinetics/item_drain.json new file mode 100644 index 000000000..f46acc293 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/item_drain.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "P", + "S" + ], + "key": { + "P": { + "item": "minecraft:iron_bars" + }, + "S": { + "item": "create:copper_casing" + } + }, + "result": { + "item": "create:item_drain" + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index b7f73ff3f..4ac25c014 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -554,8 +554,7 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .properties(Block.Properties::nonOpaque) .blockstate(new FluidTankGenerator()::generate) - .onRegister(CreateRegistrate - .blockModel(() -> m -> new FluidTankModel(m, AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING))) + .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::standard)) .addLayer(() -> RenderType::getCutoutMipped) .item(FluidTankItem::new) .model(AssetLookup.customItemModel("_", "block_single_window")) @@ -567,8 +566,7 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .properties(Block.Properties::nonOpaque) .blockstate(new FluidTankGenerator("creative_")::generate) - .onRegister(CreateRegistrate.blockModel( - () -> m -> new FluidTankModel(m, AllSpriteShifts.CREATIVE_FLUID_TANK, AllSpriteShifts.CREATIVE_CASING))) + .onRegister(CreateRegistrate.blockModel(() -> FluidTankModel::creative)) .addLayer(() -> RenderType::getCutoutMipped) .item(FluidTankItem::new) .model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/fluid_tank/block_single_window")) @@ -786,42 +784,45 @@ public class AllBlocks { .simpleItem() .register(); + public static final BlockEntry[] SEATS = new BlockEntry[DyeColor.values().length]; + static { // SEATS for (DyeColor colour : DyeColor.values()) { String colourName = colour.getName(); SeatMovementBehaviour movementBehaviour = new SeatMovementBehaviour(); - REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED)) - .initialProperties(SharedProperties::wooden) - .onRegister(addMovementBehaviour(movementBehaviour)) - .blockstate((c, p) -> { - p.simpleBlock(c.get(), p.models() - .withExistingParent(colourName + "_seat", p.modLoc("block/seat")) - .texture("1", p.modLoc("block/seat/top_" + colourName)) - .texture("2", p.modLoc("block/seat/side_" + colourName))); - }) - .recipe((c, p) -> { - ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getWoolOfDye(colour)) - .key('-', ItemTags.WOODEN_SLABS) - .addCriterion("has_wool", p.hasItem(ItemTags.WOOL)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName())); - ShapedRecipeBuilder.shapedRecipe(c.get()) - .patternLine("#") - .patternLine("-") - .key('#', DyeHelper.getTagOfDye(colour)) - .key('-', AllItemTags.SEATS.tag) - .addCriterion("has_seat", p.hasItem(AllItemTags.SEATS.tag)) - .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); - }) - .onRegisterAfter(Item.class, v -> TooltipHelper.referTo(v, "block.create.seat")) - .tag(AllBlockTags.SEATS.tag) - .item() - .tag(AllItemTags.SEATS.tag) - .build() - .register(); + SEATS[colour.ordinal()] = + REGISTRATE.block(colourName + "_seat", p -> new SeatBlock(p, colour == DyeColor.RED)) + .initialProperties(SharedProperties::wooden) + .onRegister(addMovementBehaviour(movementBehaviour)) + .blockstate((c, p) -> { + p.simpleBlock(c.get(), p.models() + .withExistingParent(colourName + "_seat", p.modLoc("block/seat")) + .texture("1", p.modLoc("block/seat/top_" + colourName)) + .texture("2", p.modLoc("block/seat/side_" + colourName))); + }) + .recipe((c, p) -> { + ShapedRecipeBuilder.shapedRecipe(c.get()) + .patternLine("#") + .patternLine("-") + .key('#', DyeHelper.getWoolOfDye(colour)) + .key('-', ItemTags.WOODEN_SLABS) + .addCriterion("has_wool", p.hasItem(ItemTags.WOOL)) + .build(p, Create.asResource("crafting/kinetics/" + c.getName())); + ShapedRecipeBuilder.shapedRecipe(c.get()) + .patternLine("#") + .patternLine("-") + .key('#', DyeHelper.getTagOfDye(colour)) + .key('-', AllItemTags.SEATS.tag) + .addCriterion("has_seat", p.hasItem(AllItemTags.SEATS.tag)) + .build(p, Create.asResource("crafting/kinetics/" + c.getName() + "_from_other_seat")); + }) + .onRegisterAfter(Item.class, v -> TooltipHelper.referTo(v, "block.create.seat")) + .tag(AllBlockTags.SEATS.tag) + .item() + .tag(AllItemTags.SEATS.tag) + .build() + .register(); } } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index e9fe27c1f..8d24eb6bc 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -50,6 +50,8 @@ import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; +import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity; import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; @@ -257,6 +259,12 @@ public class AllTileEntities { .renderer(() -> SpoutRenderer::new) .register(); + public static final TileEntityEntry ITEM_DRAIN = Create.registrate() + .tileEntity("item_drain", ItemDrainTileEntity::new) + .validBlocks(AllBlocks.ITEM_DRAIN) + .renderer(() -> ItemDrainRenderer::new) + .register(); + public static final TileEntityEntry BELT = Create.registrate() .tileEntity("belt", BeltTileEntity::new) .validBlocks(AllBlocks.BELT) diff --git a/src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java b/src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java index 7ec3d405e..7b6d085b0 100644 --- a/src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java +++ b/src/main/java/com/simibubi/create/compat/jei/FilterGhostIngredientHandler.java @@ -1,21 +1,24 @@ package com.simibubi.create.compat.jei; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.logging.log4j.LogManager; + import com.simibubi.create.content.logistics.item.filter.AbstractFilterContainer; import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.foundation.networking.AllPackets; + import mcp.MethodsReturnNonnullByDefault; import mezz.jei.api.gui.handlers.IGhostIngredientHandler; import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import org.apache.logging.log4j.LogManager; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.List; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault diff --git a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java index 5eba3d335..4f444d6d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/RotationPropagator.java @@ -9,8 +9,10 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerBlock; import com.simibubi.create.content.contraptions.relays.advanced.SpeedControllerTileEntity; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.encased.DirectionalShaftHalvesTileEntity; import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; import com.simibubi.create.content.contraptions.relays.encased.SplitShaftTileEntity; @@ -123,13 +125,13 @@ public class RotationPropagator { private static float getConveyedSpeed(KineticTileEntity from, KineticTileEntity to) { final BlockState stateFrom = from.getBlockState(); final BlockState stateTo = to.getBlockState(); - final BlockPos diff = to.getPos() - .subtract(from.getPos()); // Rotation Speed Controller <-> Large Gear - if (isLargeCogToSpeedController(stateFrom, stateTo, diff)) + if (isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() + .subtract(from.getPos()))) return SpeedControllerTileEntity.getConveyedSpeed(from, to, true); - if (isLargeCogToSpeedController(stateTo, stateFrom, diff)) + if (isLargeCogToSpeedController(stateTo, stateFrom, from.getPos() + .subtract(to.getPos()))) return SpeedControllerTileEntity.getConveyedSpeed(to, from, false); float rotationSpeedModifier = getRotationSpeedModifier(from, to); @@ -188,7 +190,12 @@ public class RotationPropagator { private static boolean isLargeCogToSpeedController(BlockState from, BlockState to, BlockPos diff) { if (!isLargeCog(from) || !AllBlocks.ROTATION_SPEED_CONTROLLER.has(to)) return false; - if (!diff.equals(BlockPos.ZERO.up()) && !diff.equals(BlockPos.ZERO.down())) + if (!diff.equals(BlockPos.ZERO.down())) + return false; + Axis axis = from.get(CogWheelBlock.AXIS); + if (axis.isVertical()) + return false; + if (to.get(SpeedControllerBlock.HORIZONTAL_AXIS) == axis) return false; return true; } @@ -395,12 +402,12 @@ public class RotationPropagator { public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) { final BlockState stateFrom = from.getBlockState(); final BlockState stateTo = to.getBlockState(); - final BlockPos diff = to.getPos() - .subtract(from.getPos()); - if (isLargeCogToSpeedController(stateFrom, stateTo, diff)) + if (isLargeCogToSpeedController(stateFrom, stateTo, to.getPos() + .subtract(from.getPos()))) return true; - if (isLargeCogToSpeedController(stateTo, stateFrom, diff)) + if (isLargeCogToSpeedController(stateTo, stateFrom, from.getPos() + .subtract(to.getPos()))) return true; return getRotationSpeedModifier(from, to) != 0; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java index f0211af6b..f6ac7143b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatBlock.java @@ -5,7 +5,9 @@ import java.util.List; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.foundation.utility.DyeHelper; import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; @@ -16,6 +18,7 @@ import net.minecraft.entity.LivingEntity; import net.minecraft.entity.MobEntity; import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; import net.minecraft.pathfinding.PathNodeType; @@ -85,11 +88,25 @@ public class SeatBlock extends Block { } @Override - public ActionResultType onUse(BlockState p_225533_1_, World world, BlockPos pos, PlayerEntity player, - Hand p_225533_5_, BlockRayTraceResult p_225533_6_) { + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult p_225533_6_) { if (player.isSneaking()) return ActionResultType.PASS; + ItemStack heldItem = player.getHeldItem(hand); + for (DyeColor color : DyeColor.values()) { + if (!heldItem.getItem() + .isIn(DyeHelper.getTagOfDye(color))) + continue; + if (world.isRemote) + return ActionResultType.SUCCESS; + + BlockState newState = AllBlocks.SEATS[color.ordinal()].getDefaultState(); + if (newState != state) + world.setBlockState(pos, newState); + return ActionResultType.SUCCESS; + } + List seats = world.getEntitiesWithinAABB(SeatEntity.class, new AxisAlignedBB(pos)); if (!seats.isEmpty()) { SeatEntity seatEntity = seats.get(0); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java index ee0d66d43..e622237db 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/ValveHandleBlock.java @@ -3,10 +3,20 @@ package com.simibubi.create.content.contraptions.components.crank; import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.utility.DyeHelper; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; import net.minecraft.util.NonNullList; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -17,29 +27,50 @@ public class ValveHandleBlock extends HandCrankBlock { public static ValveHandleBlock copper(Properties properties) { return new ValveHandleBlock(properties, true); } - + public static ValveHandleBlock dyed(Properties properties) { return new ValveHandleBlock(properties, false); } - + private ValveHandleBlock(Properties properties, boolean inCreativeTab) { super(properties); this.inCreativeTab = inCreativeTab; } + @Override + public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + BlockRayTraceResult hit) { + ItemStack heldItem = player.getHeldItem(handIn); + for (DyeColor color : DyeColor.values()) { + if (!heldItem.getItem() + .isIn(DyeHelper.getTagOfDye(color))) + continue; + if (worldIn.isRemote) + return ActionResultType.SUCCESS; + + BlockState newState = AllBlocks.DYED_VALVE_HANDLES[color.ordinal()].getDefaultState() + .with(FACING, state.get(FACING)); + if (newState != state) + worldIn.setBlockState(pos, newState); + return ActionResultType.SUCCESS; + } + + return super.onUse(state, worldIn, pos, player, handIn, hit); + } + @Override public void fillItemGroup(ItemGroup group, NonNullList p_149666_2_) { if (group != ItemGroup.SEARCH && !inCreativeTab) return; super.fillItemGroup(group, p_149666_2_); } - + @Override @OnlyIn(Dist.CLIENT) public AllBlockPartials getRenderedHandle() { return null; } - + @Override public int getRotationSpeed() { return 16; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java index c7dade697..dfb3817bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawBlock.java @@ -12,14 +12,11 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.BooleanProperty; -import net.minecraft.state.StateContainer.Builder; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java index 5c6478a38..a161df9d8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawRenderer.java @@ -10,7 +10,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index 4c1169d55..b21309879 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -25,7 +25,6 @@ import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.actors.SeatBlock; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; -import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index 2fb7a5ed1..03b2ca366 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -5,6 +5,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.ProperDirectionalBlock; @@ -20,6 +22,7 @@ import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.DyeColor; import net.minecraft.item.ItemStack; +import net.minecraft.item.ShearsItem; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -80,6 +83,12 @@ public class SailBlock extends ProperDirectionalBlock { return ActionResultType.SUCCESS; } + if (heldItem.getItem() instanceof ShearsItem) { + if (!world.isRemote) + applyDye(state, world, pos, null); + return ActionResultType.SUCCESS; + } + if (frame) return ActionResultType.PASS; @@ -95,9 +104,10 @@ public class SailBlock extends ProperDirectionalBlock { return ActionResultType.PASS; } - protected void applyDye(BlockState state, World world, BlockPos pos, DyeColor color) { - BlockState newState = AllBlocks.DYED_SAILS[color.ordinal()].getDefaultState() - .with(FACING, state.get(FACING)); + protected void applyDye(BlockState state, World world, BlockPos pos, @Nullable DyeColor color) { + BlockState newState = + (color == null ? AllBlocks.SAIL_FRAME : AllBlocks.DYED_SAILS[color.ordinal()]).getDefaultState() + .with(FACING, state.get(FACING)); // Dye the block itself if (state != newState) { @@ -142,7 +152,7 @@ public class SailBlock extends ProperDirectionalBlock { continue; BlockState adjacentState = world.getBlockState(offset); Block block = adjacentState.getBlock(); - if (!(block instanceof SailBlock) || ((SailBlock) block).frame) + if (!(block instanceof SailBlock) || ((SailBlock) block).frame && color != null) continue; if (state != adjacentState) world.setBlockState(offset, newState); @@ -165,13 +175,14 @@ public class SailBlock extends ProperDirectionalBlock { return AllShapes.SAIL_FRAME_COLLISION.get(state.get(FACING)); return getShape(state, p_220071_2_, p_220071_3_, p_220071_4_); } - + @Override public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, PlayerEntity player) { ItemStack pickBlock = super.getPickBlock(state, target, world, pos, player); if (pickBlock.isEmpty()) - return AllBlocks.SAIL.get().getPickBlock(state, target, world, pos, player); + return AllBlocks.SAIL.get() + .getPickBlock(state, target, world, pos, player); return pickBlock; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java new file mode 100644 index 000000000..e93ecf899 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/AbstractPulleyRenderer.java @@ -0,0 +1,109 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.pulley; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.SuperByteBuffer; + +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import net.minecraft.world.World; + +public abstract class AbstractPulleyRenderer extends KineticTileEntityRenderer { + + private AllBlockPartials halfRope; + private AllBlockPartials halfMagnet; + + public AbstractPulleyRenderer(TileEntityRendererDispatcher dispatcher, AllBlockPartials halfRope, + AllBlockPartials halfMagnet) { + super(dispatcher); + this.halfRope = halfRope; + this.halfMagnet = halfMagnet; + } + + @Override + public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { + return true; + } + + @Override + protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + float offset = getOffset(te, partialTicks); + boolean running = isRunning(te); + + Axis rotationAxis = ((IRotate) te.getBlockState() + .getBlock()).getRotationAxis(te.getBlockState()); + kineticRotationTransform(getRotatedCoil(te), te, rotationAxis, AngleHelper.rad(offset * 180), light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + + World world = te.getWorld(); + BlockState blockState = te.getBlockState(); + BlockPos pos = te.getPos(); + + SuperByteBuffer halfMagnet = this.halfMagnet.renderOn(blockState); + SuperByteBuffer halfRope = this.halfRope.renderOn(blockState); + SuperByteBuffer magnet = renderMagnet(te); + SuperByteBuffer rope = renderRope(te); + + IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); + if (running || offset == 0) + renderAt(world, offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb); + + float f = offset % 1; + if (offset > .75f && (f < .25f || f > .75f)) + renderAt(world, halfRope, f > .75f ? f - 1 : f, pos, ms, vb); + + if (!running) + return; + + for (int i = 0; i < offset - 1.25f; i++) + renderAt(world, rope, offset - i - 1, pos, ms, vb); + } + + private void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos, MatrixStack ms, + IVertexBuilder buffer) { + BlockPos actualPos = pulleyPos.down((int) offset); + int light = WorldRenderer.getLightmapCoordinates(world, world.getBlockState(actualPos), actualPos); + partial.translate(0, -offset, 0) + .light(light) + .renderInto(ms, buffer); + } + + protected abstract Axis getShaftAxis(KineticTileEntity te); + + protected abstract AllBlockPartials getCoil(); + + protected abstract SuperByteBuffer renderRope(KineticTileEntity te); + + protected abstract SuperByteBuffer renderMagnet(KineticTileEntity te); + + protected abstract float getOffset(KineticTileEntity te, float partialTicks); + + protected abstract boolean isRunning(KineticTileEntity te); + + @Override + protected BlockState getRenderedBlockState(KineticTileEntity te) { + return shaft(getShaftAxis(te)); + } + + protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { + BlockState blockState = te.getBlockState(); + return getCoil().renderOnDirectionalSouth(blockState, + Direction.getFacingFromAxis(AxisDirection.POSITIVE, getShaftAxis(te))); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index 7fb9d23a4..01b88c2c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -1,53 +1,45 @@ package com.simibubi.create.content.contraptions.components.structureMovement.pulley; -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; import com.simibubi.create.foundation.utility.SuperByteBuffer; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.AxisDirection; -import net.minecraft.util.math.BlockPos; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.MathHelper; -import net.minecraft.world.IWorld; -import net.minecraft.world.World; -public class PulleyRenderer extends KineticTileEntityRenderer { +public class PulleyRenderer extends AbstractPulleyRenderer { public PulleyRenderer(TileEntityRendererDispatcher dispatcher) { - super(dispatcher); - } - - @Override - public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { - return true; + super(dispatcher, AllBlockPartials.ROPE_HALF, AllBlockPartials.ROPE_HALF_MAGNET); } @Override - protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { - super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + protected Axis getShaftAxis(KineticTileEntity te) { + return te.getBlockState().get(PulleyBlock.HORIZONTAL_AXIS); + } + @Override + protected AllBlockPartials getCoil() { + return AllBlockPartials.ROPE_COIL; + } + + @Override + protected SuperByteBuffer renderRope(KineticTileEntity te) { + return CreateClient.bufferCache.renderBlock(AllBlocks.ROPE.getDefaultState()); + } + + @Override + protected SuperByteBuffer renderMagnet(KineticTileEntity te) { + return CreateClient.bufferCache.renderBlock(AllBlocks.PULLEY_MAGNET.getDefaultState()); + } + + @Override + protected float getOffset(KineticTileEntity te, float partialTicks) { PulleyTileEntity pulley = (PulleyTileEntity) te; - World world = te.getWorld(); - BlockState blockState = te.getBlockState(); - BlockPos pos = te.getPos(); - - SuperByteBuffer halfMagnet = AllBlockPartials.ROPE_HALF_MAGNET.renderOn(blockState); - SuperByteBuffer halfRope = AllBlockPartials.ROPE_HALF.renderOn(blockState); - SuperByteBuffer magnet = CreateClient.bufferCache.renderBlock(AllBlocks.PULLEY_MAGNET.getDefaultState()); - SuperByteBuffer rope = CreateClient.bufferCache.renderBlock(AllBlocks.ROPE.getDefaultState()); - boolean running = pulley.running; boolean moving = running && (pulley.movedContraption == null || !pulley.movedContraption.isStalled()); float offset = pulley.getInterpolatedOffset(moving ? partialTicks : 0.5f); @@ -56,45 +48,16 @@ public class PulleyRenderer extends KineticTileEntityRenderer { ContraptionEntity e = pulley.movedContraption; PulleyContraption c = (PulleyContraption) pulley.movedContraption.getContraption(); double entityPos = MathHelper.lerp(partialTicks, e.lastTickPosY, e.getY()); - offset = (float) -(entityPos - c.getAnchor().getY() - c.initialOffset); + offset = (float) -(entityPos - c.getAnchor() + .getY() - c.initialOffset); } - renderPulleyRope(ms, buffer, world, pos, halfMagnet, halfRope, magnet, rope, running, offset); - } - - public static void renderPulleyRope(MatrixStack ms, IRenderTypeBuffer buffer, World world, BlockPos pos, - SuperByteBuffer halfMagnet, SuperByteBuffer halfRope, SuperByteBuffer magnet, SuperByteBuffer rope, - boolean running, float offset) { - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - if (running || offset == 0) - renderAt(world, offset > .25f ? magnet : halfMagnet, offset, pos, ms, vb); - - float f = offset % 1; - if (offset > .75f && (f < .25f || f > .75f)) - renderAt(world, halfRope, f > .75f ? f - 1 : f, pos, ms, vb); - - if (!running) - return; - - for (int i = 0; i < offset - 1.25f; i++) - renderAt(world, rope, offset - i - 1, pos, ms, vb); - } - - public static void renderAt(IWorld world, SuperByteBuffer partial, float offset, BlockPos pulleyPos, - MatrixStack ms, IVertexBuilder buffer) { - BlockPos actualPos = pulleyPos.down((int) offset); - int light = WorldRenderer.getLightmapCoordinates(world, world.getBlockState(actualPos), actualPos); - partial.translate(0, -offset, 0).light(light).renderInto(ms, buffer); + return offset; } @Override - protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { - BlockState blockState = te.getBlockState(); - return AllBlockPartials.ROPE_COIL.renderOnDirectionalSouth(blockState, horizontalFacing(blockState)); - } - - public Direction horizontalFacing(BlockState blockState) { - return Direction.getFacingFromAxis(AxisDirection.POSITIVE, blockState.get(PulleyBlock.HORIZONTAL_AXIS)); + protected boolean isRunning(KineticTileEntity te) { + return ((PulleyTileEntity) te).running; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java index bca6ec22e..71b01f6eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -51,7 +51,6 @@ public class OpenEndedPipe { .isReplaceable()) return; - // TODO different pipe end types if (pulling) { if (fluidState.isEmpty() || !fluidState.isSource()) return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java index 2fc5797bf..af76354d6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyRenderer.java @@ -1,70 +1,50 @@ package com.simibubi.create.content.contraptions.fluids.actors; -import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; -import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyRenderer; -import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.content.contraptions.components.structureMovement.pulley.AbstractPulleyRenderer; import com.simibubi.create.foundation.utility.SuperByteBuffer; -import net.minecraft.block.BlockState; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -public class HosePulleyRenderer extends KineticTileEntityRenderer { +public class HosePulleyRenderer extends AbstractPulleyRenderer { public HosePulleyRenderer(TileEntityRendererDispatcher dispatcher) { - super(dispatcher); + super(dispatcher, AllBlockPartials.HOSE_HALF, AllBlockPartials.HOSE_HALF_MAGNET); } @Override - public boolean isGlobalRenderer(KineticTileEntity p_188185_1_) { + protected Axis getShaftAxis(KineticTileEntity te) { + return te.getBlockState() + .get(HosePulleyBlock.HORIZONTAL_FACING) + .rotateY() + .getAxis(); + } + + @Override + protected AllBlockPartials getCoil() { + return AllBlockPartials.HOSE_COIL; + } + + @Override + protected SuperByteBuffer renderRope(KineticTileEntity te) { + return AllBlockPartials.HOSE.renderOn(te.getBlockState()); + } + + @Override + protected SuperByteBuffer renderMagnet(KineticTileEntity te) { + return AllBlockPartials.HOSE_MAGNET.renderOn(te.getBlockState()); + } + + @Override + protected float getOffset(KineticTileEntity te, float partialTicks) { + return ((HosePulleyTileEntity) te).getInterpolatedOffset(partialTicks); + } + + @Override + protected boolean isRunning(KineticTileEntity te) { return true; } - @Override - protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, - int light, int overlay) { - super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - HosePulleyTileEntity pulley = (HosePulleyTileEntity) te; - float offset = pulley.getInterpolatedOffset(partialTicks); - - Axis rotationAxis = ((IRotate) te.getBlockState() - .getBlock()).getRotationAxis(te.getBlockState()); - kineticRotationTransform(getRotatedCoil(te), te, rotationAxis, AngleHelper.rad(offset * 180), light).renderInto(ms, - buffer.getBuffer(RenderType.getSolid())); - - World world = te.getWorld(); - BlockState blockState = te.getBlockState(); - BlockPos pos = te.getPos(); - - SuperByteBuffer halfMagnet = AllBlockPartials.HOSE_HALF_MAGNET.renderOn(blockState); - SuperByteBuffer halfRope = AllBlockPartials.HOSE_HALF.renderOn(blockState); - SuperByteBuffer magnet = AllBlockPartials.HOSE_MAGNET.renderOn(blockState); - SuperByteBuffer rope = AllBlockPartials.HOSE.renderOn(blockState); - - PulleyRenderer.renderPulleyRope(ms, buffer, world, pos, halfMagnet, halfRope, magnet, rope, true, offset); - } - - @Override - protected BlockState getRenderedBlockState(KineticTileEntity te) { - return shaft(te.getBlockState() - .get(HosePulleyBlock.HORIZONTAL_FACING) - .rotateY() - .getAxis()); - } - - protected SuperByteBuffer getRotatedCoil(KineticTileEntity te) { - BlockState blockState = te.getBlockState(); - return AllBlockPartials.HOSE_COIL.renderOnDirectionalSouth(blockState, - blockState.get(HosePulleyBlock.HORIZONTAL_FACING) - .rotateY()); - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java index 9ea0ab495..16f2a9470 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -1,24 +1,71 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.fluid.FluidHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.item.ItemGroup; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.InventoryHelper; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; -import net.minecraft.util.NonNullList; +import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; -public class ItemDrainBlock extends Block { +public class ItemDrainBlock extends Block implements IWrenchable, ITE { public ItemDrainBlock(Properties p_i48440_1_) { super(p_i48440_1_); } + @Override + public ActionResultType onUse(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, + BlockRayTraceResult hit) { + ItemStack heldItem = player.getHeldItem(handIn); + + try { + ItemDrainTileEntity te = getTileEntity(worldIn, pos); + if (!heldItem.isEmpty()) { + te.internalTank.allowInsertion(); + ActionResultType tryExchange = tryExchange(worldIn, player, handIn, heldItem, te); + te.internalTank.forbidInsertion(); + if (tryExchange.isAccepted()) + return tryExchange; + } + + ItemStack heldItemStack = te.getHeldItemStack(); + if (!worldIn.isRemote && !heldItemStack.isEmpty()) { + player.inventory.placeItemBackInInventory(worldIn, heldItemStack); + te.heldItem = null; + te.notifyUpdate(); + } + return ActionResultType.SUCCESS; + } catch (TileEntityException e) { + } + + return ActionResultType.PASS; + } + + protected ActionResultType tryExchange(World worldIn, PlayerEntity player, Hand handIn, ItemStack heldItem, + ItemDrainTileEntity te) { + if (FluidHelper.tryEmptyItemIntoTE(worldIn, player, handIn, heldItem, te)) + return ActionResultType.SUCCESS; + if (EmptyingByBasin.canItemBeEmptied(worldIn, heldItem)) + return ActionResultType.SUCCESS; + return ActionResultType.PASS; + } + @Override public VoxelShape getShape(BlockState p_220053_1_, IBlockReader p_220053_2_, BlockPos p_220053_3_, ISelectionContext p_220053_4_) { @@ -26,6 +73,30 @@ public class ItemDrainBlock extends Block { } @Override - public void fillItemGroup(ItemGroup p_149666_1_, NonNullList p_149666_2_) {} + public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) + return; + withTileEntityDo(worldIn, pos, te -> { + ItemStack heldItemStack = te.getHeldItemStack(); + if (!heldItemStack.isEmpty()) + InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), heldItemStack); + }); + worldIn.removeTileEntity(pos); + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.ITEM_DRAIN.create(); + } + + @Override + public Class getTileEntityClass() { + return ItemDrainTileEntity.class; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainItemHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainItemHandler.java new file mode 100644 index 000000000..a0e98baa8 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainItemHandler.java @@ -0,0 +1,70 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraftforge.items.IItemHandler; + +public class ItemDrainItemHandler implements IItemHandler { + + private ItemDrainTileEntity te; + private Direction side; + + public ItemDrainItemHandler(ItemDrainTileEntity te, Direction side) { + this.te = te; + this.side = side; + } + + @Override + public int getSlots() { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + return te.getHeldItemStack(); + } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!te.getHeldItemStack() + .isEmpty()) + return stack; + if (!simulate) { + TransportedItemStack heldItem = new TransportedItemStack(stack); + heldItem.prevBeltPosition = 0; + te.setHeldItem(heldItem, side.getOpposite()); + te.notifyUpdate(); + } + return ItemStack.EMPTY; + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + TransportedItemStack held = te.heldItem; + if (held == null) + return ItemStack.EMPTY; + + ItemStack stack = held.stack.copy(); + ItemStack extracted = stack.split(amount); + if (!simulate) { + te.heldItem.stack = stack; + if (stack.isEmpty()) + te.heldItem = null; + te.notifyUpdate(); + } + return extracted; + } + + @Override + public int getSlotLimit(int slot) { + return 64; + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java new file mode 100644 index 000000000..8ee36ac2f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainRenderer.java @@ -0,0 +1,182 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.Random; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; +import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.fluid.FluidRenderer; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; +import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fluids.FluidStack; + +public class ItemDrainRenderer extends SmartTileEntityRenderer { + + public ItemDrainRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(ItemDrainTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + renderFluid(te, partialTicks, ms, buffer, light); + renderItem(te, partialTicks, ms, buffer, light, overlay); + } + + protected void renderItem(ItemDrainTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + TransportedItemStack transported = te.heldItem; + if (transported == null) + return; + + MatrixStacker msr = MatrixStacker.of(ms); + Vec3d itemPosition = VecHelper.getCenterOf(te.getPos()); + + Direction insertedFrom = transported.insertedFrom; + if (!insertedFrom.getAxis() + .isHorizontal()) + return; + + ms.push(); + ms.translate(.5f, 15 / 16f, .5f); + msr.nudge(0); + float offset = MathHelper.lerp(partialTicks, transported.prevBeltPosition, transported.beltPosition); + float sideOffset = MathHelper.lerp(partialTicks, transported.prevSideOffset, transported.sideOffset); + + Vec3d offsetVec = new Vec3d(insertedFrom.getOpposite() + .getDirectionVec()).scale(.5f - offset); + ms.translate(offsetVec.x, offsetVec.y, offsetVec.z); + boolean alongX = insertedFrom.rotateY() + .getAxis() == Axis.X; + if (!alongX) + sideOffset *= -1; + ms.translate(alongX ? sideOffset : 0, 0, alongX ? 0 : sideOffset); + + ItemStack itemStack = transported.stack; + Random r = new Random(0); + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + int count = (int) (MathHelper.log2((int) (itemStack.getCount()))) / 2; + boolean renderUpright = BeltHelper.isItemUpright(itemStack); + boolean blockItem = itemRenderer.getItemModelWithOverrides(itemStack, null, null) + .isGui3d(); + + if (renderUpright) + ms.translate(0, 3 / 32d, 0); + + int positive = insertedFrom.getAxisDirection() + .getOffset(); + float verticalAngle = positive * offset * 360; + if (insertedFrom.getAxis() != Axis.X) + msr.rotateX(verticalAngle); + if (insertedFrom.getAxis() != Axis.Z) + msr.rotateZ(-verticalAngle); + + if (renderUpright) { + Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + if (renderViewEntity != null) { + Vec3d positionVec = renderViewEntity.getPositionVec(); + Vec3d vectorForOffset = itemPosition.add(offsetVec); + Vec3d diff = vectorForOffset.subtract(positionVec); + + if (insertedFrom.getAxis() != Axis.X) + diff = VecHelper.rotate(diff, verticalAngle, Axis.X); + if (insertedFrom.getAxis() != Axis.Z) + diff = VecHelper.rotate(diff, -verticalAngle, Axis.Z); + + float yRot = (float) MathHelper.atan2(diff.z, -diff.x); + ms.multiply(Vector3f.POSITIVE_Y.getRadialQuaternion((float) (yRot - Math.PI / 2))); + } + ms.translate(0, 0, -1/16f); + } + + for (int i = 0; i <= count; i++) { + ms.push(); + if (blockItem) + ms.translate(r.nextFloat() * .0625f * i, 0, r.nextFloat() * .0625f * i); + ms.scale(.5f, .5f, .5f); + if (!blockItem && !renderUpright) + msr.rotateX(90); + itemRenderer.renderItem(itemStack, TransformType.FIXED, light, overlay, ms, buffer); + ms.pop(); + + if (!renderUpright) { + if (!blockItem) + msr.rotateY(10); + ms.translate(0, blockItem ? 1 / 64d : 1 / 16d, 0); + } else + ms.translate(0, 0, -1 / 16f); + } + + ms.pop(); + } + + protected void renderFluid(ItemDrainTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light) { + SmartFluidTankBehaviour tank = te.internalTank; + if (tank == null) + return; + + TankSegment primaryTank = tank.getPrimaryTank(); + FluidStack fluidStack = primaryTank.getRenderedFluid(); + float level = primaryTank.getFluidLevel() + .getValue(partialTicks); + + if (!fluidStack.isEmpty() && level != 0) { + float yMin = 4f / 16f; + float min = 2f / 16f; + float max = min + (12 / 16f); + float yOffset = (8 / 16f) * level; + ms.push(); + ms.translate(0, yOffset, 0); + FluidRenderer.renderTiledFluidBB(fluidStack, min, yMin - yOffset, min, max, yMin, max, buffer, ms, light, + false); + ms.pop(); + } + + ItemStack heldItemStack = te.getHeldItemStack(); + if (heldItemStack.isEmpty()) + return; + FluidStack fluidStack2 = EmptyingByBasin.emptyItem(te.getWorld(), heldItemStack, true) + .getFirst(); + if (fluidStack2.isEmpty()) { + if (fluidStack.isEmpty()) + return; + fluidStack2 = fluidStack; + } + + int processingTicks = te.processingTicks; + float processingPT = te.processingTicks - partialTicks; + float processingProgress = 1 - (processingPT - 5) / 10; + processingProgress = MathHelper.clamp(processingProgress, 0, 1); + float radius = 0; + + if (processingTicks != -1) { + radius = (float) (Math.pow(((2 * processingProgress) - 1), 2) - 1); + AxisAlignedBB bb = new AxisAlignedBB(0.5, 1.0, 0.5, 0.5, 0.25, 0.5).grow(radius / 32f); + FluidRenderer.renderTiledFluidBB(fluidStack2, (float) bb.minX, (float) bb.minY, (float) bb.minZ, + (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ, buffer, ms, light, true); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java new file mode 100644 index 000000000..341b36e25 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java @@ -0,0 +1,257 @@ +package com.simibubi.create.content.contraptions.fluids.actors; + +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.Block; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; + +public class ItemDrainTileEntity extends SmartTileEntity { + + public static final int FILLING_TIME = 20; + + SmartFluidTankBehaviour internalTank; + TransportedItemStack heldItem; + protected int processingTicks; + Map> itemHandlers; + + public ItemDrainTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + itemHandlers = new IdentityHashMap<>(); + for (Direction d : Iterate.horizontalDirections) { + ItemDrainItemHandler itemDrainItemHandler = new ItemDrainItemHandler(this, d); + itemHandlers.put(d, LazyOptional.of(() -> itemDrainItemHandler)); + } + } + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new DirectBeltInputBehaviour(this).setInsertionHandler(this::tryInsertingFromSide)); + behaviours.add(internalTank = SmartFluidTankBehaviour.single(this, 1500) + .allowExtraction() + .forbidInsertion()); + } + + private ItemStack tryInsertingFromSide(TransportedItemStack transportedStack, Direction side, boolean simulate) { + ItemStack inserted = transportedStack.stack; + ItemStack empty = ItemStack.EMPTY; + + if (!getHeldItemStack().isEmpty()) + return inserted; + if (simulate) + return empty; + + transportedStack = transportedStack.copy(); + transportedStack.beltPosition = side.getAxis() + .isVertical() ? .5f : 0; + transportedStack.prevSideOffset = transportedStack.sideOffset; + transportedStack.prevBeltPosition = transportedStack.beltPosition; + setHeldItem(transportedStack, side); + markDirty(); + sendData(); + + return empty; + } + + public ItemStack getHeldItemStack() { + return heldItem == null ? ItemStack.EMPTY : heldItem.stack; + } + + @Override + public void tick() { + super.tick(); + if (heldItem == null) { + processingTicks = 0; + return; + } + + if (processingTicks > 0) { + heldItem.prevBeltPosition = .5f; + boolean wasAtBeginning = processingTicks == FILLING_TIME; + if (!world.isRemote || processingTicks < FILLING_TIME) + processingTicks--; + if (!continueProcessing()) { + processingTicks = 0; + notifyUpdate(); + return; + } + if (wasAtBeginning != (processingTicks == FILLING_TIME)) + sendData(); + return; + } + + heldItem.prevBeltPosition = heldItem.beltPosition; + heldItem.prevSideOffset = heldItem.sideOffset; + + heldItem.beltPosition += itemMovementPerTick(); + if (heldItem.beltPosition > 1) { + heldItem.beltPosition = 1; + + if (world.isRemote) + return; + + Direction side = heldItem.insertedFrom; + BlockPos nextPosition = pos.offset(side); + DirectBeltInputBehaviour directBeltInputBehaviour = + TileEntityBehaviour.get(world, nextPosition, DirectBeltInputBehaviour.TYPE); + if (directBeltInputBehaviour == null) { + if (!Block.hasSolidSide(world.getBlockState(nextPosition), world, nextPosition, side.getOpposite())) { + ItemStack ejected = heldItem.stack; + Vec3d outPos = VecHelper.getCenterOf(pos) + .add(new Vec3d(side.getDirectionVec()).scale(.75)); + float movementSpeed = itemMovementPerTick(); + Vec3d outMotion = new Vec3d(side.getDirectionVec()).scale(movementSpeed) + .add(0, 1 / 8f, 0); + outPos.add(outMotion.normalize()); + ItemEntity entity = new ItemEntity(world, outPos.x, outPos.y + 6 / 16f, outPos.z, ejected); + entity.setMotion(outMotion); + entity.setDefaultPickupDelay(); + entity.velocityChanged = true; + world.addEntity(entity); + + heldItem = null; + notifyUpdate(); + } + return; + } + + if (!directBeltInputBehaviour.canInsertFromSide(side)) + return; + + ItemStack returned = directBeltInputBehaviour.handleInsertion(heldItem.copy(), side, false); + + if (returned.isEmpty()) { + heldItem = null; + notifyUpdate(); + return; + } + + if (returned.getCount() != heldItem.stack.getCount()) { + heldItem.stack = returned; + notifyUpdate(); + return; + } + + return; + } + + if (heldItem.prevBeltPosition < .5f && heldItem.beltPosition >= .5f) { + if (!EmptyingByBasin.canItemBeEmptied(world, heldItem.stack)) + return; + heldItem.beltPosition = .5f; + if (world.isRemote) + return; + processingTicks = FILLING_TIME; + sendData(); + } + + } + + protected boolean continueProcessing() { + if (world.isRemote) + return true; + if (processingTicks < 5) + return true; + if (!EmptyingByBasin.canItemBeEmptied(world, heldItem.stack)) + return false; + + Pair emptyItem = EmptyingByBasin.emptyItem(world, heldItem.stack, true); + FluidStack fluidFromItem = emptyItem.getFirst(); + + if (processingTicks > 5) { + internalTank.allowInsertion(); + if (internalTank.getPrimaryHandler() + .fill(fluidFromItem, FluidAction.SIMULATE) != fluidFromItem.getAmount()) { + internalTank.forbidInsertion(); + processingTicks = FILLING_TIME; + return true; + } + internalTank.forbidInsertion(); + return true; + } + + emptyItem = EmptyingByBasin.emptyItem(world, heldItem.stack.copy(), false); + + // Process finished + ItemStack out = emptyItem.getSecond(); + if (!out.isEmpty()) + heldItem.stack = out; + else + heldItem = null; + internalTank.allowInsertion(); + internalTank.getPrimaryHandler() + .fill(fluidFromItem, FluidAction.EXECUTE); + internalTank.forbidInsertion(); + notifyUpdate(); + return true; + } + + private float itemMovementPerTick() { + return 1 / 8f; + } + + @Override + public void remove() { + super.remove(); + for (LazyOptional lazyOptional : itemHandlers.values()) + lazyOptional.invalidate(); + } + + public void setHeldItem(TransportedItemStack heldItem, Direction insertedFrom) { + this.heldItem = heldItem; + this.heldItem.insertedFrom = insertedFrom; + } + + @Override + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putInt("ProcessingTicks", processingTicks); + if (heldItem != null) + compound.put("HeldItem", heldItem.serializeNBT()); + super.write(compound, clientPacket); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + heldItem = null; + processingTicks = compound.getInt("ProcessingTicks"); + if (compound.contains("HeldItem")) + heldItem = TransportedItemStack.read(compound.getCompound("HeldItem")); + super.read(compound, clientPacket); + } + + @Override + public LazyOptional getCapability(Capability cap, Direction side) { + if (side != null && side.getAxis() + .isHorizontal() && isItemHandlerCap(cap)) + return itemHandlers.get(side) + .cast(); + + if (side != Direction.UP && isFluidHandlerCap(cap)) + return internalTank.getCapability() + .cast(); + + return super.getCapability(cap, side); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index 552858f1e..06ab3c4b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -147,9 +147,9 @@ public class SpoutTileEntity extends SmartTileEntity { public void tick() { super.tick(); - if (processingTicks >= 0) - processingTicks--; if (processingTicks >= 8 && world.isRemote) + if (processingTicks >= 0) + processingTicks--; spawnProcessingParticles(tank.getPrimaryTank().getRenderedFluid()); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java index 93fda0b22..0411e7edf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankModel.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.Random; +import com.simibubi.create.AllSpriteShifts; import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.utility.Iterate; @@ -23,7 +24,15 @@ public class FluidTankModel extends CTModel { protected static ModelProperty CULL_PROPERTY = new ModelProperty<>(); - public FluidTankModel(IBakedModel originalModel, CTSpriteShiftEntry side, CTSpriteShiftEntry top) { + public static FluidTankModel standard(IBakedModel originalModel) { + return new FluidTankModel(originalModel, AllSpriteShifts.FLUID_TANK, AllSpriteShifts.COPPER_CASING); + } + + public static FluidTankModel creative(IBakedModel originalModel) { + return new FluidTankModel(originalModel, AllSpriteShifts.CREATIVE_FLUID_TANK, AllSpriteShifts.CREATIVE_CASING); + } + + private FluidTankModel(IBakedModel originalModel, CTSpriteShiftEntry side, CTSpriteShiftEntry top) { super(originalModel, new FluidTankCTBehaviour(side, top)); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java index afe7c9a87..5d85d663f 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/ChromaticCompoundItem.java @@ -1,11 +1,15 @@ package com.simibubi.create.content.curiosities; +import java.util.List; +import java.util.Random; + import com.simibubi.create.AllItems; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CRecipes; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.item.ItemEntity; @@ -17,15 +21,16 @@ import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.BeaconTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; -import net.minecraft.util.math.*; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceContext; import net.minecraft.util.math.RayTraceContext.BlockMode; import net.minecraft.util.math.RayTraceContext.FluidMode; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraft.world.gen.Heightmap; -import java.util.List; -import java.util.Random; - public class ChromaticCompoundItem extends Item { public ChromaticCompoundItem(Properties properties) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java index f16b10656..afbf8dab9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotBlock.java @@ -101,10 +101,8 @@ public class DepotBlock extends Block implements ITE { @Override public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { - if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) { + if (!state.hasTileEntity() || state.getBlock() == newState.getBlock()) return; - } - withTileEntityDo(worldIn, pos, te -> { ItemHelper.dropContents(worldIn, pos, te.processingOutputBuffer); if (!te.getHeldItemStack() diff --git a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java index 63f2755a2..636f0c585 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/depot/DepotRenderer.java @@ -86,7 +86,7 @@ public class DepotRenderer extends SafeTileEntityRenderer { ms.pop(); } - protected void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack itemStack, + public static void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack itemStack, int angle, Random r, Vec3d itemPosition) { ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index b6f949a5a..16c0b33ea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -6,6 +6,8 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.depot.DepotBlock; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VoxelShaper; import com.tterrag.registrate.util.entry.BlockEntry; @@ -107,7 +109,7 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { public static BlockState updateShape(BlockState state, IBlockReader world, BlockPos pos) { state = state.with(SHAPE, Shape.RETRACTED); Direction horizontalFacing = state.get(HORIZONTAL_FACING); - + BlockState below = world.getBlockState(pos.down()); if (below.getBlock() instanceof BeltBlock && below.get(BeltBlock.HORIZONTAL_FACING) .getAxis() != horizontalFacing.getAxis()) @@ -129,6 +131,17 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { return false; } + @Override + public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, + boolean p_196243_5_) { + if (p_196243_1_.hasTileEntity() + && (p_196243_1_.getBlock() != p_196243_4_.getBlock() && !FunnelBlock.isFunnel(p_196243_4_) + || !p_196243_4_.hasTileEntity())) { + TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); + p_196243_2_.removeTileEntity(p_196243_3_); + } + } + @Override protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) { return isOnValidBelt(state, world, pos); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index ea72f1ccf..c95d6b41a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -32,7 +32,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { if (!funnelFacing.getAxis() .isHorizontal()) { - Vec3d southLocation = VecHelper.voxelSpace(8, 13, 15.5f); + Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 3 : 13, 15.5f); return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); } @@ -48,7 +48,7 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; if (reverse) zRotLast += 180; - + Vec3d vec = VecHelper.voxelSpace(8, 13, .5f); vec = vec.subtract(.5, .5, .5); vec = VecHelper.rotate(vec, zRotLast, Axis.Z); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 5e139d946..75c75fde0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -8,12 +8,12 @@ import com.google.common.collect.ImmutableMap; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; import com.simibubi.create.content.contraptions.components.deployer.DeployerBlock; import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 3bc9e2901..26af2e2ad 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -1,5 +1,10 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nullable; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Jukebox; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPoint.Mode; @@ -15,6 +20,7 @@ import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; + import net.minecraft.block.BlockState; import net.minecraft.block.JukeboxBlock; import net.minecraft.item.ItemStack; @@ -30,10 +36,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - public class ArmTileEntity extends KineticTileEntity { // Server diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java index a701a2b07..23db2297e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/StockpileSwitchBlock.java @@ -79,6 +79,8 @@ public class StockpileSwitchBlock extends HorizontalBlock implements ITE b.key('S', I.shaft()) - .key('A', I.andesite()) - .key('R', ItemTags.PLANKS) - .key('B', Items.IRON_BARS) + .key('A', I.andesiteCasing()) + .key('R', I.cog()) .key('P', AllItems.PROPELLER.get()) .patternLine(" S ") .patternLine("RAR") - .patternLine("BPB")), + .patternLine(" P ")), CUCKOO_CLOCK = create(AllBlocks.CUCKOO_CLOCK).unlockedBy(I::andesite) .viaShaped(b -> b.key('S', ItemTags.PLANKS) @@ -458,6 +457,13 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("T") .patternLine("P") .patternLine("S")), + + ITEM_DRAIN = create(AllBlocks.ITEM_DRAIN).unlockedBy(I::copperCasing) + .viaShaped(b -> b + .key('P', Blocks.IRON_BARS) + .key('S', I.copperCasing()) + .patternLine("P") + .patternLine("S")), FLUID_TANK = create(AllBlocks.FLUID_TANK).returns(2) .unlockedBy(I::copperCasing) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 445ab0a91..44dadd97f 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -226,7 +226,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { protected FluidStack renderedFluid; public TankSegment(int capacity) { - tank = new SmartFluidTank(1000, f -> onFluidStackChanged()); + tank = new SmartFluidTank(capacity, f -> onFluidStackChanged()); fluidLevel = LerpedFloat.linear() .startWithValue(0) .chase(0, .25, Chaser.EXP); diff --git a/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json b/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json index bbb85e18b..f29424c95 100644 --- a/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json +++ b/src/main/resources/assets/create/models/block/rope_pulley/rope_coil.json @@ -2,8 +2,6 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "0": "create:block/axis", - "1": "create:block/axis_top", "5": "create:block/pulley_rope" }, "elements": [ @@ -37,7 +35,7 @@ "name": "coil", "from": [3.5, 3.5, 3], "to": [12.5, 12.5, 7], - "rotation": {"angle": 45, "axis": "z", "origin": [8, 8, -10]}, + "rotation": {"angle": -45, "axis": "z", "origin": [8, 8, -10]}, "faces": { "north": {"uv": [0, 0, 9, 9], "texture": "#5"}, "east": {"uv": [0, 0, 4, 9], "texture": "#5"}, @@ -46,21 +44,6 @@ "up": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"}, "down": {"uv": [0, 0, 4, 9], "rotation": 90, "texture": "#5"} } - }, - { - "name": "Axis", - "from": [6, 6, 0], - "to": [10, 10, 16], - "shade": false, - "rotation": {"angle": 0, "axis": "x", "origin": [8, 1, 8]}, - "faces": { - "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"}, - "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#0"}, - "south": {"uv": [6, 6, 10, 10], "texture": "#1"}, - "west": {"uv": [6, 0, 10, 16], "rotation": 270, "texture": "#0"}, - "up": {"uv": [6, 0, 10, 16], "texture": "#0"}, - "down": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"} - } } ] } \ No newline at end of file From d5f08aab7615c9b041ea3422acac9f0dce9ad762 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 4 Nov 2020 19:08:01 +0100 Subject: [PATCH 33/36] Brackets and spilled potions - Added wooden and metal brackets - Brackets can be applied to shafts, cogs and fluid pipes - Brackets prevent pipes from connecting to adjacent pipes - Fixed blockzapper not showing up in the searchable creative menu - Added config values for hose pulleys - Hose pulleys now extinguish lit waterloggable blocks - Hose pulley now break blocks that cannot withstand vanilla fluid flows - Spout is now wrenchable - Fixed spout not activating properly - Added fluid particles that supports fluids without a block variant - Potion fluids now apply their effects to nearby entities when spilling from an open end - Fixed pumps not rendering fluid particles when spilling/pulling fluids directly - Hose Pulley no longer accepts fluids that cannot be placed - Hose Pulleys and open pipes can no longer place water in the nether - Some Refactors to the particle system - Reverted reversed crtl activation for schematic tools - Added a command to fix broken lighting in some of creates models (enables experimental forge block rendering) - Fixed fluid ingredients in jei once again - Fixed fluid tag ingredients being resolved on the client --- src/generated/resources/.cache/cache | 44 +++- .../create/blockstates/metal_bracket.json | 154 +++++++++++++ .../create/blockstates/wooden_bracket.json | 154 +++++++++++++ .../resources/assets/create/lang/en_ud.json | 2 + .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 4 +- .../assets/create/lang/unfinished/pt_br.json | 4 +- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../block/bracket/cog/ground_metal.json | 7 + .../block/bracket/cog/ground_wooden.json | 7 + .../models/block/bracket/cog/wall_metal.json | 7 + .../models/block/bracket/cog/wall_wooden.json | 7 + .../block/bracket/pipe/ground_metal.json | 7 + .../block/bracket/pipe/ground_wooden.json | 7 + .../models/block/bracket/pipe/wall_metal.json | 7 + .../block/bracket/pipe/wall_wooden.json | 7 + .../block/bracket/shaft/ground_metal.json | 7 + .../block/bracket/shaft/ground_wooden.json | 7 + .../block/bracket/shaft/wall_metal.json | 7 + .../block/bracket/shaft/wall_wooden.json | 7 + .../create/models/item/metal_bracket.json | 7 + .../create/models/item/wooden_bracket.json | 7 + .../crafting/kinetics/metal_bracket.json | 32 +++ .../crafting/kinetics/wooden_bracket.json | 32 +++ .../loot_tables/blocks/metal_bracket.json | 19 ++ .../loot_tables/blocks/wooden_bracket.json | 19 ++ .../crafting/kinetics/metal_bracket.json | 22 ++ .../crafting/kinetics/wooden_bracket.json | 22 ++ .../java/com/simibubi/create/AllBlocks.java | 19 ++ .../com/simibubi/create/AllParticleTypes.java | 59 ++--- .../compat/jei/category/MixingCategory.java | 2 +- .../content/contraptions/fluids/FluidFX.java | 72 +++++- .../fluids/FluidPipeAttachmentBehaviour.java | 18 +- .../fluids/FluidPipeBehaviour.java | 74 ++----- .../contraptions/fluids/FluidPropagator.java | 21 +- .../contraptions/fluids/OpenEndedPipe.java | 126 ++++++++++- .../fluids/PipeAttachmentModel.java | 21 +- .../contraptions/fluids/PumpTileEntity.java | 56 ++++- .../fluids/actors/FluidDrainingBehaviour.java | 9 +- .../fluids/actors/FluidFillingBehaviour.java | 65 +++++- .../actors/FluidManipulationBehaviour.java | 10 +- .../fluids/actors/HosePulleyFluidHandler.java | 9 +- .../fluids/actors/SpoutBlock.java | 3 +- .../fluids/actors/SpoutTileEntity.java | 30 +-- .../fluids/particle/FluidParticleData.java | 71 ++++++ .../fluids/particle/FluidStackParticle.java | 87 ++++++++ .../fluids/pipes/AxisPipeBlock.java | 22 +- .../fluids/pipes/BracketBlock.java | 66 ++++++ .../fluids/pipes/BracketBlockItem.java | 73 ++++++ .../fluids/pipes/BracketGenerator.java | 52 +++++ .../fluids/pipes/FluidPipeBlock.java | 65 ++++-- .../fluids/pipes/GlassFluidPipeBlock.java | 5 +- .../particle/AirFlowParticleData.java | 4 +- .../particle/AirParticleData.java | 4 +- .../particle/CubeParticleData.java | 12 +- .../particle/HeaterParticleData.java | 4 +- ...Particle.java => ICustomParticleData.java} | 12 +- .../ICustomParticleDataWithSprite.java | 34 +++ .../RotationIndicatorParticleData.java | 50 +++-- .../BracketedKineticBlockModel.java | 80 +++++++ .../BracketedTileEntityBehaviour.java | 75 +++++++ .../relays/elementary/ShaftBlock.java | 193 +++++++++------- .../elementary/SimpleKineticTileEntity.java | 13 +- .../relays/gauge/GaugeGenerator.java | 43 +--- .../wrench/IWrenchableWithBracket.java | 54 +++++ .../zapper/blockzapper/BlockzapperItem.java | 25 ++- .../schematics/client/SchematicHandler.java | 2 +- .../foundation/command/AllCommands.java | 1 + .../command/ConfigureConfigPacket.java | 38 ++-- .../command/FixLightingCommand.java | 29 +++ .../create/foundation/config/CFluids.java | 17 +- .../data/DirectionalAxisBlockStateGen.java | 56 +++++ .../data/recipe/CreateRecipeProvider.java | 5 + .../data/recipe/StandardRecipeGen.java | 24 +- .../create/foundation/fluid/FluidHelper.java | 7 + .../foundation/fluid/FluidIngredient.java | 29 ++- .../create/foundation/gui/GuiGameElement.java | 5 +- .../utility/SuperByteBufferCache.java | 3 +- .../utility/VirtualEmptyModelData.java | 30 +++ .../models/block/bracket/cog/ground.json | 208 ++++++++++++++++++ .../create/models/block/bracket/cog/wall.json | 206 +++++++++++++++++ .../create/models/block/bracket/item.json | 110 +++++++++ .../models/block/bracket/pipe/ground.json | 119 ++++++++++ .../models/block/bracket/pipe/wall.json | 110 +++++++++ .../models/block/bracket/shaft/ground.json | 110 +++++++++ .../models/block/bracket/shaft/wall.json | 110 +++++++++ .../block/fluid_tank/block_single_window.json | 18 +- .../assets/create/particles/fluid_drip.json | 1 + .../create/particles/fluid_particle.json | 1 + .../create/textures/block/bracket_metal.png | Bin 0 -> 514 bytes .../textures/block/bracket_plate_metal.png | Bin 0 -> 489 bytes .../textures/block/bracket_plate_wooden.png | Bin 0 -> 576 bytes .../create/textures/block/bracket_wooden.png | Bin 0 -> 632 bytes 99 files changed, 3096 insertions(+), 417 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/metal_bracket.json create mode 100644 src/generated/resources/assets/create/blockstates/wooden_bracket.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/cog/ground_metal.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/cog/ground_wooden.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/cog/wall_metal.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/cog/wall_wooden.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/pipe/ground_metal.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/pipe/ground_wooden.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/pipe/wall_metal.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/pipe/wall_wooden.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/shaft/ground_metal.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/shaft/ground_wooden.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/shaft/wall_metal.json create mode 100644 src/generated/resources/assets/create/models/block/bracket/shaft/wall_wooden.json create mode 100644 src/generated/resources/assets/create/models/item/metal_bracket.json create mode 100644 src/generated/resources/assets/create/models/item/wooden_bracket.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/metal_bracket.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wooden_bracket.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/metal_bracket.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/wooden_bracket.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/metal_bracket.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/wooden_bracket.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java rename src/main/java/com/simibubi/create/content/contraptions/particle/{ICustomParticle.java => ICustomParticleData.java} (56%) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java create mode 100644 src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java create mode 100644 src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/VirtualEmptyModelData.java create mode 100644 src/main/resources/assets/create/models/block/bracket/cog/ground.json create mode 100644 src/main/resources/assets/create/models/block/bracket/cog/wall.json create mode 100644 src/main/resources/assets/create/models/block/bracket/item.json create mode 100644 src/main/resources/assets/create/models/block/bracket/pipe/ground.json create mode 100644 src/main/resources/assets/create/models/block/bracket/pipe/wall.json create mode 100644 src/main/resources/assets/create/models/block/bracket/shaft/ground.json create mode 100644 src/main/resources/assets/create/models/block/bracket/shaft/wall.json create mode 100644 src/main/resources/assets/create/particles/fluid_drip.json create mode 100644 src/main/resources/assets/create/particles/fluid_particle.json create mode 100644 src/main/resources/assets/create/textures/block/bracket_metal.png create mode 100644 src/main/resources/assets/create/textures/block/bracket_plate_metal.png create mode 100644 src/main/resources/assets/create/textures/block/bracket_plate_wooden.png create mode 100644 src/main/resources/assets/create/textures/block/bracket_wooden.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 6035cda1c..6637c18cb 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -225,6 +225,7 @@ debef0f5dde74103aaf4422de4bc90e4099b0c47 assets/create/blockstates/mechanical_pl 92269fe66d7b83095a2e04e121af0be792f55dd6 assets/create/blockstates/mechanical_press.json b7c4a0ff0c6f16e14d71fc0fb7fc66d032b65cf3 assets/create/blockstates/mechanical_pump.json 264d72320ee0f1e014319f7d99dcc1fa953a4ad4 assets/create/blockstates/mechanical_saw.json +94bbcb7e622471dbf418d78f9200ad321c7168de assets/create/blockstates/metal_bracket.json 4e48ad0936647065c2322390e7c0fe115c853a98 assets/create/blockstates/millstone.json 468202df0802e17c75fcad0993daf1bc5300ca91 assets/create/blockstates/minecart_anchor.json 6a42f86aaff8ced70aaa6adb9460614ab40c21e5 assets/create/blockstates/mossy_andesite.json @@ -384,22 +385,23 @@ c77b46d8b459e5c7cc495393546f3fcca8a1fa1d assets/create/blockstates/weathered_lim 4647010162eb4c350fad236d860317eaa1884c77 assets/create/blockstates/white_seat.json 89000903d0ab8139e919abea7aa0361b34c24e55 assets/create/blockstates/white_valve_handle.json c4cd1131113667da0180898b5db3ebad609db8ba assets/create/blockstates/windmill_bearing.json +d4f804f2818376950ef28fc8d6250419f4e12218 assets/create/blockstates/wooden_bracket.json e03c48512967845fce09d84b955d3bc7b480fedc assets/create/blockstates/yellow_sail.json a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.json 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -6fe6c50ae75a9c89c90d3423bc74f3e628bc213a assets/create/lang/en_ud.json -b054eb6cf72ac04fbb2512569effa84768adef74 assets/create/lang/en_us.json -cf432c7dcf9b91769a570242a59c12ecca79a091 assets/create/lang/unfinished/de_de.json -5a2e2499696f45b1f95feeaa702119b8e1b371eb assets/create/lang/unfinished/fr_fr.json -12ac01a6f21c536aa09599c36139f593cbbf7d1f assets/create/lang/unfinished/it_it.json -3e65e163c658e4f34124807716b009e1907187cc assets/create/lang/unfinished/ja_jp.json -4dfeba1d56d8ad688442d2ca026dfa16147178ef assets/create/lang/unfinished/ko_kr.json -3d114a874d1c198ecf0978fd13b98249536cc684 assets/create/lang/unfinished/nl_nl.json -3434f2d429bdf64dcbc915c0365e20250b64d819 assets/create/lang/unfinished/pt_br.json -0bfd9476411fc565a3011ffc43eecaca3f0e53ff assets/create/lang/unfinished/ru_ru.json -d7150e9c65d74f41e2dc65daadf003dc200e512c assets/create/lang/unfinished/zh_cn.json +be82e2e68c74c572e72979a6d4a5ec5e571931e2 assets/create/lang/en_ud.json +b953a264ec3044b955431fb988c0bafcb9b57388 assets/create/lang/en_us.json +97fe71d544f1bc7552e6c9d1f328ae02cb1a1947 assets/create/lang/unfinished/de_de.json +052819c4d2177bfc5cee9675300866d724f4b63f assets/create/lang/unfinished/fr_fr.json +67d67f305c83e021e2ae37e03b9bf4aa2661bc87 assets/create/lang/unfinished/it_it.json +b0e3fc5a71b5127b832e38daece78ca9db9ce303 assets/create/lang/unfinished/ja_jp.json +610f399864dfa9d7fd258570853f7d577c5aee31 assets/create/lang/unfinished/ko_kr.json +12215221adcb015c5c74dbfe5affa920cd570580 assets/create/lang/unfinished/nl_nl.json +ead7216188692e96fb060b35213f1ef6b0682e87 assets/create/lang/unfinished/pt_br.json +e9d95034f9b33eb8e41792740ed2d8c488af6676 assets/create/lang/unfinished/ru_ru.json +32a2c4af9a5247f3bc7a5c2f502376e1e580d8bc assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -467,6 +469,18 @@ e2801a0c3fe8e1c2485291485b977f581fdc8b7c assets/create/models/block/andesite_tun d876627b6e519c6f3f59c7c27cc7b0f903206f7c assets/create/models/block/blue_sail.json e58b00a7222152d7facbe0e82f00933b974df747 assets/create/models/block/blue_seat.json c7f91468b196fbda137e6b31764870b3bbfda6b6 assets/create/models/block/blue_valve_handle.json +213e99062a7f2a5e7464082d7975066bc6fc45e0 assets/create/models/block/bracket/cog/ground_metal.json +16e824026066d930187d812e77e2e582c0d3c1cc assets/create/models/block/bracket/cog/ground_wooden.json +8c22623c9565c66346600c0ccf9648c77c4a5870 assets/create/models/block/bracket/cog/wall_metal.json +3a9fc3d3f30af61b2db0cfdf365ec8d01f78f9b4 assets/create/models/block/bracket/cog/wall_wooden.json +f545a7631bce14e75c0a7df0baef00f9163c91d6 assets/create/models/block/bracket/pipe/ground_metal.json +ef4f1a0f5499674d5b3de8e584f380074c1ecb24 assets/create/models/block/bracket/pipe/ground_wooden.json +1de8d82b6355ab0028e7259ada0cc7a28bb0509b assets/create/models/block/bracket/pipe/wall_metal.json +6b8e7f992f6be00c22bda0dbeb71c3979c6ae903 assets/create/models/block/bracket/pipe/wall_wooden.json +c86a455b8e85ef190261718726b344cf15ba1e4f assets/create/models/block/bracket/shaft/ground_metal.json +8fa9ce896412af894d7c431a50104445d91b1d4d assets/create/models/block/bracket/shaft/ground_wooden.json +3956168840aca9425d3bf240650406c1dbc8ea66 assets/create/models/block/bracket/shaft/wall_metal.json +7aaa2fbdb618e8aab7e0da19a5393e1eaa608623 assets/create/models/block/bracket/shaft/wall_wooden.json 24dff9a8d22c9a88286d2b7d08384ac9f281a512 assets/create/models/block/brass_belt_funnel_pull_extended.json c9c5f53c9d4f6cf6f509452e91cab1ba5b57f807 assets/create/models/block/brass_belt_funnel_pull_powered_extended.json addcf821a2348c0985bf9a72229355cfab818069 assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json @@ -1326,6 +1340,7 @@ f8d0d4b2a890ea7a69ab0c390947b48fe0478d3f assets/create/models/item/mechanical_pi 6c2acb80e53256fbb85f76851f335f9248ace6da assets/create/models/item/mechanical_press.json 4e363477e3e8059dd7b2bad04046521b31923d1b assets/create/models/item/mechanical_pump.json 3fc1fcb2016d2782c3667c21575423122b66705a assets/create/models/item/mechanical_saw.json +3afa723a8ba4160a4bd8778a56e1880e7ff53ed9 assets/create/models/item/metal_bracket.json 0eb5726c8c0de462f432411c210d6132b2c446a4 assets/create/models/item/millstone.json 1134bc8ecdfefe5d30ee4973c37aa9a349c368b4 assets/create/models/item/minecart_contraption.json 5f44acb8a784611c17913ddf64fb4098b3a8aee9 assets/create/models/item/minecart_coupling.json @@ -1496,6 +1511,7 @@ c6253e0f8db3c3992d3f78fe5045e276d39d5b22 assets/create/models/item/white_sail.js 69328eb4f91c4407fbcad5e3c4b88363f1a9572c assets/create/models/item/white_seat.json be7a2d59d43083d7f2427193dcb9d68004224dd3 assets/create/models/item/white_valve_handle.json d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bearing.json +500abf752654a904d78a967f6c6d29a75a4821ab assets/create/models/item/wooden_bracket.json 2527b52413965a3e84b4718e08a9b8bb30a741ea assets/create/models/item/wrench.json 4b49bc2418410cded5f0b7da3430f1a22e049f18 assets/create/models/item/yellow_seat.json 790daf016f980801e7587b548a325082c65f6f03 assets/create/models/item/yellow_valve_handle.json @@ -1623,6 +1639,7 @@ b2845089f6356957e048df29ea75c9f5e64d5a44 data/create/advancements/recipes/create 02cfc8c25c2977292dba992542c83666d9123e95 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_press.json 750d93013709081b7eaca5a5b9122ab51ab31d02 data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_pump.json f5ea782327d2353dd0e484b15536b7c19987a32b data/create/advancements/recipes/create.base/crafting/kinetics/mechanical_saw.json +8fd1bd08e678262d95ac97ba2f18d631c2fd3796 data/create/advancements/recipes/create.base/crafting/kinetics/metal_bracket.json 5a107ee1772727b66414c8d143b77833f3a92f0f data/create/advancements/recipes/create.base/crafting/kinetics/millstone.json d38e8ff9dd33558227678d69393b57a360caa28e data/create/advancements/recipes/create.base/crafting/kinetics/mysterious_cuckoo_clock.json afeb2a152697b68bc953986d6886cbe527c6d2b5 data/create/advancements/recipes/create.base/crafting/kinetics/nozzle.json @@ -1664,6 +1681,7 @@ f876dcbd2877c921613a4af481c89d66664c1ea8 data/create/advancements/recipes/create 856760c4b120f7b29a94dd22fe04d62df061d409 data/create/advancements/recipes/create.base/crafting/kinetics/white_seat_from_other_seat.json b73e6f8b89e6ef94167b6fa3d0837a27222edb01 data/create/advancements/recipes/create.base/crafting/kinetics/white_valve_handle_from_other_valve_handle.json 6b783787a32446a39bb553359a7db58f71492a42 data/create/advancements/recipes/create.base/crafting/kinetics/windmill_bearing.json +d3874ab405cc09b75f5e4ff2994e9ddd9b5e77f6 data/create/advancements/recipes/create.base/crafting/kinetics/wooden_bracket.json ddbe7ae23f48dcaee3ad44a0e597c24380b51682 data/create/advancements/recipes/create.base/crafting/kinetics/wrench.json 14c1cac4545f544a78bfd80cf7dd6355794c6679 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat.json e8c2001863d9819d2a2c1fddeda41a4f126a5c09 data/create/advancements/recipes/create.base/crafting/kinetics/yellow_seat_from_other_seat.json @@ -2348,6 +2366,7 @@ d9e217fcc668a04ee495968f8ccf9966271b6cea data/create/loot_tables/blocks/mechanic 0e0742d066bda87ba5cc835a4028efb99e70b2f2 data/create/loot_tables/blocks/mechanical_press.json e94a78187bcf7f235244b2c656732ba9a5821dd0 data/create/loot_tables/blocks/mechanical_pump.json 321daee16d6fad25ecc84da1b2830556d67e2a19 data/create/loot_tables/blocks/mechanical_saw.json +b13066b9e627db6954a30b115908602f1298576b data/create/loot_tables/blocks/metal_bracket.json efbd4689e7d6740b80357203d1e02196f0752efa data/create/loot_tables/blocks/millstone.json 205f5899101262f31f5c1a88bb7d954918d08d04 data/create/loot_tables/blocks/minecart_anchor.json 53215ac772bee2f88052266b82213aaf668660e9 data/create/loot_tables/blocks/mossy_andesite.json @@ -2507,6 +2526,7 @@ e8f3af61d9a2fd1ff5b32c9bb474ed005e6d70c4 data/create/loot_tables/blocks/weathere 969eda31556feb5a68e350762848d17453275fee data/create/loot_tables/blocks/white_seat.json 79fe374f8e677088f928a3a49ff5eeed6128d165 data/create/loot_tables/blocks/white_valve_handle.json 941ea78ea7c0f0061c3d3569ecea333ae6a16bf1 data/create/loot_tables/blocks/windmill_bearing.json +728c8719e653825c030913df94ce845fdc6d79b7 data/create/loot_tables/blocks/wooden_bracket.json 28ae0ee8a0b1fb6becae6264de687fe17940708e data/create/loot_tables/blocks/yellow_sail.json 37ead431a278928a09b260ae06a448e2c791a73e data/create/loot_tables/blocks/yellow_seat.json 899bb208908a2f9bec5e544ff47526f3e24db720 data/create/loot_tables/blocks/yellow_valve_handle.json @@ -2629,6 +2649,7 @@ ac9003ad3320fe2009c1793a3c6e86bdf20ca832 data/create/recipes/crafting/kinetics/m ce8e269907aae5549cea04141bd231f4a20e6453 data/create/recipes/crafting/kinetics/mechanical_press.json 5a685078d3c9d7dbe68080b7b6f2a44fc41582c5 data/create/recipes/crafting/kinetics/mechanical_pump.json ce28bcb47a379976d4a1bdfcfd1cdd0bae0bcdae data/create/recipes/crafting/kinetics/mechanical_saw.json +353146e9501096b4cd9632ad5500b0a2406c6f5d data/create/recipes/crafting/kinetics/metal_bracket.json 58d9046e61eae40958181388186a35dc07cc9a59 data/create/recipes/crafting/kinetics/millstone.json 13fa2887d3c988973c9222ce5e2e3dd0d9bd8374 data/create/recipes/crafting/kinetics/minecart_from_contraption_cart.json be4c7fdb0ba1e9ee6d3dcf200dc2718ad83ec8fb data/create/recipes/crafting/kinetics/mysterious_cuckoo_clock.json @@ -2671,6 +2692,7 @@ f4d88aa2edea548d29cf2678a111d8bb5db7720a data/create/recipes/crafting/kinetics/w 7e0d276cd56f04f35d02c25810bffdf8fc297fcd data/create/recipes/crafting/kinetics/white_seat_from_other_seat.json 4d3890621caa0bdbb752a395c1f5761dbbc1121e data/create/recipes/crafting/kinetics/white_valve_handle_from_other_valve_handle.json 8508255518d3718a0d8c2f536f69ffe9ed48a855 data/create/recipes/crafting/kinetics/windmill_bearing.json +d11eee4005372b1d0fad283b28c8016d823b5e37 data/create/recipes/crafting/kinetics/wooden_bracket.json 3ec8bb5660656f1c676035d8ba5460462c1d1865 data/create/recipes/crafting/kinetics/wrench.json 5579e58473474c4e59efd1ee39ddf0140d66b618 data/create/recipes/crafting/kinetics/yellow_seat.json f055d233ac7ee9eac840a658afa01bedd793ff38 data/create/recipes/crafting/kinetics/yellow_seat_from_other_seat.json diff --git a/src/generated/resources/assets/create/blockstates/metal_bracket.json b/src/generated/resources/assets/create/blockstates/metal_bracket.json new file mode 100644 index 000000000..12e229a33 --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/metal_bracket.json @@ -0,0 +1,154 @@ +{ + "variants": { + "axis_along_first=false,facing=down,type=pipe": { + "model": "create:block/bracket/pipe/ground_metal", + "x": 180 + }, + "axis_along_first=true,facing=down,type=pipe": { + "model": "create:block/bracket/pipe/ground_metal", + "x": 180, + "y": 90 + }, + "axis_along_first=false,facing=up,type=pipe": { + "model": "create:block/bracket/pipe/ground_metal" + }, + "axis_along_first=true,facing=up,type=pipe": { + "model": "create:block/bracket/pipe/ground_metal", + "y": 90 + }, + "axis_along_first=false,facing=north,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "x": 90, + "y": 270 + }, + "axis_along_first=true,facing=north,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "y": 270 + }, + "axis_along_first=false,facing=south,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=south,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "y": 90 + }, + "axis_along_first=false,facing=west,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "y": 180 + }, + "axis_along_first=true,facing=west,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "x": 90, + "y": 180 + }, + "axis_along_first=false,facing=east,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal" + }, + "axis_along_first=true,facing=east,type=pipe": { + "model": "create:block/bracket/pipe/wall_metal", + "x": 90 + }, + "axis_along_first=false,facing=down,type=cog": { + "model": "create:block/bracket/cog/ground_metal", + "x": 180 + }, + "axis_along_first=true,facing=down,type=cog": { + "model": "create:block/bracket/cog/ground_metal", + "x": 180, + "y": 90 + }, + "axis_along_first=false,facing=up,type=cog": { + "model": "create:block/bracket/cog/ground_metal" + }, + "axis_along_first=true,facing=up,type=cog": { + "model": "create:block/bracket/cog/ground_metal", + "y": 90 + }, + "axis_along_first=false,facing=north,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "x": 90, + "y": 270 + }, + "axis_along_first=true,facing=north,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "y": 270 + }, + "axis_along_first=false,facing=south,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=south,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "y": 90 + }, + "axis_along_first=false,facing=west,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "y": 180 + }, + "axis_along_first=true,facing=west,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "x": 90, + "y": 180 + }, + "axis_along_first=false,facing=east,type=cog": { + "model": "create:block/bracket/cog/wall_metal" + }, + "axis_along_first=true,facing=east,type=cog": { + "model": "create:block/bracket/cog/wall_metal", + "x": 90 + }, + "axis_along_first=false,facing=down,type=shaft": { + "model": "create:block/bracket/shaft/ground_metal", + "x": 180 + }, + "axis_along_first=true,facing=down,type=shaft": { + "model": "create:block/bracket/shaft/ground_metal", + "x": 180, + "y": 90 + }, + "axis_along_first=false,facing=up,type=shaft": { + "model": "create:block/bracket/shaft/ground_metal" + }, + "axis_along_first=true,facing=up,type=shaft": { + "model": "create:block/bracket/shaft/ground_metal", + "y": 90 + }, + "axis_along_first=false,facing=north,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "x": 90, + "y": 270 + }, + "axis_along_first=true,facing=north,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "y": 270 + }, + "axis_along_first=false,facing=south,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=south,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "y": 90 + }, + "axis_along_first=false,facing=west,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "y": 180 + }, + "axis_along_first=true,facing=west,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "x": 90, + "y": 180 + }, + "axis_along_first=false,facing=east,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal" + }, + "axis_along_first=true,facing=east,type=shaft": { + "model": "create:block/bracket/shaft/wall_metal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/blockstates/wooden_bracket.json b/src/generated/resources/assets/create/blockstates/wooden_bracket.json new file mode 100644 index 000000000..b677cf3cd --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/wooden_bracket.json @@ -0,0 +1,154 @@ +{ + "variants": { + "axis_along_first=false,facing=down,type=pipe": { + "model": "create:block/bracket/pipe/ground_wooden", + "x": 180 + }, + "axis_along_first=true,facing=down,type=pipe": { + "model": "create:block/bracket/pipe/ground_wooden", + "x": 180, + "y": 90 + }, + "axis_along_first=false,facing=up,type=pipe": { + "model": "create:block/bracket/pipe/ground_wooden" + }, + "axis_along_first=true,facing=up,type=pipe": { + "model": "create:block/bracket/pipe/ground_wooden", + "y": 90 + }, + "axis_along_first=false,facing=north,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "x": 90, + "y": 270 + }, + "axis_along_first=true,facing=north,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "y": 270 + }, + "axis_along_first=false,facing=south,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=south,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "y": 90 + }, + "axis_along_first=false,facing=west,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "y": 180 + }, + "axis_along_first=true,facing=west,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "x": 90, + "y": 180 + }, + "axis_along_first=false,facing=east,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden" + }, + "axis_along_first=true,facing=east,type=pipe": { + "model": "create:block/bracket/pipe/wall_wooden", + "x": 90 + }, + "axis_along_first=false,facing=down,type=cog": { + "model": "create:block/bracket/cog/ground_wooden", + "x": 180 + }, + "axis_along_first=true,facing=down,type=cog": { + "model": "create:block/bracket/cog/ground_wooden", + "x": 180, + "y": 90 + }, + "axis_along_first=false,facing=up,type=cog": { + "model": "create:block/bracket/cog/ground_wooden" + }, + "axis_along_first=true,facing=up,type=cog": { + "model": "create:block/bracket/cog/ground_wooden", + "y": 90 + }, + "axis_along_first=false,facing=north,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "x": 90, + "y": 270 + }, + "axis_along_first=true,facing=north,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "y": 270 + }, + "axis_along_first=false,facing=south,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=south,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "y": 90 + }, + "axis_along_first=false,facing=west,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "y": 180 + }, + "axis_along_first=true,facing=west,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "x": 90, + "y": 180 + }, + "axis_along_first=false,facing=east,type=cog": { + "model": "create:block/bracket/cog/wall_wooden" + }, + "axis_along_first=true,facing=east,type=cog": { + "model": "create:block/bracket/cog/wall_wooden", + "x": 90 + }, + "axis_along_first=false,facing=down,type=shaft": { + "model": "create:block/bracket/shaft/ground_wooden", + "x": 180 + }, + "axis_along_first=true,facing=down,type=shaft": { + "model": "create:block/bracket/shaft/ground_wooden", + "x": 180, + "y": 90 + }, + "axis_along_first=false,facing=up,type=shaft": { + "model": "create:block/bracket/shaft/ground_wooden" + }, + "axis_along_first=true,facing=up,type=shaft": { + "model": "create:block/bracket/shaft/ground_wooden", + "y": 90 + }, + "axis_along_first=false,facing=north,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "x": 90, + "y": 270 + }, + "axis_along_first=true,facing=north,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "y": 270 + }, + "axis_along_first=false,facing=south,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "x": 90, + "y": 90 + }, + "axis_along_first=true,facing=south,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "y": 90 + }, + "axis_along_first=false,facing=west,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "y": 180 + }, + "axis_along_first=true,facing=west,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "x": 90, + "y": 180 + }, + "axis_along_first=false,facing=east,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden" + }, + "axis_along_first=true,facing=east,type=shaft": { + "model": "create:block/bracket/shaft/wall_wooden", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index bd2daac3a..31d33664b 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -226,6 +226,7 @@ "block.create.mechanical_press": "ss\u01DD\u0279\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", "block.create.mechanical_pump": "d\u026Fn\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", "block.create.mechanical_saw": "\u028D\u0250S \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW", + "block.create.metal_bracket": "\u0287\u01DD\u029E\u0254\u0250\u0279\u15FA \u05DF\u0250\u0287\u01DDW", "block.create.millstone": "\u01DDuo\u0287s\u05DF\u05DF\u0131W", "block.create.minecart_anchor": "\u0279o\u0265\u0254u\u2C6F \u0287\u0279\u0250\u0254\u01DDu\u0131W", "block.create.mossy_andesite": "\u01DD\u0287\u0131s\u01DDpu\u2C6F \u028EssoW", @@ -385,6 +386,7 @@ "block.create.white_seat": "\u0287\u0250\u01DDS \u01DD\u0287\u0131\u0265M", "block.create.white_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u01DD\u0287\u0131\u0265M", "block.create.windmill_bearing": "bu\u0131\u0279\u0250\u01DD\u15FA \u05DF\u05DF\u0131\u026Fpu\u0131M", + "block.create.wooden_bracket": "\u0287\u01DD\u029E\u0254\u0250\u0279\u15FA u\u01DDpooM", "block.create.yellow_sail": "\u05DF\u0131\u0250S \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_seat": "\u0287\u0250\u01DDS \u028Do\u05DF\u05DF\u01DD\u028E", "block.create.yellow_valve_handle": "\u01DD\u05DFpu\u0250H \u01DD\u028C\u05DF\u0250\u039B \u028Do\u05DF\u05DF\u01DD\u028E", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 371acaa8d..d5d409eae 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -229,6 +229,7 @@ "block.create.mechanical_press": "Mechanical Press", "block.create.mechanical_pump": "Mechanical Pump", "block.create.mechanical_saw": "Mechanical Saw", + "block.create.metal_bracket": "Metal Bracket", "block.create.millstone": "Millstone", "block.create.minecart_anchor": "Minecart Anchor", "block.create.mossy_andesite": "Mossy Andesite", @@ -388,6 +389,7 @@ "block.create.white_seat": "White Seat", "block.create.white_valve_handle": "White Valve Handle", "block.create.windmill_bearing": "Windmill Bearing", + "block.create.wooden_bracket": "Wooden Bracket", "block.create.yellow_sail": "Yellow Sail", "block.create.yellow_seat": "Yellow Seat", "block.create.yellow_valve_handle": "Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 3983b7fa6..a23e4c29a 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1024", + "_": "Missing Localizations: 1026", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "Mechanische Presse", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "UNLOCALIZED: Millstone", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 8e8f1a140..a0ee15143 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 653", + "_": "Missing Localizations: 655", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "Presse mécanique", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "Scie mécanique", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "UNLOCALIZED: Millstone", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 826981954..d188b68c1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 637", + "_": "Missing Localizations: 639", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "Pressa Meccanica", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "Sega Meccanica", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "Macina", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index e3ac8dfe3..4e720b00c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 636", + "_": "Missing Localizations: 638", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "メカニカルプレス", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "メカニカル鋸", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "石臼", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index a2f0c077e..9729d9e81 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 637", + "_": "Missing Localizations: 639", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "압착기", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "톱", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "맷돌", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 634c6597a..93c43a6d1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 965", + "_": "Missing Localizations: 967", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "Mechanische Pers", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "Mechanische Zaag", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "UNLOCALIZED: Millstone", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index cc6f316b1..b7aa3e484 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1031", + "_": "Missing Localizations: 1033", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "Prensa Mecânico", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "UNLOCALIZED: Mechanical Saw", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "UNLOCALIZED: Millstone", "block.create.minecart_anchor": "UNLOCALIZED: Minecart Anchor", "block.create.mossy_andesite": "UNLOCALIZED: Mossy Andesite", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 2a67cb74f..c31c1bcb5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 306", + "_": "Missing Localizations: 308", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "Механический пресс", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "Механическая пила", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "Жернов", "block.create.minecart_anchor": "Вагонеточный якорь", "block.create.mossy_andesite": "Замшелый андезит", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 76108fbca..23a3412e0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 319", + "_": "Missing Localizations: 321", "_": "->------------------------] Game Elements [------------------------<-", @@ -230,6 +230,7 @@ "block.create.mechanical_press": "动力辊压机", "block.create.mechanical_pump": "UNLOCALIZED: Mechanical Pump", "block.create.mechanical_saw": "动力切割机", + "block.create.metal_bracket": "UNLOCALIZED: Metal Bracket", "block.create.millstone": "石磨", "block.create.minecart_anchor": "矿车锚", "block.create.mossy_andesite": "生苔安山岩", @@ -389,6 +390,7 @@ "block.create.white_seat": "UNLOCALIZED: White Seat", "block.create.white_valve_handle": "UNLOCALIZED: White Valve Handle", "block.create.windmill_bearing": "UNLOCALIZED: Windmill Bearing", + "block.create.wooden_bracket": "UNLOCALIZED: Wooden Bracket", "block.create.yellow_sail": "UNLOCALIZED: Yellow Sail", "block.create.yellow_seat": "UNLOCALIZED: Yellow Seat", "block.create.yellow_valve_handle": "UNLOCALIZED: Yellow Valve Handle", diff --git a/src/generated/resources/assets/create/models/block/bracket/cog/ground_metal.json b/src/generated/resources/assets/create/models/block/bracket/cog/ground_metal.json new file mode 100644 index 000000000..08c425195 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/cog/ground_metal.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/cog/ground", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/cog/ground_wooden.json b/src/generated/resources/assets/create/models/block/bracket/cog/ground_wooden.json new file mode 100644 index 000000000..8dae78d11 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/cog/ground_wooden.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/cog/ground", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/cog/wall_metal.json b/src/generated/resources/assets/create/models/block/bracket/cog/wall_metal.json new file mode 100644 index 000000000..9e25af4cb --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/cog/wall_metal.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/cog/wall", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/cog/wall_wooden.json b/src/generated/resources/assets/create/models/block/bracket/cog/wall_wooden.json new file mode 100644 index 000000000..94aabcbee --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/cog/wall_wooden.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/cog/wall", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/pipe/ground_metal.json b/src/generated/resources/assets/create/models/block/bracket/pipe/ground_metal.json new file mode 100644 index 000000000..a943f6809 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/pipe/ground_metal.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/pipe/ground", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/pipe/ground_wooden.json b/src/generated/resources/assets/create/models/block/bracket/pipe/ground_wooden.json new file mode 100644 index 000000000..e7e7ecf37 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/pipe/ground_wooden.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/pipe/ground", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/pipe/wall_metal.json b/src/generated/resources/assets/create/models/block/bracket/pipe/wall_metal.json new file mode 100644 index 000000000..c7999f010 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/pipe/wall_metal.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/pipe/wall", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/pipe/wall_wooden.json b/src/generated/resources/assets/create/models/block/bracket/pipe/wall_wooden.json new file mode 100644 index 000000000..2692a2407 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/pipe/wall_wooden.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/pipe/wall", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/shaft/ground_metal.json b/src/generated/resources/assets/create/models/block/bracket/shaft/ground_metal.json new file mode 100644 index 000000000..230d14a80 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/shaft/ground_metal.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/shaft/ground", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/shaft/ground_wooden.json b/src/generated/resources/assets/create/models/block/bracket/shaft/ground_wooden.json new file mode 100644 index 000000000..82133d9e2 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/shaft/ground_wooden.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/shaft/ground", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/shaft/wall_metal.json b/src/generated/resources/assets/create/models/block/bracket/shaft/wall_metal.json new file mode 100644 index 000000000..95664f94a --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/shaft/wall_metal.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/shaft/wall", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/bracket/shaft/wall_wooden.json b/src/generated/resources/assets/create/models/block/bracket/shaft/wall_wooden.json new file mode 100644 index 000000000..ab477f450 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/bracket/shaft/wall_wooden.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/shaft/wall", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/metal_bracket.json b/src/generated/resources/assets/create/models/item/metal_bracket.json new file mode 100644 index 000000000..eb6f0f14c --- /dev/null +++ b/src/generated/resources/assets/create/models/item/metal_bracket.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/item", + "textures": { + "bracket": "create:block/bracket_metal", + "plate": "create:block/bracket_plate_metal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/wooden_bracket.json b/src/generated/resources/assets/create/models/item/wooden_bracket.json new file mode 100644 index 000000000..a5fd1ec05 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/wooden_bracket.json @@ -0,0 +1,7 @@ +{ + "parent": "create:block/bracket/item", + "textures": { + "bracket": "create:block/bracket_wooden", + "plate": "create:block/bracket_plate_wooden" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/metal_bracket.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/metal_bracket.json new file mode 100644 index 000000000..620445626 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/metal_bracket.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/metal_bracket" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/metal_bracket" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wooden_bracket.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wooden_bracket.json new file mode 100644 index 000000000..4ba4de6a6 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/wooden_bracket.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/wooden_bracket" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/wooden_bracket" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/metal_bracket.json b/src/generated/resources/data/create/loot_tables/blocks/metal_bracket.json new file mode 100644 index 000000000..4f1888239 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/metal_bracket.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:metal_bracket" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/wooden_bracket.json b/src/generated/resources/data/create/loot_tables/blocks/wooden_bracket.json new file mode 100644 index 000000000..d7b082804 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/wooden_bracket.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:wooden_bracket" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/metal_bracket.json b/src/generated/resources/data/create/recipes/crafting/kinetics/metal_bracket.json new file mode 100644 index 000000000..4e26817b4 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/metal_bracket.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "PCP" + ], + "key": { + "S": { + "tag": "forge:nuggets/iron" + }, + "P": { + "tag": "forge:ingots/iron" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:metal_bracket", + "count": 4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/wooden_bracket.json b/src/generated/resources/data/create/recipes/crafting/kinetics/wooden_bracket.json new file mode 100644 index 000000000..084479ea9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/wooden_bracket.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "PCP" + ], + "key": { + "S": { + "tag": "forge:rods/wooden" + }, + "P": { + "tag": "minecraft:planks" + }, + "C": { + "item": "create:andesite_alloy" + } + }, + "result": { + "item": "create:wooden_bracket", + "count": 4 + } +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 4ac25c014..532a3e540 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -68,6 +68,9 @@ import com.simibubi.create.content.contraptions.fluids.PumpBlock; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlock; import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainBlock; import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlock; +import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlockItem; +import com.simibubi.create.content.contraptions.fluids.pipes.BracketGenerator; import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveBlock; @@ -90,6 +93,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltColor; import com.simibubi.create.content.contraptions.relays.belt.BeltGenerator; import com.simibubi.create.content.contraptions.relays.belt.BeltModel; +import com.simibubi.create.content.contraptions.relays.elementary.BracketedKineticBlockModel; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; @@ -205,6 +209,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .transform(StressConfigDefaults.setNoImpact()) .blockstate(BlockStateGen.axisBlockProvider(false)) + .onRegister(CreateRegistrate.blockModel(() -> BracketedKineticBlockModel::new)) .simpleItem() .register(); @@ -213,6 +218,7 @@ public class AllBlocks { .transform(StressConfigDefaults.setNoImpact()) .properties(p -> p.sound(SoundType.WOOD)) .blockstate(BlockStateGen.axisBlockProvider(false)) + .onRegister(CreateRegistrate.blockModel(() -> BracketedKineticBlockModel::new)) .item(CogwheelBlockItem::new) .build() .register(); @@ -223,6 +229,7 @@ public class AllBlocks { .properties(p -> p.sound(SoundType.WOOD)) .transform(StressConfigDefaults.setNoImpact()) .blockstate(BlockStateGen.axisBlockProvider(false)) + .onRegister(CreateRegistrate.blockModel(() -> BracketedKineticBlockModel::new)) .item(CogwheelBlockItem::new) .build() .register(); @@ -469,6 +476,18 @@ public class AllBlocks { .transform(ModelGen.customItemModel("gauge", "_", "item")) .register(); + public static final BlockEntry WOODEN_BRACKET = REGISTRATE.block("wooden_bracket", BracketBlock::new) + .blockstate(new BracketGenerator("wooden")::generate) + .item(BracketBlockItem::new) + .transform(BracketGenerator.itemModel("wooden")) + .register(); + + public static final BlockEntry METAL_BRACKET = REGISTRATE.block("metal_bracket", BracketBlock::new) + .blockstate(new BracketGenerator("metal")::generate) + .item(BracketBlockItem::new) + .transform(BracketGenerator.itemModel("metal")) + .register(); + // Fluids public static final BlockEntry FLUID_PIPE = REGISTRATE.block("fluid_pipe", FluidPipeBlock::new) diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index d583ef7aa..b3d85867a 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -2,17 +2,16 @@ package com.simibubi.create; import java.util.function.Supplier; +import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; import com.simibubi.create.content.contraptions.particle.AirFlowParticleData; import com.simibubi.create.content.contraptions.particle.AirParticleData; -import com.simibubi.create.content.contraptions.particle.CubeParticle; import com.simibubi.create.content.contraptions.particle.CubeParticleData; import com.simibubi.create.content.contraptions.particle.HeaterParticleData; -import com.simibubi.create.content.contraptions.particle.ICustomParticle; +import com.simibubi.create.content.contraptions.particle.ICustomParticleData; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.IParticleFactory; import net.minecraft.client.particle.ParticleManager; import net.minecraft.particles.IParticleData; import net.minecraft.particles.ParticleType; @@ -29,23 +28,19 @@ public enum AllParticleTypes { AIR_FLOW(AirFlowParticleData::new), AIR(AirParticleData::new), HEATER_PARTICLE(HeaterParticleData::new), - CUBE(CubeParticleData::dummy, () -> CubeParticle.Factory::new) + CUBE(CubeParticleData::new), + FLUID_PARTICLE(FluidParticleData::new), + FLUID_DRIP(FluidParticleData::new) ; private ParticleEntry entry; - AllParticleTypes(Supplier> typeFactory) { + AllParticleTypes(Supplier> typeFactory) { String asId = Lang.asId(this.name()); entry = new ParticleEntry<>(new ResourceLocation(Create.ID, asId), typeFactory); } - AllParticleTypes(Supplier> typeFactory, - Supplier>> particleMetaFactory) { - String asId = Lang.asId(this.name()); - entry = new ParticleEntry<>(new ResourceLocation(Create.ID, asId), typeFactory, particleMetaFactory); - } - public static void register(RegistryEvent.Register> event) { for (AllParticleTypes particle : values()) particle.entry.register(event.getRegistry()); @@ -59,7 +54,7 @@ public enum AllParticleTypes { } public ParticleType get() { - return entry.getType(); + return entry.getOrCreateType(); } public String parameter() { @@ -67,48 +62,32 @@ public enum AllParticleTypes { } private class ParticleEntry { - Supplier> typeFactory; - Supplier>> particleMetaFactory; + Supplier> typeFactory; ParticleType type; ResourceLocation id; - public ParticleEntry(ResourceLocation id, Supplier> typeFactory, - Supplier>> particleMetaFactory) { + public ParticleEntry(ResourceLocation id, Supplier> typeFactory) { this.id = id; this.typeFactory = typeFactory; - this.particleMetaFactory = particleMetaFactory; - } - - public ParticleEntry(ResourceLocation id, Supplier> typeFactory) { - this(id, typeFactory, null); - } - - ParticleType getType() { - makeType(); - return type; } void register(IForgeRegistry> registry) { - makeType(); - registry.register(type); + registry.register(getOrCreateType()); } - void makeType() { - if (type == null) { - type = typeFactory.get() - .createType(); - type.setRegistryName(id); - } + ParticleType getOrCreateType() { + if (type != null) + return type; + type = typeFactory.get() + .createType(); + type.setRegistryName(id); + return type; } @OnlyIn(Dist.CLIENT) void registerFactory(ParticleManager particles) { - makeType(); - if (particleMetaFactory == null) - particles.registerFactory(type, typeFactory.get() - .getFactory()); - else - particles.registerFactory(type, particleMetaFactory.get().get()); + typeFactory.get() + .register(getOrCreateType(), particles); } } diff --git a/src/main/java/com/simibubi/create/compat/jei/category/MixingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/MixingCategory.java index dc253e1b8..338e4c455 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/MixingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/MixingCategory.java @@ -14,7 +14,7 @@ public class MixingCategory extends BasinCategory { private final AnimatedMixer mixer = new AnimatedMixer(); private final AnimatedBlazeBurner heater = new AnimatedBlazeBurner(); - private MixingType type; + MixingType type; enum MixingType { AUTO_SHAPELESS, MIXING, AUTO_BREWING; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java index 8cf78dbd7..dd9e02978 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java @@ -2,6 +2,9 @@ package com.simibubi.create.content.contraptions.fluids; import java.util.Random; +import com.simibubi.create.AllParticleTypes; +import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; +import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; @@ -11,20 +14,21 @@ import net.minecraft.fluid.IFluidState; import net.minecraft.particles.BlockParticleData; import net.minecraft.particles.IParticleData; import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; public class FluidFX { - + static Random r = new Random(); - + public static void splash(BlockPos pos, FluidStack fluidStack) { Fluid fluid = fluidStack.getFluid(); if (fluid == Fluids.EMPTY) return; - + IFluidState defaultState = fluid.getDefaultState(); if (defaultState == null || defaultState.isEmpty()) { return; @@ -32,18 +36,72 @@ public class FluidFX { BlockParticleData blockParticleData = new BlockParticleData(ParticleTypes.BLOCK, defaultState.getBlockState()); Vec3d center = VecHelper.getCenterOf(pos); - + for (int i = 0; i < 20; i++) { Vec3d v = VecHelper.offsetRandomly(Vec3d.ZERO, r, .25f); particle(blockParticleData, center.add(v), v); } - + } - + + public static IParticleData getFluidParticle(FluidStack fluid) { + if (FluidHelper.hasBlockState(fluid.getFluid())) + return new BlockParticleData(ParticleTypes.BLOCK, fluid.getFluid() + .getDefaultState() + .getBlockState()); + return new FluidParticleData(AllParticleTypes.FLUID_PARTICLE.get(), fluid); + } + + public static IParticleData getDrippingParticle(FluidStack fluid) { + IParticleData particle = null; + if (FluidHelper.isWater(fluid.getFluid())) + particle = ParticleTypes.DRIPPING_WATER; + if (FluidHelper.isLava(fluid.getFluid())) + particle = ParticleTypes.DRIPPING_LAVA; + if (particle == null) + particle = new FluidParticleData(AllParticleTypes.FLUID_DRIP.get(), fluid); + return particle; + } + + public static void spawnRimParticles(World world, BlockPos pos, Direction side, int amount, IParticleData particle, + float rimRadius) { + Vec3d directionVec = new Vec3d(side.getDirectionVec()); + for (int i = 0; i < amount; i++) { + Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, 1) + .normalize(); + vec = VecHelper.clampComponentWise(vec, rimRadius) + .mul(VecHelper.axisAlingedPlaneOf(directionVec)) + .add(directionVec.scale(.45 + r.nextFloat() / 16f)); + Vec3d m = vec; + vec = vec.add(VecHelper.getCenterOf(pos)); + + world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); + } + } + + public static void spawnPouringLiquid(World world, BlockPos pos, int amount, IParticleData particle, + float rimRadius, Vec3d directionVec, boolean inbound) { + for (int i = 0; i < amount; i++) { + Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, rimRadius); + vec = vec.mul(VecHelper.axisAlingedPlaneOf(directionVec)) + .add(directionVec.scale(.5 + r.nextFloat() / 4f)); + Vec3d m = vec; + Vec3d centerOf = VecHelper.getCenterOf(pos); + vec = vec.add(centerOf); + if (inbound) { + vec = vec.add(m); + m = centerOf.add(directionVec.scale(.5)) + .subtract(vec) + .scale(3); + } + world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); + } + } + private static void particle(IParticleData data, Vec3d pos, Vec3d motion) { world().addParticle(data, pos.x, pos.y, pos.z, motion.x, motion.y, motion.z); } - + private static World world() { return Minecraft.getInstance().world; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java index 07cd96b44..cdd3ef3d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeAttachmentBehaviour.java @@ -1,8 +1,9 @@ package com.simibubi.create.content.contraptions.fluids; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; +import com.simibubi.create.content.contraptions.relays.elementary.BracketedTileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; -import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.block.BlockState; @@ -10,7 +11,7 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ILightReader; -public class FluidPipeAttachmentBehaviour extends TileEntityBehaviour { +public class FluidPipeAttachmentBehaviour extends BracketedTileEntityBehaviour { public static BehaviourType TYPE = new BehaviourType<>(); @@ -36,6 +37,9 @@ public class FluidPipeAttachmentBehaviour extends TileEntityBehaviour { FluidPipeBehaviour fluidPipeBehaviour = tileEntity.getBehaviour(FluidPipeBehaviour.TYPE); if (fluidPipeBehaviour == null) return false; +// BlockState bracket = getBracket(); +// if (bracket != Blocks.AIR.getDefaultState() && bracket.get(BracketBlock.FACING) == direction) +// return false; return fluidPipeBehaviour.isConnectedTo(state, direction); } @@ -56,4 +60,14 @@ public class FluidPipeAttachmentBehaviour extends TileEntityBehaviour { return TYPE; } + @Override + public boolean canHaveBracket() { + BlockState blockState = tileEntity.getBlockState(); + if (blockState.getBlock() instanceof PumpBlock) + return false; + if (blockState.getBlock() instanceof EncasedPipeBlock) + return false; + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java index 3010fa403..ab4d56bdb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPipeBehaviour.java @@ -12,7 +12,6 @@ import javax.annotation.Nullable; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; -import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; @@ -31,9 +30,7 @@ import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; -import net.minecraft.particles.BlockParticleData; import net.minecraft.particles.IParticleData; -import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -48,6 +45,10 @@ import net.minecraftforge.fml.DistExecutor; public abstract class FluidPipeBehaviour extends TileEntityBehaviour { public static BehaviourType TYPE = new BehaviourType<>(); + public static final int MAX_PARTICLE_RENDER_DISTANCE = 20; + public static final int SPLASH_PARTICLE_AMOUNT = 1; + public static final float IDLE_PARTICLE_SPAWN_CHANCE = 1 / 800f; + public static final Random r = new Random(); // Direction -> (inboundflows{}, outwardflows{}) Map> allFlows; @@ -228,22 +229,17 @@ public abstract class FluidPipeBehaviour extends TileEntityBehaviour { contentsChanged(); } - public void spawnParticles() { - DistExecutor.runWhenOn(Dist.CLIENT, () -> this::spawnParticlesInner); - } - public void spawnSplashOnRim(Direction face) { DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> spawnSplashOnRimInner(face)); } - public static final int MAX_PARTICLE_RENDER_DISTANCE = 20; - public static final int SPLASH_PARTICLE_AMOUNT = 1; - public static final float IDLE_PARTICLE_SPAWN_CHANCE = 1 / 800f; - public static final Random r = new Random(); + public void spawnParticles() { + DistExecutor.runWhenOn(Dist.CLIENT, () -> this::spawnParticlesInner); + } @OnlyIn(Dist.CLIENT) private void spawnParticlesInner() { - if (!isRenderEntityWithinDistance()) + if (!isRenderEntityWithinDistance(tileEntity.getPos())) return; if (fluid.isEmpty()) return; @@ -267,7 +263,7 @@ public abstract class FluidPipeBehaviour extends TileEntityBehaviour { @OnlyIn(Dist.CLIENT) private void spawnSplashOnRimInner(Direction face) { - if (!isRenderEntityWithinDistance()) + if (!isRenderEntityWithinDistance(tileEntity.getPos())) return; if (fluid.isEmpty()) return; @@ -285,72 +281,36 @@ public abstract class FluidPipeBehaviour extends TileEntityBehaviour { return; } - IParticleData particle = null; - if (FluidHelper.isWater(fluid.getFluid())) - particle = ParticleTypes.DRIPPING_WATER; - if (FluidHelper.isLava(fluid.getFluid())) - particle = ParticleTypes.DRIPPING_LAVA; - // TODO: Generic drip particle type for forge fluids - - if (particle == null) - return; - + IParticleData particle = FluidFX.getDrippingParticle(fluid); float rimRadius = getRimRadius(state, side); - Vec3d directionVec = new Vec3d(side.getDirectionVec()); - - for (int i = 0; i < amount; i++) { - Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, 1) - .normalize(); - vec = VecHelper.clampComponentWise(vec, rimRadius) - .mul(VecHelper.axisAlingedPlaneOf(directionVec)) - .add(directionVec.scale(.45 + r.nextFloat() / 16f)); - Vec3d m = vec; - vec = vec.add(VecHelper.getCenterOf(pos)); - - world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); - } + FluidFX.spawnRimParticles(world, pos, side, amount, particle, rimRadius); } @OnlyIn(Dist.CLIENT) private void spawnPouringLiquid(World world, BlockState state, FluidStack fluid, Direction side, int amount) { - IParticleData particle = new BlockParticleData(ParticleTypes.BLOCK, fluid.getFluid() - .getDefaultState() - .getBlockState()); + IParticleData particle = FluidFX.getFluidParticle(fluid); float rimRadius = getRimRadius(state, side); Vec3d directionVec = new Vec3d(side.getDirectionVec()); + BlockPos pos = tileEntity.getPos(); Couple couple = allFlows.get(side); if (couple == null) return; + couple.forEachWithContext((flow, inbound) -> { if (flow.progress == null) return; - for (int i = 0; i < amount; i++) { - Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, rimRadius); - vec = vec.mul(VecHelper.axisAlingedPlaneOf(directionVec)) - .add(directionVec.scale(.5 + r.nextFloat() / 4f)); - Vec3d m = vec; - Vec3d centerOf = VecHelper.getCenterOf(tileEntity.getPos()); - vec = vec.add(centerOf); - if (inbound) { - vec = vec.add(m); - m = centerOf.add(directionVec.scale(.5)) - .subtract(vec) - .scale(3); - } - world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); - } + FluidFX.spawnPouringLiquid(world, pos, amount, particle, rimRadius, directionVec, inbound); }); - } @OnlyIn(Dist.CLIENT) - private boolean isRenderEntityWithinDistance() { + public static boolean isRenderEntityWithinDistance(BlockPos pos) { Entity renderViewEntity = Minecraft.getInstance() .getRenderViewEntity(); if (renderViewEntity == null) return false; - Vec3d center = VecHelper.getCenterOf(tileEntity.getPos()); + Vec3d center = VecHelper.getCenterOf(pos); if (renderViewEntity.getPositionVec() .distanceTo(center) > MAX_PARTICLE_RENDER_DISTANCE) return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java index 5ffc2e22e..7c46b4019 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidPropagator.java @@ -5,6 +5,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.annotation.Nullable; + import org.apache.commons.lang3.mutable.MutableObject; import com.simibubi.create.AllBlocks; @@ -45,7 +47,7 @@ public class FluidPropagator { return null; if (otherBlock instanceof FlowingFluidBlock) return null; - if (!isStraightPipe(state)) + if (getStraightPipeAxis(state) == null) return null; for (Direction d : Iterate.directions) { if (!pos.offset(d) @@ -161,12 +163,13 @@ public class FluidPropagator { .isPresent(); } - public static boolean isStraightPipe(BlockState state) { + @Nullable + public static Axis getStraightPipeAxis(BlockState state) { if (state.getBlock() instanceof AxisPipeBlock) - return true; + return state.get(AxisPipeBlock.AXIS); if (!FluidPipeBlock.isPipe(state)) - return false; - boolean axisFound = false; + return null; + Axis axisFound = null; int connections = 0; for (Axis axis : Iterate.axes) { Direction d1 = Direction.getFacingFromAxis(AxisDirection.NEGATIVE, axis); @@ -178,12 +181,12 @@ public class FluidPropagator { if (openAt2) connections++; if (openAt1 && openAt2) - if (axisFound) - return false; + if (axisFound != null) + return null; else - axisFound = true; + axisFound = axis; } - return axisFound && connections == 2; + return connections == 2 ? axisFound : null; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java index 71b01f6eb..4c7e415d1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/OpenEndedPipe.java @@ -1,36 +1,63 @@ package com.simibubi.create.content.contraptions.fluids; +import java.util.List; + import javax.annotation.Nullable; +import com.simibubi.create.AllFluids; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; +import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.entity.LivingEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.fluid.IFluidState; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.potion.Effect; +import net.minecraft.potion.EffectInstance; +import net.minecraft.potion.PotionUtils; import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tags.FluidTags; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.fluids.capability.templates.FluidTank; public class OpenEndedPipe { World world; + BlockPos pos; + AxisAlignedBB aoe; private OpenEndFluidHandler fluidHandler; private BlockPos outputPos; private boolean wasPulling; private boolean stale; + private FluidStack cachedFluid; + private List cachedEffects; + public OpenEndedPipe(BlockFace face) { fluidHandler = new OpenEndFluidHandler(); outputPos = face.getConnectedPos(); + pos = face.getPos(); + aoe = new AxisAlignedBB(outputPos).expand(0, -1, 0); + if (face.getFace() == Direction.DOWN) + aoe = aoe.expand(0, -1, 0); } public void tick(World world, boolean pulling) { @@ -58,7 +85,8 @@ public class OpenEndedPipe { return; if (waterlog) { world.setBlockState(outputPos, state.with(BlockStateProperties.WATERLOGGED, false), 3); - world.getPendingFluidTicks().scheduleTick(outputPos, Fluids.WATER, 1); + world.getPendingFluidTicks() + .scheduleTick(outputPos, Fluids.WATER, 1); return; } world.setBlockState(outputPos, fluidState.getBlockState() @@ -66,6 +94,20 @@ public class OpenEndedPipe { return; } + FluidStack fluid = fluidHandler.getFluid(); + if (fluid.isEmpty()) + return; + if (!FluidHelper.hasBlockState(fluid.getFluid())) { + fluidHandler.drain(fluid.getAmount() > 1 ? fluid.getAmount() - 1 : 1, FluidAction.EXECUTE); + if (fluidHandler.isEmpty()) + updatePumpIfNecessary(); + if (!fluid.getFluid() + .isEquivalentTo(AllFluids.POTION.get())) + return; + applyPotionEffects(world, fluid); + return; + } + Fluid providedFluid = fluidHandler.tryProvidingFluid(); if (providedFluid == null) return; @@ -75,17 +117,55 @@ public class OpenEndedPipe { } if (fluidState.isSource()) return; + + if (world.dimension.doesWaterVaporize() && providedFluid.getFluid() + .isIn(FluidTags.WATER)) { + int i = outputPos.getX(); + int j = outputPos.getY(); + int k = outputPos.getZ(); + world.playSound(null, i, j, k, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, + 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + return; + } + if (waterlog) { if (providedFluid.getFluid() != Fluids.WATER) return; world.setBlockState(outputPos, state.with(BlockStateProperties.WATERLOGGED, true), 3); - world.getPendingFluidTicks().scheduleTick(outputPos, Fluids.WATER, 1); + world.getPendingFluidTicks() + .scheduleTick(outputPos, Fluids.WATER, 1); return; } world.setBlockState(outputPos, providedFluid.getDefaultState() .getBlockState(), 3); } + private void applyPotionEffects(World world, FluidStack fluid) { + if (cachedFluid == null || cachedEffects == null || !fluid.isFluidEqual(cachedFluid)) { + FluidStack copy = fluid.copy(); + copy.setAmount(250); + ItemStack bottle = PotionFluidHandler.fillBottle(new ItemStack(Items.GLASS_BOTTLE), fluid); + cachedEffects = PotionUtils.getEffectsFromStack(bottle); + } + + if (cachedEffects.isEmpty()) + return; + + List list = + this.world.getEntitiesWithinAABB(LivingEntity.class, aoe, LivingEntity::canBeHitWithPotion); + for (LivingEntity livingentity : list) { + for (EffectInstance effectinstance : cachedEffects) { + Effect effect = effectinstance.getPotion(); + if (effect.isInstant()) { + effect.affectEntity(null, null, livingentity, effectinstance.getAmplifier(), 0.5D); + continue; + } + livingentity.addPotionEffect(new EffectInstance(effectinstance)); + } + } + + } + public LazyOptional getCapability() { return LazyOptional.of(() -> fluidHandler); } @@ -113,6 +193,16 @@ public class OpenEndedPipe { return stale; } + private void updatePumpIfNecessary() { + if (world == null) + return; + if (!PumpBlock.isPump(world.getBlockState(pos))) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity instanceof PumpTileEntity) + ((PumpTileEntity) tileEntity).sendData(); + } + private class OpenEndFluidHandler extends FluidTank { public OpenEndFluidHandler() { @@ -128,6 +218,8 @@ public class OpenEndedPipe { return 0; if (resource.isEmpty()) return 0; + + FluidStack prevFluid = getFluid(); BlockState state = world.getBlockState(outputPos); IFluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty() && fluidState.getFluid() != resource.getFluid()) { @@ -144,7 +236,30 @@ public class OpenEndedPipe { // Never allow being filled above 1000 FluidStack insertable = resource.copy(); insertable.setAmount(Math.min(insertable.getAmount(), Math.max(1000 - getFluidAmount(), 0))); - return super.fill(insertable, action); + int fill = super.fill(insertable, action); + + if (!getFluid().isFluidEqual(prevFluid)) + updatePumpIfNecessary(); + + return fill; + } + + @Override + public FluidStack drain(FluidStack resource, FluidAction action) { + boolean wasEmpty = isEmpty(); + FluidStack drain = super.drain(resource, action); + if (action.execute() && !wasEmpty && isEmpty()) + updatePumpIfNecessary(); + return drain; + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + boolean wasEmpty = isEmpty(); + FluidStack drain = super.drain(maxDrain, action); + if (action.execute() && !wasEmpty && isEmpty()) + updatePumpIfNecessary(); + return drain; } public boolean tryCollectFluid(Fluid fluid) { @@ -152,6 +267,7 @@ public class OpenEndedPipe { if (super.fill(new FluidStack(fluid, 1000), simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE) != 1000) return false; + updatePumpIfNecessary(); return true; } @@ -161,11 +277,15 @@ public class OpenEndedPipe { for (boolean simulate : Iterate.trueAndFalse) if (drain(1000, simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE).getAmount() != 1000) return null; + updatePumpIfNecessary(); return fluid; } public void clear() { + boolean wasEmpty = isEmpty(); setFluid(FluidStack.EMPTY); + if (!wasEmpty) + updatePumpIfNecessary(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java index 715ccf946..b05ce97ac 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeAttachmentModel.java @@ -13,6 +13,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.util.Direction; @@ -35,10 +36,14 @@ public class PipeAttachmentModel extends WrappedBakedModel { PipeModelData data = new PipeModelData(); FluidPipeAttachmentBehaviour attachmentBehaviour = TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); - if (attachmentBehaviour != null) + + if (attachmentBehaviour != null) { for (Direction d : Iterate.directions) data.putRim(d, attachmentBehaviour.getAttachment(world, pos, state, d)); + data.putBracket(attachmentBehaviour.getBracket()); + } data.setEncased(FluidPipeBlock.shouldDrawCasing(world, pos, state)); + return new ModelDataMap.Builder().withInitial(PIPE_PROPERTY, data) .build(); } @@ -67,17 +72,31 @@ public class PipeAttachmentModel extends WrappedBakedModel { if (pipeData.isEncased()) quads.addAll(AllBlockPartials.FLUID_PIPE_CASING.get() .getQuads(state, side, rand, data)); + IBakedModel bracket = pipeData.getBracket(); + if (bracket != null) + quads.addAll(bracket.getQuads(state, side, rand, data)); } private class PipeModelData { AttachmentTypes[] rims; boolean encased; + IBakedModel bracket; public PipeModelData() { rims = new AttachmentTypes[6]; Arrays.fill(rims, AttachmentTypes.NONE); } + public void putBracket(BlockState state) { + this.bracket = Minecraft.getInstance() + .getBlockRendererDispatcher() + .getModelForState(state); + } + + public IBakedModel getBracket() { + return bracket; + } + public void putRim(Direction face, AttachmentTypes rim) { rims[face.getIndex()] = rim; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index 2e83cfd4b..4c36b15e9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -7,6 +7,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import javax.annotation.Nullable; + import org.apache.commons.lang3.mutable.MutableBoolean; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -22,14 +24,19 @@ import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; +import net.minecraft.particles.IParticleData; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.ILightReader; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; +import net.minecraftforge.fml.DistExecutor; public class PumpTileEntity extends KineticTileEntity { @@ -49,7 +56,7 @@ public class PumpTileEntity extends KineticTileEntity { openEnds = Couple.create(HashMap::new); setProvidedFluid(FluidStack.EMPTY); } - + @Override public void addBehaviours(List behaviours) { super.addBehaviours(behaviours); @@ -70,6 +77,7 @@ public class PumpTileEntity extends KineticTileEntity { if (world.isRemote) { if (speed == 0) return; + spawnParticles(); arrowDirection.chase(speed >= 0 ? 1 : -1, .5f, Chaser.EXP); arrowDirection.tickChaser(); return; @@ -279,6 +287,14 @@ public class PumpTileEntity extends KineticTileEntity { return isFront; } + @Nullable + protected Direction getFront() { + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof PumpBlock)) + return null; + return blockState.get(PumpBlock.FACING); + } + protected void updatePipeNetwork(boolean front) { if (networks != null) networks.get(front) @@ -301,6 +317,44 @@ public class PumpTileEntity extends KineticTileEntity { return front == reversed; } + public void spawnParticles() { + DistExecutor.runWhenOn(Dist.CLIENT, () -> this::spawnParticlesInner); + } + + @OnlyIn(Dist.CLIENT) + private void spawnParticlesInner() { + if (!FluidPipeBehaviour.isRenderEntityWithinDistance(pos)) + return; + for (boolean front : Iterate.trueAndFalse) { + Direction side = getFront(); + if (side == null) + return; + if (!front) + side = side.getOpposite(); + if (!FluidPropagator.isOpenEnd(world, pos, side)) + continue; + BlockFace key = new BlockFace(pos, side); + Map map = openEnds.get(front); + if (map.containsKey(key)) { + FluidStack fluidStack = map.get(key) + .getCapability() + .map(fh -> fh.getFluidInTank(0)) + .orElse(FluidStack.EMPTY); + if (!fluidStack.isEmpty()) + spawnPouringLiquid(fluidStack, side, 1); + } + } + } + + @OnlyIn(Dist.CLIENT) + private void spawnPouringLiquid(FluidStack fluid, Direction side, int amount) { + IParticleData particle = FluidFX.getFluidParticle(fluid); + float rimRadius = 1 / 4f + 1 / 64f; + boolean inbound = isPullingOnSide(getFront() == side); + Vec3d directionVec = new Vec3d(side.getDirectionVec()); + FluidFX.spawnPouringLiquid(world, pos, amount, particle, rimRadius, directionVec, inbound); + } + public Map getOpenEnds(Direction side) { return openEnds.get(isFront(side)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java index 6a44ca97a..3c6873c0d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidDrainingBehaviour.java @@ -110,7 +110,7 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { .getFluid(); emptied = Blocks.AIR.getDefaultState(); } - + if (this.fluid == null) this.fluid = fluid; @@ -249,7 +249,7 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { World world = getWorld(); int maxBlocks = maxBlocks(); - if (visited.size() > maxBlocks) { + if (visited.size() > maxBlocks && maxBlocks != -1) { infinite = true; // Find first block with valid fluid while (true) { @@ -280,10 +280,9 @@ public class FluidDrainingBehaviour extends FluidManipulationBehaviour { search(fluid, validationFrontier, validationVisited, (e, d) -> newValidationSet.add(e), false); int maxBlocks = maxBlocks(); - if (validationVisited.size() > maxBlocks) { - if (!infinite) { + if (validationVisited.size() > maxBlocks && maxBlocks != -1) { + if (!infinite) reset(); - } validationFrontier.clear(); setLongValidationTimer(); return; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java index 7764001a0..c8023c7dc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidFillingBehaviour.java @@ -12,16 +12,26 @@ import com.simibubi.create.foundation.utility.Iterate; import it.unimi.dsi.fastutil.PriorityQueue; import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.DoorBlock; import net.minecraft.block.FlowingFluidBlock; +import net.minecraft.block.material.Material; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; import net.minecraft.fluid.IFluidState; import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.FluidTags; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.world.IBlockReader; import net.minecraft.world.ITickList; import net.minecraft.world.NextTickListEntry; import net.minecraft.world.World; @@ -60,7 +70,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { (p, d) -> infinityCheckFrontier.add(new BlockPosEntry(p, d)), true); int maxBlocks = maxBlocks(); - if (infinityCheckVisited.size() > maxBlocks) { + if (infinityCheckVisited.size() > maxBlocks && maxBlocks != -1) { if (!infinite) { reset(); infinite = true; @@ -111,16 +121,24 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { int maxRange = maxRange(); int maxRangeSq = maxRange * maxRange; int maxBlocks = maxBlocks(); + boolean evaporate = world.dimension.doesWaterVaporize() && fluid.isIn(FluidTags.WATER); - if (infinite) { + if (infinite || evaporate) { IFluidState fluidState = world.getFluidState(rootPos); boolean equivalentTo = fluidState.getFluid() .isEquivalentTo(fluid); - if (!equivalentTo) + if (!equivalentTo && !evaporate) return false; if (simulate) return true; - playEffect(world, BlockPos.ZERO, fluid, false); + playEffect(world, null, fluid, false); + if (evaporate) { + int i = root.getX(); + int j = root.getY(); + int k = root.getZ(); + world.playSound(null, i, j, k, SoundEvents.BLOCK_FIRE_EXTINGUISH, SoundCategory.BLOCKS, 0.5F, + 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F); + } return true; } @@ -137,7 +155,7 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { if (!simulate) visited.add(currentPos); - if (visited.size() >= maxBlocks) { + if (visited.size() >= maxBlocks && maxBlocks != -1) { infinite = true; visited.clear(); queue.clear(); @@ -154,9 +172,10 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { BlockState blockState = world.getBlockState(currentPos); if (blockState.has(BlockStateProperties.WATERLOGGED) && fluid.isEquivalentTo(Fluids.WATER)) { - world.setBlockState(currentPos, blockState.with(BlockStateProperties.WATERLOGGED, true), - 2 | 16); + world.setBlockState(currentPos, + updatePostWaterlogging(blockState.with(BlockStateProperties.WATERLOGGED, true)), 2 | 16); } else { + replaceBlock(world, currentPos, blockState); world.setBlockState(currentPos, fluid.getDefaultState() .getBlockState(), 2 | 16); } @@ -237,8 +256,36 @@ public class FluidFillingBehaviour extends FluidManipulationBehaviour { .isEmpty()) return toFill.isEquivalentTo(fluidState.getFluid()) ? SpaceType.FILLED : SpaceType.BLOCKING; - return blockState.getMaterial() - .isReplaceable() ? SpaceType.FILLABLE : SpaceType.BLOCKING; + return canBeReplacedByFluid(world, pos, blockState) ? SpaceType.FILLABLE : SpaceType.BLOCKING; + } + + protected void replaceBlock(World world, BlockPos pos, BlockState state) { + TileEntity tileentity = state.getBlock() + .hasTileEntity(state) ? world.getTileEntity(pos) : null; + Block.spawnDrops(state, world.getWorld(), pos, tileentity); + } + + // From FlowingFluidBlock#isBlocked + protected boolean canBeReplacedByFluid(IBlockReader world, BlockPos pos, BlockState state) { + Block block = state.getBlock(); + if (!(block instanceof DoorBlock) && !block.isIn(BlockTags.SIGNS) && block != Blocks.LADDER + && block != Blocks.SUGAR_CANE && block != Blocks.BUBBLE_COLUMN) { + Material material = state.getMaterial(); + if (material != Material.PORTAL && material != Material.STRUCTURE_VOID && material != Material.OCEAN_PLANT + && material != Material.SEA_GRASS) { + return !material.blocksMovement(); + } else { + return false; + } + } else { + return false; + } + } + + protected BlockState updatePostWaterlogging(BlockState state) { + if (state.has(BlockStateProperties.LIT)) + state = state.with(BlockStateProperties.LIT, false); + return state; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java index 3150c6011..b0bd65e00 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/FluidManipulationBehaviour.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Set; import java.util.function.BiConsumer; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -76,11 +77,11 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { } protected int maxRange() { - return 128; + return AllConfigs.SERVER.fluids.hosePulleyRange.get(); } protected int maxBlocks() { - return 10000; + return AllConfigs.SERVER.fluids.hosePulleyBlockThreshold.get(); } public void reset() { @@ -137,7 +138,8 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { int maxRangeSq = maxRange * maxRange; int i; - for (i = 0; i < searchedPerTick && !frontier.isEmpty() && visited.size() <= maxBlocks; i++) { + for (i = 0; i < searchedPerTick && !frontier.isEmpty() + && (visited.size() <= maxBlocks || maxBlocks == -1); i++) { BlockPosEntry entry = frontier.remove(0); BlockPos currentPos = entry.pos; if (visited.contains(currentPos)) @@ -180,7 +182,7 @@ public abstract class FluidManipulationBehaviour extends TileEntityBehaviour { } protected void playEffect(World world, BlockPos pos, Fluid fluid, boolean fillSound) { - BlockPos splooshPos = infinite ? tileEntity.getPos() : pos; + BlockPos splooshPos = pos == null ? tileEntity.getPos() : pos; SoundEvent soundevent = fillSound ? fluid.getAttributes() .getFillSound() diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java index 043c23985..86837a340 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyFluidHandler.java @@ -4,6 +4,7 @@ import java.util.function.Supplier; import javax.annotation.Nullable; +import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.SmartFluidTank; import net.minecraft.util.math.BlockPos; @@ -18,11 +19,13 @@ public class HosePulleyFluidHandler implements IFluidHandler { public int fill(FluidStack resource, FluidAction action) { if (!internalTank.isEmpty() && !resource.isFluidEqual(internalTank.getFluid())) return 0; + if (resource.isEmpty() || !FluidHelper.hasBlockState(resource.getFluid())) + return 0; int diff = resource.getAmount(); int totalAmountAfterFill = diff + internalTank.getFluidAmount(); FluidStack remaining = resource.copy(); - + if (predicate.get() && totalAmountAfterFill >= 1000) { if (filler.tryDeposit(resource.getFluid(), rootPosGetter.get(), action.simulate())) { drainer.counterpartActed(); @@ -30,8 +33,8 @@ public class HosePulleyFluidHandler implements IFluidHandler { diff -= 1000; } } - - if (action.simulate()) + + if (action.simulate()) return diff <= 0 ? resource.getAmount() : internalTank.fill(remaining, action); if (diff <= 0) { internalTank.drain(-diff, FluidAction.EXECUTE); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java index 583b3dffb..f7436a0a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; +import com.simibubi.create.content.contraptions.wrench.IWrenchable; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -11,7 +12,7 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; -public class SpoutBlock extends Block { +public class SpoutBlock extends Block implements IWrenchable { public SpoutBlock(Properties p_i48440_1_) { super(p_i48440_1_); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index 06ab3c4b8..ec63afdff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -33,11 +33,11 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; public class SpoutTileEntity extends SmartTileEntity { public static final int FILLING_TIME = 20; - + protected BeltProcessingBehaviour beltProcessing; protected int processingTicks; protected boolean sendSplash; - + SmartFluidTankBehaviour tank; public SpoutTileEntity(TileEntityType tileEntityTypeIn) { @@ -54,11 +54,11 @@ public class SpoutTileEntity extends SmartTileEntity { public void addBehaviours(List behaviours) { tank = SmartFluidTankBehaviour.single(this, 1000); behaviours.add(tank); - + beltProcessing = new BeltProcessingBehaviour(this).whenItemEnters(this::onItemReceived) .whileItemHeld(this::whenItemHeld); behaviours.add(beltProcessing); - + } protected ProcessingResult onItemReceived(TransportedItemStack transported, @@ -106,20 +106,22 @@ public class SpoutTileEntity extends SmartTileEntity { handler.handleProcessingOnItem(transported, TransportedResult.convertToAndLeaveHeld(outList, held)); } - tank.getPrimaryHandler().setFluid(fluid); + tank.getPrimaryHandler() + .setFluid(fluid); sendSplash = true; notifyUpdate(); return PASS; } private FluidStack getCurrentFluidInTank() { - return tank.getPrimaryHandler().getFluid(); + return tank.getPrimaryHandler() + .getFluid(); } @Override protected void write(CompoundNBT compound, boolean clientPacket) { super.write(compound, clientPacket); - + compound.putInt("ProcessingTicks", processingTicks); if (sendSplash && clientPacket) { compound.putBoolean("Splash", true); @@ -134,23 +136,25 @@ public class SpoutTileEntity extends SmartTileEntity { if (!clientPacket) return; if (compound.contains("Splash")) - spawnSplash(tank.getPrimaryTank().getRenderedFluid()); + spawnSplash(tank.getPrimaryTank() + .getRenderedFluid()); } @Override public LazyOptional getCapability(Capability cap, Direction side) { if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY && side != Direction.DOWN) - return tank.getCapability().cast(); + return tank.getCapability() + .cast(); return super.getCapability(cap, side); } - public void tick() { super.tick(); + if (processingTicks >= 0) + processingTicks--; if (processingTicks >= 8 && world.isRemote) - if (processingTicks >= 0) - processingTicks--; - spawnProcessingParticles(tank.getPrimaryTank().getRenderedFluid()); + spawnProcessingParticles(tank.getPrimaryTank() + .getRenderedFluid()); } protected void spawnProcessingParticles(FluidStack fluid) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java new file mode 100644 index 000000000..6e06adf33 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java @@ -0,0 +1,71 @@ +package com.simibubi.create.content.contraptions.fluids.particle; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.simibubi.create.content.contraptions.particle.ICustomParticleData; + +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.fluid.Fluids; +import net.minecraft.network.PacketBuffer; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; + +public class FluidParticleData implements IParticleData, ICustomParticleData { + + private ParticleType type; + private FluidStack fluid; + + public FluidParticleData() {} + + @SuppressWarnings("unchecked") + public FluidParticleData(ParticleType type, FluidStack fluid) { + this.type = (ParticleType) type; + this.fluid = fluid; + } + + @Override + @OnlyIn(Dist.CLIENT) + public IParticleFactory getFactory() { + return (data, world, x, y, z, vx, vy, vz) -> new FluidStackParticle(world, data.fluid, x, y, z, vx, vy, vz); + } + + @Override + public ParticleType getType() { + return type; + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeFluidStack(fluid); + } + + @Override + public String getParameters() { + return ForgeRegistries.PARTICLE_TYPES.getKey(type) + " " + fluid.getFluid() + .getRegistryName(); + } + + public static final IParticleData.IDeserializer DESERIALIZER = + new IParticleData.IDeserializer() { + + // TODO Fluid particles on command + public FluidParticleData deserialize(ParticleType particleTypeIn, StringReader reader) + throws CommandSyntaxException { + return new FluidParticleData(particleTypeIn, new FluidStack(Fluids.WATER, 1)); + } + + public FluidParticleData read(ParticleType particleTypeIn, PacketBuffer buffer) { + return new FluidParticleData(particleTypeIn, buffer.readFluidStack()); + } + }; + + @Override + public IDeserializer getDeserializer() { + return DESERIALIZER; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java new file mode 100644 index 000000000..82a269418 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java @@ -0,0 +1,87 @@ +package com.simibubi.create.content.contraptions.fluids.particle; + +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid; +import com.simibubi.create.foundation.utility.ColorHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.SpriteTexturedParticle; +import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +public class FluidStackParticle extends SpriteTexturedParticle { + private final float field_217587_G; + private final float field_217588_H; + private FluidStack fluid; + + public FluidStackParticle(World world, FluidStack fluid, double x, double y, double z, double vx, double vy, + double vz) { + super(world, x, y, z, vx, vy, vz); + this.fluid = fluid; + this.setSprite(Minecraft.getInstance() + .getSpriteAtlas(PlayerContainer.BLOCK_ATLAS_TEXTURE) + .apply(fluid.getFluid() + .getAttributes() + .getStillTexture())); + + this.particleGravity = 1.0F; + this.particleRed = 0.8F; + this.particleGreen = 0.8F; + this.particleBlue = 0.8F; + this.multiplyColor(fluid.getFluid() + .getAttributes() + .getColor(fluid)); + + this.particleScale /= 2.0F; + this.field_217587_G = this.rand.nextFloat() * 3.0F; + this.field_217588_H = this.rand.nextFloat() * 3.0F; + } + + public IParticleRenderType getRenderType() { + return IParticleRenderType.TERRAIN_SHEET; + } + + protected void multiplyColor(int color) { + this.particleRed *= (float) (color >> 16 & 255) / 255.0F; + this.particleGreen *= (float) (color >> 8 & 255) / 255.0F; + this.particleBlue *= (float) (color & 255) / 255.0F; + } + + protected float getMinU() { + return this.sprite.getInterpolatedU((double) ((this.field_217587_G + 1.0F) / 4.0F * 16.0F)); + } + + protected float getMaxU() { + return this.sprite.getInterpolatedU((double) (this.field_217587_G / 4.0F * 16.0F)); + } + + protected float getMinV() { + return this.sprite.getInterpolatedV((double) (this.field_217588_H / 4.0F * 16.0F)); + } + + protected float getMaxV() { + return this.sprite.getInterpolatedV((double) ((this.field_217588_H + 1.0F) / 4.0F * 16.0F)); + } + + @Override + public void tick() { + super.tick(); + if (!(fluid.getFluid() instanceof PotionFluid)) + return; + if (onGround) + setExpired(); + if (!isExpired) + return; + if (!onGround && world.rand.nextFloat() < 1/8f) + return; + + Vec3d rgb = ColorHelper.getRGB(fluid.getFluid() + .getAttributes() + .getColor(fluid)); + world.addParticle(ParticleTypes.ENTITY_EFFECT, posX, posY, posZ, rgb.x, rgb.y, rgb.z); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java index 885ebabc0..751ff1de4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/AxisPipeBlock.java @@ -1,15 +1,19 @@ package com.simibubi.create.content.contraptions.fluids.pipes; import java.util.Map; +import java.util.Optional; import java.util.Random; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; import com.simibubi.create.content.contraptions.fluids.FluidPropagator; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.contraptions.wrench.IWrenchableWithBracket; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.RotatedPillarBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; @@ -28,7 +32,7 @@ import net.minecraft.world.TickPriority; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchable, IAxisPipe { +public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchableWithBracket, IAxisPipe { public AxisPipeBlock(Properties p_i48339_1_) { super(p_i48339_1_); @@ -39,6 +43,8 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchable, IA boolean blockTypeChanged = state.getBlock() != newState.getBlock(); if (blockTypeChanged && !world.isRemote) FluidPropagator.propagateChangedPipe(world, pos, state); + if (state != newState && !isMoving) + removeBracket(world, pos).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) world.removeTileEntity(pos); } @@ -100,4 +106,16 @@ public class AxisPipeBlock extends RotatedPillarBlock implements IWrenchable, IA return state.get(AXIS); } + @Override + public Optional removeBracket(IBlockReader world, BlockPos pos) { + FluidPipeAttachmentBehaviour behaviour = TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (behaviour == null) + return Optional.empty(); + BlockState bracket = behaviour.getBracket(); + behaviour.removeBracket(); + if (bracket == Blocks.AIR.getDefaultState()) + return Optional.empty(); + return Optional.of(new ItemStack(bracket.getBlock())); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java new file mode 100644 index 000000000..90c72f341 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlock.java @@ -0,0 +1,66 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.Optional; + +import com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock; +import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; +import com.simibubi.create.content.contraptions.fluids.FluidPropagator; +import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; +import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; +import com.simibubi.create.foundation.block.ProperDirectionalBlock; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.IStringSerializable; + +public class BracketBlock extends ProperDirectionalBlock { + + public static final BooleanProperty AXIS_ALONG_FIRST_COORDINATE = + DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; + public static final EnumProperty TYPE = EnumProperty.create("type", BracketType.class); + + public static enum BracketType implements IStringSerializable { + PIPE, COG, SHAFT; + + @Override + public String getName() { + return Lang.asId(name()); + } + + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(AXIS_ALONG_FIRST_COORDINATE) + .add(TYPE)); + } + + public BracketBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + } + + public Optional getSuitableBracket(BlockState blockState, Direction direction) { + if (blockState.getBlock() instanceof ShaftBlock) + return getSuitableBracket(blockState.get(RotatedPillarKineticBlock.AXIS), direction, + blockState.getBlock() instanceof CogWheelBlock ? BracketType.COG : BracketType.SHAFT); + return getSuitableBracket(FluidPropagator.getStraightPipeAxis(blockState), direction, BracketType.PIPE); + } + + private Optional getSuitableBracket(Axis targetBlockAxis, Direction direction, BracketType type) { + Axis axis = direction.getAxis(); + if (targetBlockAxis == null || targetBlockAxis == axis) + return Optional.empty(); + + boolean alongFirst = axis != Axis.Z ? targetBlockAxis == Axis.Z : targetBlockAxis == Axis.Y; + return Optional.of(getDefaultState().with(TYPE, type) + .with(FACING, direction) + .with(AXIS_ALONG_FIRST_COORDINATE, !alongFirst)); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java new file mode 100644 index 000000000..98e563b1f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketBlockItem.java @@ -0,0 +1,73 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import java.util.Optional; + +import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; +import com.simibubi.create.content.contraptions.relays.elementary.BracketedTileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class BracketBlockItem extends BlockItem { + + public BracketBlockItem(Block p_i48527_1_, Properties p_i48527_2_) { + super(p_i48527_1_, p_i48527_2_); + } + + @Override + public ActionResultType onItemUse(ItemUseContext context) { + World world = context.getWorld(); + BlockPos pos = context.getPos(); + BlockState state = world.getBlockState(pos); + BracketBlock bracketBlock = getBracketBlock(); + PlayerEntity player = context.getPlayer(); + + BracketedTileEntityBehaviour behaviour = TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (behaviour == null) + behaviour = TileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); + + if (behaviour != null && behaviour.canHaveBracket()) { + if (world.isRemote) + return ActionResultType.SUCCESS; + + Optional suitableBracket = bracketBlock.getSuitableBracket(state, context.getFace()); + if (!suitableBracket.isPresent() && player != null) + suitableBracket = + bracketBlock.getSuitableBracket(state, Direction.getFacingDirections(player)[0].getOpposite()); + if (!suitableBracket.isPresent()) + return ActionResultType.SUCCESS; + + BlockState bracket = behaviour.getBracket(); + behaviour.applyBracket(suitableBracket.get()); + if (player == null || !player.isCreative()) { + context.getItem() + .shrink(1); + if (bracket != Blocks.AIR.getDefaultState()) { + ItemStack returnedStack = new ItemStack(bracket.getBlock()); + if (player == null) + Block.spawnAsEntity(world, pos, returnedStack); + else + player.inventory.placeItemBackInInventory(world, returnedStack); + } + } + return ActionResultType.SUCCESS; + } + + return ActionResultType.FAIL; + } + + private BracketBlock getBracketBlock() { + return (BracketBlock) getBlock(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java new file mode 100644 index 000000000..16b06b1d4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/BracketGenerator.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.simibubi.create.foundation.data.DirectionalAxisBlockStateGen; +import com.tterrag.registrate.builders.ItemBuilder; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import com.tterrag.registrate.util.nullness.NonNullFunction; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.BlockItem; +import net.minecraftforge.client.model.generators.ModelFile; + +public class BracketGenerator extends DirectionalAxisBlockStateGen { + + private String material; + + public BracketGenerator(String material) { + this.material = material; + } + + @Override + public String getModelPrefix(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + return ""; + } + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + String type = state.get(BracketBlock.TYPE) + .getName(); + boolean vertical = state.get(BracketBlock.FACING) + .getAxis() + .isVertical(); + + String path = "block/bracket/" + type + "/" + (vertical ? "ground" : "wall"); + + return prov.models() + .withExistingParent(path + "_" + material, prov.modLoc(path)) + .texture("bracket", prov.modLoc("block/bracket_" + material)) + .texture("plate", prov.modLoc("block/bracket_plate_" + material)); + } + + public static NonNullFunction, P> itemModel(String material) { + return b -> b.model((c, p) -> p.withExistingParent(c.getName(), p.modLoc("block/bracket/item")) + .texture("bracket", p.modLoc("block/bracket_" + material)) + .texture("plate", p.modLoc("block/bracket_plate_" + material))) + .build(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java index 299f70405..56217071f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidPipeBlock.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.fluids.pipes; +import java.util.Optional; import java.util.Random; import javax.annotation.Nullable; @@ -8,18 +9,20 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.fluids.FluidPipeAttachmentBehaviour; import com.simibubi.create.content.contraptions.fluids.FluidPropagator; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.contraptions.wrench.IWrenchableWithBracket; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.IWaterLoggable; import net.minecraft.block.SixWayBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluids; import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.network.DebugPacketSender; import net.minecraft.state.StateContainer.Builder; @@ -39,7 +42,7 @@ import net.minecraft.world.TickPriority; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; -public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWrenchable { +public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWrenchableWithBracket { public FluidPipeBlock(Properties properties) { super(4 / 16f, properties); @@ -48,6 +51,9 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (tryRemoveBracket(context)) + return ActionResultType.SUCCESS; + World world = context.getWorld(); BlockPos pos = context.getPos(); Axis axis = getAxis(world, pos, state); @@ -78,16 +84,7 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren @Nullable private Axis getAxis(IBlockReader world, BlockPos pos, BlockState state) { - if (!FluidPropagator.isStraightPipe(state)) - return null; - Axis axis = null; - for (Direction d : Iterate.directions) { - if (isOpenAt(state, d)) { - axis = d.getAxis(); - break; - } - } - return axis; + return FluidPropagator.getStraightPipeAxis(state); } @Override @@ -105,6 +102,8 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren boolean blockTypeChanged = state.getBlock() != newState.getBlock(); if (blockTypeChanged && !world.isRemote) FluidPropagator.propagateChangedPipe(world, pos, state); + if (state != newState && !isMoving) + removeBracket(world, pos).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); if (state.hasTileEntity() && (blockTypeChanged || !newState.hasTileEntity())) world.removeTileEntity(pos); } @@ -141,10 +140,13 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } public static boolean canConnectTo(ILightReader world, BlockPos pos, BlockState neighbour, Direction blockFace) { - if (isPipe(neighbour) || FluidPropagator.hasFluidCapability(neighbour, world, pos, blockFace)) + if (FluidPropagator.hasFluidCapability(neighbour, world, pos, blockFace)) return true; FluidPipeAttachmentBehaviour attachmentBehaviour = TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (isPipe(neighbour)) + return attachmentBehaviour == null || attachmentBehaviour.getBracket() == Blocks.AIR.getDefaultState() + || FluidPropagator.getStraightPipeAxis(neighbour) == blockFace.getAxis(); if (attachmentBehaviour == null) return false; return attachmentBehaviour.isPipeConnectedTowards(neighbour, blockFace); @@ -155,9 +157,11 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren BlockState facingState = world.getBlockState(offsetPos); if (!isPipe(facingState)) return true; + if (!canConnectTo(world, offsetPos, facingState, direction)) + return true; if (!isCornerOrEndPipe(world, pos, state)) return false; - if (FluidPropagator.isStraightPipe(facingState)) + if (FluidPropagator.getStraightPipeAxis(facingState) != null) return true; if (!shouldDrawCasing(world, pos, state) && shouldDrawCasing(world, offsetPos, facingState)) return true; @@ -171,7 +175,8 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren } public static boolean isCornerOrEndPipe(ILightReader world, BlockPos pos, BlockState state) { - return isPipe(state) && !FluidPropagator.isStraightPipe(state) && !shouldDrawCasing(world, pos, state); + return isPipe(state) && FluidPropagator.getStraightPipeAxis(state) == null + && !shouldDrawCasing(world, pos, state); } public static boolean shouldDrawCasing(ILightReader world, BlockPos pos, BlockState state) { @@ -206,20 +211,28 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren @Override public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { + if (state.get(BlockStateProperties.WATERLOGGED)) world.getPendingFluidTicks() .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } + if (isOpenAt(state, direction) && neighbourState.has(BlockStateProperties.WATERLOGGED)) + world.getPendingBlockTicks() + .scheduleTick(pos, this, 1, TickPriority.HIGH); return updateBlockState(state, direction, direction.getOpposite(), world, pos); } public BlockState updateBlockState(BlockState state, Direction preferredDirection, @Nullable Direction ignore, ILightReader world, BlockPos pos) { + + FluidPipeAttachmentBehaviour behaviour = TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (behaviour != null && behaviour.getBracket() != Blocks.AIR.getDefaultState()) + return state; + // Update sides that are not ignored for (Direction d : Iterate.directions) - if (d != ignore) - state = state.with(FACING_TO_PROPERTY_MAP.get(d), - canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d)); + if (d != ignore) { + boolean shouldConnect = canConnectTo(world, pos.offset(d), world.getBlockState(pos.offset(d)), d); + state = state.with(FACING_TO_PROPERTY_MAP.get(d), shouldConnect); + } // See if it has enough connections Direction connectedDirection = null; @@ -245,4 +258,16 @@ public class FluidPipeBlock extends SixWayBlock implements IWaterLoggable, IWren return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); } + + @Override + public Optional removeBracket(IBlockReader world, BlockPos pos) { + FluidPipeAttachmentBehaviour behaviour = TileEntityBehaviour.get(world, pos, FluidPipeAttachmentBehaviour.TYPE); + if (behaviour == null) + return Optional.empty(); + BlockState bracket = behaviour.getBracket(); + behaviour.removeBracket(); + if (bracket == Blocks.AIR.getDefaultState()) + return Optional.empty(); + return Optional.of(new ItemStack(bracket.getBlock())); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java index 33d1dad10..6acc3541a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/GlassFluidPipeBlock.java @@ -39,12 +39,11 @@ public class GlassFluidPipeBlock extends AxisPipeBlock { @Override public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (tryRemoveBracket(context)) + return ActionResultType.SUCCESS; BlockState newState = state; World world = context.getWorld(); BlockPos pos = context.getPos(); -// if (!state.get(ALT)) -// newState = state.with(ALT, true); -// else newState = toRegularPipe(world, pos, state); world.setBlockState(pos, newState, 3); return ActionResultType.SUCCESS; diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java index db604f367..d5c4592b8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticleData.java @@ -14,7 +14,7 @@ import net.minecraft.util.math.Vec3i; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class AirFlowParticleData implements IParticleData, ICustomParticle { +public class AirFlowParticleData implements IParticleData, ICustomParticleDataWithSprite { public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { public AirFlowParticleData deserialize(ParticleType particleTypeIn, StringReader reader) @@ -75,7 +75,7 @@ public class AirFlowParticleData implements IParticleData, ICustomParticle getFactory() { + public IParticleMetaFactory getMetaFactory() { return AirFlowParticle.Factory::new; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java index 3f40c9576..9a516edbc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirParticleData.java @@ -13,7 +13,7 @@ import net.minecraft.particles.ParticleType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class AirParticleData implements IParticleData, ICustomParticle { +public class AirParticleData implements IParticleData, ICustomParticleDataWithSprite { public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { @@ -66,7 +66,7 @@ public class AirParticleData implements IParticleData, ICustomParticle getFactory() { + public IParticleMetaFactory getMetaFactory() { return AirParticle.Factory::new; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java index dc22608c7..db84b2e0c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/CubeParticleData.java @@ -6,14 +6,14 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.simibubi.create.AllParticleTypes; -import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.particle.IParticleFactory; import net.minecraft.network.PacketBuffer; import net.minecraft.particles.IParticleData; import net.minecraft.particles.ParticleType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class CubeParticleData implements IParticleData, ICustomParticle { +public class CubeParticleData implements IParticleData, ICustomParticleData { public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { @Override @@ -55,8 +55,8 @@ public class CubeParticleData implements IParticleData, ICustomParticle getFactory() { - return null; + public IParticleFactory getFactory() { + return new CubeParticle.Factory(); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java index 54d5e1626..b159192bd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/HeaterParticleData.java @@ -18,7 +18,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class HeaterParticleData implements IParticleData, ICustomParticle { +public class HeaterParticleData implements IParticleData, ICustomParticleDataWithSprite { public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { @@ -61,7 +61,7 @@ public class HeaterParticleData implements IParticleData, ICustomParticle getFactory() { + public IParticleMetaFactory getMetaFactory() { return HeaterParticle.Factory::new; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java similarity index 56% rename from src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticle.java rename to src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java index 341094dcb..540dccc31 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleData.java @@ -1,13 +1,14 @@ package com.simibubi.create.content.contraptions.particle; -import net.minecraft.client.particle.ParticleManager.IParticleMetaFactory; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.ParticleManager; import net.minecraft.particles.IParticleData; import net.minecraft.particles.IParticleData.IDeserializer; import net.minecraft.particles.ParticleType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public interface ICustomParticle { +public interface ICustomParticleData { public IDeserializer getDeserializer(); @@ -16,6 +17,11 @@ public interface ICustomParticle { } @OnlyIn(Dist.CLIENT) - public IParticleMetaFactory getFactory(); + public IParticleFactory getFactory(); + + @OnlyIn(Dist.CLIENT) + public default void register(ParticleType type, ParticleManager particles) { + particles.registerFactory(type, getFactory()); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java new file mode 100644 index 000000000..1800fe514 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/ICustomParticleDataWithSprite.java @@ -0,0 +1,34 @@ +package com.simibubi.create.content.contraptions.particle; + +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.particle.ParticleManager.IParticleMetaFactory; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.IParticleData.IDeserializer; +import net.minecraft.particles.ParticleType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public interface ICustomParticleDataWithSprite extends ICustomParticleData { + + public IDeserializer getDeserializer(); + + public default ParticleType createType() { + return new ParticleType(false, getDeserializer()); + } + + @Override + default IParticleFactory getFactory() { + throw new IllegalAccessError("This particle type uses a metaFactory!"); + } + + @OnlyIn(Dist.CLIENT) + public IParticleMetaFactory getMetaFactory(); + + @Override + @OnlyIn(Dist.CLIENT) + public default void register(ParticleType type, ParticleManager particles) { + particles.registerFactory(type, getMetaFactory()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java index 846ed9085..fd685b6b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticleData.java @@ -14,32 +14,34 @@ import net.minecraft.util.Direction.Axis; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class RotationIndicatorParticleData implements IParticleData, ICustomParticle { +public class RotationIndicatorParticleData + implements IParticleData, ICustomParticleDataWithSprite { - public static final IParticleData.IDeserializer DESERIALIZER = new IParticleData.IDeserializer() { - public RotationIndicatorParticleData deserialize(ParticleType particleTypeIn, + public static final IParticleData.IDeserializer DESERIALIZER = + new IParticleData.IDeserializer() { + public RotationIndicatorParticleData deserialize(ParticleType particleTypeIn, StringReader reader) throws CommandSyntaxException { - reader.expect(' '); - int color = reader.readInt(); - reader.expect(' '); - float speed = (float) reader.readDouble(); - reader.expect(' '); - float rad1 = (float) reader.readDouble(); - reader.expect(' '); - float rad2 = (float) reader.readDouble(); - reader.expect(' '); - int lifeSpan = reader.readInt(); - reader.expect(' '); - char axis = reader.read(); - return new RotationIndicatorParticleData(color, speed, rad1, rad2, lifeSpan, axis); - } + reader.expect(' '); + int color = reader.readInt(); + reader.expect(' '); + float speed = (float) reader.readDouble(); + reader.expect(' '); + float rad1 = (float) reader.readDouble(); + reader.expect(' '); + float rad2 = (float) reader.readDouble(); + reader.expect(' '); + int lifeSpan = reader.readInt(); + reader.expect(' '); + char axis = reader.read(); + return new RotationIndicatorParticleData(color, speed, rad1, rad2, lifeSpan, axis); + } - public RotationIndicatorParticleData read(ParticleType particleTypeIn, + public RotationIndicatorParticleData read(ParticleType particleTypeIn, PacketBuffer buffer) { - return new RotationIndicatorParticleData(buffer.readInt(), buffer.readFloat(), buffer.readFloat(), + return new RotationIndicatorParticleData(buffer.readInt(), buffer.readFloat(), buffer.readFloat(), buffer.readFloat(), buffer.readInt(), buffer.readChar()); - } - }; + } + }; final int color; final float speed; @@ -49,7 +51,7 @@ public class RotationIndicatorParticleData implements IParticleData, ICustomPart final char axis; public RotationIndicatorParticleData(int color, float speed, float radius1, float radius2, int lifeSpan, - char axis) { + char axis) { this.color = color; this.speed = speed; this.radius1 = radius1; @@ -84,7 +86,7 @@ public class RotationIndicatorParticleData implements IParticleData, ICustomPart @Override public String getParameters() { return String.format(Locale.ROOT, "%s %d %.2f %.2f %.2f %d %c", AllParticleTypes.ROTATION_INDICATOR.parameter(), - color, speed, radius1, radius2, lifeSpan, axis); + color, speed, radius1, radius2, lifeSpan, axis); } @Override @@ -94,7 +96,7 @@ public class RotationIndicatorParticleData implements IParticleData, ICustomPart @Override @OnlyIn(Dist.CLIENT) - public IParticleMetaFactory getFactory() { + public IParticleMetaFactory getMetaFactory() { return RotationIndicatorParticle.Factory::new; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java new file mode 100644 index 000000000..abc89b9a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedKineticBlockModel.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.contraptions.relays.elementary; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.simibubi.create.foundation.block.render.WrappedBakedModel; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.VirtualEmptyModelData; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.model.BakedQuad; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ILightReader; +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelDataMap; +import net.minecraftforge.client.model.data.ModelProperty; + +public class BracketedKineticBlockModel extends WrappedBakedModel { + + private static ModelProperty BRACKET_PROPERTY = new ModelProperty<>(); + + public BracketedKineticBlockModel(IBakedModel template) { + super(template); + } + + @Override + public IModelData getModelData(ILightReader world, BlockPos pos, BlockState state, IModelData tileData) { + if (tileData == VirtualEmptyModelData.INSTANCE) + return tileData; + BracketedModelData data = new BracketedModelData(); + BracketedTileEntityBehaviour attachmentBehaviour = + TileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); + if (attachmentBehaviour != null) + data.putBracket(attachmentBehaviour.getBracket()); + return new ModelDataMap.Builder().withInitial(BRACKET_PROPERTY, data) + .build(); + } + + @Override + public List getQuads(BlockState state, Direction side, Random rand, IModelData data) { + if (data instanceof ModelDataMap) { + List quads = new ArrayList<>(); + ModelDataMap modelDataMap = (ModelDataMap) data; + if (modelDataMap.hasProperty(BRACKET_PROPERTY)) { + quads = new ArrayList<>(quads); + addQuads(quads, state, side, rand, modelDataMap, modelDataMap.getData(BRACKET_PROPERTY)); + } + return quads; + } + return super.getQuads(state, side, rand, data); + } + + private void addQuads(List quads, BlockState state, Direction side, Random rand, IModelData data, + BracketedModelData pipeData) { + IBakedModel bracket = pipeData.getBracket(); + if (bracket == null) + return; + quads.addAll(bracket.getQuads(state, side, rand, data)); + } + + private class BracketedModelData { + IBakedModel bracket; + + public void putBracket(BlockState state) { + this.bracket = Minecraft.getInstance() + .getBlockRendererDispatcher() + .getModelForState(state); + } + + public IBakedModel getBracket() { + return bracket; + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java new file mode 100644 index 000000000..2348e2921 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/BracketedTileEntityBehaviour.java @@ -0,0 +1,75 @@ +package com.simibubi.create.content.contraptions.relays.elementary; + +import java.util.Optional; + +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.NBTUtil; + +public class BracketedTileEntityBehaviour extends TileEntityBehaviour { + + public static BehaviourType TYPE = new BehaviourType<>(); + + private Optional bracket; + private boolean reRender; + + public BracketedTileEntityBehaviour(SmartTileEntity te) { + super(te); + bracket = Optional.empty(); + } + + @Override + public BehaviourType getType() { + return TYPE; + } + + public void applyBracket(BlockState state) { + this.bracket = Optional.of(state); + reRender = true; + tileEntity.notifyUpdate(); + } + + public void removeBracket() { + this.bracket = Optional.empty(); + reRender = true; + tileEntity.notifyUpdate(); + } + + public BlockState getBracket() { + return bracket.orElse(Blocks.AIR.getDefaultState()); + } + + @Override + public void write(CompoundNBT nbt, boolean clientPacket) { + bracket.ifPresent(p -> nbt.put("Bracket", NBTUtil.writeBlockState(p))); + if (clientPacket && reRender) { + NBTHelper.putMarker(nbt, "Redraw"); + reRender = false; + } + super.write(nbt, clientPacket); + } + + @Override + public void read(CompoundNBT nbt, boolean clientPacket) { + bracket = Optional.empty(); + if (nbt.contains("Bracket")) + bracket = Optional.of(NBTUtil.readBlockState(nbt.getCompound("Bracket"))); + if (clientPacket && nbt.contains("Redraw")) + getWorld().notifyBlockUpdate(getPos(), tileEntity.getBlockState(), tileEntity.getBlockState(), 16); + super.read(nbt, clientPacket); + } + + public boolean canHaveBracket() { + BlockState blockState = tileEntity.getBlockState(); + if (blockState.getBlock() instanceof ShaftBlock) + return true; + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index 3a82af260..434883193 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -1,15 +1,19 @@ package com.simibubi.create.content.contraptions.relays.elementary; +import java.util.Optional; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; +import com.simibubi.create.content.contraptions.wrench.IWrenchableWithBracket; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import net.minecraft.block.Block; -import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.IWaterLoggable; import net.minecraft.block.material.PushReaction; import net.minecraft.entity.player.PlayerEntity; @@ -35,107 +39,130 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class ShaftBlock extends RotatedPillarKineticBlock implements IWaterLoggable { +public class ShaftBlock extends RotatedPillarKineticBlock implements IWaterLoggable, IWrenchableWithBracket { - public ShaftBlock(Properties properties) { - super(properties); - setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); - } + public ShaftBlock(Properties properties) { + super(properties); + setDefaultState(super.getDefaultState().with(BlockStateProperties.WATERLOGGED, false)); + } - public static boolean isShaft(BlockState state) { - return AllBlocks.SHAFT.has(state); - } + public static boolean isShaft(BlockState state) { + return AllBlocks.SHAFT.has(state); + } - @Override - public PushReaction getPushReaction(BlockState state) { - return PushReaction.NORMAL; - } + @Override + public PushReaction getPushReaction(BlockState state) { + return PushReaction.NORMAL; + } - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.ENTITYBLOCK_ANIMATED; - } + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.SIMPLE_KINETIC.create(); + } - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.SIMPLE_KINETIC.create(); - } + @Override + @SuppressWarnings("deprecation") + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + if (state != newState && !isMoving) + removeBracket(world, pos).ifPresent(stack -> Block.spawnAsEntity(world, pos, stack)); + super.onReplaced(state, world, pos, newState, isMoving); + } - @Override - public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { - return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)); - } + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)); + } - @Override - public float getParticleTargetRadius() { - return .25f; - } + @Override + public float getParticleTargetRadius() { + return .25f; + } - @Override - public float getParticleInitialRadius() { - return 0f; - } + @Override + public float getParticleInitialRadius() { + return 0f; + } - @Override - public void fillItemGroup(ItemGroup group, NonNullList items) { - super.fillItemGroup(group, items); - } + @Override + public void fillItemGroup(ItemGroup group, NonNullList items) { + super.fillItemGroup(group, items); + } - @Override - public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult p_225533_6_) { - if (player.isSneaking() || !player.isAllowEdit()) - return ActionResultType.PASS; + @Override + public ActionResultType onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, + BlockRayTraceResult p_225533_6_) { + if (player.isSneaking() || !player.isAllowEdit()) + return ActionResultType.PASS; - ItemStack heldItem = player.getHeldItem(hand); + ItemStack heldItem = player.getHeldItem(hand); - for (EncasedShaftBlock.Casing casing : EncasedShaftBlock.Casing.values()) { - if (casing.getCasingEntry().isIn(heldItem)) { - if (world.isRemote) - return ActionResultType.SUCCESS; + for (EncasedShaftBlock.Casing casing : EncasedShaftBlock.Casing.values()) { + if (casing.getCasingEntry() + .isIn(heldItem)) { + if (world.isRemote) + return ActionResultType.SUCCESS; - KineticTileEntity.switchToBlockState(world, pos, AllBlocks.ENCASED_SHAFT.getDefaultState().with(EncasedShaftBlock.CASING, casing).with(AXIS, state.get(AXIS))); - return ActionResultType.SUCCESS; - } - } + KineticTileEntity.switchToBlockState(world, pos, AllBlocks.ENCASED_SHAFT.getDefaultState() + .with(EncasedShaftBlock.CASING, casing) + .with(AXIS, state.get(AXIS))); + return ActionResultType.SUCCESS; + } + } - return ActionResultType.PASS; - } + return ActionResultType.PASS; + } - // IRotate: + // IRotate: - @Override - public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { - return face.getAxis() == state.get(AXIS); - } + @Override + public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) { + return face.getAxis() == state.get(AXIS); + } - @Override - public Axis getRotationAxis(BlockState state) { - return state.get(AXIS); - } + @Override + public Axis getRotationAxis(BlockState state) { + return state.get(AXIS); + } - @Override - public IFluidState getFluidState(BlockState state) { - return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) : Fluids.EMPTY.getDefaultState(); - } + @Override + public IFluidState getFluidState(BlockState state) { + return state.get(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getStillFluidState(false) + : Fluids.EMPTY.getDefaultState(); + } - @Override - protected void fillStateContainer(Builder builder) { - builder.add(BlockStateProperties.WATERLOGGED); - super.fillStateContainer(builder); - } + @Override + protected void fillStateContainer(Builder builder) { + builder.add(BlockStateProperties.WATERLOGGED); + super.fillStateContainer(builder); + } - @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, - IWorld world, BlockPos pos, BlockPos neighbourPos) { - if (state.get(BlockStateProperties.WATERLOGGED)) { - world.getPendingFluidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } - return state; - } + @Override + public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbourState, + IWorld world, BlockPos pos, BlockPos neighbourPos) { + if (state.get(BlockStateProperties.WATERLOGGED)) { + world.getPendingFluidTicks() + .scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); + } + return state; + } - @Override - public BlockState getStateForPlacement(BlockItemUseContext context) { - IFluidState ifluidstate = context.getWorld().getFluidState(context.getPos()); - return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); - } + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + IFluidState ifluidstate = context.getWorld() + .getFluidState(context.getPos()); + return super.getStateForPlacement(context).with(BlockStateProperties.WATERLOGGED, + Boolean.valueOf(ifluidstate.getFluid() == Fluids.WATER)); + } + + @Override + public Optional removeBracket(IBlockReader world, BlockPos pos) { + BracketedTileEntityBehaviour behaviour = TileEntityBehaviour.get(world, pos, BracketedTileEntityBehaviour.TYPE); + if (behaviour == null) + return Optional.empty(); + BlockState bracket = behaviour.getBracket(); + behaviour.removeBracket(); + if (bracket == Blocks.AIR.getDefaultState()) + return Optional.empty(); + return Optional.of(new ItemStack(bracket.getBlock())); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java index de86e0acb..fbe11f3bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/SimpleKineticTileEntity.java @@ -1,16 +1,25 @@ package com.simibubi.create.content.contraptions.relays.elementary; +import java.util.List; + import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.AxisAlignedBB; public class SimpleKineticTileEntity extends KineticTileEntity { - + public SimpleKineticTileEntity(TileEntityType type) { super(type); } - + + @Override + public void addBehaviours(List behaviours) { + behaviours.add(new BracketedTileEntityBehaviour(this)); + super.addBehaviours(behaviours); + } + @Override public AxisAlignedBB getRenderBoundingBox() { return new AxisAlignedBB(pos).grow(1); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeGenerator.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeGenerator.java index bf32aef3e..def2c0652 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeGenerator.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeGenerator.java @@ -1,53 +1,18 @@ package com.simibubi.create.content.contraptions.relays.gauge; -import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.simibubi.create.foundation.data.DirectionalAxisBlockStateGen; import com.tterrag.registrate.providers.DataGenContext; import com.tterrag.registrate.providers.RegistrateBlockstateProvider; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraftforge.client.model.generators.ModelFile; -public class GaugeGenerator extends SpecialBlockStateGen { +public class GaugeGenerator extends DirectionalAxisBlockStateGen { @Override - protected int getXRotation(BlockState state) { - Direction direction = state.get(GaugeBlock.FACING); - boolean alongFirst = state.get(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); - - if (direction == Direction.DOWN) - return 180; - if (direction == Direction.UP) - return 0; - if ((direction.getAxis() == Axis.X) == alongFirst) - return 90; - - return 0; - } - - @Override - protected int getYRotation(BlockState state) { - Direction direction = state.get(GaugeBlock.FACING); - boolean alongFirst = state.get(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); - - if (direction.getAxis() - .isVertical()) - return alongFirst ? 90 : 0; - - return horizontalAngle(direction) + 90; - } - - @Override - public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + public String getModelPrefix(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - boolean vertical = state.get(GaugeBlock.FACING) - .getAxis() - .isVertical(); - String partial = vertical ? "base" : "base_wall"; - return prov.models() - .getExistingFile(prov.modLoc("block/gauge/" + partial)); + return "block/gauge/base"; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java new file mode 100644 index 000000000..1c6ed8e89 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/IWrenchableWithBracket.java @@ -0,0 +1,54 @@ +package com.simibubi.create.content.contraptions.wrench; + +import java.util.Optional; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.fluids.FluidPropagator; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.Direction.AxisDirection; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public interface IWrenchableWithBracket extends IWrenchable { + + public Optional removeBracket(IBlockReader world, BlockPos pos); + + @Override + default ActionResultType onWrenched(BlockState state, ItemUseContext context) { + if (tryRemoveBracket(context)) + return ActionResultType.SUCCESS; + return IWrenchable.super.onWrenched(state, context); + } + + default boolean tryRemoveBracket(ItemUseContext context) { + World world = context.getWorld(); + BlockPos pos = context.getPos(); + Optional bracket = removeBracket(world, pos); + BlockState blockState = world.getBlockState(pos); + if (bracket.isPresent()) { + PlayerEntity player = context.getPlayer(); + if (!world.isRemote && !player.isCreative()) + player.inventory.placeItemBackInInventory(world, bracket.get()); + if (!world.isRemote && AllBlocks.FLUID_PIPE.has(blockState)) { + Axis preferred = FluidPropagator.getStraightPipeAxis(blockState); + Direction preferredDirection = + preferred == null ? Direction.UP : Direction.getFacingFromAxis(AxisDirection.POSITIVE, preferred); + BlockState updated = AllBlocks.FLUID_PIPE.get() + .updateBlockState(blockState, preferredDirection, null, world, pos); + if (updated != blockState) + world.setBlockState(pos, updated); + } + return true; + } + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java index b06e9864f..c5528de7d 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/zapper/blockzapper/BlockzapperItem.java @@ -75,20 +75,21 @@ public class BlockzapperItem extends ZapperItem { @Override public void fillItemGroup(ItemGroup group, NonNullList items) { - if (group == Create.baseCreativeTab) { - ItemStack gunWithoutStuff = new ItemStack(this); - items.add(gunWithoutStuff); + if (group != Create.baseCreativeTab && group != ItemGroup.SEARCH) + return; + + ItemStack gunWithoutStuff = new ItemStack(this); + items.add(gunWithoutStuff); - ItemStack gunWithGoldStuff = new ItemStack(this); - for (Components c : Components.values()) - setTier(c, ComponentTier.Brass, gunWithGoldStuff); - items.add(gunWithGoldStuff); + ItemStack gunWithGoldStuff = new ItemStack(this); + for (Components c : Components.values()) + setTier(c, ComponentTier.Brass, gunWithGoldStuff); + items.add(gunWithGoldStuff); - ItemStack gunWithPurpurStuff = new ItemStack(this); - for (Components c : Components.values()) - setTier(c, ComponentTier.Chromatic, gunWithPurpurStuff); - items.add(gunWithPurpurStuff); - } + ItemStack gunWithPurpurStuff = new ItemStack(this); + for (Components c : Components.values()) + setTier(c, ComponentTier.Chromatic, gunWithPurpurStuff); + items.add(gunWithPurpurStuff); } protected boolean activate(World world, PlayerEntity player, ItemStack stack, BlockState selectedState, diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java index d8b7b2c4e..2ac1b6b8d 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicHandler.java @@ -235,7 +235,7 @@ public class SchematicHandler { selectionScreen.cycle((int) delta); return true; } - if (!AllKeys.ctrlDown()) + if (AllKeys.ctrlDown()) return currentTool.getTool() .handleMouseWheel(delta); return false; diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index 1b995a0e1..d28ec3bd8 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -12,6 +12,7 @@ public class AllCommands { //general purpose .then(ToggleDebugCommand.register()) .then(OverlayConfigCommand.register()) + .then(FixLightingCommand.register()) //dev-util //Comment out for release diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index 6932543e3..908b83d85 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -10,9 +10,11 @@ import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.SimplePacketBase; +import net.minecraft.client.Minecraft; import net.minecraft.network.PacketBuffer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ForgeConfig; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.NetworkEvent; @@ -39,24 +41,27 @@ public class ConfigureConfigPacket extends SimplePacketBase { @Override public void handle(Supplier ctx) { - ctx.get().enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { - try { - Actions.valueOf(option).performAction(value); - } catch (IllegalArgumentException e) { - LogManager.getLogger().warn("Received ConfigureConfigPacket with invalid Option: " + option); - } - })); + ctx.get() + .enqueueWork(() -> DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> { + try { + Actions.valueOf(option) + .performAction(value); + } catch (IllegalArgumentException e) { + LogManager.getLogger() + .warn("Received ConfigureConfigPacket with invalid Option: " + option); + } + })); - ctx.get().setPacketHandled(true); + ctx.get() + .setPacketHandled(true); } enum Actions { rainbowDebug((value) -> { AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); }), - overlayScreen((value) -> { - overlayScreenAction(); - }), + overlayScreen(Actions::overlayScreenAction), + fixLighting(Actions::experimentalLightingAction), overlayReset((value) -> { AllConfigs.CLIENT.overlayOffsetX.set(0); AllConfigs.CLIENT.overlayOffsetY.set(0); @@ -70,14 +75,19 @@ public class ConfigureConfigPacket extends SimplePacketBase { this.consumer = action; } - void performAction(String value){ + void performAction(String value) { consumer.accept(value); } @OnlyIn(Dist.CLIENT) - private static void overlayScreenAction(){ - //this doesn't work if i move it into the enum constructor like the other two. if there's a proper way to do this, please let me know + private static void overlayScreenAction(String value) { ScreenOpener.open(new GoggleConfigScreen()); } + + @OnlyIn(Dist.CLIENT) + private static void experimentalLightingAction(String value) { + ForgeConfig.CLIENT.experimentalForgeLightPipelineEnabled.set(true); + Minecraft.getInstance().worldRenderer.loadRenderers(); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java b/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java new file mode 100644 index 000000000..7a128bced --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/FixLightingCommand.java @@ -0,0 +1,29 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.simibubi.create.foundation.networking.AllPackets; + +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.fml.network.PacketDistributor; + +public class FixLightingCommand { + + static ArgumentBuilder register() { + return Commands.literal("fixLighting") + .requires(cs -> cs.hasPermissionLevel(0)) + .executes(ctx -> { + AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource() + .getEntity()), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.fixLighting.name(), String.valueOf(true))); + + ctx.getSource() + .sendFeedback( + new StringTextComponent("Forge's experimental block rendering pipeline is now enabled."), true); + + return 1; + }); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/config/CFluids.java b/src/main/java/com/simibubi/create/foundation/config/CFluids.java index d90eaa7a4..ad8684da1 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CFluids.java +++ b/src/main/java/com/simibubi/create/foundation/config/CFluids.java @@ -4,8 +4,13 @@ public class CFluids extends ConfigBase { public ConfigInt fluidTankCapacity = i(8, 1, "fluidTankCapacity", Comments.buckets, Comments.fluidTankCapacity); public ConfigInt fluidTankMaxHeight = i(32, 1, "fluidTankMaxHeight", Comments.blocks, Comments.fluidTankMaxHeight); - public ConfigInt mechanicalPumpRange = i(16, 1, "mechanicalPumpRange", Comments.blocks, Comments.mechanicalPumpRange); - + public ConfigInt mechanicalPumpRange = + i(16, 1, "mechanicalPumpRange", Comments.blocks, Comments.mechanicalPumpRange); + + public ConfigInt hosePulleyBlockThreshold = i(10000, -1, "hosePulleyBlockThreshold", Comments.blocks, + Comments.toDisable, Comments.hosePulleyBlockThreshold); + public ConfigInt hosePulleyRange = i(128, 1, "hosePulleyRange", Comments.blocks, Comments.hosePulleyRange); + @Override public String getName() { return "fluids"; @@ -16,7 +21,13 @@ public class CFluids extends ConfigBase { static String buckets = "[in Buckets]"; static String fluidTankCapacity = "The amount of liquid a tank can hold per block."; static String fluidTankMaxHeight = "The maximum height a fluid tank can reach."; - static String mechanicalPumpRange = "The maximum distance a mechanical pump can push or pull liquids on either side."; + static String mechanicalPumpRange = + "The maximum distance a mechanical pump can push or pull liquids on either side."; + + static String hosePulleyRange = "The maximum distance a hose pulley can draw fluid blocks from."; + static String toDisable = "[-1 to disable this behaviour]"; + static String hosePulleyBlockThreshold = + "The minimum amount of fluid blocks the hose pulley needs to find before deeming it an infinite source."; } } diff --git a/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java b/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java new file mode 100644 index 000000000..64512db71 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/DirectionalAxisBlockStateGen.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.data; + +import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraftforge.client.model.generators.ModelFile; + +public abstract class DirectionalAxisBlockStateGen extends SpecialBlockStateGen { + + @Override + protected int getXRotation(BlockState state) { + Direction direction = state.get(GaugeBlock.FACING); + boolean alongFirst = state.get(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); + + if (direction == Direction.DOWN) + return 180; + if (direction == Direction.UP) + return 0; + if ((direction.getAxis() == Axis.X) == alongFirst) + return 90; + + return 0; + } + + @Override + protected int getYRotation(BlockState state) { + Direction direction = state.get(GaugeBlock.FACING); + boolean alongFirst = state.get(GaugeBlock.AXIS_ALONG_FIRST_COORDINATE); + + if (direction.getAxis() + .isVertical()) + return alongFirst ? 90 : 0; + + return horizontalAngle(direction) + 90; + } + + public abstract String getModelPrefix(DataGenContext ctx, + RegistrateBlockstateProvider prov, BlockState state); + + @Override + public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, + BlockState state) { + boolean vertical = state.get(GaugeBlock.FACING) + .getAxis() + .isVertical(); + String partial = vertical ? "" : "_wall"; + return prov.models() + .getExistingFile(prov.modLoc(getModelPrefix(ctx, prov, state) + partial)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java index 22ba2e61e..035fcc2f8 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CreateRecipeProvider.java @@ -13,6 +13,7 @@ import net.minecraft.data.DataGenerator; import net.minecraft.data.IFinishedRecipe; import net.minecraft.data.RecipeProvider; import net.minecraft.item.Item; +import net.minecraft.tags.ItemTags; import net.minecraft.tags.Tag; import net.minecraft.util.IItemProvider; import net.minecraftforge.common.Tags; @@ -49,6 +50,10 @@ public abstract class CreateRecipeProvider extends RecipeProvider { static Tag redstone() { return Tags.Items.DUSTS_REDSTONE; } + + static Tag planks() { + return ItemTags.PLANKS; + } static Tag gold() { return AllTags.forgeItemTag("ingots/gold"); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index e4c01edf1..c8f1c91e3 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -422,6 +422,22 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("SCS") .patternLine(" I ")), + WOODEN_BRACKET = create(AllBlocks.WOODEN_BRACKET).returns(4) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', Tags.Items.RODS_WOODEN) + .key('P', I.planks()) + .key('C', I.andesite()) + .patternLine("SSS") + .patternLine("PCP")), + + METAL_BRACKET = create(AllBlocks.METAL_BRACKET).returns(4) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('S', Tags.Items.NUGGETS_IRON) + .key('P', I.iron()) + .key('C', I.andesite()) + .patternLine("SSS") + .patternLine("PCP")), + FLUID_PIPE = create(AllBlocks.FLUID_PIPE).returns(16) .unlockedByTag(I::copper) .viaShaped(b -> b.key('S', I.copperSheet()) @@ -457,10 +473,9 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("T") .patternLine("P") .patternLine("S")), - + ITEM_DRAIN = create(AllBlocks.ITEM_DRAIN).unlockedBy(I::copperCasing) - .viaShaped(b -> b - .key('P', Blocks.IRON_BARS) + .viaShaped(b -> b.key('P', Blocks.IRON_BARS) .key('S', I.copperCasing()) .patternLine("P") .patternLine("S")), @@ -499,8 +514,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine(" I ")), HOSE_PULLEY = create(AllBlocks.HOSE_PULLEY).unlockedByTag(I::copper) - .viaShaped(b -> b - .key('S', I.shaft()) + .viaShaped(b -> b.key('S', I.shaft()) .key('P', AllBlocks.FLUID_PIPE.get()) .key('B', I.copperCasing()) .key('C', Items.DRIED_KELP) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index d740798a3..27f9e9f78 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -12,6 +12,8 @@ import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.utility.Pair; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; @@ -43,6 +45,11 @@ public class FluidHelper { public static boolean isLava(Fluid fluid) { return convertToStill(fluid) == Fluids.LAVA; } + + public static boolean hasBlockState(Fluid fluid) { + BlockState blockState = fluid.getDefaultState().getBlockState(); + return blockState != null && blockState != Blocks.AIR.getDefaultState(); + } public static Fluid convertToFlowing(Fluid fluid) { if (fluid == Fluids.WATER) diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java index d7b0e50fa..12580778a 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.fluid; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.function.Predicate; @@ -13,6 +14,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; +import net.minecraft.fluid.FlowingFluid; import net.minecraft.fluid.Fluid; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.PacketBuffer; @@ -180,7 +182,8 @@ public abstract class FluidIngredient implements Predicate { @Override protected List determineMatchingFluidStacks() { - return ImmutableList.of(new FluidStack(fluid, amountRequired, tagToMatch)); + return ImmutableList.of(tagToMatch.isEmpty() ? new FluidStack(fluid, amountRequired) + : new FluidStack(fluid, amountRequired, tagToMatch)); } } @@ -191,20 +194,30 @@ public abstract class FluidIngredient implements Predicate { @Override protected boolean testInternal(FluidStack t) { + if (tag == null) + for (FluidStack accepted : getMatchingFluidStacks()) + if (accepted.getFluid() + .isEquivalentTo(t.getFluid())) + return true; return t.getFluid() .isIn(tag); } @Override protected void readInternal(PacketBuffer buffer) { - ResourceLocation resourcelocation = buffer.readResourceLocation(); - tag = FluidTags.getContainer() - .get(resourcelocation); + int size = buffer.readVarInt(); + matchingFluidStacks = new ArrayList<>(size); + for (int i = 0; i < size; i++) + matchingFluidStacks.add(buffer.readFluidStack()); } @Override protected void writeInternal(PacketBuffer buffer) { - buffer.writeResourceLocation(tag.getId()); + // Tag has to be resolved on the server before sending + List matchingFluidStacks = getMatchingFluidStacks(); + buffer.writeVarInt(matchingFluidStacks.size()); + matchingFluidStacks.stream() + .forEach(buffer::writeFluidStack); } @Override @@ -226,6 +239,12 @@ public abstract class FluidIngredient implements Predicate { protected List determineMatchingFluidStacks() { return tag.getAllElements() .stream() + .map(f -> { + if (f instanceof FlowingFluid) + return ((FlowingFluid) f).getStillFluid(); + return f; + }) + .distinct() .map(f -> new FluidStack(f, amountRequired)) .collect(Collectors.toList()); } diff --git a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java index bffc55da2..8b856cf94 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java +++ b/src/main/java/com/simibubi/create/foundation/gui/GuiGameElement.java @@ -11,6 +11,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.VirtualEmptyModelData; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -175,7 +176,7 @@ public class GuiGameElement { Vec3d rgb = ColorHelper.getRGB(color); blockRenderer.getBlockModelRenderer() .renderModel(ms.peek(), vb, blockState, blockmodel, (float) rgb.x, (float) rgb.y, (float) rgb.z, - 0xF000F0, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + 0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); buffer.draw(); } } @@ -194,7 +195,7 @@ public class GuiGameElement { if (blockState.getBlock() instanceof FireBlock) { RenderHelper.disableGuiDepthLighting(); blockRenderer.renderBlock(blockState, ms, buffer, 0xF000F0, OverlayTexture.DEFAULT_UV, - EmptyModelData.INSTANCE); + VirtualEmptyModelData.INSTANCE); RenderHelper.enable(); buffer.draw(); return; diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java index 0a46c4c3a..f37b65912 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java @@ -24,7 +24,6 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; -import net.minecraftforge.client.model.data.EmptyModelData; public class SuperByteBufferCache { @@ -116,7 +115,7 @@ public class SuperByteBufferCache { builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); blockRenderer.renderModel(mc.world, model, referenceState, BlockPos.ZERO.up(255), ms, builder, true, - mc.world.rand, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + mc.world.rand, 42, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE); builder.finishDrawing(); return new SuperByteBuffer(builder); diff --git a/src/main/java/com/simibubi/create/foundation/utility/VirtualEmptyModelData.java b/src/main/java/com/simibubi/create/foundation/utility/VirtualEmptyModelData.java new file mode 100644 index 000000000..1c9b35287 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/VirtualEmptyModelData.java @@ -0,0 +1,30 @@ +package com.simibubi.create.foundation.utility; + +import net.minecraftforge.client.model.data.IModelData; +import net.minecraftforge.client.model.data.ModelProperty; + +/** + * This model data instance is passed whenever a model is rendered without + * available in-world context. IBakedModel#getModelData can react accordingly + * and avoid looking for model data itself + **/ +public enum VirtualEmptyModelData implements IModelData { + + INSTANCE; + + @Override + public boolean hasProperty(ModelProperty prop) { + return false; + } + + @Override + public T getData(ModelProperty prop) { + return null; + } + + @Override + public T setData(ModelProperty prop, T data) { + return null; + } + +} diff --git a/src/main/resources/assets/create/models/block/bracket/cog/ground.json b/src/main/resources/assets/create/models/block/bracket/cog/ground.json new file mode 100644 index 000000000..d219fe22e --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/cog/ground.json @@ -0,0 +1,208 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "#plate", + "5": "#bracket" + }, + "elements": [ + { + "from": [11.9, 3, 2], + "to": [14, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, -24]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 3, 2], + "to": [11.9, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, -24]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 2], + "to": [4.1, 6, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, -24]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 2], + "to": [4.1, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, -24]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 3.5], + "to": [13.5, 14, 4.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, -16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 2], + "to": [14, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, -24]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 3.5], + "to": [3.5, 14, 4.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, -16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 3, 10], + "to": [14, 6, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, -16]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 3, 10], + "to": [11.9, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, -16]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 10], + "to": [4.1, 6, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, -16]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 10], + "to": [4.1, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, -16]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 11.5], + "to": [13.5, 14, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, -8]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 10], + "to": [14, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, -16]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 11.5], + "to": [3.5, 14, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, -8]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [1, 0, 1], + "to": [15, 3, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "faces": { + "north": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "east": {"uv": [0, 13, 5, 16], "rotation": 180, "texture": "#5"}, + "south": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "west": {"uv": [0, 13, 5, 16], "texture": "#5"}, + "up": {"uv": [9, 2, 14, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [9, 2, 14, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [1, 0, 10], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 1.5, 8]}, + "faces": { + "north": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "east": {"uv": [0, 13, 5, 16], "texture": "#5"}, + "south": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "west": {"uv": [0, 13, 5, 16], "rotation": 180, "texture": "#5"}, + "up": {"uv": [9, 2, 14, 16], "rotation": 270, "texture": "#4"}, + "down": {"uv": [9, 2, 14, 16], "rotation": 270, "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bracket/cog/wall.json b/src/main/resources/assets/create/models/block/bracket/cog/wall.json new file mode 100644 index 000000000..46a608c9f --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/cog/wall.json @@ -0,0 +1,206 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [32, 32], + "textures": { + "4": "#plate", + "5": "#bracket", + "particle": "#plate" + }, + "elements": [ + { + "from": [3, 2, 2], + "to": [6, 4.1, 6], + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 4.1, 2], + "to": [13, 11.9, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 90, "texture": "#5"}, + "east": {"uv": [8, 6, 16, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 270, "texture": "#5"}, + "up": {"uv": [7, 0, 8, 10], "rotation": 90, "texture": "#5"}, + "down": {"uv": [7, 0, 8, 10], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 11.9, 2], + "to": [6, 14, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [10, 11.9, 2], + "to": [13, 14, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 2.5, 3.5], + "to": [14, 3.5, 4.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -4, 8]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [10, 2, 2], + "to": [13, 4.1, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -2, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 12.5, 3.5], + "to": [14, 13.5, 4.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [3, 2, 10], + "to": [6, 4.1, 14], + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 4.1, 10], + "to": [13, 11.9, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 90, "texture": "#5"}, + "east": {"uv": [8, 6, 16, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 270, "texture": "#5"}, + "up": {"uv": [7, 0, 8, 10], "rotation": 90, "texture": "#5"}, + "down": {"uv": [7, 0, 8, 10], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 11.9, 10], + "to": [6, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [10, 11.9, 10], + "to": [13, 14, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 2.5, 11.5], + "to": [14, 3.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -4, 8]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [10, 2, 10], + "to": [13, 4.1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -2, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 12.5, 11.5], + "to": [14, 13.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 8]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [0, 1, 1], + "to": [3, 15, 6], + "faces": { + "north": {"uv": [0, 10, 14, 13], "rotation": 270, "texture": "#5"}, + "east": {"uv": [9, 2, 14, 16], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 10, 14, 13], "rotation": 90, "texture": "#5"}, + "west": {"uv": [9, 2, 14, 16], "rotation": 180, "texture": "#4"}, + "up": {"uv": [0, 13, 5, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 13, 5, 16], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [0, 1, 10], + "to": [3, 15, 15], + "faces": { + "north": {"uv": [0, 10, 14, 13], "rotation": 270, "texture": "#5"}, + "east": {"uv": [9, 2, 14, 16], "texture": "#4"}, + "south": {"uv": [0, 10, 14, 13], "rotation": 90, "texture": "#5"}, + "west": {"uv": [9, 2, 14, 16], "texture": "#4"}, + "up": {"uv": [0, 13, 5, 16], "rotation": 270, "texture": "#5"}, + "down": {"uv": [0, 13, 5, 16], "rotation": 90, "texture": "#5"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bracket/item.json b/src/main/resources/assets/create/models/block/bracket/item.json new file mode 100644 index 000000000..7026004ef --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/item.json @@ -0,0 +1,110 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "#plate", + "5": "#bracket", + "particle": "#plate" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 0, 1.5]}, + "faces": { + "north": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "east": {"uv": [0, 13, 14, 16], "texture": "#5"}, + "south": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "west": {"uv": [0, 13, 14, 16], "texture": "#5"}, + "up": {"uv": [0, 2, 14, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 2, 14, 16], "rotation": 270, "texture": "#4"} + } + }, + { + "from": [11.9, 3, 6], + "to": [14, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 3, 6], + "to": [11.9, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, 8]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 6], + "to": [4.1, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 6], + "to": [4.1, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 7.5], + "to": [13.5, 14, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 6], + "to": [14, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 7.5], + "to": [3.5, 14, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bracket/pipe/ground.json b/src/main/resources/assets/create/models/block/bracket/pipe/ground.json new file mode 100644 index 000000000..6ba942bb8 --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/pipe/ground.json @@ -0,0 +1,119 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "#plate", + "5": "#bracket", + "particle": "#plate" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 0, 1.5]}, + "faces": { + "north": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "east": {"uv": [0, 13, 14, 16], "texture": "#5"}, + "south": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "west": {"uv": [0, 13, 14, 16], "texture": "#5"}, + "up": {"uv": [0, 2, 14, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 2, 14, 16], "rotation": 270, "texture": "#4"} + } + }, + { + "from": [11.9, 3, 6], + "to": [14, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 11, 6], + "to": [11.9, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, 8]}, + "faces": { + "north": {"uv": [8, 8, 16, 10], "rotation": 180, "texture": "#5"}, + "south": {"uv": [8, 6, 16, 8], "rotation": 180, "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"}, + "down": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [4.1, 3, 6], + "to": [11.9, 5, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [10, -3.5, 8]}, + "faces": { + "north": {"uv": [8, 8, 16, 10], "rotation": 180, "texture": "#5"}, + "south": {"uv": [8, 6, 16, 8], "rotation": 180, "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 6], + "to": [4.1, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 6], + "to": [4.1, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 7.5], + "to": [13.5, 14, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 6], + "to": [14, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 7.5], + "to": [3.5, 14, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bracket/pipe/wall.json b/src/main/resources/assets/create/models/block/bracket/pipe/wall.json new file mode 100644 index 000000000..99e579880 --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/pipe/wall.json @@ -0,0 +1,110 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "#plate", + "5": "#bracket", + "particle": "#plate" + }, + "elements": [ + { + "from": [0, 1, 1], + "to": [3, 15, 15], + "faces": { + "north": {"uv": [0, 10, 14, 13], "rotation": 270, "texture": "#5"}, + "east": {"uv": [0, 2, 14, 16], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 10, 14, 13], "rotation": 90, "texture": "#5"}, + "west": {"uv": [0, 2, 14, 16], "texture": "#4"}, + "up": {"uv": [0, 13, 14, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 13, 14, 16], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 2, 6], + "to": [6, 4.1, 10], + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [11, 4.1, 6], + "to": [13, 11.9, 10], + "faces": { + "north": {"uv": [8, 8, 16, 10], "rotation": 90, "texture": "#5"}, + "east": {"uv": [8, 6, 16, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [8, 6, 16, 8], "rotation": 270, "texture": "#5"}, + "west": {"uv": [8, 6, 16, 10], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 4.1, 6], + "to": [5, 11.9, 10], + "faces": { + "north": {"uv": [8, 8, 16, 10], "rotation": 90, "texture": "#5"}, + "east": {"uv": [8, 6, 16, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [8, 6, 16, 8], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [3, 11.9, 6], + "to": [6, 14, 10], + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [10, 11.9, 6], + "to": [13, 14, 10], + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 2.5, 7.5], + "to": [14, 3.5, 8.5], + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [10, 2, 6], + "to": [13, 4.1, 10], + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 12.5, 7.5], + "to": [14, 13.5, 8.5], + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bracket/shaft/ground.json b/src/main/resources/assets/create/models/block/bracket/shaft/ground.json new file mode 100644 index 000000000..7026004ef --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/shaft/ground.json @@ -0,0 +1,110 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "#plate", + "5": "#bracket", + "particle": "#plate" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [15, 3, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [1.5, 0, 1.5]}, + "faces": { + "north": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "east": {"uv": [0, 13, 14, 16], "texture": "#5"}, + "south": {"uv": [0, 10, 14, 13], "texture": "#5"}, + "west": {"uv": [0, 13, 14, 16], "texture": "#5"}, + "up": {"uv": [0, 2, 14, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [0, 2, 14, 16], "rotation": 270, "texture": "#4"} + } + }, + { + "from": [11.9, 3, 6], + "to": [14, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [4.1, 3, 6], + "to": [11.9, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 4.5, 8]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [7, 0, 8, 10], "texture": "#5"}, + "up": {"uv": [8, 6, 16, 10], "texture": "#5"} + } + }, + { + "from": [2, 3, 6], + "to": [4.1, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 4.5, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [2, 10, 6], + "to": [4.1, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 11.5, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "west": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 270, "texture": "#5"} + } + }, + { + "from": [12.5, 6, 7.5], + "to": [13.5, 14, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [20, 14, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + }, + { + "from": [11.9, 10, 6], + "to": [14, 13, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [18, 11.5, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "texture": "#5"}, + "east": {"uv": [10, 3, 14, 6], "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "texture": "#5"}, + "up": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"}, + "down": {"uv": [10, 1, 14, 3], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [2.5, 6, 7.5], + "to": [3.5, 14, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [10, 14, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [14, 8, 15, 16], "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [15, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [14, 7, 15, 8], "texture": "#4"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/bracket/shaft/wall.json b/src/main/resources/assets/create/models/block/bracket/shaft/wall.json new file mode 100644 index 000000000..6fabc5b7f --- /dev/null +++ b/src/main/resources/assets/create/models/block/bracket/shaft/wall.json @@ -0,0 +1,110 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "4": "#plate", + "5": "#bracket", + "particle": "#plate" + }, + "elements": [ + { + "from": [0, 1, 1], + "to": [3, 15, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 14.5, 1.5]}, + "faces": { + "north": {"uv": [0, 10, 14, 13], "rotation": 270, "texture": "#5"}, + "east": {"uv": [0, 2, 14, 16], "rotation": 180, "texture": "#4"}, + "south": {"uv": [0, 10, 14, 13], "rotation": 90, "texture": "#5"}, + "west": {"uv": [0, 2, 14, 16], "texture": "#4"}, + "up": {"uv": [0, 13, 14, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 13, 14, 16], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 2, 6], + "to": [6, 4.1, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 8, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 4.1, 6], + "to": [13, 11.9, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 6, 8]}, + "faces": { + "north": {"uv": [0, 0, 8, 10], "rotation": 90, "texture": "#5"}, + "east": {"uv": [8, 6, 16, 10], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 0, 8, 10], "rotation": 270, "texture": "#5"}, + "up": {"uv": [7, 0, 8, 10], "rotation": 90, "texture": "#5"}, + "down": {"uv": [7, 0, 8, 10], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [3, 11.9, 6], + "to": [6, 14, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 13, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [10, 11.9, 6], + "to": [13, 14, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [11.5, 13, 8]}, + "faces": { + "north": {"uv": [10, 3, 8, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "south": {"uv": [8, 3, 10, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "texture": "#5"}, + "up": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 2.5, 7.5], + "to": [14, 3.5, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, -4, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + }, + { + "from": [10, 2, 6], + "to": [13, 4.1, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [11.5, -2, 8]}, + "faces": { + "north": {"uv": [8, 3, 10, 6], "rotation": 270, "texture": "#5"}, + "east": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 3, 8, 6], "rotation": 90, "texture": "#5"}, + "west": {"uv": [10, 1, 14, 3], "rotation": 180, "texture": "#5"}, + "down": {"uv": [10, 3, 14, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "from": [6, 12.5, 7.5], + "to": [14, 13.5, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 6, 16]}, + "faces": { + "north": {"uv": [15, 8, 16, 16], "rotation": 270, "texture": "#4"}, + "east": {"uv": [14, 7, 15, 8], "rotation": 90, "texture": "#4"}, + "south": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "west": {"uv": [0, 0, 0, 0], "rotation": 90, "texture": "#4"}, + "up": {"uv": [15, 8, 16, 16], "rotation": 90, "texture": "#4"}, + "down": {"uv": [14, 8, 15, 16], "rotation": 90, "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json index fb5f533ee..3b21d585d 100644 --- a/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json +++ b/src/main/resources/assets/create/models/block/fluid_tank/block_single_window.json @@ -4,7 +4,7 @@ "textures": { "0": "create:block/copper_casing", "1": "create:block/fluid_tank", - "5": "create:block/fluid_tank_window_single", + "4": "create:block/fluid_tank_window_single", "particle": "#1" }, "elements": [ @@ -69,8 +69,8 @@ "to": [12, 12, 1], "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]}, "faces": { - "north": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "north"}, - "south": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "north"} + "north": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "north"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "north"} } }, { @@ -78,8 +78,8 @@ "from": [15, 4, 4], "to": [15, 12, 12], "faces": { - "east": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "east"}, - "west": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "east"} + "east": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "east"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "east"} } }, { @@ -87,8 +87,8 @@ "from": [4, 4, 15], "to": [12, 12, 15], "faces": { - "north": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "south"}, - "south": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "south"} + "north": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "south"}, + "south": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "south"} } }, { @@ -96,8 +96,8 @@ "from": [1, 4, 4], "to": [1, 12, 12], "faces": { - "east": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "west"}, - "west": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "west"} + "east": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "west"}, + "west": {"uv": [0, 0, 8, 8], "texture": "#4", "cullface": "west"} } }, { diff --git a/src/main/resources/assets/create/particles/fluid_drip.json b/src/main/resources/assets/create/particles/fluid_drip.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/src/main/resources/assets/create/particles/fluid_drip.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/create/particles/fluid_particle.json b/src/main/resources/assets/create/particles/fluid_particle.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/src/main/resources/assets/create/particles/fluid_particle.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/bracket_metal.png b/src/main/resources/assets/create/textures/block/bracket_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..de7116d14db7cefe753e797243d0de8c144325be GIT binary patch literal 514 zcmV+d0{#7oP)7<5jRrT(`^6%0gp*U zK~y-)os!XR(=Zf=y)Z}1 zE+U%*q#^acI*yM0f9F3Dmmfbh0JSk#Nu?P2K6|ZsJ%1y3M)F?Ylcos(VK@e$D0To` zU*EXK@5^tEeY7@)#o|-|$TUsZW*N)Xifx_)5JwU7*^D$zxO|(FycqL2Z!fn-;U5Bk z$4SDMuaC`M|6u6*ZcO_Sz)={EopV>)JSPmt4!I}_q*5-Q9>H^}jlq~2 z&-dKLE`cnH9dQ)(MzA>)#m>1}3cIB||Jm%dZVBeInZxde_%{XMNGye1uh&ecQ{p7~ zXN^}^8A?eW9)1HL#DMN90mQ|{ho;+ba`Lj*AeBPz?+{{u=X*UOr6h8(I0c|AOM)P9 zHPAa(l_rW_x%%c;DQ@pH;{5!5!vPWlB|OhVo}ImO?$+75ch6Q;)rO}l!zc(i;y_I% z3Abh0j-Zruf&K5N0x+f~o=nB)c-W3`NQk53A)8Ic6M+Bc@Ae?pR{#J207*qoM6N<$ Ef{2RS`Tzg` literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/bracket_plate_metal.png b/src/main/resources/assets/create/textures/block/bracket_plate_metal.png new file mode 100644 index 0000000000000000000000000000000000000000..cdde8144ccb7469d425e8320536e7495e85af355 GIT binary patch literal 489 zcmV7<5f&c4!!rN?0d`45 zK~y-)rITMz+b|Txf9-51c9=o5s-S?jAt9vlr7H1l;S)?euIf-9(B`xuwX=l>u$urc zh$BVHzjN<7=Uxxy^J_kXA)kZ*TIU?rTAXv~!|UgWx~>42OpXSz0E@-14|P2~J=I=5-&^lfK5r~UviDos_Fw9}sVbTfXhKN;Ip;X}cHZ{J*o2T& z38~>=M1dM~=9?x#6*@`itcK7Ns(Tl!+YebPMIVc|QZC zG5|8AdgQLEZit7Y5yQAy5k*m?v|}Dpij+?bQESatYZ*=^M*v)0T=vM?Xq3v(Mkn%* z@8_w=bb3tb93om+t?m&*^weZZ_1?urs_TmIzhyc-M$~o1csxqMbPrK?LSAx5AI1D2sDDD6N0nJH7 zK~y-)rISxf8&MR+f2IcV-X!7il8~7Mti&wb3APjoZu=3s6`|j(+kOPQEtHfZ5(_Rg zO2AD1*kRPno6s22#W2q#ZCBpqy_|c_J?FiRwG8kP#}+=N}SROA8iRX&IE01K`RZ<7&yL zZ{XF-&kB^2YtKiBX+nLBp?!$oJPfv@Cr}RJNE+-O3i3e5f*xC1XoAb_j zqQFy{y=KKSuPgbVH!CKl(Jcekfx{rO$^dk!l$e+{)|mnPFhFD_CZ1E(j$JB*pinHb znF5mSBg=BFNA@9g!wG}HFbpEXXo{yawVI^g_mc%D7n;N7gvRz3ei#6-<5gDvf>$@3 zc6yv#XpRoxaS~Chd1S7;BR;$_)`K*aG{WVxTrD{|fbLC?Lf)a@_xS^P_}%FRmgIN< O00005AI46&o(XIdh0tHD# zK~y-)g_F&0(?AqPkK3ta$FV!I)1;F~q-q|3Mf(a}QntJe8{UHz5?k2z6<~pc#D=sD zQaUt0*2He?N=aoFj)w#!xRND%Ja_K>zH`TU`{qR{eHXKQ1VH*O0Nz0ZfcKw-!#_e4 z=7Eo&1t2&)i~v|H5+LPbV1QEqUY)PYhPO{%JW;H2K70us0C6>x+-uG4XvFN z$Ngl2lred+rdZ_^tI8K`lFg3lfIa>b#VWT3Ym*>-*BT8V7K?;VyS*c!_Q9AraDen( z;xMq<=V`{v=V=*-0RrHp-?wdVo9H->#W_#29SPER8R{wGVqmyJ(NXFTjBqh9XtPGi zXh#BoSw13t7vae!muKtEk91Qp++Yi>^U%PP4J$EL0eSI+sHd>jS0fwhDFbz66SPU} z_dLyb{qCnzG2HdyWCt)Xn6a?VZcBgSxMV#H`moz>+y_kSCOSD;`HQMg)mw2_1g`e zZ0=OAFHgNkn*>ib$-Xb?b`^Wqw?8WOk&o)Nc97Li-F_$XE1Bkjpy_jWr}+g`@A+B% SwwGf70000 Date: Fri, 6 Nov 2020 19:45:38 +0100 Subject: [PATCH 34/36] Spinny vortex - Crushing wheels no longer z-fight with chutes - Improved rendering of items and fluids inside basins --- .../com/simibubi/create/AllParticleTypes.java | 1 + .../mixer/MechanicalMixerTileEntity.java | 56 ++-- .../content/contraptions/fluids/FluidFX.java | 10 +- .../fluids/particle/BasinFluidParticle.java | 100 +++++++ .../fluids/particle/FluidParticleData.java | 3 +- .../fluids/particle/FluidStackParticle.java | 37 ++- .../processing/BasinRenderer.java | 110 +++++--- .../processing/BasinTileEntity.java | 255 ++++++++++++++++-- .../fluid/SmartFluidTankBehaviour.java | 10 + .../create/foundation/utility/Couple.java | 38 ++- .../foundation/utility/IntAttached.java | 37 +++ .../block/belt_funnel/block_extended.json | 17 +- .../block/belt_funnel/block_retracted.json | 19 +- .../create/models/block/crushing_wheel.json | 175 ++++++------ .../assets/create/particles/basin_fluid.json | 1 + .../textures/block/crushing_wheel_body.png | Bin 1363 -> 826 bytes 16 files changed, 672 insertions(+), 197 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/IntAttached.java create mode 100644 src/main/resources/assets/create/particles/basin_fluid.json diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index b3d85867a..03726b2ef 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -30,6 +30,7 @@ public enum AllParticleTypes { HEATER_PARTICLE(HeaterParticleData::new), CUBE(CubeParticleData::new), FLUID_PARTICLE(FluidParticleData::new), + BASIN_FLUID(FluidParticleData::new), FLUID_DRIP(FluidParticleData::new) ; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java index 7177d4fac..7e1e92bc0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerTileEntity.java @@ -5,6 +5,7 @@ import java.util.Optional; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.potion.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; @@ -12,6 +13,8 @@ import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.ITriggerable; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.SmartInventory; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.inventory.IInventory; @@ -19,6 +22,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.IParticleData; import net.minecraft.particles.ItemParticleData; import net.minecraft.particles.ParticleTypes; import net.minecraft.tileentity.TileEntityType; @@ -86,6 +90,9 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { running = compound.getBoolean("Running"); runningTicks = compound.getInt("Ticks"); super.read(compound, clientPacket); + + if (clientPacket && hasWorld()) + getBasin().ifPresent(bte -> bte.setAreFluidsMoving(running && runningTicks <= 20)); } @Override @@ -127,7 +134,6 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (runningTicks != 20) runningTicks++; } - } public void renderParticles() { @@ -135,24 +141,38 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity { if (!basin.isPresent() || world == null) return; - SmartInventory inputs = basin.get() - .getInputInventory(); - for (int slot = 0; slot < inputs.getSlots(); slot++) { - ItemStack stackInSlot = inputs.getStackInSlot(slot); - if (stackInSlot.isEmpty()) - continue; - - ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot); - float angle = world.rand.nextFloat() * 360; - Vec3d offset = new Vec3d(0, 0, 0.25f); - offset = VecHelper.rotate(offset, angle, Axis.Y); - Vec3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y) - .add(0, .25f, 0); - - Vec3d center = offset.add(VecHelper.getCenterOf(pos)); - target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f); - world.addParticle(data, center.x, center.y - 2, center.z, target.x, target.y, target.z); + for (SmartInventory inv : basin.get() + .getInvs()) { + for (int slot = 0; slot < inv.getSlots(); slot++) { + ItemStack stackInSlot = inv.getStackInSlot(slot); + if (stackInSlot.isEmpty()) + continue; + ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot); + spillParticle(data); + } } + + for (SmartFluidTankBehaviour behaviour : basin.get() + .getTanks()) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + if (tankSegment.isEmpty(0)) + continue; + spillParticle(FluidFX.getFluidParticle(tankSegment.getRenderedFluid())); + } + } + } + + protected void spillParticle(IParticleData data) { + float angle = world.rand.nextFloat() * 360; + Vec3d offset = new Vec3d(0, 0, 0.25f); + offset = VecHelper.rotate(offset, angle, Axis.Y); + Vec3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y) + .add(0, .25f, 0); + Vec3d center = offset.add(VecHelper.getCenterOf(pos)); + target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f); + world.addParticle(data, center.x, center.y - 1.75f, center.z, target.x, target.y, target.z); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java index dd9e02978..6f02282af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFX.java @@ -45,10 +45,6 @@ public class FluidFX { } public static IParticleData getFluidParticle(FluidStack fluid) { - if (FluidHelper.hasBlockState(fluid.getFluid())) - return new BlockParticleData(ParticleTypes.BLOCK, fluid.getFluid() - .getDefaultState() - .getBlockState()); return new FluidParticleData(AllParticleTypes.FLUID_PARTICLE.get(), fluid); } @@ -82,17 +78,17 @@ public class FluidFX { public static void spawnPouringLiquid(World world, BlockPos pos, int amount, IParticleData particle, float rimRadius, Vec3d directionVec, boolean inbound) { for (int i = 0; i < amount; i++) { - Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, rimRadius); + Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, rimRadius * .75f); vec = vec.mul(VecHelper.axisAlingedPlaneOf(directionVec)) .add(directionVec.scale(.5 + r.nextFloat() / 4f)); - Vec3d m = vec; + Vec3d m = vec.scale(1 / 4f); Vec3d centerOf = VecHelper.getCenterOf(pos); vec = vec.add(centerOf); if (inbound) { vec = vec.add(m); m = centerOf.add(directionVec.scale(.5)) .subtract(vec) - .scale(3); + .scale(1 / 16f); } world.addOptionalParticle(particle, vec.x, vec.y - 1 / 16f, vec.z, m.x, m.y, m.z); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java new file mode 100644 index 000000000..44c1bafab --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/BasinFluidParticle.java @@ -0,0 +1,100 @@ +package com.simibubi.create.content.contraptions.fluids.particle; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.processing.BasinTileEntity; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.Quaternion; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidStack; + +public class BasinFluidParticle extends FluidStackParticle { + + BlockPos basinPos; + Vec3d targetPos; + Vec3d centerOfBasin; + float yOffset; + + public BasinFluidParticle(World world, FluidStack fluid, double x, double y, double z, double vx, double vy, + double vz) { + super(world, fluid, x, y, z, vx, vy, vz); + particleGravity = 0; + motionX = 0; + motionY = 0; + motionZ = 0; + yOffset = world.rand.nextFloat() * 1 / 32f; + posY += yOffset; + particleScale = 0; + maxAge = 60; + Vec3d currentPos = new Vec3d(posX, posY, posZ); + basinPos = new BlockPos(currentPos); + centerOfBasin = VecHelper.getCenterOf(basinPos); + + if (vx != 0) { + maxAge = 20; + Vec3d centerOf = VecHelper.getCenterOf(basinPos); + Vec3d diff = currentPos.subtract(centerOf) + .mul(1, 0, 1) + .normalize() + .scale(.375); + targetPos = centerOf.add(diff); + prevPosX = posX = centerOfBasin.x; + prevPosZ = posZ = centerOfBasin.z; + } + } + + @Override + public void tick() { + super.tick(); + particleScale = targetPos != null ? Math.max(1 / 32f, ((1f * age) / maxAge) / 8) + : 1 / 8f * (1 - ((Math.abs(age - (maxAge / 2)) / (1f * maxAge)))); + + if (age % 2 == 0) { + if (!AllBlocks.BASIN.has(world.getBlockState(basinPos))) { + setExpired(); + return; + } + + TileEntity tileEntity = world.getTileEntity(basinPos); + if (tileEntity instanceof BasinTileEntity) { + float totalUnits = ((BasinTileEntity) tileEntity).getTotalFluidUnits(); + if (totalUnits < 1) + totalUnits = 0; + float fluidLevel = MathHelper.clamp(totalUnits / 2000, 0, 1); + posY = 2 / 16f + basinPos.getY() + 12 / 16f * fluidLevel + yOffset; + } + + } + + if (targetPos != null) { + float progess = (1f * age) / maxAge; + Vec3d currentPos = centerOfBasin.add(targetPos.subtract(centerOfBasin) + .scale(progess)); + posX = currentPos.x; + posZ = currentPos.z; + } + } + + @Override + public void buildGeometry(IVertexBuilder vb, ActiveRenderInfo info, float pt) { + Quaternion rotation = info.getRotation(); + Quaternion prevRotation = new Quaternion(rotation); + rotation.set(1, 0, 0, 1); + rotation.normalize(); + super.buildGeometry(vb, info, pt); + rotation.set(0, 0, 0, 1); + rotation.multiply(prevRotation); + } + + @Override + protected boolean canEvaporate() { + return false; + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java index 6e06adf33..2812d3d76 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidParticleData.java @@ -30,7 +30,8 @@ public class FluidParticleData implements IParticleData, ICustomParticleData getFactory() { - return (data, world, x, y, z, vx, vy, vz) -> new FluidStackParticle(world, data.fluid, x, y, z, vx, vy, vz); + return (data, world, x, y, z, vx, vy, vz) -> FluidStackParticle.create(data.type, world, data.fluid, x, y, z, + vx, vy, vz); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java index 82a269418..d0868a468 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/particle/FluidStackParticle.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.fluids.particle; +import com.simibubi.create.AllParticleTypes; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluid; import com.simibubi.create.foundation.utility.ColorHelper; @@ -7,6 +8,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.particle.IParticleRenderType; import net.minecraft.client.particle.SpriteTexturedParticle; import net.minecraft.inventory.container.PlayerContainer; +import net.minecraft.particles.ParticleType; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -17,6 +19,13 @@ public class FluidStackParticle extends SpriteTexturedParticle { private final float field_217588_H; private FluidStack fluid; + public static FluidStackParticle create(ParticleType type, World world, FluidStack fluid, double x, + double y, double z, double vx, double vy, double vz) { + if (type == AllParticleTypes.BASIN_FLUID.get()) + return new BasinFluidParticle(world, fluid, x, y, z, vx, vy, vz); + return new FluidStackParticle(world, fluid, x, y, z, vx, vy, vz); + } + public FluidStackParticle(World world, FluidStack fluid, double x, double y, double z, double vx, double vy, double vz) { super(world, x, y, z, vx, vy, vz); @@ -34,14 +43,25 @@ public class FluidStackParticle extends SpriteTexturedParticle { this.multiplyColor(fluid.getFluid() .getAttributes() .getColor(fluid)); + + this.motionX = vx; + this.motionY = vy; + this.motionZ = vz; this.particleScale /= 2.0F; this.field_217587_G = this.rand.nextFloat() * 3.0F; this.field_217588_H = this.rand.nextFloat() * 3.0F; } - public IParticleRenderType getRenderType() { - return IParticleRenderType.TERRAIN_SHEET; + @Override + protected int getBrightnessForRender(float p_189214_1_) { + int brightnessForRender = super.getBrightnessForRender(p_189214_1_); + int skyLight = brightnessForRender >> 20; + int blockLight = (brightnessForRender >> 4) & 0xf; + blockLight = Math.max(blockLight, fluid.getFluid() + .getAttributes() + .getLuminosity(fluid)); + return (skyLight << 20) | (blockLight << 4); } protected void multiplyColor(int color) { @@ -69,13 +89,13 @@ public class FluidStackParticle extends SpriteTexturedParticle { @Override public void tick() { super.tick(); - if (!(fluid.getFluid() instanceof PotionFluid)) + if (!canEvaporate()) return; if (onGround) setExpired(); if (!isExpired) return; - if (!onGround && world.rand.nextFloat() < 1/8f) + if (!onGround && world.rand.nextFloat() < 1 / 8f) return; Vec3d rgb = ColorHelper.getRGB(fluid.getFluid() @@ -83,5 +103,14 @@ public class FluidStackParticle extends SpriteTexturedParticle { .getColor(fluid)); world.addParticle(ParticleTypes.ENTITY_EFFECT, posX, posY, posZ, rgb.x, rgb.y, rgb.z); } + + protected boolean canEvaporate() { + return fluid.getFluid() instanceof PotionFluid; + } + + @Override + public IParticleRenderType getRenderType() { + return IParticleRenderType.TERRAIN_SHEET; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index 148309b28..bfb965e46 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -7,14 +7,20 @@ import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -33,35 +39,92 @@ public class BasinRenderer extends SmartTileEntityRenderer { int light, int overlay) { super.renderSafe(basin, partialTicks, ms, buffer, light, overlay); - renderFluids(basin, partialTicks, ms, buffer, light, overlay); + float fluidLevel = renderFluids(basin, partialTicks, ms, buffer, light, overlay); + float level = MathHelper.clamp(fluidLevel - .3f, .125f, .6f); ms.push(); + BlockPos pos = basin.getPos(); ms.translate(.5, .2f, .5); + MatrixStacker.of(ms) + .rotateY(basin.ingredientRotation.getValue(partialTicks)); + Random r = new Random(pos.hashCode()); + Vec3d baseVector = new Vec3d(.125, level, 0); IItemHandlerModifiable inv = basin.itemCapability.orElse(new ItemStackHandler()); + int itemCount = 0; + for (int slot = 0; slot < inv.getSlots(); slot++) + if (!inv.getStackInSlot(slot) + .isEmpty()) + itemCount++; + + if (itemCount == 1) + baseVector = new Vec3d(0, level, 0); + + float anglePartition = 360f / itemCount; for (int slot = 0; slot < inv.getSlots(); slot++) { ItemStack stack = inv.getStackInSlot(slot); if (stack.isEmpty()) continue; + ms.push(); + + if (fluidLevel > 0) { + ms.translate(0, + (MathHelper.sin(AnimationTickHolder.getRenderTick() / 12f + anglePartition * itemCount) + 1.5f) * 1 + / 32f, + 0); + } + + Vec3d itemPosition = VecHelper.rotate(baseVector, anglePartition * itemCount, Axis.Y); + ms.translate(itemPosition.x, itemPosition.y, itemPosition.z); + MatrixStacker.of(ms) + .rotateY(anglePartition * itemCount + 35) + .rotateX(65); + for (int i = 0; i <= stack.getCount() / 8; i++) { ms.push(); - Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, .25f); - Vec3d vec2 = VecHelper.offsetRandomly(Vec3d.ZERO, r, .5f); + Vec3d vec = VecHelper.offsetRandomly(Vec3d.ZERO, r, 1 / 16f); ms.translate(vec.x, vec.y, vec.z); - ms.multiply(new Vector3f((float) vec2.z, (float) vec2.y, 0).getDegreesQuaternion((float) vec2.x * 180)); - - Minecraft.getInstance() - .getItemRenderer() - .renderItem(stack, TransformType.GROUND, light, overlay, ms, buffer); + renderItem(ms, buffer, light, overlay, stack); ms.pop(); } - ms.translate(0, 1 / 64f, 0); + ms.pop(); + + itemCount--; } ms.pop(); + BlockState blockState = basin.getBlockState(); + if (!(blockState.getBlock() instanceof BasinBlock)) + return; + Direction direction = blockState.get(BasinBlock.FACING); + if (direction == Direction.DOWN) + return; + Vec3d directionVec = new Vec3d(direction.getDirectionVec()); + Vec3d outVec = VecHelper.getCenterOf(BlockPos.ZERO) + .add(directionVec.scale(.55) + .subtract(0, 1 / 2f, 0)); + + for (IntAttached intAttached : basin.visualizedOutputItems) { + float progress = 1 - (intAttached.getFirst() - partialTicks) / BasinTileEntity.OUTPUT_ANIMATION_TIME; + ms.push(); + MatrixStacker.of(ms) + .translate(outVec) + .translate(new Vec3d(0, Math.max(-.55f, -(progress * progress * 2)), 0)) + .translate(directionVec.scale(progress * .5f)) + .rotateY(AngleHelper.horizontalAngle(direction)) + .rotateX(progress * 180); + renderItem(ms, buffer, light, overlay, intAttached.getValue()); + ms.pop(); + } + } + + protected void renderItem(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, ItemStack stack) { + Minecraft.getInstance() + .getItemRenderer() + .renderItem(stack, TransformType.GROUND, light, overlay, ms, buffer); } protected float renderFluids(BasinTileEntity basin, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, @@ -69,26 +132,7 @@ public class BasinRenderer extends SmartTileEntityRenderer { SmartFluidTankBehaviour inputFluids = basin.getBehaviour(SmartFluidTankBehaviour.INPUT); SmartFluidTankBehaviour outputFluids = basin.getBehaviour(SmartFluidTankBehaviour.OUTPUT); SmartFluidTankBehaviour[] tanks = { inputFluids, outputFluids }; - int renderedFluids = 0; - float totalUnits = 0; - - for (SmartFluidTankBehaviour behaviour : tanks) { - if (behaviour == null) - continue; - for (TankSegment tankSegment : behaviour.getTanks()) { - if (tankSegment.getRenderedFluid() - .isEmpty()) - continue; - float units = tankSegment.getTotalUnits(partialTicks); - if (units < 1) - continue; - totalUnits += units; - renderedFluids++; - } - } - - if (renderedFluids == 0) - return 0; + float totalUnits = basin.getTotalFluidUnits(); if (totalUnits < 1) return 0; @@ -111,8 +155,8 @@ public class BasinRenderer extends SmartTileEntityRenderer { float units = tankSegment.getTotalUnits(partialTicks); if (units < 1) continue; - - float partial = units / totalUnits; + + float partial = MathHelper.clamp(units / totalUnits, 0, 1); xMax += partial * 12 / 16f; FluidRenderer.renderTiledFluidBB(renderedFluid, xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, false); @@ -121,7 +165,7 @@ public class BasinRenderer extends SmartTileEntityRenderer { } } - return fluidLevel; + return yMax; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index f7a4c6d6e..12a4dcca4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -1,11 +1,18 @@ package com.simibubi.create.content.contraptions.processing; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Random; import javax.annotation.Nonnull; +import com.simibubi.create.AllParticleTypes; import com.simibubi.create.AllTags; +import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity; +import com.simibubi.create.content.contraptions.fluids.FluidFX; +import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; @@ -16,21 +23,32 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.IntAttached; import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.IParticleData; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; @@ -44,25 +62,44 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper; public class BasinTileEntity extends SmartTileEntity implements ITickableTileEntity { + private boolean areFluidsMoving; + LerpedFloat ingredientRotationSpeed; + LerpedFloat ingredientRotation; + public BasinInventory inputInventory; public SmartFluidTankBehaviour inputTank; protected SmartInventory outputInventory; protected SmartFluidTankBehaviour outputTank; + private FilteringBehaviour filtering; + private boolean contentsChanged; + + private Couple invs; + private Couple tanks; protected LazyOptional itemCapability; protected LazyOptional fluidCapability; - private FilteringBehaviour filtering; - private boolean contentsChanged; + public static final int OUTPUT_ANIMATION_TIME = 10; + List> visualizedOutputItems; + List> visualizedOutputFluids; public BasinTileEntity(TileEntityType type) { super(type); inputInventory = new BasinInventory(9, this); inputInventory.whenContentsChanged($ -> contentsChanged = true); outputInventory = new BasinInventory(9, this).forbidInsertion(); - + areFluidsMoving = false; itemCapability = LazyOptional.of(() -> new CombinedInvWrapper(inputInventory, outputInventory)); contentsChanged = true; + ingredientRotation = LerpedFloat.angular() + .startWithValue(0); + ingredientRotationSpeed = LerpedFloat.linear() + .startWithValue(0); + + invs = Couple.create(inputInventory, outputInventory); + tanks = Couple.create(inputTank, outputTank); + visualizedOutputItems = Collections.synchronizedList(new ArrayList<>()); + visualizedOutputFluids = Collections.synchronizedList(new ArrayList<>()); } @Override @@ -78,6 +115,7 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt outputTank = new SmartFluidTankBehaviour(SmartFluidTankBehaviour.OUTPUT, this, 2, 1000, true).forbidInsertion(); behaviours.add(inputTank); behaviours.add(outputTank); + fluidCapability = LazyOptional.of(() -> { LazyOptional inputCap = inputTank.getCapability(); LazyOptional outputCap = outputTank.getCapability(); @@ -90,6 +128,15 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt super.read(compound, clientPacket); inputInventory.deserializeNBT(compound.getCompound("InputItems")); outputInventory.deserializeNBT(compound.getCompound("OutputItems")); + + if (!clientPacket) + return; + + NBTHelper.iterateCompoundList(compound.getList("VisualizedItems", NBT.TAG_COMPOUND), + c -> visualizedOutputItems.add(IntAttached.with(OUTPUT_ANIMATION_TIME, ItemStack.read(c)))); + NBTHelper.iterateCompoundList(compound.getList("VisualizedFluids", NBT.TAG_COMPOUND), + c -> visualizedOutputFluids + .add(IntAttached.with(OUTPUT_ANIMATION_TIME, FluidStack.loadFluidStackFromNBT(c)))); } @Override @@ -97,6 +144,16 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt super.write(compound, clientPacket); compound.put("InputItems", inputInventory.serializeNBT()); compound.put("OutputItems", outputInventory.serializeNBT()); + + if (!clientPacket) + return; + + compound.put("VisualizedItems", NBTHelper.writeCompoundList(visualizedOutputItems, ia -> ia.getValue() + .serializeNBT())); + compound.put("VisualizedFluids", NBTHelper.writeCompoundList(visualizedOutputFluids, ia -> ia.getValue() + .writeToNBT(new CompoundNBT()))); + visualizedOutputItems.clear(); + visualizedOutputFluids.clear(); } public void onEmptied() { @@ -129,11 +186,26 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt @Override public void lazyTick() { super.lazyTick(); + if (!world.isRemote) + return; + TileEntity tileEntity = world.getTileEntity(pos.up(2)); + if (!(tileEntity instanceof MechanicalMixerTileEntity)) { + setAreFluidsMoving(false); + return; + } + MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tileEntity; + setAreFluidsMoving(mixer.running && mixer.runningTicks <= 20); } @Override public void tick() { super.tick(); + if (world.isRemote) { + createFluidParticles(); + tickVisualizedOutputs(); + ingredientRotationSpeed.tickChaser(); + ingredientRotation.setValue(ingredientRotation.getValue() + ingredientRotationSpeed.getValue()); + } if (!contentsChanged) return; contentsChanged = false; @@ -143,7 +215,8 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt BlockPos toUpdate = pos.up() .offset(offset); BlockState stateToUpdate = world.getBlockState(toUpdate); - if (stateToUpdate.getBlock() instanceof BasinBlock && stateToUpdate.get(BasinBlock.FACING) == offset.getOpposite()) { + if (stateToUpdate.getBlock() instanceof BasinBlock + && stateToUpdate.get(BasinBlock.FACING) == offset.getOpposite()) { TileEntity te = world.getTileEntity(toUpdate); if (te instanceof BasinTileEntity) ((BasinTileEntity) te).contentsChanged = true; @@ -151,6 +224,32 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt } } + public float getTotalFluidUnits() { + int renderedFluids = 0; + float totalUnits = 0; + + for (SmartFluidTankBehaviour behaviour : getTanks()) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + if (tankSegment.getRenderedFluid() + .isEmpty()) + continue; + float units = tankSegment.getTotalUnits(0); + if (units < 1) + continue; + totalUnits += units; + renderedFluids++; + } + } + + if (renderedFluids == 0) + return 0; + if (totalUnits < 1) + return 0; + return totalUnits; + } + private Optional getOperator() { if (world == null) return Optional.empty(); @@ -224,6 +323,8 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt if (!ItemHandlerHelper.insertItemStacked(targetInv, itemStack.copy(), simulate) .isEmpty()) return false; + else if (!simulate) + visualizedOutputItems.add(IntAttached.withZero(itemStack)); if (targetTank == null) return false; @@ -231,10 +332,145 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt if (targetTank.fill(fluidStack.copy(), simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE) != fluidStack .getAmount()) return false; + else if (!simulate) + visualizedOutputFluids.add(IntAttached.withZero(fluidStack)); return true; } + public void readOnlyItems(CompoundNBT compound) { + inputInventory.deserializeNBT(compound.getCompound("InputItems")); + outputInventory.deserializeNBT(compound.getCompound("OutputItems")); + } + + public static HeatLevel getHeatLevelOf(BlockState state) { + if (state.has(BlazeBurnerBlock.HEAT_LEVEL)) + return state.get(BlazeBurnerBlock.HEAT_LEVEL); + return AllTags.AllBlockTags.FAN_HEATERS.matches(state) ? HeatLevel.SMOULDERING : HeatLevel.NONE; + } + + public Couple getTanks() { + return tanks; + } + + public Couple getInvs() { + return invs; + } + + // client things + + private void tickVisualizedOutputs() { + visualizedOutputFluids.forEach(IntAttached::decrement); + visualizedOutputItems.forEach(IntAttached::decrement); + visualizedOutputFluids.removeIf(IntAttached::isOrBelowZero); + visualizedOutputItems.removeIf(IntAttached::isOrBelowZero); + } + + private void createFluidParticles() { + Random r = world.rand; + + if (!visualizedOutputFluids.isEmpty()) + createOutputFluidParticles(r); + + if (!areFluidsMoving && r.nextFloat() > 1 / 8f) + return; + + int segments = 0; + for (SmartFluidTankBehaviour behaviour : getTanks()) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) + if (!tankSegment.isEmpty(0)) + segments++; + } + if (segments < 2) + return; + + float totalUnits = getTotalFluidUnits(); + if (totalUnits == 0) + return; + float fluidLevel = MathHelper.clamp(totalUnits / 2000, 0, 1); + float rim = 2 / 16f; + float space = 12 / 16f; + float surface = pos.getY() + rim + space * fluidLevel + 1 / 32f; + + if (areFluidsMoving) { + createMovingFluidParticles(surface, segments); + return; + } + + for (SmartFluidTankBehaviour behaviour : getTanks()) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + if (tankSegment.isEmpty(0)) + continue; + float x = pos.getX() + rim + space * r.nextFloat(); + float z = pos.getZ() + rim + space * r.nextFloat(); + world.addOptionalParticle( + new FluidParticleData(AllParticleTypes.BASIN_FLUID.get(), tankSegment.getRenderedFluid()), x, + surface, z, 0, 0, 0); + } + } + } + + private void createOutputFluidParticles(Random r) { + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof BasinBlock)) + return; + Direction direction = blockState.get(BasinBlock.FACING); + if (direction == Direction.DOWN) + return; + Vec3d directionVec = new Vec3d(direction.getDirectionVec()); + Vec3d outVec = VecHelper.getCenterOf(pos) + .add(directionVec.scale(.65) + .subtract(0, 1 / 4f, 0)); + Vec3d outMotion = directionVec.scale(1 / 16f) + .add(0, -1 / 16f, 0); + + for (int i = 0; i < 3; i++) { + visualizedOutputFluids.forEach(ia -> { + FluidStack fluidStack = ia.getValue(); + IParticleData fluidParticle = FluidFX.getFluidParticle(fluidStack); + Vec3d m = VecHelper.offsetRandomly(outMotion, r, 1 / 16f); + world.addOptionalParticle(fluidParticle, outVec.x, outVec.y, outVec.z, m.x, m.y, m.z); + }); + } + } + + private void createMovingFluidParticles(float surface, int segments) { + Vec3d pointer = new Vec3d(1, 0, 0).scale(1 / 16f); + float interval = 360f / segments; + Vec3d centerOf = VecHelper.getCenterOf(pos); + float intervalOffset = (AnimationTickHolder.ticks * 18) % 360; + + int currentSegment = 0; + for (SmartFluidTankBehaviour behaviour : getTanks()) { + if (behaviour == null) + continue; + for (TankSegment tankSegment : behaviour.getTanks()) { + if (tankSegment.isEmpty(0)) + continue; + float angle = interval * (1 + currentSegment) + intervalOffset; + Vec3d vec = centerOf.add(VecHelper.rotate(pointer, angle, Axis.Y)); + world.addOptionalParticle( + new FluidParticleData(AllParticleTypes.BASIN_FLUID.get(), tankSegment.getRenderedFluid()), + vec.getX(), surface, vec.getZ(), 1, 0, 0); + currentSegment++; + } + } + } + + public boolean areFluidsMoving() { + return areFluidsMoving; + } + + public boolean setAreFluidsMoving(boolean areFluidsMoving) { + this.areFluidsMoving = areFluidsMoving; + ingredientRotationSpeed.chase(areFluidsMoving ? 20 : 0, .1f, Chaser.EXP); + return areFluidsMoving; + } + class BasinValueBox extends ValueBoxTransform.Sided { @Override @@ -249,15 +485,4 @@ public class BasinTileEntity extends SmartTileEntity implements ITickableTileEnt } } - - public void readOnlyItems(CompoundNBT compound) { - inputInventory.deserializeNBT(compound.getCompound("InputItems")); - outputInventory.deserializeNBT(compound.getCompound("OutputItems")); - } - - public static HeatLevel getHeatLevelOf(BlockState state) { - if (state.has(BlazeBurnerBlock.HEAT_LEVEL)) - return state.get(BlazeBurnerBlock.HEAT_LEVEL); - return AllTags.AllBlockTags.FAN_HEATERS.matches(state) ? HeatLevel.SMOULDERING : HeatLevel.NONE; - } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index 44dadd97f..069b04075 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -267,6 +267,16 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { .isEmpty()) renderedFluid = tank.getFluid(); } + + public boolean isEmpty(float partialTicks) { + FluidStack renderedFluid = getRenderedFluid(); + if (renderedFluid.isEmpty()) + return true; + float units = getTotalUnits(partialTicks); + if (units < 1) + return true; + return false; + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Couple.java b/src/main/java/com/simibubi/create/foundation/utility/Couple.java index fd391dbef..0df6950b6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Couple.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Couple.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.utility; +import java.util.Iterator; import java.util.List; import java.util.function.BiConsumer; import java.util.function.BiFunction; @@ -12,7 +13,7 @@ import com.google.common.collect.ImmutableList; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; -public class Couple extends Pair { +public class Couple extends Pair implements Iterable { private static Couple TRUE_AND_FALSE = Couple.create(true, false); @@ -62,7 +63,8 @@ public class Couple extends Pair { setSecond(function.apply(getSecond(), values.getSecond())); } - public void forEach(Consumer consumer) { + @Override + public void forEach(Consumer consumer) { consumer.accept(getFirst()); consumer.accept(getSecond()); } @@ -89,4 +91,36 @@ public class Couple extends Pair { return new Couple<>(readCompoundList.get(0), readCompoundList.get(1)); } + @Override + public Iterator iterator() { + return new Couplerator<>(this); + } + + private static class Couplerator implements Iterator { + + int state; + private Couple couple; + + public Couplerator(Couple couple) { + this.couple = couple; + state = 0; + } + + @Override + public boolean hasNext() { + return state != 2; + } + + @Override + public T next() { + state++; + if (state == 1) + return couple.first; + if (state == 2) + return couple.second; + return null; + } + + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/IntAttached.java b/src/main/java/com/simibubi/create/foundation/utility/IntAttached.java new file mode 100644 index 000000000..6353b0d2d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/IntAttached.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.utility; + +public class IntAttached extends Pair { + + protected IntAttached(Integer first, V second) { + super(first, second); + } + + public static IntAttached with(int number, V value) { + return new IntAttached<>(number, value); + } + + public static IntAttached withZero(V value) { + return new IntAttached<>(0, value); + } + + public boolean isZero() { + return first.intValue() == 0; + } + + public boolean isOrBelowZero() { + return first.intValue() <= 0; + } + + public void increment() { + first++; + } + + public void decrement() { + first--; + } + + public V getValue() { + return getSecond(); + } + +} diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json b/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json index 579fd216b..dca272755 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json @@ -123,23 +123,10 @@ "up": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"} } }, - { - "name": "BackBottom", - "from": [3.9, -2, 18], - "to": [12.1, 2, 26], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 17]}, - "faces": { - "east": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, - "south": {"uv": [8, 13, 12, 15], "rotation": 180, "texture": "#7"}, - "west": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, - "up": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"}, - "down": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"} - } - }, { "name": "Back", "from": [2.1, -2.1, 14], - "to": [13.9, 13.9, 17.9], + "to": [13.9, 13.95, 18.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "faces": { "north": {"uv": [0, 4, 16, 16], "rotation": 90, "texture": "#5"}, @@ -204,7 +191,7 @@ { "name": "Base", "origin": [9, -4, 8], - "children": [9, 10, 11, 12, 13] + "children": [9, 10, 11, 12] } ] } diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json b/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json index e026af2fc..3eafc8c41 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json @@ -108,23 +108,10 @@ "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} } }, - { - "name": "BackBottom", - "from": [3.9, -2, 18], - "to": [12.1, 2, 26], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -4, 17]}, - "faces": { - "east": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, - "south": {"uv": [8, 13, 12, 15], "rotation": 180, "texture": "#7"}, - "west": {"uv": [12, 12, 14, 16], "rotation": 270, "texture": "#7"}, - "up": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"}, - "down": {"uv": [8, 12, 12, 16], "rotation": 180, "texture": "#7"} - } - }, { "name": "Back", "from": [2.1, -2.1, 14], - "to": [13.9, 13.9, 17.9], + "to": [13.9, 13.95, 18.1], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 6]}, "faces": { "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, @@ -196,8 +183,8 @@ { "name": "Base", "origin": [9, -4, 8], - "children": [8, 9, 10, 11, 12] + "children": [8, 9, 10, 11] } ] - }, 13] + }, 12] } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/crushing_wheel.json b/src/main/resources/assets/create/models/block/crushing_wheel.json index 738682e22..021c59f45 100644 --- a/src/main/resources/assets/create/models/block/crushing_wheel.json +++ b/src/main/resources/assets/create/models/block/crushing_wheel.json @@ -3,11 +3,10 @@ "parent": "create:block/large_wheels", "textures": { "6": "create:block/crushing_wheel_body", - "spruce_log_top": "block/spruce_log", + "spruce_log_top": "create:block/smooth_dark_log_top", "axis_top": "create:block/axis_top", "axis": "create:block/axis", "crushing_wheel": "create:block/crushing_wheel", - "spruce_log": "block/spruce_log", "particle": "block/polished_andesite" }, "elements": [ @@ -27,68 +26,69 @@ }, { "name": "B1", - "from": [2, 2, -8], - "to": [9, 14, 7], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [2, 1.95, -8], + "to": [9, 14.05, 7], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [7.5, 6, 11, 12], "texture": "#6"}, "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "west": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "up": {"uv": [0, 9.5, 7.5, 13], "rotation": 270, "texture": "#6"}, "down": {"uv": [0, 9.5, 7.5, 13], "rotation": 90, "texture": "#6"} } }, { "name": "B2", - "from": [2, 2.1, -8], - "to": [10, 13.9, 7], + "from": [2, 1.9, -8], + "to": [10, 14.1, 7], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { - "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, + "north": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 270, "texture": "#6"}, + "west": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "up": {"uv": [0, 6.5, 7.5, 10.5], "rotation": 270, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 90, "texture": "#6"} } }, { "name": "B3", - "from": [2, 2, -8], - "to": [9, 14, 7], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [2, 1.95, -8], + "to": [9, 14.05, 7], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [11, 0, 14.5, 6], "texture": "#6"}, "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "west": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 270, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 90, "texture": "#6"} } }, { "name": "B4", - "from": [2, 2.1, -8], - "to": [10, 13.9, 7], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [2, 1.9, -8], + "to": [10, 14.1, 7], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8.05, 8]}, "faces": { - "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, + "north": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "up": {"uv": [8.5, 12.5, 16, 16], "rotation": 270, "texture": "#6"}, + "west": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "up": {"uv": [0, 6.5, 7.5, 10.5], "rotation": 270, "texture": "#6"}, "down": {"uv": [8.5, 12.5, 16, 16], "rotation": 90, "texture": "#6"} } }, { "name": "B5", - "from": [-8, 2, 7], - "to": [7, 14, 14], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [-8, 1.95, 7], + "to": [7, 14.05, 14], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "south": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "west": {"uv": [7.5, 6, 11, 12], "texture": "#6"}, "up": {"uv": [0, 9.5, 7.5, 13], "rotation": 180, "texture": "#6"}, "down": {"uv": [0, 9.5, 7.5, 13], "rotation": 180, "texture": "#6"} @@ -96,26 +96,27 @@ }, { "name": "B6", - "from": [-8, 2.1, 6], - "to": [7, 13.9, 14], + "from": [-8, 1.9, 6], + "to": [7, 14.1, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "west": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 180, "texture": "#6"}, + "south": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "west": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, + "up": {"uv": [0, 6.5, 7.5, 10.5], "rotation": 180, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 180, "texture": "#6"} } }, { "name": "B7", - "from": [-8, 2, 7], - "to": [7, 14, 14], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [-8, 1.95, 7], + "to": [7, 14.05, 14], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "south": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "west": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 180, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 180, "texture": "#6"} @@ -123,26 +124,26 @@ }, { "name": "B8", - "from": [-8, 2.1, 6], - "to": [7, 13.9, 14], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [-8, 1.9, 6], + "to": [7, 14.1, 14], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "west": {"uv": [11, 0, 14.5, 6], "texture": "#6"}, - "up": {"uv": [8.5, 12.5, 16, 16], "rotation": 180, "texture": "#6"}, + "south": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "west": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, + "up": {"uv": [0, 6.5, 7.5, 10.5], "rotation": 180, "texture": "#6"}, "down": {"uv": [8.5, 12.5, 16, 16], "rotation": 180, "texture": "#6"} } }, { "name": "B9", - "from": [7, 2, 9], - "to": [14, 14, 24], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [7, 1.95, 9], + "to": [14, 14.05, 24], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "east": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "south": {"uv": [7.5, 6, 11, 12], "texture": "#6"}, "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "up": {"uv": [0, 9.5, 7.5, 13], "rotation": 90, "texture": "#6"}, @@ -151,26 +152,27 @@ }, { "name": "B10", - "from": [6, 2.1, 9], - "to": [14, 13.9, 24], + "from": [6, 1.9, 9], + "to": [14, 14.1, 24], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, + "east": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "south": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [0, 6, 7.5, 10], "rotation": 90, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 270, "texture": "#6"} } }, { "name": "B11", - "from": [7, 2, 9], - "to": [14, 14, 24], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [7, 1.95, 9], + "to": [14, 14.05, 24], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "south": {"uv": [11, 0, 14.5, 6], "texture": "#6"}, + "east": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "south": {"uv": [7.5, 6, 11, 12], "texture": "#6"}, "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "up": {"uv": [8.5, 12.5, 16, 16], "rotation": 90, "texture": "#6"}, "down": {"uv": [8.5, 12.5, 16, 16], "rotation": 270, "texture": "#6"} @@ -178,25 +180,25 @@ }, { "name": "B12", - "from": [6, 2.1, 9], - "to": [14, 13.9, 24], - "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8]}, + "from": [6, 1.9, 9], + "to": [14, 14.1, 24], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, + "east": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "south": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 90, "texture": "#6"}, + "up": {"uv": [0, 6.5, 7.5, 10.5], "rotation": 90, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 270, "texture": "#6"} } }, { "name": "B13", - "from": [9, 2, 2], - "to": [24, 14, 9], - "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [9, 1.95, 2], + "to": [24, 14.05, 9], + "rotation": {"angle": -22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { - "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "north": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "east": {"uv": [7.5, 6, 11, 12], "texture": "#6"}, "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "west": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, @@ -206,24 +208,25 @@ }, { "name": "B14", - "from": [9, 2.1, 2], - "to": [24, 13.9, 10], + "from": [9, 1.9, 2], + "to": [24, 14.1, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { - "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "east": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, + "north": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "east": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "west": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "up": {"uv": [0, 6, 7.5, 9.5], "texture": "#6"}, + "up": {"uv": [0, 7.5, 7.5, 11.5], "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "texture": "#6"} } }, { "name": "B15", - "from": [9, 2, 2], - "to": [24, 14, 9], - "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 8, 8]}, + "from": [9, 1.95, 2], + "to": [24, 14.05, 9], + "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { - "north": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, + "north": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, "east": {"uv": [11, 0, 14.5, 6], "texture": "#6"}, "south": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "west": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, @@ -233,15 +236,15 @@ }, { "name": "B16", - "from": [2, 2.1, -8], - "to": [10, 13.9, 7], - "rotation": {"angle": -45, "axis": "y", "origin": [8, 8, 8]}, + "from": [2, 1.9, -8], + "to": [10, 14.1, 7], + "rotation": {"angle": -45, "axis": "y", "origin": [8, 7.95, 8]}, "faces": { - "north": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, + "north": {"uv": [3.5, 0, 7.5, 6], "texture": "#6"}, "east": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, "south": {"uv": [7.5, 0, 11, 6], "texture": "#6"}, - "west": {"uv": [0, 0, 7.5, 6], "texture": "#6"}, - "up": {"uv": [0, 6, 7.5, 9.5], "rotation": 270, "texture": "#6"}, + "west": {"uv": [1.5, 6, 7.5, 0], "rotation": 180, "texture": "#6"}, + "up": {"uv": [0, 6.5, 7.5, 10.5], "rotation": 270, "texture": "#6"}, "down": {"uv": [0, 6, 7.5, 9.5], "rotation": 90, "texture": "#6"} } }, @@ -251,18 +254,18 @@ "to": [12, 15, 12], "shade": false, "faces": { - "north": {"uv": [4, 1, 12, 15], "texture": "#spruce_log"}, - "east": {"uv": [4, 1, 12, 15], "texture": "#spruce_log"}, - "south": {"uv": [4, 1, 12, 15], "texture": "#spruce_log"}, - "west": {"uv": [4, 1, 12, 15], "texture": "#spruce_log"}, + "north": {"uv": [4, 1, 12, 15], "texture": "#spruce_log_top"}, + "east": {"uv": [4, 1, 12, 15], "texture": "#spruce_log_top"}, + "south": {"uv": [4, 1, 12, 15], "texture": "#spruce_log_top"}, + "west": {"uv": [4, 1, 12, 15], "texture": "#spruce_log_top"}, "up": {"uv": [4, 4, 12, 12], "texture": "#spruce_log_top"}, "down": {"uv": [4, 4, 12, 12], "texture": "#spruce_log_top"} } }, { "name": "Cover", - "from": [-4, 1.9, -4], - "to": [20, 14.1, 20], + "from": [-4, 1.85, -4], + "to": [20, 14.15, 20], "faces": { "up": {"uv": [2, 2, 14, 14], "texture": "#crushing_wheel"}, "down": {"uv": [2, 2, 14, 14], "texture": "#crushing_wheel"} @@ -276,4 +279,4 @@ "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] } ] -} +} \ No newline at end of file diff --git a/src/main/resources/assets/create/particles/basin_fluid.json b/src/main/resources/assets/create/particles/basin_fluid.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/src/main/resources/assets/create/particles/basin_fluid.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/crushing_wheel_body.png b/src/main/resources/assets/create/textures/block/crushing_wheel_body.png index 542f0f54183bd173edf16b8af5238e8b422a8918..4bb0b9cffb850ede1b7f761ff965f5244753535c 100644 GIT binary patch delta 766 zcmcc2wTo?nBnLAC1B1(wu45Aw73%i}_=LDFSvqISrZwHYbAS?U9ql#s4aMcfS-HjO zS?R6q9qpYRwGEA36DD-`_H=f4O`9>jx4*BauXp;)8Tm!!&21eWU7gcr&sw%(c~?)* zoOyF6O`g1P@uITIy85Q(mbUhu{{Ff1=S`k6xvRHl%CxDyeSH(APU)M_KXv-F=C=Cw zy2hr-GiNSYI=8gAu&Sc0ATOt-y`{dXzP`44-ogbL*%>ou&#J1a>geofZfUNoudA%8 zEGaGN>gmqS&WwtU0=jsW&Y>zGWnU8H7yO?@AdIS>p--(we4?FrJ>zaq7sn6_|Jp#_ z^4SJFTPlTCB-}caeeKi6b#pIoz3p)=WzAi$!-@0FJojGro6mp4du@9`v}k$h ziUb>WBj$izTgo_74u(B_zR*cYrsDs$Bdc`>~&j(JPjdy;vXr^#(TzJ3nNhqcQD{-ypmO<{ETQ@{Gf z6sf1>_D#q56(+3In=uOWUs-y4Sl6jEeea+@*!s+PQtZ#Bp&RQyQv&!^819w1%$TF>` Rr-12#!PC{xWt~$(6951Sk8c0~ delta 1327 zcmV+~1m9nlFEsl1jq09+va?8J4A6!n3xx#O z*rWT&p?fG04$;bTgymL+0C;}GOMk(DF(z}lToeumDHQZGHJa_ATFf!0Di5 zKbfKQQIeGe11lqAK;=Sl?1ZxRjn}ux>2y-1Ql(z6$GmVLr1nr=QA&Nf&VRf<;xPdZ zfhZ8b?U5Q@vCr8{tFcL<@ zqXu1wt+E`zTEOG=@@SP+DivyVyX4l*@D1z^9<3Oap`0Gd5PK*G#O0UQSDE+tiJ2Ex z6pPBpa#_{*xXj^jkW912wm3Ork5fxC5`d@c4%K*?L(U0|P?+rf4lTu(sgN;^ zn-y#Tl;REm61z#R1S?<&_?pd5o2nXM3?O&G#aN8iHa7V^w-IFCtY8D+W|S8;K)Ffj z0pP(v@BuU_F)(PD-SWSqBh~3@w7GGG=Qi6+;b)BcfGD)a9Dh702Tz(243c*TiWV0a znf!h~Hy&OSSYr7sU<2S%#J1lv`!?nvO`W9QYElo~%xR~{f{%I~^3?c#V2&TbakKmM=clBS6?xjTPM5fXdqqPX0ceDu3x`O*RHHk zsaoW_0H+6V<9~tX!Q5q-OgtMaLsSl24=+TbQSN^8VD2(RmZQ`jJowe*E6?E6nWIBa z#C~f|58!8>GQ_t+bajokx8E5`&7R-WoOHOq$30;lyi^%xl6(A&M9k(YRLZ8QRV`8C zAT@U*vfcdn=3wp8Wu8bVtbprbAY}L~_qqBMjxN#h;eP>r^X;A43;sD^18{TI$_47E zZ#q;0lmaM000}0e(9-e>eSZ5k8}Q}V-@o*QX2TzbSH-PQZm}1|OY-MM{?rI2=Wkxy zJn4k53JKryDrs^qI5z{%s-$U^1)Q4!XI0YV90mjDW&j`xtO*C6C Date: Wed, 11 Nov 2020 19:00:31 +0100 Subject: [PATCH 35/36] The Funnel doesn't end here - Updated wrench model (Kryppers) - Funnels on depots and perpendicular to belts use a new model - Funnels at the end of belts - no longer have a directional constraint - can now be extended/retracted manually - now hold items back at the block boundary - Extracting Funnels on top of belts can now specify an amount no their filter, taking x items off a nearby stack when possible - Fixed some issues with belt/funnel interaction - Items reaching the end of a belt will still be regularly checked by perpendicular funnels in the space - Contraptions now render blocks in appropriate render layers - Straight diagonal Chutes now create an intersection when a funnel is directly above them - Attempted a safety fix to bracket removal from shafts and cogs - Fixed windmill structures not stalling when their attached network is overstressed --- src/generated/resources/.cache/cache | 40 +-- .../blockstates/andesite_belt_funnel.json | 128 +++++----- .../create/blockstates/brass_belt_funnel.json | 128 +++++----- .../assets/create/blockstates/fluid_pipe.json | 190 +++++++------- .../create/blockstates/radial_chassis.json | 72 +++--- ...on => andesite_belt_funnel__extended.json} | 4 +- ...desite_belt_funnel__powered_extended.json} | 4 +- ...ndesite_belt_funnel__powered_pulling.json} | 6 +- ...ndesite_belt_funnel__powered_pushing.json} | 6 +- ...esite_belt_funnel__powered_retracted.json} | 4 +- ...son => andesite_belt_funnel__pulling.json} | 6 +- ...son => andesite_belt_funnel__pushing.json} | 6 +- ...n => andesite_belt_funnel__retracted.json} | 4 +- ....json => brass_belt_funnel__extended.json} | 4 +- ... brass_belt_funnel__powered_extended.json} | 4 +- ...> brass_belt_funnel__powered_pulling.json} | 6 +- ...> brass_belt_funnel__powered_pushing.json} | 6 +- ...brass_belt_funnel__powered_retracted.json} | 4 +- ...d.json => brass_belt_funnel__pulling.json} | 6 +- ...d.json => brass_belt_funnel__pushing.json} | 6 +- ...json => brass_belt_funnel__retracted.json} | 4 +- .../java/com/simibubi/create/AllShapes.java | 19 +- .../ContraptionRenderer.java | 39 ++- .../bearing/MechanicalBearingTileEntity.java | 2 + .../BeltFunnelInteractionHandler.java | 71 ++++-- .../relays/belt/transport/BeltInventory.java | 4 +- .../relays/elementary/ShaftBlock.java | 6 + .../wrench/WrenchItemRenderer.java | 2 +- .../belts/tunnel/BrassTunnelTileEntity.java | 3 +- .../logistics/block/chute/ChuteBlock.java | 9 +- .../block/funnel/BeltFunnelBlock.java | 202 ++++++++++----- .../block/funnel/BeltFunnelGenerator.java | 9 +- .../logistics/block/funnel/FunnelBlock.java | 6 +- .../funnel/FunnelFilterSlotPositioning.java | 80 +++--- .../logistics/block/funnel/FunnelItem.java | 11 +- .../block/funnel/FunnelRenderer.java | 1 + .../block/funnel/FunnelTileEntity.java | 61 ++++- .../HorizontalInteractionFunnelBlock.java | 128 ---------- .../filtering/FilteringBehaviour.java | 9 +- .../foundation/utility/SuperByteBuffer.java | 4 + .../block/belt_funnel/block_connected.json | 232 ++++++++++++++++++ .../block/belt_funnel/block_extended.json | 13 +- .../block/belt_funnel/block_pulling.json | 160 ++++++++++++ .../block/belt_funnel/block_pushing.json | 160 ++++++++++++ .../block/belt_funnel/block_retracted.json | 13 +- .../create/models/item/wrench/gear.json | 93 +++---- .../create/models/item/wrench/item.json | 198 ++++++++------- .../block/andesite_funnel_neutral.png | Bin 0 -> 368 bytes .../block/andesite_funnel_plating.png | Bin 1229 -> 576 bytes .../textures/block/brass_funnel_neutral.png | Bin 0 -> 282 bytes .../textures/block/brass_funnel_plating.png | Bin 1157 -> 535 bytes .../assets/create/textures/item/wrench.png | Bin 0 -> 2371 bytes 52 files changed, 1432 insertions(+), 741 deletions(-) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_pull_extended.json => andesite_belt_funnel__extended.json} (67%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_push_powered_extended.json => andesite_belt_funnel__powered_extended.json} (68%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_pull_powered_extended.json => andesite_belt_funnel__powered_pulling.json} (56%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_push_powered_retracted.json => andesite_belt_funnel__powered_pushing.json} (56%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_pull_powered_retracted.json => andesite_belt_funnel__powered_retracted.json} (68%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_push_extended.json => andesite_belt_funnel__pulling.json} (55%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_pull_retracted.json => andesite_belt_funnel__pushing.json} (55%) rename src/generated/resources/assets/create/models/block/{andesite_belt_funnel_push_retracted.json => andesite_belt_funnel__retracted.json} (67%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_pull_extended.json => brass_belt_funnel__extended.json} (68%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_push_powered_extended.json => brass_belt_funnel__powered_extended.json} (69%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_pull_powered_extended.json => brass_belt_funnel__powered_pulling.json} (57%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_push_powered_retracted.json => brass_belt_funnel__powered_pushing.json} (57%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_pull_powered_retracted.json => brass_belt_funnel__powered_retracted.json} (69%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_push_extended.json => brass_belt_funnel__pulling.json} (55%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_pull_retracted.json => brass_belt_funnel__pushing.json} (55%) rename src/generated/resources/assets/create/models/block/{brass_belt_funnel_push_retracted.json => brass_belt_funnel__retracted.json} (68%) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java create mode 100644 src/main/resources/assets/create/models/block/belt_funnel/block_connected.json create mode 100644 src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json create mode 100644 src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json create mode 100644 src/main/resources/assets/create/textures/block/andesite_funnel_neutral.png create mode 100644 src/main/resources/assets/create/textures/block/brass_funnel_neutral.png create mode 100644 src/main/resources/assets/create/textures/item/wrench.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 6637c18cb..5a0ab6556 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -5,7 +5,7 @@ f0d6baaabda94151134f569246d61a6e710c35a9 assets/create/blockstates/acacia_window 79c50afcea3a360783a5b3c73de9823511e9aed9 assets/create/blockstates/adjustable_pulse_repeater.json 1d730df54c9eae94063e37396d224fb3c87517e0 assets/create/blockstates/adjustable_repeater.json 9dd79bf5430f674e7d3e3fc7d59edee3d66e241e assets/create/blockstates/analog_lever.json -0a172dea0746027be3676e87271615f1307245a6 assets/create/blockstates/andesite_belt_funnel.json +dd468657a73fc2ad6e1ac08ace2996b6997d33e0 assets/create/blockstates/andesite_belt_funnel.json 585481e97c5066af63ea12fa5dd658798844d64c assets/create/blockstates/andesite_bricks.json 4e8d61aa2c8490301317ef747f67f0169ebfc2ed assets/create/blockstates/andesite_bricks_slab.json da63a8be3191d6d72afef6c79e3aea3f607631f9 assets/create/blockstates/andesite_bricks_stairs.json @@ -29,7 +29,7 @@ a71ddf3291bd13d7877f2fe32c42f50407f99afb assets/create/blockstates/black_valve_h ec2ab87734acc209e6be3bc4898b1199f819bfd3 assets/create/blockstates/blue_sail.json 4854d1ef52130a7887aecc60bcaffbd66f0871a8 assets/create/blockstates/blue_seat.json 9d7341a5cae5d47788c595167946dfb6441cebd1 assets/create/blockstates/blue_valve_handle.json -fba967b1f6e44b34a9d9662e2fedfc13aad7f36c assets/create/blockstates/brass_belt_funnel.json +ee1299a15fca849eb42bf81507f85a54c167bbfe assets/create/blockstates/brass_belt_funnel.json 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json 3057e1121117c0cd651c288cd8e2d46bdf64afb1 assets/create/blockstates/brass_funnel.json @@ -137,7 +137,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json +fe9169716dd21a81a3710a89f0a9b7ea4dcd4d51 assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -329,7 +329,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -424,14 +424,14 @@ cda6f9761431c5b8538f746db2dc55e5fb57bf01 assets/create/models/block/adjustable_p ce5e0cd1598cf2228bb77a68c304dd210f3848f8 assets/create/models/block/adjustable_repeater_powered.json c82a31943f5adb4a64c6db4c48c94cbce5d95bc4 assets/create/models/block/adjustable_repeater_powered_powering.json 51cf61f8bc25cf62b0e0c0705c75512809358ff0 assets/create/models/block/adjustable_repeater_powering.json -4b8c1db868de612ae6a49d9133db700ac6a3d688 assets/create/models/block/andesite_belt_funnel_pull_extended.json -eb7f1bfcd856bf302cb24dda09994ceef280fca2 assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json -d5d7c62b16aa3cfb279b4e3100f910c1782b5846 assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json -2d228eae550d573f4cad06ed6f6d51e4975fdde6 assets/create/models/block/andesite_belt_funnel_pull_retracted.json -2a3b929e3c24f70a0842b9ce56c175c4383e2598 assets/create/models/block/andesite_belt_funnel_push_extended.json -56a4d2e099fb285fd04ef095ced3bd7046835711 assets/create/models/block/andesite_belt_funnel_push_powered_extended.json -8a73d43517d64f873896631fbe7fccd085e1603a assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json -aff112cb4ca73f3b1f71e98ccd984ee286da2930 assets/create/models/block/andesite_belt_funnel_push_retracted.json +bcbe466da8b2172aa0f6e5c846b2e261632ceb6b assets/create/models/block/andesite_belt_funnel__extended.json +9218b0a053911071dbde66fdc97de7485a08c54e assets/create/models/block/andesite_belt_funnel__powered_extended.json +433daa4b4cb4b6bc12918b2e78c2141d941e78d8 assets/create/models/block/andesite_belt_funnel__powered_pulling.json +a3581f92b80a7adf2f933cfbeda43f88db7d8615 assets/create/models/block/andesite_belt_funnel__powered_pushing.json +14b6689a3c67bfb4fddbd062e9bdb0957e228a8c assets/create/models/block/andesite_belt_funnel__powered_retracted.json +657f22838ee3e8719fa33e1f85034043c4907310 assets/create/models/block/andesite_belt_funnel__pulling.json +59016d8f76df2920437168368cfba47bbf19d214 assets/create/models/block/andesite_belt_funnel__pushing.json +997495a40f20d13a6b7f6083bb8f519ff107ca28 assets/create/models/block/andesite_belt_funnel__retracted.json 4d412de3eb98dfee548a0dcdbae5d0168ac67123 assets/create/models/block/andesite_bricks.json 054ef3fff7f146dbf8adc92dc2b6d169c2bdb7a5 assets/create/models/block/andesite_bricks_slab.json 8784414839f6a5786bf43d6a7dff6c27bdf7fe46 assets/create/models/block/andesite_bricks_slab_top.json @@ -481,14 +481,14 @@ c86a455b8e85ef190261718726b344cf15ba1e4f assets/create/models/block/bracket/shaf 8fa9ce896412af894d7c431a50104445d91b1d4d assets/create/models/block/bracket/shaft/ground_wooden.json 3956168840aca9425d3bf240650406c1dbc8ea66 assets/create/models/block/bracket/shaft/wall_metal.json 7aaa2fbdb618e8aab7e0da19a5393e1eaa608623 assets/create/models/block/bracket/shaft/wall_wooden.json -24dff9a8d22c9a88286d2b7d08384ac9f281a512 assets/create/models/block/brass_belt_funnel_pull_extended.json -c9c5f53c9d4f6cf6f509452e91cab1ba5b57f807 assets/create/models/block/brass_belt_funnel_pull_powered_extended.json -addcf821a2348c0985bf9a72229355cfab818069 assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json -332c7b8bf2feb635290b05788b61ead0b2cc813a assets/create/models/block/brass_belt_funnel_pull_retracted.json -094a5aedd53295aaa9b78deedf7899f9875dc5d8 assets/create/models/block/brass_belt_funnel_push_extended.json -44d2cf63398e5e4c39f43412a00d7f0213d8703c assets/create/models/block/brass_belt_funnel_push_powered_extended.json -07eb19291e5c6108e9e25f57f512747bc48352dd assets/create/models/block/brass_belt_funnel_push_powered_retracted.json -6ff63956c71363f198588aca3fd849ad4e0c8863 assets/create/models/block/brass_belt_funnel_push_retracted.json +3fac6b1da6a81fc44a1ffe1e13dc6cfe37c3b738 assets/create/models/block/brass_belt_funnel__extended.json +2d10825bfd94419d5dbb4e60187127c4a1ce1526 assets/create/models/block/brass_belt_funnel__powered_extended.json +5ff7e01c5b65eb210a054556068d75426b547d9b assets/create/models/block/brass_belt_funnel__powered_pulling.json +e981727fd71e32ea2ecb8e057dfe123f1b940101 assets/create/models/block/brass_belt_funnel__powered_pushing.json +bc23a91f300e46761bb14c597fad39c3d414e84d assets/create/models/block/brass_belt_funnel__powered_retracted.json +dfc6250e28e12ff193a45891978ec50c406fc0c2 assets/create/models/block/brass_belt_funnel__pulling.json +5409325494780afe32e6e30377314e2992ca4aa5 assets/create/models/block/brass_belt_funnel__pushing.json +97410a12b7c1461f88fb633f26ff566a0636b627 assets/create/models/block/brass_belt_funnel__retracted.json 0934933df6bfbb19a1b14cd0e3cab2c18d5a3ebc assets/create/models/block/brass_block.json 166a5c053a81e6aadc24509ed24dc144a7255969 assets/create/models/block/brass_casing.json 838e7ab4c0c9d89eacfa078daf64995e505db896 assets/create/models/block/brass_funnel.json diff --git a/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json b/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json index 369be6128..4bbd11c49 100644 --- a/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json +++ b/src/generated/resources/assets/create/blockstates/andesite_belt_funnel.json @@ -1,123 +1,123 @@ { "variants": { - "facing=north,powered=false,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_retracted" + "facing=north,powered=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel__retracted" }, - "facing=south,powered=false,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_retracted", + "facing=south,powered=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel__retracted", "y": 180 }, - "facing=west,powered=false,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_retracted", + "facing=west,powered=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel__retracted", "y": 270 }, - "facing=east,powered=false,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_retracted", + "facing=east,powered=false,shape=retracted": { + "model": "create:block/andesite_belt_funnel__retracted", "y": 90 }, - "facing=north,powered=true,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_powered_retracted" + "facing=north,powered=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel__powered_retracted" }, - "facing=south,powered=true,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_powered_retracted", + "facing=south,powered=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel__powered_retracted", "y": 180 }, - "facing=west,powered=true,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_powered_retracted", + "facing=west,powered=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel__powered_retracted", "y": 270 }, - "facing=east,powered=true,pushing=false,shape=retracted": { - "model": "create:block/andesite_belt_funnel_pull_powered_retracted", + "facing=east,powered=true,shape=retracted": { + "model": "create:block/andesite_belt_funnel__powered_retracted", "y": 90 }, - "facing=north,powered=false,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_retracted" + "facing=north,powered=false,shape=extended": { + "model": "create:block/andesite_belt_funnel__extended" }, - "facing=south,powered=false,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_retracted", + "facing=south,powered=false,shape=extended": { + "model": "create:block/andesite_belt_funnel__extended", "y": 180 }, - "facing=west,powered=false,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_retracted", + "facing=west,powered=false,shape=extended": { + "model": "create:block/andesite_belt_funnel__extended", "y": 270 }, - "facing=east,powered=false,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_retracted", + "facing=east,powered=false,shape=extended": { + "model": "create:block/andesite_belt_funnel__extended", "y": 90 }, - "facing=north,powered=true,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_powered_retracted" + "facing=north,powered=true,shape=extended": { + "model": "create:block/andesite_belt_funnel__powered_extended" }, - "facing=south,powered=true,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_powered_retracted", + "facing=south,powered=true,shape=extended": { + "model": "create:block/andesite_belt_funnel__powered_extended", "y": 180 }, - "facing=west,powered=true,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_powered_retracted", + "facing=west,powered=true,shape=extended": { + "model": "create:block/andesite_belt_funnel__powered_extended", "y": 270 }, - "facing=east,powered=true,pushing=true,shape=retracted": { - "model": "create:block/andesite_belt_funnel_push_powered_retracted", + "facing=east,powered=true,shape=extended": { + "model": "create:block/andesite_belt_funnel__powered_extended", "y": 90 }, - "facing=north,powered=false,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_extended" + "facing=north,powered=false,shape=pushing": { + "model": "create:block/andesite_belt_funnel__pushing" }, - "facing=south,powered=false,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_extended", + "facing=south,powered=false,shape=pushing": { + "model": "create:block/andesite_belt_funnel__pushing", "y": 180 }, - "facing=west,powered=false,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_extended", + "facing=west,powered=false,shape=pushing": { + "model": "create:block/andesite_belt_funnel__pushing", "y": 270 }, - "facing=east,powered=false,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_extended", + "facing=east,powered=false,shape=pushing": { + "model": "create:block/andesite_belt_funnel__pushing", "y": 90 }, - "facing=north,powered=true,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_powered_extended" + "facing=north,powered=true,shape=pushing": { + "model": "create:block/andesite_belt_funnel__powered_pushing" }, - "facing=south,powered=true,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_powered_extended", + "facing=south,powered=true,shape=pushing": { + "model": "create:block/andesite_belt_funnel__powered_pushing", "y": 180 }, - "facing=west,powered=true,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_powered_extended", + "facing=west,powered=true,shape=pushing": { + "model": "create:block/andesite_belt_funnel__powered_pushing", "y": 270 }, - "facing=east,powered=true,pushing=false,shape=extended": { - "model": "create:block/andesite_belt_funnel_pull_powered_extended", + "facing=east,powered=true,shape=pushing": { + "model": "create:block/andesite_belt_funnel__powered_pushing", "y": 90 }, - "facing=north,powered=false,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_extended" + "facing=north,powered=false,shape=pulling": { + "model": "create:block/andesite_belt_funnel__pulling" }, - "facing=south,powered=false,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_extended", + "facing=south,powered=false,shape=pulling": { + "model": "create:block/andesite_belt_funnel__pulling", "y": 180 }, - "facing=west,powered=false,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_extended", + "facing=west,powered=false,shape=pulling": { + "model": "create:block/andesite_belt_funnel__pulling", "y": 270 }, - "facing=east,powered=false,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_extended", + "facing=east,powered=false,shape=pulling": { + "model": "create:block/andesite_belt_funnel__pulling", "y": 90 }, - "facing=north,powered=true,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_powered_extended" + "facing=north,powered=true,shape=pulling": { + "model": "create:block/andesite_belt_funnel__powered_pulling" }, - "facing=south,powered=true,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_powered_extended", + "facing=south,powered=true,shape=pulling": { + "model": "create:block/andesite_belt_funnel__powered_pulling", "y": 180 }, - "facing=west,powered=true,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_powered_extended", + "facing=west,powered=true,shape=pulling": { + "model": "create:block/andesite_belt_funnel__powered_pulling", "y": 270 }, - "facing=east,powered=true,pushing=true,shape=extended": { - "model": "create:block/andesite_belt_funnel_push_powered_extended", + "facing=east,powered=true,shape=pulling": { + "model": "create:block/andesite_belt_funnel__powered_pulling", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json b/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json index 779a55e87..5f68caef4 100644 --- a/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json +++ b/src/generated/resources/assets/create/blockstates/brass_belt_funnel.json @@ -1,123 +1,123 @@ { "variants": { - "facing=north,powered=false,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_retracted" + "facing=north,powered=false,shape=retracted": { + "model": "create:block/brass_belt_funnel__retracted" }, - "facing=south,powered=false,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_retracted", + "facing=south,powered=false,shape=retracted": { + "model": "create:block/brass_belt_funnel__retracted", "y": 180 }, - "facing=west,powered=false,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_retracted", + "facing=west,powered=false,shape=retracted": { + "model": "create:block/brass_belt_funnel__retracted", "y": 270 }, - "facing=east,powered=false,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_retracted", + "facing=east,powered=false,shape=retracted": { + "model": "create:block/brass_belt_funnel__retracted", "y": 90 }, - "facing=north,powered=true,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_powered_retracted" + "facing=north,powered=true,shape=retracted": { + "model": "create:block/brass_belt_funnel__powered_retracted" }, - "facing=south,powered=true,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_powered_retracted", + "facing=south,powered=true,shape=retracted": { + "model": "create:block/brass_belt_funnel__powered_retracted", "y": 180 }, - "facing=west,powered=true,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_powered_retracted", + "facing=west,powered=true,shape=retracted": { + "model": "create:block/brass_belt_funnel__powered_retracted", "y": 270 }, - "facing=east,powered=true,pushing=false,shape=retracted": { - "model": "create:block/brass_belt_funnel_pull_powered_retracted", + "facing=east,powered=true,shape=retracted": { + "model": "create:block/brass_belt_funnel__powered_retracted", "y": 90 }, - "facing=north,powered=false,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_retracted" + "facing=north,powered=false,shape=extended": { + "model": "create:block/brass_belt_funnel__extended" }, - "facing=south,powered=false,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_retracted", + "facing=south,powered=false,shape=extended": { + "model": "create:block/brass_belt_funnel__extended", "y": 180 }, - "facing=west,powered=false,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_retracted", + "facing=west,powered=false,shape=extended": { + "model": "create:block/brass_belt_funnel__extended", "y": 270 }, - "facing=east,powered=false,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_retracted", + "facing=east,powered=false,shape=extended": { + "model": "create:block/brass_belt_funnel__extended", "y": 90 }, - "facing=north,powered=true,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_powered_retracted" + "facing=north,powered=true,shape=extended": { + "model": "create:block/brass_belt_funnel__powered_extended" }, - "facing=south,powered=true,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_powered_retracted", + "facing=south,powered=true,shape=extended": { + "model": "create:block/brass_belt_funnel__powered_extended", "y": 180 }, - "facing=west,powered=true,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_powered_retracted", + "facing=west,powered=true,shape=extended": { + "model": "create:block/brass_belt_funnel__powered_extended", "y": 270 }, - "facing=east,powered=true,pushing=true,shape=retracted": { - "model": "create:block/brass_belt_funnel_push_powered_retracted", + "facing=east,powered=true,shape=extended": { + "model": "create:block/brass_belt_funnel__powered_extended", "y": 90 }, - "facing=north,powered=false,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_extended" + "facing=north,powered=false,shape=pushing": { + "model": "create:block/brass_belt_funnel__pushing" }, - "facing=south,powered=false,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_extended", + "facing=south,powered=false,shape=pushing": { + "model": "create:block/brass_belt_funnel__pushing", "y": 180 }, - "facing=west,powered=false,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_extended", + "facing=west,powered=false,shape=pushing": { + "model": "create:block/brass_belt_funnel__pushing", "y": 270 }, - "facing=east,powered=false,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_extended", + "facing=east,powered=false,shape=pushing": { + "model": "create:block/brass_belt_funnel__pushing", "y": 90 }, - "facing=north,powered=true,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_powered_extended" + "facing=north,powered=true,shape=pushing": { + "model": "create:block/brass_belt_funnel__powered_pushing" }, - "facing=south,powered=true,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_powered_extended", + "facing=south,powered=true,shape=pushing": { + "model": "create:block/brass_belt_funnel__powered_pushing", "y": 180 }, - "facing=west,powered=true,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_powered_extended", + "facing=west,powered=true,shape=pushing": { + "model": "create:block/brass_belt_funnel__powered_pushing", "y": 270 }, - "facing=east,powered=true,pushing=false,shape=extended": { - "model": "create:block/brass_belt_funnel_pull_powered_extended", + "facing=east,powered=true,shape=pushing": { + "model": "create:block/brass_belt_funnel__powered_pushing", "y": 90 }, - "facing=north,powered=false,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_extended" + "facing=north,powered=false,shape=pulling": { + "model": "create:block/brass_belt_funnel__pulling" }, - "facing=south,powered=false,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_extended", + "facing=south,powered=false,shape=pulling": { + "model": "create:block/brass_belt_funnel__pulling", "y": 180 }, - "facing=west,powered=false,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_extended", + "facing=west,powered=false,shape=pulling": { + "model": "create:block/brass_belt_funnel__pulling", "y": 270 }, - "facing=east,powered=false,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_extended", + "facing=east,powered=false,shape=pulling": { + "model": "create:block/brass_belt_funnel__pulling", "y": 90 }, - "facing=north,powered=true,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_powered_extended" + "facing=north,powered=true,shape=pulling": { + "model": "create:block/brass_belt_funnel__powered_pulling" }, - "facing=south,powered=true,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_powered_extended", + "facing=south,powered=true,shape=pulling": { + "model": "create:block/brass_belt_funnel__powered_pulling", "y": 180 }, - "facing=west,powered=true,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_powered_extended", + "facing=west,powered=true,shape=pulling": { + "model": "create:block/brass_belt_funnel__powered_pulling", "y": 270 }, - "facing=east,powered=true,pushing=true,shape=extended": { - "model": "create:block/brass_belt_funnel_push_powered_extended", + "facing=east,powered=true,shape=pulling": { + "model": "create:block/brass_belt_funnel__powered_pulling", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 581373307..3b646b920 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", - "north": "true" + "north": "true", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "south": "true", - "up": "true", "down": "false", - "north": "false" + "north": "false", + "up": "true", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,21 +104,21 @@ }, { "when": { - "south": "false", - "up": "true", "down": "true", - "north": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { - "south": "false", + "north": "false", "up": "true", - "down": "false", - "north": "false" + "south": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "down": "false", + "north": "false", + "up": "true", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "true" + "north": "true", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", - "north": "false" + "north": "false", + "up": "false", + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "false", - "east": "true" + "east": "true", + "down": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "up": "true", - "down": "false", "west": "true", - "east": "false" + "east": "false", + "down": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "false", - "east": "true" + "east": "true", + "down": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "up": "false", - "down": "true", "west": "true", - "east": "false" + "east": "false", + "down": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "up": "true", + "west": "false", + "east": "false", "down": "true", - "west": "false", - "east": "false" + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "up": "true", + "west": "false", + "east": "false", "down": "false", - "west": "false", - "east": "false" + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "up": "false", + "west": "false", + "east": "false", "down": "true", - "west": "false", - "east": "false" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "true" + "east": "true", + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "true" + "east": "true", + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "true", - "east": "false" + "east": "false", + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "up": "false", - "down": "false", "west": "false", - "east": "false" + "east": "false", + "down": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 1aa3d3728..9d00ea8b1 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__extended.json similarity index 67% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_extended.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__extended.json index f79ae5977..9e68f10d3 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_extended.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__extended.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_extended", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_pull", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall", "6": "create:block/andesite_funnel", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_extended.json similarity index 68% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_extended.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_extended.json index 9921a4309..85b3cf6a7 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_extended.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_extended.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_extended", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_push", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall_powered", "6": "create:block/andesite_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_pulling.json similarity index 56% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_pulling.json index 4475b476b..70301fac8 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_extended.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_pulling.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_extended", + "parent": "create:block/belt_funnel/block_pulling", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_pull", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall_powered", "6": "create:block/andesite_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_pushing.json similarity index 56% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_pushing.json index 38a2f735a..804891334 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_powered_retracted.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_pushing.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_retracted", + "parent": "create:block/belt_funnel/block_pushing", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_push", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall_powered", "6": "create:block/andesite_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_retracted.json similarity index 68% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_retracted.json index 4ade59fc5..6a6e4890d 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_powered_retracted.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__powered_retracted.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_retracted", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_pull", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall_powered", "6": "create:block/andesite_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_extended.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__pulling.json similarity index 55% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_extended.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__pulling.json index 75b27092e..2e7f54321 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_extended.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__pulling.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_extended", + "parent": "create:block/belt_funnel/block_pulling", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_push", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall", "6": "create:block/andesite_funnel", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__pushing.json similarity index 55% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_retracted.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__pushing.json index f77372c76..db852a0e1 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_pull_retracted.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__pushing.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_retracted", + "parent": "create:block/belt_funnel/block_pushing", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_pull", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall", "6": "create:block/andesite_funnel", diff --git a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_retracted.json b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__retracted.json similarity index 67% rename from src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_retracted.json rename to src/generated/resources/assets/create/models/block/andesite_belt_funnel__retracted.json index 91e243db3..533f700e6 100644 --- a/src/generated/resources/assets/create/models/block/andesite_belt_funnel_push_retracted.json +++ b/src/generated/resources/assets/create/models/block/andesite_belt_funnel__retracted.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_retracted", "textures": { "particle": "block/polished_andesite", - "2": "create:block/andesite_funnel_push", + "2": "create:block/andesite_funnel_neutral", + "2_1": "create:block/andesite_funnel_push", + "2_2": "create:block/andesite_funnel_pull", "3": "create:block/andesite_funnel_back", "5": "create:block/andesite_funnel_tall", "6": "create:block/andesite_funnel", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__extended.json similarity index 68% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__extended.json index fadd65788..0fce1a25a 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_extended.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__extended.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_extended", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_pull", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall", "6": "create:block/brass_funnel", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_extended.json similarity index 69% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_extended.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_extended.json index 455499d7f..ff664c508 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_extended.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_extended.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_extended", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_push", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall_powered", "6": "create:block/brass_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_pulling.json similarity index 57% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_extended.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_pulling.json index 5133a0a73..b2afb7d4e 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_extended.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_pulling.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_extended", + "parent": "create:block/belt_funnel/block_pulling", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_pull", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall_powered", "6": "create:block/brass_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_pushing.json similarity index 57% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_retracted.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_pushing.json index c5d444dd5..99b733775 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_powered_retracted.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_pushing.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_retracted", + "parent": "create:block/belt_funnel/block_pushing", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_push", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall_powered", "6": "create:block/brass_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_retracted.json similarity index 69% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_retracted.json index d64a5168c..60060dfb5 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_powered_retracted.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__powered_retracted.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_retracted", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_pull", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall_powered", "6": "create:block/brass_funnel_powered", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_extended.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__pulling.json similarity index 55% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_push_extended.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__pulling.json index 98a177099..2975e7830 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_extended.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__pulling.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_extended", + "parent": "create:block/belt_funnel/block_pulling", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_push", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall", "6": "create:block/brass_funnel", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__pushing.json similarity index 55% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_retracted.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__pushing.json index b4e776036..a1130fb8e 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_pull_retracted.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__pushing.json @@ -1,8 +1,10 @@ { - "parent": "create:block/belt_funnel/block_retracted", + "parent": "create:block/belt_funnel/block_pushing", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_pull", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall", "6": "create:block/brass_funnel", diff --git a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_retracted.json b/src/generated/resources/assets/create/models/block/brass_belt_funnel__retracted.json similarity index 68% rename from src/generated/resources/assets/create/models/block/brass_belt_funnel_push_retracted.json rename to src/generated/resources/assets/create/models/block/brass_belt_funnel__retracted.json index 4f23ee54f..693ec38e6 100644 --- a/src/generated/resources/assets/create/models/block/brass_belt_funnel_push_retracted.json +++ b/src/generated/resources/assets/create/models/block/brass_belt_funnel__retracted.json @@ -2,7 +2,9 @@ "parent": "create:block/belt_funnel/block_retracted", "textures": { "particle": "create:block/brass_block", - "2": "create:block/brass_funnel_push", + "2": "create:block/brass_funnel_neutral", + "2_1": "create:block/brass_funnel_push", + "2_2": "create:block/brass_funnel_pull", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall", "6": "create:block/brass_funnel", diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 60f71a3e8..5daece9ab 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -77,12 +77,27 @@ public class AllShapes { .add(2, 6, 2, 14, 10, 14) .add(0, 10, 0, 16, 13, 16) .forDirectional(UP), - BELT_FUNNEL_RETRACTED = shape(2, -5, 14, 12, 14, 18).add(0, -5, 8, 16, 16, 14) + BELT_FUNNEL_RETRACTED = shape(2, -2, 14, 14, 14, 18).add(0, -5, 8, 16, 16, 14) .forHorizontal(NORTH), - BELT_FUNNEL_EXTENDED = shape(2, -4, 14, 14, 14, 18).add(3, -4, 10, 13, 13, 14) + BELT_FUNNEL_EXTENDED = shape(2, -2, 14, 14, 14, 18).add(3, -4, 10, 13, 13, 14) .add(2, -4, 6, 14, 14, 10) .add(0, -5, 0, 16, 16, 6) .forHorizontal(NORTH), + BELT_FUNNEL_PERPENDICULAR = + shape(2, -2, 14, 14, 14, 18) + .add(1, 8, 12, 15, 15, 14) + .add(0.1, 13, 7, 15.9, 15, 11) + .add(0.1, 9, 8, 15.9, 13, 12) + .add(0.1, 5, 9, 15.9, 9, 13) + .add(0.1, 1, 10, 15.9, 5, 14) + .add(0.1, -3, 11, 15.9, 1, 15) + .forHorizontal(NORTH), + BELT_FUNNEL_CONNECTED = + shape(2, -2, 14, 14, 14, 18) + .add(0, -5, 5, 16, 16, 11) + .add(2, -4, 2, 14, 14, -2) + .add(3, -2, 0, 13, 13, 16) + .forHorizontal(NORTH), FLUID_VALVE = shape(3, -1, 3, 13, 17, 13).add(2, 2, 2, 14, 14, 14) .forAxis(), SMART_FLUID_PIPE_FLOOR = shape(4, 4, 0, 12, 12, 16).add(3, 3, 3, 13, 13, 13) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java index 92c2ba6c5..45049327f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionRenderer.java @@ -1,15 +1,16 @@ package com.simibubi.create.content.contraptions.components.structureMovement; +import java.util.List; import java.util.Random; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; import com.simibubi.create.foundation.utility.TileEntityRenderHelper; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; @@ -23,6 +24,7 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; @@ -30,28 +32,40 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; +import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; public class ContraptionRenderer { - public static final Compartment CONTRAPTION = new Compartment<>(); + public static final Compartment> CONTRAPTION = new Compartment<>(); protected static PlacementSimulationWorld renderWorld; public static void render(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - renderStructure(world, c, ms, msLocal, buffer); renderTileEntities(world, c, ms, msLocal, buffer); + if (buffer instanceof IRenderTypeBuffer.Impl) + ((IRenderTypeBuffer.Impl) buffer).draw(); + renderStructure(world, c, ms, msLocal, buffer); renderActors(world, c, ms, msLocal, buffer); } protected static void renderStructure(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { - IVertexBuilder translucent = buffer.getBuffer(RenderType.getTranslucent()); - SuperByteBuffer contraptionBuffer = CreateClient.bufferCache.get(CONTRAPTION, c, () -> buildStructureBuffer(c)); - Matrix4f model = msLocal.peek() - .getModel(); - contraptionBuffer.light(model) - .renderInto(ms, translucent); + SuperByteBufferCache bufferCache = CreateClient.bufferCache; + List blockLayers = RenderType.getBlockLayers(); + + buffer.getBuffer(RenderType.getSolid()); + for (int i = 0; i < blockLayers.size(); i++) { + RenderType layer = blockLayers.get(i); + Pair key = Pair.of(c, i); + SuperByteBuffer contraptionBuffer = bufferCache.get(CONTRAPTION, key, () -> buildStructureBuffer(c, layer)); + if (contraptionBuffer.isEmpty()) + continue; + Matrix4f model = msLocal.peek() + .getModel(); + contraptionBuffer.light(model) + .renderInto(ms, buffer.getBuffer(layer)); + } } private static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, @@ -59,10 +73,11 @@ public class ContraptionRenderer { TileEntityRenderHelper.renderTileEntities(world, c.customRenderTEs, ms, msLocal, buffer); } - private static SuperByteBuffer buildStructureBuffer(Contraption c) { + private static SuperByteBuffer buildStructureBuffer(Contraption c, RenderType layer) { if (renderWorld == null || renderWorld.getWorld() != Minecraft.getInstance().world) renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world); + ForgeHooksClient.setRenderLayer(layer); MatrixStack ms = new MatrixStack(); BlockRendererDispatcher dispatcher = Minecraft.getInstance() .getBlockRendererDispatcher(); @@ -79,7 +94,9 @@ public class ContraptionRenderer { if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) continue; - + if (!RenderTypeLookup.canRenderInLayer(state, layer)) + continue; + IBakedModel originalModel = dispatcher.getModelForState(state); ms.push(); ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index fda747d49..620c5a1b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -94,6 +94,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp public float getAngularSpeed() { float speed = (isWindmill() ? getGeneratedSpeed() : getSpeed()) * 3 / 10f; + if (getSpeed() == 0) + speed = 0; if (world.isRemote) { speed *= ServerSpeedProvider.get(); speed += clientAngleDiff / 3f; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java index ad2d4e10f..3fa3d429c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.relays.belt.transport; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; @@ -13,18 +14,19 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; +import net.minecraftforge.items.ItemHandlerHelper; public class BeltFunnelInteractionHandler { public static boolean checkForFunnels(BeltInventory beltInventory, TransportedItemStack currentItem, float nextOffset) { boolean beltMovementPositive = beltInventory.beltMovementPositive; - int firstUpcomingSegment = (int) (currentItem.beltPosition + (beltMovementPositive ? .5f : -.5f)); + int firstUpcomingSegment = (int) Math.floor(currentItem.beltPosition); int step = beltMovementPositive ? 1 : -1; firstUpcomingSegment = MathHelper.clamp(firstUpcomingSegment, 0, beltInventory.belt.beltLength - 1); - for (int segment = firstUpcomingSegment; beltMovementPositive ? segment + .5f <= nextOffset - : segment + .5f >= nextOffset; segment += step) { + for (int segment = firstUpcomingSegment; beltMovementPositive ? segment <= nextOffset + : segment + 1 >= nextOffset; segment += step) { BlockPos funnelPos = BeltHelper.getPositionForOffset(beltInventory.belt, segment) .up(); World world = beltInventory.belt.getWorld(); @@ -36,15 +38,25 @@ public class BeltFunnelInteractionHandler { boolean blocking = funnelFacing == movementFacing.getOpposite(); if (funnelFacing == movementFacing) continue; + if (funnelState.get(BeltFunnelBlock.SHAPE) == Shape.PUSHING) + continue; - currentItem.beltPosition = segment + .5f; + float funnelEntry = segment + .5f; + if (funnelState.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) + funnelEntry += .499f * (beltMovementPositive ? -1 : 1); + + boolean hasCrossed = nextOffset > funnelEntry && beltMovementPositive + || nextOffset < funnelEntry && !beltMovementPositive; + if (!hasCrossed) + return false; + if (blocking) + currentItem.beltPosition = funnelEntry; - if (world.isRemote) - return blocking; - if (funnelState.get(BeltFunnelBlock.PUSHING)) - return blocking; - if (funnelState.has(BeltFunnelBlock.POWERED) && funnelState.get(BeltFunnelBlock.POWERED)) - return blocking; + if (world.isRemote || funnelState.has(BeltFunnelBlock.POWERED) && funnelState.get(BeltFunnelBlock.POWERED)) + if (blocking) + return true; + else + continue; TileEntity te = world.getTileEntity(funnelPos); if (!(te instanceof FunnelTileEntity)) @@ -54,20 +66,41 @@ public class BeltFunnelInteractionHandler { InvManipulationBehaviour inserting = funnelTE.getBehaviour(InvManipulationBehaviour.TYPE); FilteringBehaviour filtering = funnelTE.getBehaviour(FilteringBehaviour.TYPE); - if (inserting == null) - return blocking; - if (filtering != null && !filtering.test(currentItem.stack)) - return blocking; + if (inserting == null || filtering != null && !filtering.test(currentItem.stack)) + if (blocking) + return true; + else + continue; - ItemStack before = currentItem.stack.copy(); - ItemStack remainder = inserting.insert(before); - if (before.equals(remainder, false)) - return blocking; + int amountToExtract = funnelTE.getAmountToExtract(); + ItemStack toInsert = currentItem.stack.copy(); + if (amountToExtract > toInsert.getCount()) + if (blocking) + return true; + else + continue; + + if (amountToExtract != -1) + toInsert.setCount(amountToExtract); + + ItemStack remainder = inserting.insert(toInsert); + if (toInsert.equals(remainder, false)) + if (blocking) + return true; + else + continue; + + int notFilled = currentItem.stack.getCount() - toInsert.getCount(); + if (!remainder.isEmpty()) { + remainder.grow(notFilled); + } else if (notFilled > 0) + remainder = ItemHandlerHelper.copyStackWithSize(currentItem.stack, notFilled); funnelTE.flap(true); currentItem.stack = remainder; beltInventory.belt.sendData(); - return true; + if (blocking) + return true; } return false; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 8271b56b8..32b9e61d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -292,8 +292,8 @@ public class BeltInventory { BlockPos lastPosition = BeltHelper.getPositionForOffset(belt, lastOffset); BlockPos nextPosition = BeltHelper.getPositionForOffset(belt, beltMovementPositive ? belt.beltLength : -1); - if (AllBlocks.BRASS_BELT_FUNNEL.has(world.getBlockState(lastPosition.up()))) - return Ending.FUNNEL; +// if (AllBlocks.BRASS_BELT_FUNNEL.has(world.getBlockState(lastPosition.up()))) +// return Ending.FUNNEL; DirectBeltInputBehaviour inputBehaviour = TileEntityBehaviour.get(world, nextPosition, DirectBeltInputBehaviour.TYPE); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index 434883193..9a19a0f95 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -22,6 +22,7 @@ import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; @@ -49,6 +50,11 @@ public class ShaftBlock extends RotatedPillarKineticBlock implements IWaterLogga public static boolean isShaft(BlockState state) { return AllBlocks.SHAFT.has(state); } + + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + return IWrenchableWithBracket.super.onWrenched(state, context); + } @Override public PushReaction getPushReaction(BlockState state) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index 6bd89f42a..fc0828078 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -18,7 +18,7 @@ public class WrenchItemRenderer extends CustomRenderedItemModelRenderer parent; + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); public enum Shape implements IStringSerializable { - RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED); + RETRACTED(AllShapes.BELT_FUNNEL_RETRACTED), + EXTENDED(AllShapes.BELT_FUNNEL_EXTENDED), + PUSHING(AllShapes.BELT_FUNNEL_PERPENDICULAR), + PULLING(AllShapes.BELT_FUNNEL_PERPENDICULAR); +// CONNECTED(AllShapes.BELT_FUNNEL_CONNECTED); VoxelShaper shaper; @@ -49,35 +69,31 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { } public BeltFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { - super(parent, p_i48377_1_); - setDefaultState(getDefaultState().with(SHAPE, Shape.RETRACTED)); + super(p_i48377_1_); + this.parent = parent; + BlockState defaultState = getDefaultState().with(SHAPE, Shape.RETRACTED); + if (hasPoweredProperty()) + defaultState = defaultState.with(POWERED, false); + setDefaultState(defaultState); + } + + public abstract boolean hasPoweredProperty(); + + @Override + public boolean hasTileEntity(BlockState state) { + return true; } @Override - public BlockState getStateForPlacement(BlockItemUseContext ctx) { - BlockState state = super.getStateForPlacement(ctx); - return getStateForPosition(ctx.getWorld(), ctx.getPos(), state, ctx.getFace()); - } - - public BlockState getStateForPosition(World world, BlockPos pos, BlockState defaultState, Direction facing) { - BlockState state = defaultState.with(HORIZONTAL_FACING, facing); - BlockPos posBelow = pos.down(); - BlockState stateBelow = world.getBlockState(posBelow); - if (!AllBlocks.BELT.has(stateBelow)) - return state; - TileEntity teBelow = world.getTileEntity(posBelow); - if (teBelow == null || !(teBelow instanceof BeltTileEntity)) - return state; - BeltTileEntity beltTileEntity = (BeltTileEntity) teBelow; - if (beltTileEntity.getSpeed() == 0) - return state; - Direction movementFacing = beltTileEntity.getMovementFacing(); - return state.with(PUSHING, movementFacing == facing); + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.FUNNEL.create(); } @Override protected void fillStateContainer(Builder p_206840_1_) { - super.fillStateContainer(p_206840_1_.add(SHAPE)); + if (hasPoweredProperty()) + p_206840_1_.add(POWERED); + super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, SHAPE)); } @Override @@ -86,13 +102,72 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { return state.get(SHAPE).shaper.get(state.get(HORIZONTAL_FACING)); } + @Override + public BlockState getStateForPlacement(BlockItemUseContext ctx) { + BlockState stateForPlacement = super.getStateForPlacement(ctx); + BlockPos pos = ctx.getPos(); + World world = ctx.getWorld(); + Direction facing = ctx.getFace(); + + if (hasPoweredProperty()) + stateForPlacement = stateForPlacement.with(POWERED, world.isBlockPowered(pos)); + + BlockState state = stateForPlacement.with(HORIZONTAL_FACING, facing); + return state.with(SHAPE, getShapeForPosition(world, pos, facing)); + } + + public static Shape getShapeForPosition(IBlockReader world, BlockPos pos, Direction facing) { + BlockPos posBelow = pos.down(); + BlockState stateBelow = world.getBlockState(posBelow); + if (!AllBlocks.BELT.has(stateBelow)) + return Shape.PUSHING; + Direction movementFacing = stateBelow.get(BeltBlock.HORIZONTAL_FACING); + return movementFacing.getAxis() != facing.getAxis() ? Shape.PUSHING : Shape.RETRACTED; + } + + @Override + public void onReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean isMoving) { + if (state.hasTileEntity() && (state.getBlock() != newState.getBlock() && !FunnelBlock.isFunnel(newState) + || !newState.hasTileEntity())) { + TileEntityBehaviour.destroy(world, pos, FilteringBehaviour.TYPE); + world.removeTileEntity(pos); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean addDestroyEffects(BlockState state, World world, BlockPos pos, ParticleManager manager) { + BlockHelper.addReducedDestroyEffects(state, world, pos, manager); + return true; + } + + @Override + public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, + PlayerEntity player) { + return parent.asStack(); + } + @Override public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, BlockPos pos, BlockPos p_196271_6_) { - if (direction == state.get(HORIZONTAL_FACING)) - return updateShape(state, world, pos); - else - return super.updatePostPlacement(state, direction, neighbour, world, pos, p_196271_6_); + if (!isOnValidBelt(state, world, pos)) { + BlockState parentState = parent.getDefaultState(); + if (state.has(POWERED) && state.get(POWERED)) + parentState = parentState.with(POWERED, true); + return parentState.with(FunnelBlock.FACING, state.get(HORIZONTAL_FACING)); + } + Shape updatedShape = getShapeForPosition(world, pos, state.get(HORIZONTAL_FACING)); + Shape currentShape = state.get(SHAPE); + if (updatedShape == currentShape) + return state; + + // Don't revert wrenched states + if (updatedShape == Shape.PUSHING && currentShape == Shape.PULLING) + return state; + if (updatedShape == Shape.RETRACTED && currentShape == Shape.EXTENDED) + return state; + + return state.with(SHAPE, updatedShape); } public static boolean isOnValidBelt(BlockState state, IWorldReader world, BlockPos pos) { @@ -106,45 +181,44 @@ public abstract class BeltFunnelBlock extends HorizontalInteractionFunnelBlock { return true; } - public static BlockState updateShape(BlockState state, IBlockReader world, BlockPos pos) { - state = state.with(SHAPE, Shape.RETRACTED); - Direction horizontalFacing = state.get(HORIZONTAL_FACING); - - BlockState below = world.getBlockState(pos.down()); - if (below.getBlock() instanceof BeltBlock && below.get(BeltBlock.HORIZONTAL_FACING) - .getAxis() != horizontalFacing.getAxis()) - return state; - - BlockState neighbour = world.getBlockState(pos.offset(horizontalFacing)); - if (canConnectTo(state, neighbour)) - return state.with(SHAPE, Shape.EXTENDED); - return state; - } - - private static boolean canConnectTo(BlockState state, BlockState neighbour) { - if (neighbour.getBlock() instanceof BeltTunnelBlock) - return true; - if (neighbour.getBlock() instanceof BeltFunnelBlock - && neighbour.get(HORIZONTAL_FACING) == state.get(HORIZONTAL_FACING) - .getOpposite()) - return true; - return false; + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + if (!hasPoweredProperty()) + return; + if (worldIn.isRemote) + return; + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) + worldIn.setBlockState(pos, state.cycle(POWERED), 2); } @Override - public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, - boolean p_196243_5_) { - if (p_196243_1_.hasTileEntity() - && (p_196243_1_.getBlock() != p_196243_4_.getBlock() && !FunnelBlock.isFunnel(p_196243_4_) - || !p_196243_4_.hasTileEntity())) { - TileEntityBehaviour.destroy(p_196243_2_, p_196243_3_, FilteringBehaviour.TYPE); - p_196243_2_.removeTileEntity(p_196243_3_); + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + World world = context.getWorld(); + if (world.isRemote) + return ActionResultType.SUCCESS; + + Shape shape = state.get(SHAPE); + Shape newShape = shape; + if (shape == Shape.PULLING) + newShape = Shape.PUSHING; + else if (shape == Shape.PUSHING) + newShape = Shape.PULLING; + else if (shape == Shape.EXTENDED) + newShape = Shape.RETRACTED; + else if (shape == Shape.RETRACTED) { + BlockState belt = world.getBlockState(context.getPos().down()); + if (belt.getBlock() instanceof BeltBlock && belt.get(BeltBlock.SLOPE) != BeltSlope.HORIZONTAL) + newShape = Shape.RETRACTED; + else + newShape = Shape.EXTENDED; } - } - @Override - protected boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos) { - return isOnValidBelt(state, world, pos); + if (newShape != shape) + world + .setBlockState(context.getPos(), state.with(SHAPE, newShape)); + return ActionResultType.SUCCESS; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java index e047e1d0f..3cab09fdd 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelGenerator.java @@ -33,20 +33,19 @@ public class BeltFunnelGenerator extends SpecialBlockStateGen { @Override public ModelFile getModel(DataGenContext ctx, RegistrateBlockstateProvider prov, BlockState state) { - boolean pushing = state.get(BeltFunnelBlock.PUSHING); boolean powered = state.has(BlockStateProperties.POWERED) && state.get(BeltFunnelBlock.POWERED); String shapeName = state.get(BeltFunnelBlock.SHAPE) .getName(); - String pushingSuffix = (pushing ? "push" : "pull") ; String poweredSuffix = powered ? "_powered" : ""; - String name = ctx.getName() + "_" + pushingSuffix + poweredSuffix; - String textureName = type + "_funnel_" + pushingSuffix; + String name = ctx.getName() + "_" + poweredSuffix; return prov.models() .withExistingParent(name + "_" + shapeName, prov.modLoc("block/belt_funnel/block_" + shapeName)) .texture("particle", materialBlockTexture) - .texture("2", prov.modLoc("block/" + textureName)) + .texture("2", prov.modLoc("block/" + type + "_funnel_neutral")) + .texture("2_1", prov.modLoc("block/" + type + "_funnel_push")) + .texture("2_2", prov.modLoc("block/" + type + "_funnel_pull")) .texture("3", prov.modLoc("block/" + type + "_funnel_back")) .texture("5", prov.modLoc("block/" + type + "_funnel_tall" + poweredSuffix)) .texture("6", prov.modLoc("block/" + type + "_funnel" + poweredSuffix)) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index a9a41f804..0084a6412 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -164,7 +164,7 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< if (direction == Direction.DOWN) { BlockState equivalentFunnel = getEquivalentBeltFunnel(null, null, state); if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos)) - return BeltFunnelBlock.updateShape(equivalentFunnel, world, pos); + return equivalentFunnel.with(BeltFunnelBlock.SHAPE, BeltFunnelBlock.getShapeForPosition(world, pos, facing)); } } return state; @@ -177,7 +177,7 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< Block block = world.getBlockState(pos.offset(state.get(FACING) .getOpposite())) .getBlock(); - return !(block instanceof FunnelBlock) && !(block instanceof HorizontalInteractionFunnelBlock); + return !(block instanceof FunnelBlock) && !(block instanceof BeltFunnelBlock); } @Nullable @@ -205,7 +205,7 @@ public abstract class FunnelBlock extends ProperDirectionalBlock implements ITE< @Nullable public static boolean isFunnel(BlockState state) { - return state.getBlock() instanceof FunnelBlock || state.getBlock() instanceof HorizontalInteractionFunnelBlock; + return state.getBlock() instanceof FunnelBlock || state.getBlock() instanceof BeltFunnelBlock; } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index c95d6b41a..f76caa4f0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -1,7 +1,6 @@ package com.simibubi.create.content.logistics.block.funnel; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.utility.AngleHelper; @@ -24,11 +23,21 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { Direction funnelFacing = FunnelBlock.getFunnelFacing(state); float stateAngle = AngleHelper.horizontalAngle(funnelFacing); - if (AllBlocks.BRASS_BELT_FUNNEL.has(state)) - if (state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED) - return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 13, 7.5f), horizontalAngle, Axis.Y); - else + if (state.getBlock() instanceof BeltFunnelBlock) { + switch (state.get(BeltFunnelBlock.SHAPE)) { + +// case CONNECTED: +// return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 15.5f, 8), stateAngle, Axis.Y); + case EXTENDED: return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 15.5f, 13), stateAngle, Axis.Y); + case PULLING: + case PUSHING: + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12.1, 8.7f), horizontalAngle, Axis.Y); + default: + case RETRACTED: + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 13, 7.5f), horizontalAngle, Axis.Y); + } + } if (!funnelFacing.getAxis() .isHorizontal()) { @@ -40,14 +49,10 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { .getAxis()); if (funnelFacing.getAxis() == Axis.Z) verticalDirection = verticalDirection.getOpposite(); - boolean reverse = state.getBlock() instanceof HorizontalInteractionFunnelBlock - && !state.get(HorizontalInteractionFunnelBlock.PUSHING); float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; float xRot = -90; boolean alongX = funnelFacing.getAxis() == Axis.X; float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; - if (reverse) - zRotLast += 180; Vec3d vec = VecHelper.voxelSpace(8, 13, .5f); vec = vec.subtract(.5, .5, .5); @@ -63,33 +68,37 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { protected void rotate(BlockState state, MatrixStack ms) { Direction facing = FunnelBlock.getFunnelFacing(state); - if (!facing.getAxis() - .isVertical() - && !(AllBlocks.BRASS_BELT_FUNNEL.has(state) && state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED)) { - Direction verticalDirection = DirectionHelper.rotateAround(getSide(), facing.rotateY() - .getAxis()); - if (facing.getAxis() == Axis.Z) - verticalDirection = verticalDirection.getOpposite(); - - boolean reverse = state.getBlock() instanceof HorizontalInteractionFunnelBlock - && !state.get(HorizontalInteractionFunnelBlock.PUSHING); - - float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; - float xRot = -90; - boolean alongX = facing.getAxis() == Axis.X; - float zRotLast = alongX ^ facing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; - if (reverse) - zRotLast += 180; - - MatrixStacker.of(ms) - .rotateZ(alongX ? xRot : 0) - .rotateX(alongX ? 0 : xRot) - .rotateY(yRot) - .rotateZ(zRotLast); + if (facing.getAxis() + .isVertical()) { + super.rotate(state, ms); return; } - super.rotate(state, ms); + boolean isBeltFunnel = state.getBlock() instanceof BeltFunnelBlock; + if (isBeltFunnel && state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) { + Shape shape = state.get(BeltFunnelBlock.SHAPE); + super.rotate(state, ms); + if (shape == Shape.PULLING || shape == Shape.PUSHING) + MatrixStacker.of(ms).rotateX(-22.5f); + return; + } + + Direction verticalDirection = DirectionHelper.rotateAround(getSide(), facing.rotateY() + .getAxis()); + if (facing.getAxis() == Axis.Z) + verticalDirection = verticalDirection.getOpposite(); + + float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; + float xRot = -90; + boolean alongX = facing.getAxis() == Axis.X; + float zRotLast = alongX ^ facing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; + + + MatrixStacker.of(ms) + .rotateZ(alongX ? xRot : 0) + .rotateX(alongX ? 0 : xRot) + .rotateY(yRot) + .rotateZ(zRotLast); } @Override @@ -99,9 +108,8 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { if (facing == null) return false; - if (AllBlocks.BRASS_BELT_FUNNEL.has(state)) - return state.get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED ? direction == facing - : direction == Direction.UP; + if (state.getBlock() instanceof BeltFunnelBlock) + return state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED ? direction == facing : direction == Direction.UP; return direction.getAxis() != facing.getAxis(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java index 8afae31c4..1c8a21912 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java @@ -1,9 +1,12 @@ package com.simibubi.create.content.logistics.block.funnel; +import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; + import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -37,8 +40,12 @@ public class FunnelItem extends BlockItem { return state; Direction direction = state.get(FunnelBlock.FACING); if (!direction.getAxis() - .isHorizontal()) + .isHorizontal()) { + TileEntity tileEntity = world.getTileEntity(pos.offset(direction.getOpposite())); + if (tileEntity instanceof ChuteTileEntity && ((ChuteTileEntity) tileEntity).getItemMotion() > 0) + state = state.with(FunnelBlock.FACING, direction.getOpposite()); return state; + } FunnelBlock block = (FunnelBlock) getBlock(); Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state) @@ -46,7 +53,7 @@ public class FunnelItem extends BlockItem { BlockState equivalentBeltFunnel = beltFunnelBlock.getStateForPlacement(ctx) .with(BeltFunnelBlock.HORIZONTAL_FACING, direction); if (BeltFunnelBlock.isOnValidBelt(equivalentBeltFunnel, world, pos)) - return BeltFunnelBlock.updateShape(equivalentBeltFunnel, world, pos); + return equivalentBeltFunnel; return state; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index 2c49402db..ed0f46a09 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -42,6 +42,7 @@ public class FunnelRenderer extends SmartTileEntityRenderer { msr.centre() .rotateY(horizontalAngle) .unCentre(); + ms.translate(0, 0, -te.getFlapOffset()); for (int segment = 0; segment <= 3; segment++) { ms.push(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index f57aee3ac..ca034a723 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -5,6 +5,8 @@ import java.util.function.Function; import java.util.function.Predicate; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.config.AllConfigs; @@ -57,8 +59,16 @@ public class FunnelTileEntity extends SmartTileEntity { if (FunnelBlock.getFunnelFacing(state) == Direction.UP && autoExtractor.hasInventory()) return Mode.HOPPER; if (state.getBlock() instanceof BeltFunnelBlock) { - boolean pushing = state.get(BeltFunnelBlock.PUSHING); - return pushing ? Mode.PUSHING_TO_BELT : Mode.TAKING_FROM_BELT; + Shape shape = state.get(BeltFunnelBlock.SHAPE); + if (shape == Shape.PULLING) + return Mode.TAKING_FROM_BELT; + if (shape == Shape.PUSHING) + return Mode.PUSHING_TO_BELT; + + BeltTileEntity belt = BeltHelper.getSegmentTE(world, pos.down()); + if (belt != null) + return belt.getMovementFacing() == state.get(BeltFunnelBlock.HORIZONTAL_FACING) ? Mode.PUSHING_TO_BELT + : Mode.TAKING_FROM_BELT; } return Mode.COLLECT; } @@ -140,9 +150,7 @@ public class FunnelTileEntity extends SmartTileEntity { if (!inputBehaviour.canInsertFromSide(facing)) return; - int amountToExtract = invManipulation.getAmountFromFilter(); - if (!filtering.isActive()) - amountToExtract = 1; + int amountToExtract = getAmountToExtract(); ItemStack stack = invManipulation.extract(amountToExtract, s -> inputBehaviour.handleInsertion(s, facing, true) .isEmpty()); if (stack.isEmpty()) @@ -153,6 +161,15 @@ public class FunnelTileEntity extends SmartTileEntity { startCooldown(); } + public int getAmountToExtract() { + if (!supportsAmountOnFilter()) + return -1; + int amountToExtract = invManipulation.getAmountFromFilter(); + if (!filtering.isActive()) + amountToExtract = 1; + return amountToExtract; + } + private int startCooldown() { return extractionCooldown = AllConfigs.SERVER.logistics.defaultExtractionTimer.get(); } @@ -194,12 +211,18 @@ public class FunnelTileEntity extends SmartTileEntity { private boolean supportsAmountOnFilter() { BlockState blockState = getBlockState(); - boolean pushingToBelt = blockState.getBlock() instanceof HorizontalInteractionFunnelBlock - && blockState.get(HorizontalInteractionFunnelBlock.PUSHING); + boolean beltFunnelsupportsAmount = false; + if (blockState.getBlock() instanceof BeltFunnelBlock) { + Shape shape = blockState.get(BeltFunnelBlock.SHAPE); + if (shape == Shape.PUSHING) + beltFunnelsupportsAmount = true; + else + beltFunnelsupportsAmount = BeltHelper.getSegmentTE(world, pos.down()) != null; + } boolean hopper = FunnelBlock.getFunnelFacing(blockState) == Direction.UP && !world.getBlockState(pos.up()) .getMaterial() .isReplaceable(); - return pushingToBelt || hopper; + return beltFunnelsupportsAmount || hopper; } private boolean supportsDirectBeltInput(Direction side) { @@ -236,8 +259,26 @@ public class FunnelTileEntity extends SmartTileEntity { } public boolean hasFlap() { - return getBlockState().getBlock() instanceof BeltFunnelBlock - && getBlockState().get(BeltFunnelBlock.SHAPE) == Shape.RETRACTED; + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof BeltFunnelBlock)) + return false; + return true; + } + + public float getFlapOffset() { + BlockState blockState = getBlockState(); + if (!(blockState.getBlock() instanceof BeltFunnelBlock)) + return 0; + switch (blockState.get(BeltFunnelBlock.SHAPE)) { + default: + case RETRACTED: + return 0; + case EXTENDED: + return 8 / 16f; + case PULLING: + case PUSHING: + return -2 / 16f; + } } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java deleted file mode 100644 index 3216e1d8a..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/HorizontalInteractionFunnelBlock.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.simibubi.create.content.logistics.block.funnel; - -import com.simibubi.create.AllTileEntities; -import com.simibubi.create.content.contraptions.wrench.IWrenchable; -import com.tterrag.registrate.util.entry.BlockEntry; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; -import net.minecraft.state.BooleanProperty; -import net.minecraft.state.StateContainer.Builder; -import net.minecraft.state.properties.BlockStateProperties; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.world.IBlockReader; -import net.minecraft.world.IWorld; -import net.minecraft.world.IWorldReader; -import net.minecraft.world.World; - -public abstract class HorizontalInteractionFunnelBlock extends HorizontalBlock implements IWrenchable { - - public static final BooleanProperty POWERED = BlockStateProperties.POWERED; - public static final BooleanProperty PUSHING = BooleanProperty.create("pushing"); - private BlockEntry parent; - - public HorizontalInteractionFunnelBlock(BlockEntry parent, Properties p_i48377_1_) { - super(p_i48377_1_); - this.parent = parent; - BlockState defaultState = getDefaultState().with(PUSHING, true); - if (hasPoweredProperty()) - defaultState = defaultState.with(POWERED, false); - setDefaultState(defaultState); - } - - public abstract boolean hasPoweredProperty(); - - @Override - public boolean hasTileEntity(BlockState state) { - return true; - } - - @Override - public TileEntity createTileEntity(BlockState state, IBlockReader world) { - return AllTileEntities.FUNNEL.create(); - } - - @Override - protected void fillStateContainer(Builder p_206840_1_) { - if (hasPoweredProperty()) - p_206840_1_.add(POWERED); - super.fillStateContainer(p_206840_1_.add(HORIZONTAL_FACING, PUSHING)); - } - - @Override - public BlockState getStateForPlacement(BlockItemUseContext ctx) { - BlockState stateForPlacement = super.getStateForPlacement(ctx); - if (hasPoweredProperty()) - stateForPlacement = stateForPlacement.with(POWERED, ctx.getWorld() - .isBlockPowered(ctx.getPos())); - return stateForPlacement; - } - - @Override - public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, - boolean p_196243_5_) { - if (p_196243_1_.hasTileEntity() - && (p_196243_1_.getBlock() != p_196243_4_.getBlock() && !FunnelBlock.isFunnel(p_196243_4_) - || !p_196243_4_.hasTileEntity())) { - p_196243_2_.removeTileEntity(p_196243_3_); - } - } - - @Override - public ItemStack getPickBlock(BlockState state, RayTraceResult target, IBlockReader world, BlockPos pos, - PlayerEntity player) { - return parent.asStack(); - } - - @Override - public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState neighbour, IWorld world, - BlockPos pos, BlockPos p_196271_6_) { - if (!canStillInteract(state, world, pos)) { - BlockState parentState = parent.getDefaultState(); - if (state.has(POWERED) && state.get(POWERED)) - parentState = parentState.with(POWERED, true); - return parentState.with(FunnelBlock.FACING, state.get(HORIZONTAL_FACING)); - } - return state; - } - - @Override - public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { - return !world.getBlockState(pos.offset(state.get(HORIZONTAL_FACING) - .getOpposite())) - .getShape(world, pos) - .isEmpty(); - } - - protected abstract boolean canStillInteract(BlockState state, IWorldReader world, BlockPos pos); - - @Override - public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, - boolean isMoving) { - if (!hasPoweredProperty()) - return; - if (worldIn.isRemote) - return; - boolean previouslyPowered = state.get(POWERED); - if (previouslyPowered != worldIn.isBlockPowered(pos)) - worldIn.setBlockState(pos, state.cycle(POWERED), 2); - } - - @Override - public ActionResultType onWrenched(BlockState state, ItemUseContext context) { - if (!context.getWorld().isRemote) - context.getWorld() - .setBlockState(context.getPos(), state.cycle(PUSHING)); - return ActionResultType.SUCCESS; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java index 0c4caec59..48c259053 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringBehaviour.java @@ -19,6 +19,7 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.items.ItemHandlerHelper; public class FilteringBehaviour extends TileEntityBehaviour { @@ -105,7 +106,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { recipeFilter = true; return this; } - + public FilteringBehaviour forFluids() { fluidFilter = true; return this; @@ -142,9 +143,11 @@ public class FilteringBehaviour extends TileEntityBehaviour { } public void setFilter(ItemStack stack) { + boolean confirm = ItemHandlerHelper.canItemStacksStack(stack, filter); filter = stack.copy(); callback.accept(filter); - count = (filter.getItem() instanceof FilterItem) ? 0 : Math.min(stack.getCount(), stack.getMaxStackSize()); + count = !confirm ? 0 + : (filter.getItem() instanceof FilterItem) ? 0 : Math.min(stack.getCount(), stack.getMaxStackSize()); forceClientState = true; tileEntity.markDirty(); @@ -177,7 +180,7 @@ public class FilteringBehaviour extends TileEntityBehaviour { public boolean test(ItemStack stack) { return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter); } - + public boolean test(FluidStack stack) { return !isActive() || filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java index ce9c01c80..9e89d23c3 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBuffer.java @@ -280,5 +280,9 @@ public class SuperByteBuffer { return ((int) sky) << 20 | ((int) block) << 4; } + + public boolean isEmpty() { + return template.limit() == 0; + } } diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_connected.json b/src/main/resources/assets/create/models/block/belt_funnel/block_connected.json new file mode 100644 index 000000000..447d36f7a --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_connected.json @@ -0,0 +1,232 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "2": "create:block/brass_funnel_neutral", + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, -3, 5], + "to": [16, 0, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "north": {"uv": [8, 8, 9, 9.5], "texture": "#7"}, + "east": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2"}, + "south": {"uv": [15, 8, 16, 9.5], "texture": "#7"} + } + }, + { + "name": "LeftWall", + "from": [0, -3, 5], + "to": [2, 0, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "north": {"uv": [15, 8, 16, 9.5], "texture": "#7"}, + "south": {"uv": [8, 7.5, 9, 9], "texture": "#7"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2"} + } + }, + { + "name": "LeftWall", + "from": [0, 0, 5], + "to": [16, 16, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "north": {"uv": [8, 0, 16, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2"}, + "south": {"uv": [8, 0, 16, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2"}, + "up": {"uv": [0, 0, 8, 3], "texture": "#7"} + } + }, + { + "name": "LeftBottom", + "from": [15, -5, 5], + "to": [16, -3, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "east": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "west": {"uv": [5, 15, 8, 16], "texture": "#7"}, + "down": {"uv": [0, 0, 1, 6], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [0, -5, 5], + "to": [1, -3, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "east": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "west": {"uv": [8, 15, 5, 16], "texture": "#7"}, + "down": {"uv": [1, 0, 0, 6], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [15, -5, 11], + "to": [16, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 11]}, + "faces": { + "east": {"uv": [5, 14.5, 7.5, 16], "texture": "#7"}, + "south": {"uv": [7.5, 13, 8, 14.5], "texture": "#7"}, + "west": {"uv": [5.5, 14.5, 8, 16], "texture": "#7"}, + "up": {"uv": [0, 0, 1, 5], "texture": "#particle"}, + "down": {"uv": [0, 0, 1, 5], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [0, -5, 11], + "to": [1, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 11]}, + "faces": { + "east": {"uv": [8, 14.5, 5.5, 16], "texture": "#7"}, + "south": {"uv": [8, 13, 7.5, 14.5], "texture": "#7"}, + "west": {"uv": [7.5, 14.5, 5, 16], "texture": "#7"}, + "up": {"uv": [1, 0, 0, 5], "texture": "#particle"}, + "down": {"uv": [1, 0, 0, 5], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [15, -5, 0], + "to": [16, -2, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "north": {"uv": [8, 13, 7.5, 14.5], "texture": "#7"}, + "east": {"uv": [7.5, 14.5, 5, 16], "texture": "#7"}, + "west": {"uv": [8, 14.5, 5.5, 16], "texture": "#7"}, + "up": {"uv": [0, 5, 1, 0], "texture": "#particle"}, + "down": {"uv": [0, 5, 1, 0], "texture": "#particle"} + } + }, + { + "name": "LeftBottom", + "from": [0, -5, 0], + "to": [1, -2, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 5]}, + "faces": { + "north": {"uv": [7.5, 13, 8, 14.5], "texture": "#7"}, + "east": {"uv": [5.5, 14.5, 8, 16], "texture": "#7"}, + "west": {"uv": [5, 14.5, 7.5, 16], "texture": "#7"}, + "up": {"uv": [1, 5, 0, 0], "texture": "#particle"}, + "down": {"uv": [1, 5, 0, 0], "texture": "#particle"} + } + }, + { + "name": "BackExtension", + "from": [3, -2, 10], + "to": [13, 13, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "east": {"uv": [9, 6, 16, 8], "rotation": 90, "texture": "#3"}, + "west": {"uv": [9, 6, 16, 8], "rotation": 270, "texture": "#3"}, + "up": {"uv": [9.5, 2, 14.5, 4], "texture": "#3"} + } + }, + { + "name": "BackExtension", + "from": [3, -2, 2], + "to": [13, 13, 6], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 10]}, + "faces": { + "east": {"uv": [9, 8, 16, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [9, 8, 16, 6], "rotation": 270, "texture": "#3"}, + "up": {"uv": [9.5, 4, 14.5, 2], "texture": "#3"} + } + }, + { + "name": "MidExtension", + "from": [2, -2, 8], + "to": [14, 14, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "east": {"uv": [1, 6, 9, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 16, 6], "rotation": 270, "texture": "#3"}, + "west": {"uv": [1, 8, 9, 6], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6, 0, 8, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "MidExtension", + "from": [2, -2, 4], + "to": [14, 14, 8], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 8]}, + "faces": { + "north": {"uv": [8, 6, 16, 0], "rotation": 270, "texture": "#3"}, + "east": {"uv": [1, 8, 9, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [1, 6, 9, 8], "rotation": 90, "texture": "#3"}, + "up": {"uv": [8, 0, 6, 6], "rotation": 90, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, -2.1, -2.1], + "to": [13.9, 13.95, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 10]}, + "faces": { + "north": {"uv": [15, 1, 9, 9], "texture": "#7"}, + "east": {"uv": [0, 4, 16, 0], "rotation": 90, "texture": "#5"}, + "south": {"uv": [0, 16, 16, 4], "rotation": 90, "texture": "#5"}, + "west": {"uv": [0, 4, 16, 0], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 4, 12, 0], "texture": "#6"}, + "down": {"uv": [0, 4, 12, 0], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Back", + "from": [2.1, -2.1, 14], + "to": [13.9, 13.95, 18.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, + "faces": { + "north": {"uv": [0, 4, 16, 16], "rotation": 90, "texture": "#5"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "south": {"uv": [9, 1, 15, 9], "texture": "#7"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "RearBackPlate", + "from": [1, -5, 0], + "to": [15, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, + "faces": { + "north": {"uv": [0.5, 13, 7.5, 14.5], "texture": "#7"}, + "south": {"uv": [0.5, 13, 7.5, 14.5], "texture": "#7"}, + "up": {"uv": [1, 0, 15, 16], "texture": "#particle"}, + "down": {"uv": [1, 0, 15, 16], "texture": "#particle"} + } + } + ], + "groups": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8] + }, + { + "name": "Extension", + "origin": [9, -4, 8], + "children": [9, 10, 11, 12] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [13, 14, 15] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json b/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json index dca272755..073985dd2 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_extended.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "parent": "block/block", "textures": { - "2": "create:block/brass_funnel_push", + "2": "create:block/brass_funnel_neutral", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall", "6": "create:block/brass_funnel", @@ -68,7 +68,7 @@ "to": [14, 16, 6], "rotation": {"angle": 0, "axis": "y", "origin": [6, -8, 0]}, "faces": { - "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "north": {"uv": [9, 13, 15, 16], "texture": "#7"}, "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, "up": {"uv": [1, 0, 7, 3], "texture": "#7"}, "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2"} @@ -140,18 +140,19 @@ { "name": "RearBackPlate", "from": [1, -5, 5], - "to": [15, -2, 16], + "to": [15, -2, 16.05], "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, "faces": { "north": {"uv": [1, 13, 15, 16], "texture": "#particle"}, "south": {"uv": [0.5, 13, 7.5, 14.5], "texture": "#7"}, - "up": {"uv": [1, 5, 15, 16], "texture": "#particle"} + "up": {"uv": [1, 5, 15, 16], "texture": "#particle"}, + "down": {"uv": [1, 0, 15, 11], "texture": "#particle"} } }, { "name": "BackPlateLeft", "from": [15, -5, 6], - "to": [16, -2, 16], + "to": [16, -2, 16.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "faces": { "east": {"uv": [0, 14.5, 5, 16], "texture": "#7"}, @@ -163,7 +164,7 @@ { "name": "BackPlateLeft", "from": [0, -5, 6], - "to": [1, -2, 16], + "to": [1, -2, 16.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "faces": { "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#7"}, diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json b/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json new file mode 100644 index 000000000..adfbea4bf --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_pulling.json @@ -0,0 +1,160 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "2_2": "create:block/brass_funnel_pull", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, -2, 6], + "to": [16.05, 1, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [0, 8, 1, 9.5], "texture": "#7"}, + "east": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2_2"}, + "south": {"uv": [15, 8, 16, 9.5], "texture": "#7"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2_2"}, + "down": {"uv": [14, 0, 16, 6], "texture": "#2_2"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, -2, 6], + "to": [2, 1, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [7, 8, 8, 9.5], "texture": "#7"}, + "east": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2_2"}, + "south": {"uv": [8, 7.5, 9, 9], "texture": "#7"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2_2"}, + "down": {"uv": [0, 0, 2, 6], "texture": "#2_2"} + } + }, + { + "name": "LeftWall", + "from": [14, 1, 6], + "to": [16.05, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2_2"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2_2"}, + "up": {"uv": [14, 0, 16, 6], "texture": "#2_2"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, 1, 6], + "to": [2, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [7, 0, 8, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2_2"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2_2"}, + "up": {"uv": [16, 0, 14, 6], "texture": "#2_2"} + } + }, + { + "name": "Top", + "from": [2, 11, 6], + "to": [14, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#2_2"}, + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"} + } + }, + { + "name": "Back", + "from": [2.1, -2.1, 14], + "to": [13.9, 13.95, 18.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 6]}, + "faces": { + "north": {"uv": [0, 6, 6, 14], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "south": {"uv": [9, 1, 15, 9], "texture": "#7"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Back", + "from": [2.1, 2.9, 11.9], + "to": [13.9, 13.95, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 22]}, + "faces": { + "east": {"uv": [5, 1, 16, 3], "rotation": 270, "texture": "#5"}, + "west": {"uv": [5, 3, 16, 1], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 3, 12, 1], "texture": "#6"} + } + }, + { + "name": "RearBackPlate", + "from": [0, -5, 13], + "to": [16, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, + "faces": { + "north": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, + "east": {"uv": [6.5, 14.5, 8, 16], "texture": "#7"}, + "south": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, + "west": {"uv": [0, 14.5, 1.5, 16], "texture": "#7"}, + "up": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, + "down": {"uv": [0, 13, 8, 14.5], "texture": "#7"} + } + }, + { + "name": "RearBackPlate", + "from": [2, 9.9, 9], + "to": [14, 11.9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6.9, 8]}, + "faces": { + "down": {"uv": [2, 6, 14, 13], "texture": "#2_2"} + } + }, + { + "from": [1, 8, 11], + "to": [15, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 6, 21]}, + "faces": { + "east": {"uv": [1, 6.5, 4.5, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 11.5, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [1, 6, 4.5, 7.5], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6.5, 0, 8, 6], "rotation": 90, "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [5, 6, 7, 8] + } + ] + }, 9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json b/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json new file mode 100644 index 000000000..a1c751f64 --- /dev/null +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_pushing.json @@ -0,0 +1,160 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "6": "create:block/brass_funnel", + "7": "create:block/brass_funnel_plating", + "2_1": "create:block/brass_funnel_push", + "particle": "create:block/brass_block" + }, + "elements": [ + { + "name": "LeftWall", + "from": [14, -2, 6], + "to": [16.05, 1, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [0, 8, 1, 9.5], "texture": "#7"}, + "east": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2_1"}, + "south": {"uv": [15, 8, 16, 9.5], "texture": "#7"}, + "west": {"uv": [13, 0, 16, 6], "rotation": 90, "texture": "#2_1"}, + "down": {"uv": [14, 0, 16, 6], "texture": "#2_1"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, -2, 6], + "to": [2, 1, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [7, 8, 8, 9.5], "texture": "#7"}, + "east": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2_1"}, + "south": {"uv": [8, 7.5, 9, 9], "texture": "#7"}, + "west": {"uv": [13, 6, 16, 0], "rotation": 90, "texture": "#2_1"}, + "down": {"uv": [0, 0, 2, 6], "texture": "#2_1"} + } + }, + { + "name": "LeftWall", + "from": [14, 1, 6], + "to": [16.05, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [0, 0, 1, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2_1"}, + "south": {"uv": [15, 0, 16, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2_1"}, + "up": {"uv": [14, 0, 16, 6], "texture": "#2_1"} + } + }, + { + "name": "LeftWall", + "from": [-0.05, 1, 6], + "to": [2, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [7, 0, 8, 8], "texture": "#7"}, + "east": {"uv": [0, 6, 16, 12], "rotation": 90, "texture": "#2_1"}, + "south": {"uv": [8, 0, 9, 8], "texture": "#7"}, + "west": {"uv": [0, 12, 16, 6], "rotation": 90, "texture": "#2_1"}, + "up": {"uv": [16, 0, 14, 6], "texture": "#2_1"} + } + }, + { + "name": "Top", + "from": [2, 11, 6], + "to": [14, 17, 12], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 15, 12]}, + "faces": { + "north": {"uv": [1, 0, 7, 3], "texture": "#7"}, + "south": {"uv": [9, 0, 15, 3], "texture": "#7"}, + "up": {"uv": [2, 0, 14, 6], "texture": "#2_1"}, + "down": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_1"} + } + }, + { + "name": "Back", + "from": [2.1, -2.1, 14], + "to": [13.9, 13.95, 18.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 6]}, + "faces": { + "north": {"uv": [0, 6, 6, 14], "texture": "#3"}, + "east": {"uv": [0, 0, 16, 4], "rotation": 90, "texture": "#5"}, + "south": {"uv": [9, 1, 15, 9], "texture": "#7"}, + "west": {"uv": [0, 0, 16, 4], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 0, 12, 4], "texture": "#6"}, + "down": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"} + } + }, + { + "name": "Back", + "from": [2.1, 2.9, 11.9], + "to": [13.9, 13.95, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -8.1, 22]}, + "faces": { + "east": {"uv": [5, 1, 16, 3], "rotation": 270, "texture": "#5"}, + "west": {"uv": [5, 3, 16, 1], "rotation": 270, "texture": "#5"}, + "up": {"uv": [0, 3, 12, 1], "texture": "#6"} + } + }, + { + "name": "RearBackPlate", + "from": [0, -5, 13], + "to": [16, -2, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, + "faces": { + "north": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, + "east": {"uv": [6.5, 14.5, 8, 16], "texture": "#7"}, + "south": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, + "west": {"uv": [0, 14.5, 1.5, 16], "texture": "#7"}, + "up": {"uv": [0, 13, 8, 14.5], "texture": "#7"}, + "down": {"uv": [0, 13, 8, 14.5], "texture": "#7"} + } + }, + { + "name": "RearBackPlate", + "from": [2, 9.9, 9], + "to": [14, 11.9, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 6.9, 8]}, + "faces": { + "down": {"uv": [2, 6, 14, 13], "texture": "#2_1"} + } + }, + { + "from": [1, 8, 11], + "to": [15, 15, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 6, 21]}, + "faces": { + "east": {"uv": [1, 6.5, 4.5, 8], "rotation": 90, "texture": "#3"}, + "south": {"uv": [8, 0, 11.5, 6], "rotation": 90, "texture": "#3"}, + "west": {"uv": [1, 6, 4.5, 7.5], "rotation": 90, "texture": "#3"}, + "up": {"uv": [6.5, 0, 8, 6], "rotation": 90, "texture": "#3"} + } + } + ], + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [5, 6, 7, 8] + } + ] + }, 9] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json b/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json index 3eafc8c41..6336e2bd4 100644 --- a/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json +++ b/src/main/resources/assets/create/models/block/belt_funnel/block_retracted.json @@ -1,8 +1,9 @@ { "credit": "Made with Blockbench", "parent": "block/block", + "texture_size": [32, 32], "textures": { - "2": "create:block/brass_funnel_push", + "2": "create:block/brass_funnel_neutral", "3": "create:block/brass_funnel_back", "5": "create:block/brass_funnel_tall", "6": "create:block/brass_funnel", @@ -124,7 +125,7 @@ { "name": "RearBackPlate", "from": [1, -5, 10], - "to": [15, -2, 16], + "to": [15, -2, 16.05], "rotation": {"angle": 0, "axis": "y", "origin": [7, -8, 8]}, "faces": { "north": {"uv": [1, 13, 15, 16], "texture": "#particle"}, @@ -135,26 +136,26 @@ { "name": "BackPlateLeft", "from": [15, -5, 14], - "to": [16, -2, 16], + "to": [16, -2, 16.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "faces": { "east": {"uv": [0, 14.5, 1, 16], "texture": "#7"}, "south": {"uv": [7.5, 14.5, 8, 16], "texture": "#7"}, "west": {"uv": [7, 14.5, 8, 16], "texture": "#7"}, - "up": {"uv": [0, 14.5, 5.5, 15], "rotation": 270, "texture": "#7"}, + "up": {"uv": [0, 15, 1, 14.5], "rotation": 270, "texture": "#7"}, "down": {"uv": [0, 0, 1, 2], "texture": "#particle"} } }, { "name": "BackPlateLeft", "from": [0, -5, 14], - "to": [1, -2, 16], + "to": [1, -2, 16.05], "rotation": {"angle": 0, "axis": "y", "origin": [8, -8, 6]}, "faces": { "east": {"uv": [8, 14.5, 7, 16], "texture": "#7"}, "south": {"uv": [0, 14.5, 0.5, 16], "texture": "#7"}, "west": {"uv": [1, 14.5, 0, 16], "texture": "#7"}, - "up": {"uv": [0, 15, 5.5, 14.5], "rotation": 270, "texture": "#7"}, + "up": {"uv": [0, 15, 1, 14.5], "rotation": 270, "texture": "#7"}, "down": {"uv": [0, 0, 1, 2], "texture": "#particle"} } }, diff --git a/src/main/resources/assets/create/models/item/wrench/gear.json b/src/main/resources/assets/create/models/item/wrench/gear.json index 3142c72d7..05ffe5665 100644 --- a/src/main/resources/assets/create/models/item/wrench/gear.json +++ b/src/main/resources/assets/create/models/item/wrench/gear.json @@ -2,63 +2,64 @@ "credit": "Made with Blockbench", "parent": "create:item/wrench/item", "textures": { - "0": "block/stripped_spruce_log" + "5": "create:item/wrench", + "particle": "create:item/wrench" }, "elements": [ { "name": "Cog", - "from": [8, 7, 6], - "to": [9, 8, 10], - "rotation": {"angle": -45, "axis": "y", "origin": [8.5, 7, 8]}, - "faces": { - "north": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "east": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "south": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "west": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "up": {"uv": [5, 6, 6, 10], "rotation": 180, "texture": "#0"}, - "down": {"uv": [5, 6, 6, 10], "rotation": 180, "texture": "#0"} - } - }, - { - "name": "Cog", - "from": [8, 7, 6], - "to": [9, 8, 10], - "rotation": {"angle": 45, "axis": "y", "origin": [8.5, 7, 8]}, - "faces": { - "north": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "east": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "south": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "west": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "up": {"uv": [5, 6, 6, 10], "rotation": 180, "texture": "#0"}, - "down": {"uv": [5, 6, 6, 10], "rotation": 180, "texture": "#0"} - } - }, - { - "name": "Cog", - "from": [8, 7, 6], - "to": [9, 8, 10], + "from": [8.5, 7, 6], + "to": [9.5, 8, 10], "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 7, 8]}, "faces": { - "north": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "east": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "south": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "west": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "up": {"uv": [5, 6, 6, 10], "rotation": 180, "texture": "#0"}, - "down": {"uv": [5, 6, 6, 10], "rotation": 180, "texture": "#0"} + "north": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "east": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "west": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "up": {"uv": [2, 14, 10, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [2, 14, 10, 16], "rotation": 90, "texture": "#5"} } }, { "name": "Cog", - "from": [6.5, 7, 7.5], - "to": [10.5, 8, 8.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 7, 8]}, + "from": [8.5, 7, 6], + "to": [9.5, 8, 10], + "rotation": {"angle": 45, "axis": "y", "origin": [9, 7, 8]}, "faces": { - "north": {"uv": [3, 6, 7, 7], "rotation": 180, "texture": "#0"}, - "east": {"uv": [3, 6, 4, 7], "rotation": 180, "texture": "#0"}, - "south": {"uv": [3, 6, 7, 7], "rotation": 180, "texture": "#0"}, - "west": {"uv": [7, 4, 8, 5], "rotation": 180, "texture": "#0"}, - "up": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"}, - "down": {"uv": [5, 6, 9, 7], "rotation": 180, "texture": "#0"} + "north": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "east": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "south": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "west": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "up": {"uv": [2, 14, 10, 16], "rotation": 90, "texture": "#5"}, + "down": {"uv": [2, 14, 10, 16], "rotation": 90, "texture": "#5"} + } + }, + { + "name": "Cog", + "from": [7, 7, 7.5], + "to": [11, 8, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 7, 8]}, + "faces": { + "north": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "east": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "south": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "up": {"uv": [2, 14, 10, 16], "texture": "#5"}, + "down": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"} + } + }, + { + "name": "Cog", + "from": [7, 7, 7.5], + "to": [11, 8, 8.5], + "rotation": {"angle": 45, "axis": "y", "origin": [9, 7, 8]}, + "faces": { + "north": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "east": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "south": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#5"}, + "up": {"uv": [2, 14, 10, 16], "texture": "#5"}, + "down": {"uv": [2, 14, 10, 16], "rotation": 180, "texture": "#5"} } } ] diff --git a/src/main/resources/assets/create/models/item/wrench/item.json b/src/main/resources/assets/create/models/item/wrench/item.json index 65880cabe..656143148 100644 --- a/src/main/resources/assets/create/models/item/wrench/item.json +++ b/src/main/resources/assets/create/models/item/wrench/item.json @@ -1,18 +1,113 @@ { "credit": "Made with Blockbench", "parent": "block/block", - "ambientocclusion": false, "textures": { - "0": "block/stripped_spruce_log", - "1": "block/spruce_log", - "2": "create:block/brass_casing", - "3": "block/andesite", - "particle": "block/stripped_spruce_log" + "5": "create:item/wrench", + "particle": "create:item/wrench" }, + "elements": [ + { + "name": "handle", + "from": [7.6, 0, 7.5], + "to": [8.6, 7, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11, 8]}, + "faces": { + "north": {"uv": [2, 0, 4, 14], "texture": "#5"}, + "east": {"uv": [2, 0, 4, 14], "texture": "#5"}, + "south": {"uv": [2, 0, 4, 14], "texture": "#5"}, + "west": {"uv": [2, 0, 4, 14], "texture": "#5"}, + "down": {"uv": [2, 12, 4, 14], "texture": "#5"} + } + }, + { + "name": "handle", + "from": [6.5, 8.5, 7.5], + "to": [8.5, 14.5, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [7.5, 20, 8]}, + "faces": { + "north": {"uv": [12, 0, 16, 12], "texture": "#5"}, + "east": {"uv": [14, 0, 16, 12], "texture": "#5"}, + "south": {"uv": [16, 0, 12, 12], "texture": "#5"}, + "west": {"uv": [16, 0, 14, 12], "texture": "#5"}, + "up": {"uv": [5, 7, 7, 8], "rotation": 90, "texture": "#5"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#5"} + } + }, + { + "name": "axle", + "from": [8.35355, 5, 7.14645], + "to": [9.35355, 12, 8.14645], + "rotation": {"angle": -45, "axis": "y", "origin": [8.5, 11, 8]}, + "faces": { + "north": {"uv": [0, 0, 2, 14], "texture": "#5"}, + "east": {"uv": [0, 2, 2, 16], "texture": "#5"}, + "south": {"uv": [0, 0, 2, 14], "texture": "#5"}, + "west": {"uv": [0, 2, 2, 16], "texture": "#5"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#5"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#5"} + } + }, + { + "name": "top thing", + "from": [7, 14, 7], + "to": [11, 15, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11, 7]}, + "faces": { + "north": {"uv": [4, 8, 12, 10], "texture": "#5"}, + "east": {"uv": [4, 0, 8, 2], "texture": "#5"}, + "south": {"uv": [12, 8, 4, 10], "texture": "#5"}, + "west": {"uv": [4, 6, 8, 8], "rotation": 180, "texture": "#5"}, + "up": {"uv": [4, 0, 8, 8], "rotation": 90, "texture": "#5"}, + "down": {"uv": [8, 0, 12, 8], "rotation": 90, "texture": "#5"} + } + }, + { + "name": "bottom thing", + "from": [8, 12, 7], + "to": [11, 13, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11, 7]}, + "faces": { + "north": {"uv": [10, 8, 4, 10], "rotation": 180, "texture": "#5"}, + "east": {"uv": [4, 0, 8, 2], "rotation": 180, "texture": "#5"}, + "south": {"uv": [4, 8, 10, 10], "rotation": 180, "texture": "#5"}, + "west": {"uv": [4, 6, 8, 8], "texture": "#5"}, + "up": {"uv": [8, 0, 12, 6], "rotation": 90, "texture": "#5"}, + "down": {"uv": [4, 0, 8, 6], "rotation": 90, "texture": "#5"} + } + }, + { + "name": "gear case top", + "from": [6.4, 8, 7], + "to": [10.4, 9, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 11, 8]}, + "faces": { + "north": {"uv": [4, 10, 12, 12], "texture": "#5"}, + "east": {"uv": [4, 10, 6, 14], "rotation": 90, "texture": "#5"}, + "south": {"uv": [12, 10, 4, 12], "texture": "#5"}, + "west": {"uv": [4, 10, 6, 14], "rotation": 90, "texture": "#5"}, + "up": {"uv": [4, 10, 12, 14], "rotation": 180, "texture": "#5"}, + "down": {"uv": [6, 0, 9, 2], "texture": "#5"} + } + }, + { + "name": "gear case", + "from": [7.5, 6, 7], + "to": [9.5, 7, 9], + "rotation": {"angle": 45, "axis": "y", "origin": [8.5, 11, 8]}, + "faces": { + "north": {"uv": [12, 12, 16, 14], "texture": "#5"}, + "east": {"uv": [12, 12, 16, 14], "texture": "#5"}, + "south": {"uv": [12, 12, 16, 14], "texture": "#5"}, + "west": {"uv": [12, 12, 16, 14], "texture": "#5"}, + "up": {"uv": [12, 12, 16, 16], "texture": "#5"}, + "down": {"uv": [12, 12, 16, 16], "texture": "#5"} + } + } + ], "display": { "thirdperson_righthand": { - "rotation": [0, -180, 0], - "translation": [0, 3.75, 0] + "rotation": [0, 90, 0], + "translation": [0, 3.25, 0] }, "thirdperson_lefthand": { "translation": [0, 3.75, 0] @@ -40,90 +135,11 @@ "translation": [0.5, 0.5, 0] } }, - "elements": [ + "groups": [ { - "name": "handle", - "from": [7.5, 0, 7.5], - "to": [8.5, 14, 8.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11, 8]}, - "faces": { - "north": {"uv": [1, 0, 2, 14], "texture": "#1"}, - "east": {"uv": [1, 0, 2, 14], "texture": "#1"}, - "south": {"uv": [1, 0, 2, 14], "texture": "#1"}, - "west": {"uv": [1, 0, 2, 14], "texture": "#1"}, - "up": {"uv": [0, 0, 1, 1], "texture": "#1"}, - "down": {"uv": [0, 0, 1, 1], "texture": "#1"} - } - }, - { - "name": "axle", - "from": [8.35355, 5, 7.14645], - "to": [9.35355, 12, 8.14645], - "rotation": {"angle": -45, "axis": "y", "origin": [8.5, 11, 8]}, - "faces": { - "north": {"uv": [5, 2, 6, 9], "texture": "#3"}, - "east": {"uv": [5, 2, 6, 9], "texture": "#3"}, - "south": {"uv": [0, 0, 1, 7], "texture": "#3"}, - "west": {"uv": [4, 3, 5, 10], "texture": "#3"}, - "up": {"uv": [0, 0, 1, 1], "texture": "#3"}, - "down": {"uv": [0, 0, 1, 1], "texture": "#3"} - } - }, - { - "name": "top thing", - "from": [7, 14, 7], - "to": [11, 15, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11, 7]}, - "faces": { - "north": {"uv": [6, 1, 10, 2], "texture": "#2"}, - "east": {"uv": [6, 1, 8, 2], "texture": "#2"}, - "south": {"uv": [6, 1, 10, 2], "texture": "#2"}, - "west": {"uv": [6, 1, 8, 2], "texture": "#2"}, - "up": {"uv": [5, 0, 9, 2], "texture": "#2"}, - "down": {"uv": [6, 0, 10, 2], "texture": "#2"} - } - }, - { - "name": "bottom thing", - "from": [8, 12, 7], - "to": [11, 13, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [8.5, 11, 7]}, - "faces": { - "north": {"uv": [6, 1, 9, 2], "texture": "#2"}, - "east": {"uv": [6, 1, 8, 2], "texture": "#2"}, - "south": {"uv": [5, 1, 8, 2], "texture": "#2"}, - "west": {"uv": [7, 1, 9, 2], "texture": "#2"}, - "up": {"uv": [6, 0, 9, 2], "texture": "#2"}, - "down": {"uv": [7, 0, 10, 2], "texture": "#2"} - } - }, - { - "name": "gear case top", - "from": [7, 8, 7], - "to": [10, 9, 9], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 11, 8]}, - "faces": { - "north": {"uv": [10, 0, 13, 1], "texture": "#2"}, - "east": {"uv": [7, 0, 9, 1], "texture": "#2"}, - "south": {"uv": [7, 0, 10, 1], "texture": "#2"}, - "west": {"uv": [9, 0, 11, 1], "texture": "#2"}, - "up": {"uv": [7, 0, 10, 2], "texture": "#2"}, - "down": {"uv": [6, 0, 9, 2], "texture": "#2"} - } - }, - { - "name": "gear case", - "from": [7.5, 6.5, 7], - "to": [9.5, 7.5, 9], - "rotation": {"angle": 45, "axis": "y", "origin": [8.5, 11, 8]}, - "faces": { - "north": {"uv": [0, 0, 2, 1], "texture": "#1"}, - "east": {"uv": [0, 0, 2, 1], "texture": "#1"}, - "south": {"uv": [0, 0, 2, 1], "texture": "#1"}, - "west": {"uv": [0, 0, 2, 1], "texture": "#1"}, - "up": {"uv": [0, 0, 2, 2], "texture": "#1"}, - "down": {"uv": [0, 0, 2, 2], "texture": "#1"} - } + "name": "item", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5, 6] } ] } \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_neutral.png b/src/main/resources/assets/create/textures/block/andesite_funnel_neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..dde5148369c0c683e494f5d8198ff84b36a71cc4 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lh(0G|-osMx6FwB+LQ;;so3+B(`RYbu*sTk4yd$|}q2TiWb3g+p!Rqa9TO z%w@K0T2oWs;G{1WW~1O~Ad%y*o93nIYavq@q#Na+9OtY8G!h6@MNBsWDe00Rzu^Bk z0fV{;w<%B=XMsm#F#`kNeh_A~U=0SD(&*{p7@`q8^{hAFVFezRfEfOt7XqdWcpUx9 zA0@r1W0!V#xa zb3sgSquA{7vs+g0FLyU*Hu`-oAyPf~oUu#tB&&;4qE09JggsC0GLqoo{B^_bjCue7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png b/src/main/resources/assets/create/textures/block/andesite_funnel_plating.png index 71aacc4f3e3f7442a06ebb1c7e5938dee155e8d8..6f4ed26a87efe4e6efd91d69e794ece7e81e7b6b 100644 GIT binary patch delta 534 zcmX@hd4OetBnLAC1B1(wu45Aw73!k`d_r84(~^tJi=$$rmMopKWz(9b)|UFFrplVi zwvP6u_O_b(hOFFTZ(koDKi{qi6LfVAjg8DqO)M1hOt|0#b4%L4Lviv4DEG7{eP0nK+Eak-;eR&xVbmc59-m7K4HFjRd@km@|KD_P+S(1De%@!k)h09jv{y&O3O%K} zhGBlrQf3MMKJAB3uim#ZPg|mS*34C#R>}5yJT0kWcloeUf#uAk-C7e**RM}gIx^|Y zi<62>lI<#&3-&#!Is3R$nM39MEa}8qpO2fwZxQg>C-2br{!;3^PtQ$KRg;gHiXV7C zHF%yg6HD96c@M5|ggblNGT!ZqSB&@Cuw#MOS=IyT7x&DRN!&DJ-A)Ee>B7$p$2B&- zZt_mQX4B$%fBVUR3(pk2O1L~WoASS?->JTUAuhT0THqq%l{*gn&fR?Ya9_g~+ZgjF zAJ*+`kjPsQg~-?ZTfPin+a delta 1192 zcmV;Z1XugO1kDMM83+ad0047(di0SYAb$yPNLh0L01m?d01m?e$8V@)000DHNkl;&}SMse;-OutblNaG; zTqKhN(zd$#4@#v1qMb2RJP)?dC+#bxa^3dxzfVCt@bXJ9VDiGBxKmh>4x%FxS}y^A zXBO~aSC5oAW^plx?(Qh&=B`WIV1MdiS!~J8O5L|^KoN^aCC@J9BxgO9+KZW)%bN+* zgOVEBy9+mO=cQaJuDS8b%(Uc>?jOdl6X)>a^UpQ(B>TSmeq2a%zRj4hk(j-)fIWl# z=-bgL#uq;c)`u%J@^a<>|5L*6L%@4Cs0V7bB{T z#GOw3JarL{bGIG}#hj4-Z+~BB^hxbVc z2#S$A=U9>^ER990;LdqZ5F|n)1a&}UjWL3ChMJ_A>ru8e7OjB0Ao)l*DvK%+6(Kb+ zJ$+R)z5(5fv7RG=I{7Vnc+=s9C7% z)dNbTkp?tOik447wd)D3)5z?Nd1MyX9wuralgWuU2=1KF5Xf`P$)`U$-SkbUub|$h z$z*a{Pce-@)Y~t&sKr7nVEi=pipk%mFgiMlbK~O}8yk}}@zak;r_(}I+qq#4z1^w? z6m%nZPki;om)r8<$$ycP9&b+tcDgyh@okFf}kJi4P53SKH3i*SFhz?LHz4keuJ- zZmx(*c?Gw!W!%c-&6iI}h;jpbarK?3h40|22So(hshX(uO0`zBFB}fb=X)ZNK>CNz z(Ag10kMjU#=YL)7e(IHt8?v{rR~{k$5xGkPT!hg0a6zV>y*tG?LqVuf_URmL3kDClJc=pJM{9jb)`kO-l{1prIY3kj6-5EOo0000NS%G}50G|-oiV)qV5RJ}Qoy9d4m)A!hneII)-*iu}+qxFJA|LG;WhNadW2=T90FlRQ4OyKpkTbGi(`mJ@YLShd<_O1 z&Ij{aGr#@cpFP(wE?$Roicry+JIfc=X1Qx_4KvDeSu#7lIJDDHMB-LjX|~bkI1e=k zCQrSzQ~AG^&5?NGwlnEVQzD;_w1|wvSM#OzU#wr$vOZnQZn8620~87jp00i_>zopr E0El;DH~;_u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/brass_funnel_plating.png b/src/main/resources/assets/create/textures/block/brass_funnel_plating.png index e8a3ca30e3a9d3b96aea94bebb3a256863f25b86..76fe0d5428e16964eabce4c7099bbcaa1c2bf2a5 100644 GIT binary patch delta 492 zcmZqWoX#>ql7pFnfx%@-*RhF;3iTcVJ|V81u{up58tYo@W|WzHI+%NTee|S!(;^@3 z#Wfa3rhD({b*l)`)zvjLHZn6cv9K_=wzGBg^zd+TafytG0GgGanAnkG24qMqUuOlP zN`m}?|6>OXXNC1%0o8C8ctjR6Fx2xMU|`@oz?gNdlaqmg(ZtimF~q|E?Bv@;%?3O! zsYf?WkeTDK{LBCUTPD4^;57N$R_jjvf{3>gEDR^FxX+&V=Hnz|(Ib;O^-ct+9pO~} zeKSTPNbu^K6&|aiET&5Nf7{R8vLfaCRFOa#2{|)|l@nY#HceLuyvVSwID329{zdOp^4F-5S+WeZn#Zj`gieH(db{(%|sui_aNw^!*`D$ljnj@&(? zphK~IqIZk@{J(YkG`l@MT&vAGaMP%gy=~^{1`R>!4~>g2-?gTe~DWM4f7lPT3 delta 1119 zcmV-l1fctu1ceEZ83+ad0047(di0SYAb$yPNLh0L01m+b01m+cxRGn^000CUNkla^*c16+#eX~VapAX43_5WHY`@fvi)Nv(t6%y_$L)yxAm~qm ztbPmk9}dYxgex^CXRWZ!LV@$4Aak37phj8h8m6MT zrABIf$9~1<_drB@bT5jU>MBfoBh%Rs4x_!FCXlAAw)V~G@K=^go3&~ypMPD)N8l@e z3XezD2Cp}XWD>A#FCx(>j%;6uf396b#<*!8*s^x9IH4P(@u%6RjI?f0?OfHBYs09k z_v66N3Cygo#gjw=kD`w;Z{8e4(-X5D85qQO+Zu7~`-?fVi4)Q;+m2qfvj2P~cC1^F zqAfXAe?|cgowg7P2T)#ChJObSqFAoh(1yh|wC!y1kLC2ArZQHgBc8|vziDe&)LxrXfXv9-E8MQzkxPN)GTYP|RCoPO_ zW%Zj$H^F$g`oKhXfg8p60OO2kKx25ZxS6jQA7F4R*#}Iad9o>-nmF42ajm`lX^T(e_X31UIhyn>&V(KeE9O1 zoieE!m|I^hwcf6E@-H^6!F#J3&=)CO>*?=naJ?=OJP55TPjJ-Pv?3I z0^YdSa%H^hIr~fv438!xZ8HU+`gsbTZ0{-1fQR9fg{PZY%=eOhWsBLzLV@&%<>b_W zc|)QJnDFRLC`=y@KUm&U2bw_(( zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b@k}D?+{Ld+J1Oy1garmst4RZW6BhA?BxBF5_ z#j|T;tP!HSB{6RO_2+hf;1y!XE^(1ubM|_3*v#bf;W zJr#g48Iv)%up&i|_i$E;`rj}|*ZXCJtHl%x-b1ACv2)Mx1H5PSft_zQAHPE3d^Usp zfsxGK8Bca#6+dK~S2q)X)G!3uGOBS3_4m^<&V z0wJ^wQ@-%MF88Jz|3+*CgM7g(*kJQrU38|Gw&KNegdO|jyvm)*GzWkPYcqm@x)b?K zktvfeArvCuDB!0d@(@$#V1SszB)7p$j2YxeIBVmcLYHmepwlQVAcA8?k_Z@TAS)$? zeo7K(sBz@vm^pJ{;mR$?oHFN}OFlKKl~_{Yl1nL4YH1QB2}_nDB2`)qHKK%Z&9%5H zwbs_KXoKs9yBjQ8>!HVL!sH4p=<3#$;Jd2w$>uie_q_ooF zl~-A^>S`NW+i|DOJMXe(*WDi0jMcBK(Fb$CXN`=t!&tiP%8NBjmvXzHQ%?AB2F5}n zFkTJ=5Og@4d7+fTVeW9|Yd}(P0BgjDoJofIwmDi5{P`&T8P#jlWvmtkQ^Fsm(&Ics-eHyQ zS&fO9eWY3ynAGImPB>UE@aBD;da9N^4~- zTWp59l5W|-FE+_$mr5HYsu|0${c}zCE?@Y^(RI~b5^i)O>8_ezC1wo*qvo?=3uVs- za;W}R2$ZJ^ku|BJu)*X&v)%x2Xl};WjNrK@+hy>(sOtLSv3aa)SS)mrpd#sso4H9|gL7;qNwg12!j# zgWjUAVOsK_4&5@YEzTH8<5+@*t#`N{EI9NU-AAHOs^%Xr6v~WBtOzE80!z0EW8lpebPO%H{@@9 z08bZI0}{qnOiK$gmmBg{wf4A{_~#;@+xM{da97MnsxG%wvqn=NQ8fB)?m=4fm5)B< z?sP68O9NY(pUrE*0R!ue0EA4PL(&u zcs?-XJm0EB*}+*MShgT@I9le=1mox7h(yLCEHm8IWAc3Pv~wcUSdrB18F zH$C;Y4fktvkgcT_k1kK|xo`Thii`RmIEvkTqQ}i;xpoz|e0OdR>6YjHX?h)a|J6vY zT)Tb+w3ehe4&u1;6u1|fhBh7(rVZDK)f@8F)ljSZ5WR?2N$GB4)>4htyYT1$p%vL&$-c#Zgv>K zf&FfDpP%RHN@eP`${cd%eXyW%cgnF?v;P#3V(Vv1I`q+!UqWrSD57-$G-H5Z{WshV z^2PDzXH_Q8N^C2ctBl7&OTQXrYD66s5Kk0VHL4xXQV7Yg&Sm3#UA=dI1MrGx7^5MCf<^V$LudYX$qyS_! zeEN1>I?H1)TB(P+uBs|GW2V;$B<^uoi7%pvuuKJ^Q@dSo`svbQ_>LtN)jG} zO%(tDs;a8YxfiSay*?sS7_Eqs=+KX2KaQmfo~0iGkD>9rWw=|f@7KL>!(+$|MF*?3 z)w=GK$i}8BYHb+~v+N+V06a^C+h=%kkVS{w(3Sz~b*7Tg`dD9ReckCD0|1*U&r&*@ zR#i2h&+Q+F&mUisDTJGMZwlciZo*^ehX7~*e=)=z?1XlA+{CjywzSU>S|3&Ig!+}( z2?;l$^#K0eAu_0GL8j!Tsy>yH7r1MZ@*qa;-r0z6A@sC2gOdX+hMad|le pbh6oxvHRW0Mr7kzZtm9regne^H=-vv^6~%x002ovPDHLkV1fk@dsqMf literal 0 HcmV?d00001 From 675af419ce0a4fe29bcb268c7682896040960206 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 11 Nov 2020 23:59:40 +0100 Subject: [PATCH 36/36] Fixing user errors - Added hints when looking at - Mechanical arms with no targets - Funnels attempted to be used like 0.2 transposers - Bearings that require an update to attach to their blocks - Added some additional feedback when players apply filters - Spouts now place two blocks above a depot/belt when used - Basins can no longer be placed directly under a press or mixer - Fixed prismarine recipe cycles from various mod interactions --- src/generated/resources/.cache/cache | 22 ++++---- .../resources/assets/create/lang/en_us.json | 15 ++++- .../assets/create/lang/unfinished/de_de.json | 17 +++++- .../assets/create/lang/unfinished/fr_fr.json | 17 +++++- .../assets/create/lang/unfinished/it_it.json | 17 +++++- .../assets/create/lang/unfinished/ja_jp.json | 17 +++++- .../assets/create/lang/unfinished/ko_kr.json | 17 +++++- .../assets/create/lang/unfinished/nl_nl.json | 17 +++++- .../assets/create/lang/unfinished/pt_br.json | 17 +++++- .../assets/create/lang/unfinished/ru_ru.json | 17 +++++- .../assets/create/lang/unfinished/zh_cn.json | 17 +++++- .../recipes/crushing/prismarine_crystals.json | 11 +--- .../java/com/simibubi/create/AllBlocks.java | 2 +- .../mixer/BasinOperatorBlockItem.java | 16 ++++-- .../bearing/MechanicalBearingTileEntity.java | 24 ++++++++ .../goggles/IHaveGoggleInformation.java | 2 +- .../contraptions/processing/BasinBlock.java | 9 +++ .../elementary/CogWheelPlacementHelper.java | 5 ++ .../block/funnel/FunnelTileEntity.java | 53 +++++++++++++++++- .../ArmInteractionPointHandler.java | 22 ++++++-- .../block/mechanicalArm/ArmTileEntity.java | 24 ++++++-- .../data/recipe/CrushingRecipeGen.java | 5 +- .../create/foundation/item/TooltipHelper.java | 12 ++++ .../behaviour/filtering/FilteringHandler.java | 56 +++++++++++++------ .../assets/create/lang/default/messages.json | 16 +++++- 25 files changed, 371 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 5a0ab6556..1ee9d27fe 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -392,16 +392,16 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json be82e2e68c74c572e72979a6d4a5ec5e571931e2 assets/create/lang/en_ud.json -b953a264ec3044b955431fb988c0bafcb9b57388 assets/create/lang/en_us.json -97fe71d544f1bc7552e6c9d1f328ae02cb1a1947 assets/create/lang/unfinished/de_de.json -052819c4d2177bfc5cee9675300866d724f4b63f assets/create/lang/unfinished/fr_fr.json -67d67f305c83e021e2ae37e03b9bf4aa2661bc87 assets/create/lang/unfinished/it_it.json -b0e3fc5a71b5127b832e38daece78ca9db9ce303 assets/create/lang/unfinished/ja_jp.json -610f399864dfa9d7fd258570853f7d577c5aee31 assets/create/lang/unfinished/ko_kr.json -12215221adcb015c5c74dbfe5affa920cd570580 assets/create/lang/unfinished/nl_nl.json -ead7216188692e96fb060b35213f1ef6b0682e87 assets/create/lang/unfinished/pt_br.json -e9d95034f9b33eb8e41792740ed2d8c488af6676 assets/create/lang/unfinished/ru_ru.json -32a2c4af9a5247f3bc7a5c2f502376e1e580d8bc assets/create/lang/unfinished/zh_cn.json +640c617ea3827d1ec40ab634da05f0c5af800f25 assets/create/lang/en_us.json +57bbb98446e72a74cb0735b424e9811b61af0c74 assets/create/lang/unfinished/de_de.json +4a0592f11dba8b26765e7abab386e46a2366afb8 assets/create/lang/unfinished/fr_fr.json +9bb92001a7e88fedff2a2868d2e80243a9306880 assets/create/lang/unfinished/it_it.json +c12f58d8ca37c34148a9e8358846e6911870210c assets/create/lang/unfinished/ja_jp.json +7cf5988ec697add8deac90791ca0c30c57321ee0 assets/create/lang/unfinished/ko_kr.json +1b41fd6a902cf5e845d9eb6aa60c066080a3d20e assets/create/lang/unfinished/nl_nl.json +362fb090bbf8a66b874ffa2a550f32b7c6ee2d7d assets/create/lang/unfinished/pt_br.json +0764d4f607734ed33299629ea7aceb6c3e67ba0f assets/create/lang/unfinished/ru_ru.json +23b2b6f091083dbb505e10febebfa4cab06c1db2 assets/create/lang/unfinished/zh_cn.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -2762,7 +2762,7 @@ d73a0ed13112e001dad61d6ea66fd729c86e7b62 data/create/recipes/crushing/nether_qua 70116a5a9d1f93ae377e1526ca99582190cf2e3e data/create/recipes/crushing/nether_wart_block_quark.json 0dfe5092af96fbaeddaace6d3b1c45fa6f4cf7fe data/create/recipes/crushing/netherrack.json 71397f0ae2e175181195b8b2894d108e0cdc3da7 data/create/recipes/crushing/obsidian.json -88d7ab3d6407010876e328f5f20a4ed9ddda7e3e data/create/recipes/crushing/prismarine_crystals.json +0185e8d17cc17b0ac822169f4b2968d95468b4a2 data/create/recipes/crushing/prismarine_crystals.json 42299b3a0596c7743404496205854ac2324aedd7 data/create/recipes/crushing/redstone_ore.json 94589aa3171fcfda8eed76000d53a36ea6fd7e53 data/create/recipes/crushing/sand.json dc4cf8b759f5eeee0ccfa6aaad204fbeea487b7f data/create/recipes/crushing/wool.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index d5d409eae..a0d312f3e 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -709,6 +709,9 @@ "create.logistics.fluid_filter": "Fluid Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "Applied extraction count to filter.", "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", @@ -749,7 +752,7 @@ "create.schematicAndQuill.noTarget": "Hold [Ctrl] to select Air blocks.", "create.schematicAndQuill.abort": "Removed selection.", "create.schematicAndQuill.title": "Schematic Name:", - "create.schematicAndQuill.convert": "Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "Saved as %1$s", @@ -949,6 +952,7 @@ "create.mechanical_arm.extract_from": "Take items from %1$s", "create.mechanical_arm.deposit_to": "Deposit items to %1$s", + "create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available", @@ -965,6 +969,15 @@ "create.tunnel.selection_mode.randomize": "Randomize", "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "No Targets", + "create.hint.mechanical_arm_no_targets": "It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "Horizontal Funnels", + "create.hint.horizontal_funnel": "cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "Funnels facing upward", + "create.hint.upward_funnel": "can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "Update Bearing", + "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", "create.gui.config.overlay3": "Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index a23e4c29a..e1534a0c6 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1026", + "_": "Missing Localizations: 1038", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "Halte [Strg] zur Auswahl von Luft.", "create.schematicAndQuill.abort": "Auswahl zurückgesetzt.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mein Bauplan", "create.schematicAndQuill.saved": "Gespeichert als %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index a0ee15143..1a117cf05 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 655", + "_": "Missing Localizations: 667", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "Statistiques du générateur:", "create.gui.goggles.kinetic_stats": "Statistiques cinétiques:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "Enfoncez [Ctrl] pour sélectionner les blocs d'air.", "create.schematicAndQuill.abort": "Sélection supprimée.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mon schéma", "create.schematicAndQuill.saved": "Sauvegardé en tant que %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index d188b68c1..0060f3e34 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 639", + "_": "Missing Localizations: 651", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "Statistiche del Generatore:", "create.gui.goggles.kinetic_stats": "Statistiche Cinetiche:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "Premi [Ctrl] per selezionare il Blocco d'Aria.", "create.schematicAndQuill.abort": "Selezione rimossa.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "La mia Schematica", "create.schematicAndQuill.saved": "Salvata come %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 4e720b00c..cb238c3f1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 638", + "_": "Missing Localizations: 650", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "ジェネレータの統計:", "create.gui.goggles.kinetic_stats": "動力の統計:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "[Ctrl] を押したままで空気ブロックを選択します", "create.schematicAndQuill.abort": "選択を削除しました。", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "%1$s として保存しました", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 9729d9e81..f0e1433f1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 639", + "_": "Missing Localizations: 651", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "주파수. #1", "create.logistics.secondFrequency": "주파수. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "발전 상태:", "create.gui.goggles.kinetic_stats": "가동 상태:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "[Ctrl]을 눌러 공기 블럭을 선택하기.", "create.schematicAndQuill.abort": "위치 제거됨.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "내 청사진", "create.schematicAndQuill.saved": "%1$s로 저장됨", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 93c43a6d1..e66f411f0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 967", + "_": "Missing Localizations: 979", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "Houd [Ctrl] ingedrukt om een Lucht block te kiezen.", "create.schematicAndQuill.abort": "Keuze verwijderd.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Mijn Bouwtekening", "create.schematicAndQuill.saved": "Opgeslagen als %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index b7aa3e484..56d4f0db7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1033", + "_": "Missing Localizations: 1045", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "UNLOCALIZED: Freq. #1", "create.logistics.secondFrequency": "UNLOCALIZED: Freq. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "UNLOCALIZED: Generator Stats:", "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "Seguro [Ctrl] para selecionar Blocos de Ar.", "create.schematicAndQuill.abort": "Seleção removida.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Meu Esquema", "create.schematicAndQuill.saved": "Salvo como %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index c31c1bcb5..1b3d0f477 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 308", + "_": "Missing Localizations: 320", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "Частота #1", "create.logistics.secondFrequency": "Частота #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "Статистика генератора:", "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "Удерживайте [Ctrl], чтобы выбрать воздушные блоки.", "create.schematicAndQuill.abort": "Выделение убрано", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "Моя схематика", "create.schematicAndQuill.saved": "Сохранено как %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 23a3412e0..b4a6ac12f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 321", + "_": "Missing Localizations: 333", "_": "->------------------------] Game Elements [------------------------<-", @@ -710,6 +710,9 @@ "create.logistics.fluid_filter": "UNLOCALIZED: Fluid Filter", "create.logistics.firstFrequency": "频道. #1", "create.logistics.secondFrequency": "频道. #2", + "create.logistics.filter.apply": "UNLOCALIZED: Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "UNLOCALIZED: Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "UNLOCALIZED: Applied extraction count to filter.", "create.gui.goggles.generator_stats": "产能器状态:", "create.gui.goggles.kinetic_stats": "动能状态:", @@ -750,7 +753,7 @@ "create.schematicAndQuill.noTarget": "按住Ctrl选择空气方块.", "create.schematicAndQuill.abort": "删除选择.", "create.schematicAndQuill.title": "UNLOCALIZED: Schematic Name:", - "create.schematicAndQuill.convert": "UNLOCALIZED: Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "UNLOCALIZED: Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "我的蓝图", "create.schematicAndQuill.saved": "另存为 %1$s", @@ -950,6 +953,7 @@ "create.mechanical_arm.extract_from": "UNLOCALIZED: Take items from %1$s", "create.mechanical_arm.deposit_to": "UNLOCALIZED: Deposit items to %1$s", + "create.mechanical_arm.summary": "UNLOCALIZED: Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "UNLOCALIZED: %1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "UNLOCALIZED: When Multiple Outputs Available", @@ -966,6 +970,15 @@ "create.tunnel.selection_mode.randomize": "UNLOCALIZED: Randomize", "create.tunnel.selection_mode.synchronize": "UNLOCALIZED: Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", + "create.hint.mechanical_arm_no_targets": "UNLOCALIZED: It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "UNLOCALIZED: Horizontal Funnels", + "create.hint.horizontal_funnel": "UNLOCALIZED: cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "UNLOCALIZED: Funnels facing upward", + "create.hint.upward_funnel": "UNLOCALIZED: can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "UNLOCALIZED: Update Bearing", + "create.hint.empty_bearing": "UNLOCALIZED: _Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "UNLOCALIZED: Hi :)", "create.gui.config.overlay2": "UNLOCALIZED: This is a sample overlay", "create.gui.config.overlay3": "UNLOCALIZED: Click or drag with your mouse", diff --git a/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json b/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json index bedfb41c0..0bacec70e 100644 --- a/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json +++ b/src/generated/resources/data/create/recipes/crushing/prismarine_crystals.json @@ -7,18 +7,13 @@ ], "results": [ { - "item": "minecraft:prismarine_shard", - "count": 2 + "item": "minecraft:quartz", + "count": 1 }, { "item": "minecraft:quartz", "count": 2, - "chance": 0.75 - }, - { - "item": "minecraft:prismarine_shard", - "count": 2, - "chance": 0.25 + "chance": 0.5 }, { "item": "minecraft:glowstone_dust", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 532a3e540..f0d61584c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -614,7 +614,7 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .blockstate((ctx, prov) -> prov.simpleBlock(ctx.getEntry(), AssetLookup.partialBaseModel(ctx, prov))) .addLayer(() -> RenderType::getCutoutMipped) - .item() + .item(BasinOperatorBlockItem::new) .transform(customItemModel()) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java index 4604140d2..ae91c16c8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/BasinOperatorBlockItem.java @@ -18,11 +18,17 @@ public class BasinOperatorBlockItem extends BlockItem { @Override public ActionResultType tryPlace(BlockItemUseContext context) { - - BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite()); - BlockState placedOnState = context.getWorld().getBlockState(placedOnPos); - if (AllBlocks.BASIN.has(placedOnState)) { - if (context.getWorld().getBlockState(placedOnPos.up(2)).getMaterial().isReplaceable()) + BlockPos placedOnPos = context.getPos() + .offset(context.getFace() + .getOpposite()); + BlockState placedOnState = context.getWorld() + .getBlockState(placedOnPos); + if (AllBlocks.BASIN.has(placedOnState) || AllBlocks.BELT.has(placedOnState) + || AllBlocks.DEPOT.has(placedOnState)) { + if (context.getWorld() + .getBlockState(placedOnPos.up(2)) + .getMaterial() + .isReplaceable()) context = BlockItemUseContext.func_221536_a(context, placedOnPos.up(2), Direction.UP); else return ActionResultType.FAIL; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index 620c5a1b1..b64162e31 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -6,6 +6,7 @@ import java.util.List; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntity; +import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollOptionBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; @@ -256,4 +257,27 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp return running; } + @Override + public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { + if (super.addToTooltip(tooltip, isPlayerSneaking)) + return true; + if (isPlayerSneaking) + return false; + if (isWindmill()) + return false; + if (getSpeed() == 0) + return false; + if (running) + return false; + BlockState state = getBlockState(); + if (!(state.getBlock() instanceof BearingBlock)) + return false; + BlockState attachedState = world.getBlockState(pos.offset(state.get(BearingBlock.FACING))); + if (attachedState.getMaterial() + .isReplaceable()) + return false; + TooltipHelper.addHint(tooltip, "hint.empty_bearing"); + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java index f41753606..728f1c631 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java @@ -9,7 +9,7 @@ import java.util.List; public interface IHaveGoggleInformation { DecimalFormat decimalFormat = new DecimalFormat("#.##"); - String spacing = " "; + public static String spacing = " "; /** * this method will be called when looking at a TileEntity that implemented this interface diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index afbbde0fa..d02a73d53 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -33,6 +33,7 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; import net.minecraft.world.World; import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; @@ -56,6 +57,14 @@ public class BasinBlock extends Block implements ITE, IWrenchab protected void fillStateContainer(Builder p_206840_1_) { super.fillStateContainer(p_206840_1_.add(FACING)); } + + @Override + public boolean isValidPosition(BlockState state, IWorldReader world, BlockPos pos) { + TileEntity tileEntity = world.getTileEntity(pos.up()); + if (tileEntity instanceof BasinOperatingTileEntity) + return false; + return true; + } @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java new file mode 100644 index 000000000..5f4e7a3e6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogWheelPlacementHelper.java @@ -0,0 +1,5 @@ +package com.simibubi.create.content.contraptions.relays.elementary; + +public class CogWheelPlacementHelper { + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index ca034a723..378b19249 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -5,12 +5,16 @@ import java.util.function.Function; import java.util.function.Predicate; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; +import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; +import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; @@ -24,11 +28,16 @@ import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; -public class FunnelTileEntity extends SmartTileEntity { +public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringInformation { private FilteringBehaviour filtering; private InvManipulationBehaviour invManipulation; @@ -311,4 +320,46 @@ public class FunnelTileEntity extends SmartTileEntity { .onFunnelTransfer(world, pos, stack); } + @Override + // Hint players not to use funnels like 0.2 transposers + public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { + if (isPlayerSneaking) + return false; + BlockState state = getBlockState(); + if (!(state.getBlock() instanceof FunnelBlock)) + return false; + Direction funnelFacing = FunnelBlock.getFunnelFacing(state); + + if (world.getBlockState(pos.offset(funnelFacing.getOpposite())) + .getMaterial() + .isReplaceable()) + return false; + + BlockPos inputPos = pos.offset(funnelFacing); + TileEntity tileEntity = world.getTileEntity(inputPos); + if (tileEntity == null) + return false; + if (tileEntity instanceof BeltTileEntity) + return false; + if (tileEntity instanceof SawTileEntity) + return false; + if (tileEntity instanceof ChuteTileEntity) + return false; + + LazyOptional capability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY); + if (!capability.isPresent()) + return false; + + if (funnelFacing == Direction.DOWN) { + TooltipHelper.addHint(tooltip, "hint.upward_funnel"); + return true; + } + if (!funnelFacing.getAxis() + .isHorizontal()) + return false; + + TooltipHelper.addHint(tooltip, "hint.horizontal_funnel"); + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java index 573bc1c28..e461ed678 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPointHandler.java @@ -14,6 +14,7 @@ import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -94,15 +95,28 @@ public class ArmInteractionPointHandler { int removed = 0; for (Iterator iterator = currentSelection.iterator(); iterator.hasNext();) { ArmInteractionPoint point = iterator.next(); - if (point.pos.withinDistance(pos, ArmTileEntity.getRange())) + if (point.pos.withinDistance(pos, ArmTileEntity.getRange())) continue; iterator.remove(); removed++; } - if (removed > 0) - Minecraft.getInstance().player.sendStatusMessage(new StringTextComponent( - TextFormatting.RED + Lang.translate("mechanical_arm.points_outside_range", removed)), true); + ClientPlayerEntity player = Minecraft.getInstance().player; + if (removed > 0) { + player.sendStatusMessage(Lang.createTranslationTextComponent("mechanical_arm.points_outside_range", removed) + .applyTextStyle(TextFormatting.RED), true); + } else { + int inputs = 0; + int outputs = 0; + for (ArmInteractionPoint armInteractionPoint : currentSelection) { + if (armInteractionPoint.mode == Mode.DEPOSIT) + outputs++; + else + inputs++; + } + player.sendStatusMessage(Lang.createTranslationTextComponent("mechanical_arm.summary", inputs, outputs) + .applyTextStyle(TextFormatting.WHITE), true); + } AllPackets.channel.sendToServer(new ArmPlacementPacket(currentSelection, pos)); currentSelection.clear(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index 26af2e2ad..56505fd29 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -12,6 +12,7 @@ import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.widgets.InterpolatedAngle; +import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.CenteredSideValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.INamedIconOptions; @@ -137,7 +138,7 @@ public class ArmTileEntity extends KineticTileEntity { sendData(); } } - + @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { @@ -202,7 +203,7 @@ public class ArmTileEntity extends KineticTileEntity { protected void searchForItem() { if (redstoneLocked) return; - + boolean foundInput = false; // for round robin, we start looking after the last used index, for default we // start at 0; @@ -256,7 +257,7 @@ public class ArmTileEntity extends KineticTileEntity { ArmInteractionPoint armInteractionPoint = outputs.get(i); if (!armInteractionPoint.isStillValid(world)) continue; - + ItemStack remainder = armInteractionPoint.insert(world, held, true); if (remainder.equals(heldItem, false)) continue; @@ -345,7 +346,7 @@ public class ArmTileEntity extends KineticTileEntity { } return stack; } - + public void redstoneUpdate() { if (world.isRemote) return; @@ -441,6 +442,21 @@ public class ArmTileEntity extends KineticTileEntity { return AllConfigs.SERVER.logistics.mechanicalArmRange.get(); } + @Override + public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { + if (super.addToTooltip(tooltip, isPlayerSneaking)) + return true; + if (isPlayerSneaking) + return false; + if (!inputs.isEmpty()) + return false; + if (!outputs.isEmpty()) + return false; + + TooltipHelper.addHint(tooltip, "hint.mechanical_arm_no_targets"); + return true; + } + private class SelectionModeValueBox extends CenteredSideValueBoxTransform { public SelectionModeValueBox() { diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java index 8a62ab387..b5e74e900 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/CrushingRecipeGen.java @@ -21,9 +21,8 @@ public class CrushingRecipeGen extends ProcessingRecipeGen { .output(.25f, Items.BLAZE_POWDER, 3)), PRISMARINE_CRYSTALS = create(() -> Items.PRISMARINE_CRYSTALS, b -> b.duration(150) - .output(Items.PRISMARINE_SHARD, 2) - .output(.75f, Items.QUARTZ, 2) - .output(.25f, Items.PRISMARINE_SHARD, 2) + .output(1f, Items.QUARTZ, 1) + .output(.5f, Items.QUARTZ, 2) .output(.1f, Items.GLOWSTONE_DUST, 2)), OBSIDIAN = create(() -> Blocks.OBSIDIAN, b -> b.duration(500) diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index fea30a1d3..c4d6b40af 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -1,6 +1,8 @@ package com.simibubi.create.foundation.item; import static net.minecraft.util.text.TextFormatting.DARK_GRAY; +import static net.minecraft.util.text.TextFormatting.GOLD; +import static net.minecraft.util.text.TextFormatting.GRAY; import java.util.ArrayList; import java.util.HashMap; @@ -13,6 +15,7 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineBlock; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.curiosities.tools.AllToolTiers; import com.simibubi.create.foundation.item.ItemDescription.Palette; import com.simibubi.create.foundation.utility.Lang; @@ -42,6 +45,15 @@ public class TooltipHelper { + Lang.translate("tooltip.holdKey", colorFormat + Lang.translate("tooltip.keyShift") + DARK_GRAY); } + public static void addHint(List tooltip, String hintKey, Object... messageParams) { + String spacing = IHaveGoggleInformation.spacing; + tooltip.add(spacing + GOLD + Lang.translate(hintKey + ".title")); + String hint = Lang.translate(hintKey); + List cutString = TooltipHelper.cutString(spacing + hint, GRAY, TextFormatting.WHITE); + for (int i = 0; i < cutString.size(); i++) + tooltip.add((i == 0 ? "" : spacing) + cutString.get(i)); + } + public static void referTo(IItemProvider item, Supplier itemWithTooltip) { tooltipReferrals.put(item.asItem(), () -> itemWithTooltip.get() .asItem() diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java index c911e8680..77b6de8b0 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java @@ -5,6 +5,7 @@ import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.RaycastHelper; import net.minecraft.client.Minecraft; @@ -19,6 +20,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -26,6 +29,7 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import net.minecraftforge.items.ItemHandlerHelper; @EventBusSubscriber public class FilteringHandler { @@ -56,27 +60,43 @@ public class FilteringHandler { return; if (behaviour.slotPositioning instanceof ValueBoxTransform.Sided) ((Sided) behaviour.slotPositioning).fromSide(ray.getFace()); + if (!behaviour.testHit(ray.getHitVec())) + return; - if (behaviour.testHit(ray.getHitVec())) { - if (event.getSide() != LogicalSide.CLIENT) { - ItemStack heldItem = player.getHeldItem(hand) - .copy(); - if (!player.isCreative()) { - if (behaviour.getFilter() - .getItem() instanceof FilterItem) - player.inventory.placeItemBackInInventory(world, behaviour.getFilter()); - if (heldItem.getItem() instanceof FilterItem) - player.getHeldItem(hand) - .shrink(1); - } - if (heldItem.getItem() instanceof FilterItem) - heldItem.setCount(1); - behaviour.setFilter(heldItem); + ItemStack toApply = player.getHeldItem(hand) + .copy(); + + if (event.getSide() != LogicalSide.CLIENT) { + if (!player.isCreative()) { + if (behaviour.getFilter() + .getItem() instanceof FilterItem) + player.inventory.placeItemBackInInventory(world, behaviour.getFilter()); + if (toApply.getItem() instanceof FilterItem) + player.getHeldItem(hand) + .shrink(1); } - event.setCanceled(true); - event.setCancellationResult(ActionResultType.SUCCESS); - world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); + if (toApply.getItem() instanceof FilterItem) + toApply.setCount(1); + behaviour.setFilter(toApply); + + } else { + ItemStack filter = behaviour.getFilter(); + String feedback = "apply_click_again"; + if (toApply.getItem() instanceof FilterItem || !behaviour.isCountVisible()) + feedback = "apply"; + else if (ItemHandlerHelper.canItemStacksStack(toApply, filter)) + feedback = "apply_count"; + String translationKey = world.getBlockState(pos) + .getBlock() + .getTranslationKey(); + String formattedText = new TranslationTextComponent(translationKey).getFormattedText(); + player.sendStatusMessage(Lang.createTranslationTextComponent("logistics.filter." + feedback, formattedText) + .applyTextStyle(TextFormatting.WHITE), true); } + + event.setCanceled(true); + event.setCancellationResult(ActionResultType.SUCCESS); + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 18eb79e92..6a397e433 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -161,6 +161,10 @@ "create.logistics.firstFrequency": "Freq. #1", "create.logistics.secondFrequency": "Freq. #2", + "create.logistics.filter.apply": "Applied filter to %1$s.", + "create.logistics.filter.apply_click_again": "Applied filter to %1$s, click again to copy the amount.", + "create.logistics.filter.apply_count": "Applied extraction count to filter.", + "create.gui.goggles.generator_stats": "Generator Stats:", "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.at_current_speed": "At current Speed", @@ -205,7 +209,7 @@ "create.schematicAndQuill.noTarget": "Hold [Ctrl] to select Air blocks.", "create.schematicAndQuill.abort": "Removed selection.", "create.schematicAndQuill.title": "Schematic Name:", - "create.schematicAndQuill.convert": "Save and Deploy Immediately", + "create.schematicAndQuill.convetr": "Save and Deploy Immediately", "create.schematicAndQuill.fallbackName": "My Schematic", "create.schematicAndQuill.saved": "Saved as %1$s", @@ -415,6 +419,7 @@ "create.mechanical_arm.extract_from": "Take items from %1$s", "create.mechanical_arm.deposit_to": "Deposit items to %1$s", + "create.mechanical_arm.summary": "Mechanical Arm has %1$s input(s) and %2$s output(s).", "create.mechanical_arm.points_outside_range": "%1$s selected interaction point(s) removed due to range limitations.", "create.logistics.when_multiple_outputs_available": "When Multiple Outputs Available", @@ -431,6 +436,15 @@ "create.tunnel.selection_mode.randomize": "Randomize", "create.tunnel.selection_mode.synchronize": "Synchronize Inputs", + "create.hint.mechanical_arm_no_targets.title": "No Targets", + "create.hint.mechanical_arm_no_targets": "It appears this _Mechnanical_ _Arm_ has not been assigned any _targets._ Select belts, depots, funnels and other blocks by _right-clicking_ them while _holding_ the _Mechanical_ _Arm_ in your _hand_.", + "create.hint.horizontal_funnel.title": "Horizontal Funnels", + "create.hint.horizontal_funnel": "cannot transfer between inventories _directly_. Try running a _Mechanical_ _Belt_ or _Depot_ below your funnel to extract items from Inventories.", + "create.hint.upward_funnel.title": "Funnels facing upward", + "create.hint.upward_funnel": "can only transfer items inserted by _Arms_, fan-powered _Chutes_, or items _thrown_ at them. Try building some _Chutes_ if you are looking to move your items _vertically_.", + "create.hint.empty_bearing.title": "Update Bearing", + "create.hint.empty_bearing": "_Right-click_ the bearing with an _empty_ _hand_ to _attach_ the structure you just built in front of it.", + "create.gui.config.overlay1": "Hi :)", "create.gui.config.overlay2": "This is a sample overlay", "create.gui.config.overlay3": "Click or drag with your mouse",