From a74c8127f33fe58135aae65e35af60c06f953798 Mon Sep 17 00:00:00 2001 From: joker876 <42680429+joker876@users.noreply.github.com> Date: Mon, 17 May 2021 10:59:39 +0200 Subject: [PATCH 01/21] Update pl_pl.json --- .../resources/assets/create/lang/pl_pl.json | 69 ++++++++++++++----- 1 file changed, 53 insertions(+), 16 deletions(-) diff --git a/src/main/resources/assets/create/lang/pl_pl.json b/src/main/resources/assets/create/lang/pl_pl.json index aa77c039a..72e6c341d 100644 --- a/src/main/resources/assets/create/lang/pl_pl.json +++ b/src/main/resources/assets/create/lang/pl_pl.json @@ -57,6 +57,7 @@ "block.create.cogwheel": "Koło zębate", "block.create.content_observer": "Detektor zawartości", "block.create.controller_rail": "Tory sterujące", + "block.create.copper_backtank": "Miedziany zbiornik w plecaku", "block.create.copper_block": "Blok miedzi", "block.create.copper_casing": "Miedziana Obudowa", "block.create.copper_ore": "Ruda miedzi", @@ -437,6 +438,7 @@ "item.create.chocolate_glazed_berries": "Jagody w czekoladzie", "item.create.chromatic_compound": "Związek chromatyczny", "item.create.cinder_flour": "Rozżarzona mąka", + "item.create.copper_backtank": "Miedziany zbiornik w plecaku", "item.create.copper_ingot": "Sztabka miedzi", "item.create.copper_nugget": "Bryłka miedzi", "item.create.copper_sheet": "Arkusz miedzi", @@ -455,6 +457,8 @@ "item.create.crushed_tin_ore": "Rozkruszona ruda cyny", "item.create.crushed_uranium_ore": "Rozkruszona ruda uranu", "item.create.crushed_zinc_ore": "Rozkruszona ruda cynku", + "item.create.diving_boots": "Buty do nurkowania", + "item.create.diving_helmet": "Hełm do nurkowania", "item.create.deforester": "Wylesiacz", "item.create.dough": "Ciasto", "item.create.electron_tube": "Lampa elektronowa", @@ -685,6 +689,7 @@ "create.recipe.fan_blasting.fan": "Wiatrak za lawą", "create.recipe.pressing": "Tłoczenie", "create.recipe.mixing": "Mieszanie", + "create.recipe.deploying": "Aplikowanie", "create.recipe.automatic_shapeless": "Zautomatyzowanie nieokreślone konstruowanie", "create.recipe.automatic_brewing": "Zautomatyzowane warzenie", "create.recipe.packing": "Prasowanie", @@ -760,11 +765,20 @@ "create.gui.blockzapper.patternSection": "Wzór", "create.gui.blockzapper.pattern.solid": "Ciągły", "create.gui.blockzapper.pattern.checkered": "Szachownica", - "create.gui.blockzapper.pattern.inversecheckered": "Odwrócona Szachownica", + "create.gui.blockzapper.pattern.inversecheckered": "Odwrócona szachownica", "create.gui.blockzapper.pattern.chance25": "Obrót o 25%", "create.gui.blockzapper.pattern.chance50": "Obrót o 50%", "create.gui.blockzapper.pattern.chance75": "Obrót o 75%", "create.gui.terrainzapper.title": "Ręczny kształter", + "create.gui.terrainzapper.searchDiagonal": "Wzdłuż linii ukośnych", + "create.gui.terrainzapper.searchFuzzy": "Ignoruj krawędzie materiałów", + "create.gui.terrainzapper.patternSection": "Wzór", + "create.gui.terrainzapper.pattern.solid": "Ciągły", + "create.gui.terrainzapper.pattern.checkered": "Szachownica", + "create.gui.terrainzapper.pattern.inversecheckered": "Odrócona szachownica", + "create.gui.terrainzapper.pattern.chance25": "Obrót o 25%", + "create.gui.terrainzapper.pattern.chance50": "Obrót o 50%", + "create.gui.terrainzapper.pattern.chance75": "Obrót o 75%", "create.gui.terrainzapper.placement": "Położenie", "create.gui.terrainzapper.placement.merged": "Połączony", "create.gui.terrainzapper.placement.attached": "Przyłączony", @@ -773,6 +787,8 @@ "create.gui.terrainzapper.brush.cuboid": "Prostopadłościan", "create.gui.terrainzapper.brush.sphere": "Kula", "create.gui.terrainzapper.brush.cylinder": "Walec", + "create.gui.terrainzapper.brush.surface": "Powierzchnia", + "create.gui.terrainzapper.brush.cluster": "Grupa", "create.gui.terrainzapper.tool": "Narzędzie", "create.gui.terrainzapper.tool.fill": "Wypełnianie", "create.gui.terrainzapper.tool.place": "Stawianie", @@ -782,6 +798,8 @@ "create.gui.terrainzapper.tool.flatten": "Wypłaszczanie", "create.terrainzapper.shiftRightClickToSet": "Shift+Prawe kliknięcie, aby wybrać kształt", + "create.terrainzapper.usingBlock": "Używając: %1$s", + "create.terrainzapper.leftClickToSet": "Kliknij LPM na blok aby ustawić materiał", "create.blockzapper.usingBlock": "Używając: %1$s", "create.blockzapper.componentUpgrades": "Ulepszenia komponentów:", @@ -1147,16 +1165,35 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: Użyj \"/killtps start\", aby sztucznie spowolnić serwer\n", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", - "create.subtitle.schematicannon_finish": "Schematoarmata skończyła", - "create.subtitle.slime_added": "Szlam plaska", - "create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia", - "create.subtitle.mechanical_press_item_break": "Metal brzęczy", - "create.subtitle.blockzapper_place": "Bloki lecą na miejsce", - "create.subtitle.blockzapper_confirm": "Potwierdzający sygnał", - "create.subtitle.blockzapper_deny": "Odrzucający sygnał", - "create.subtitle.block_funnel_eat": "Lejek zjada", - "create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa", + "create.contraption.minecart_contraption_too_big": "Ta maszyna w wagoniku jest zbyt duża, aby ją podnieść", + + + "_": "->------------------------] Napisy dla niesłyszących [------------------------<-", + + "create.subtitle.cogs": "Koła zębate terkoczą", + "create.subtitle.slime_added": "Szlam plaska", + "create.subtitle.contraption_disassemble": "Maszyna staje", + "create.subtitle.wrench_rotate": "Klucz skrzypi", + "create.subtitle.mixing": "Dźwięki mieszania", + "create.subtitle.mechanical_press_activation_belt": "Mechaniczna prasa stuka", + "create.subtitle.worldshaper_place": "Kształter strzela", + "create.subtitle.deployer_polish": "Aplikator poleruje", + "create.subtitle.depot_slide": "Przedmiot ślizga się", + "create.subtitle.deny": "Dźwięk odmowy", + "create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa", + "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", + "create.subtitle.funnel_flap": "Lejek trzepocze", + "create.subtitle.copper_armor_equip": "Sprzęt do nurkowania pobrzękuje", + "create.subtitle.schematicannon_finish": "Schematoarmata skończyła", + "create.subtitle.scroll_value": "Kliknięcie", + "create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia", + "create.subtitle.contraption_assemble": "Maszyna przesuwa się", + "create.subtitle.crafter_craft": "Mechaniczny stół rzemieślniczy konstruuje", + "create.subtitle.cranking": "Ręczna korba obraca się", + "create.subtitle.crafter_click": "Mechaniczny stół rzemieślniczy stuka", + "create.subtitle.wrench_remove": "Komponent niszczy się", + "create.subtitle.depot_plop": "Przedmiot ląduje", + "create.subtitle.confirm": "Dźwięk potwierdzenia", "_": "->------------------------] Opisy Przedmiotów [------------------------<-", @@ -1547,11 +1584,11 @@ "create.ponder.blaze_burner.text_3": "Z użyciem płomiennego ciasta, palnik może uzyskać szczególnie wysoką temperaturę", "create.ponder.blaze_burner.text_4": "Dostarczanie płomykowi przedmiotów może zostać zautomatyzowane z użyciem aplikatorów lub mechanicznych ramion", - "create.ponder.brass_funnel.header": "Mosiężny lejek", - "create.ponder.brass_funnel.text_1": "Andezytowe lejki mogą pobierać jedynie pojedyncze przedmioty", - "create.ponder.brass_funnel.text_2": "Mosiężne lejki mogą pobierać nawet pełne stosy", + "create.ponder.brass_funnel.header": "Mosiężny lej", + "create.ponder.brass_funnel.text_1": "Andezytowe leje mogą pobierać jedynie pojedyncze przedmioty", + "create.ponder.brass_funnel.text_2": "Mosiężne leje mogą pobierać nawet pełne stosy", "create.ponder.brass_funnel.text_3": "Przewijanie na slocie filtrującym pozwala na precyzyjną kontrolę nad maksymalną wielkością stosu", - "create.ponder.brass_funnel.text_4": "Użycie przedmiotów patrząc na slot filtrujący spowoduje, że lejek będzie przesyłał tylko pasujące przedmioty", + "create.ponder.brass_funnel.text_4": "Użycie przedmiotu patrząc na slot filtrujący spowoduje, że lej będzie przesyłał tylko pasujące przedmioty", "create.ponder.brass_tunnel.header": "Używanie mosiężnych tuneli", "create.ponder.brass_tunnel.text_1": "Mosiężne tunele mogą być użyte do przykrycia Twoich taśmociągów", @@ -2114,4 +2151,4 @@ "create.ponder.windmill_structure.header": "Wiatraki", "create.ponder.windmill_structure.text_1": "Każda struktura jest uznawana za wiatrak w momencie, kiedy ma w sobie co najmniej 8 żaglo-podobnych bloków" -} \ No newline at end of file +} From 9a935969bba294b1e1c82b564d3e3663d8cf7ccc Mon Sep 17 00:00:00 2001 From: dunois2737 <78353924+dunois2737@users.noreply.github.com> Date: Sat, 22 May 2021 16:06:26 +0900 Subject: [PATCH 02/21] update zh_tw for create 0.3.1 --- .../resources/assets/create/lang/zh_tw.json | 3917 +++++++++-------- 1 file changed, 2125 insertions(+), 1792 deletions(-) diff --git a/src/main/resources/assets/create/lang/zh_tw.json b/src/main/resources/assets/create/lang/zh_tw.json index 023f99011..e9b7b29bf 100644 --- a/src/main/resources/assets/create/lang/zh_tw.json +++ b/src/main/resources/assets/create/lang/zh_tw.json @@ -1,1792 +1,2125 @@ -{ - - "_": "->------------------------] Game Elements [------------------------<-", - - "block.create.acacia_window": "相思木窗戶", - "block.create.acacia_window_pane": "相思木窗戶片", - "block.create.adjustable_chain_gearshift": "可調式鏈式變速箱", - "block.create.adjustable_crate": "可調式板條箱", - "block.create.adjustable_pulse_repeater": "可調式脈衝中繼器", - "block.create.adjustable_repeater": "可調式中繼器", - "block.create.analog_lever": "可調式拉桿", - "block.create.andesite_belt_funnel": "安山岩輸送帶漏斗", - "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_encased_shaft": "安山傳動軸箱", - "block.create.andesite_funnel": "安山岩漏斗", - "block.create.andesite_pillar": "豎紋安山岩", - "block.create.andesite_tunnel": "安山岩物品隧道", - "block.create.basin": "作業盆", - "block.create.belt": "輸送帶", - "block.create.birch_window": "白樺木窗戶", - "block.create.birch_window_pane": "白樺木窗戶片", - "block.create.black_sail": "黑色風帆", - "block.create.black_seat": "黑色坐墊", - "block.create.black_valve_handle": "黑色閥門開關", - "block.create.blaze_burner": "烈焰使者動力爐", - "block.create.blue_sail": "藍色風帆", - "block.create.blue_seat": "藍色坐墊", - "block.create.blue_valve_handle": "藍色閥門開關", - "block.create.brass_belt_funnel": "黃銅輸送帶漏斗", - "block.create.brass_block": "黃銅磚", - "block.create.brass_casing": "黃銅機殼", - "block.create.brass_encased_shaft": "黃銅傳動軸箱", - "block.create.brass_funnel": "黃銅漏斗", - "block.create.brass_tunnel": "黃銅物品隧道", - "block.create.brown_sail": "棕色風帆", - "block.create.brown_seat": "棕色坐墊", - "block.create.brown_valve_handle": "棕色閥門開關", - "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.chocolate": "巧克力", - "block.create.chute": "滑道", - "block.create.clockwork_bearing": "時鐘軸承", - "block.create.clutch": "離合器", - "block.create.cogwheel": "齒輪", - "block.create.content_observer": "物品偵測器", - "block.create.controller_rail": "控制鐵軌", - "block.create.copper_block": "銅磚", - "block.create.copper_casing": "銅機殼", - "block.create.copper_ore": "銅礦石", - "block.create.copper_shingles": "塊狀銅磚", - "block.create.copper_tiles": "菱形銅磚", - "block.create.copper_valve_handle": "銅製閥門開關", - "block.create.creative_crate": "創造板條箱", - "block.create.creative_fluid_tank": "創造液體儲存罐", - "block.create.creative_motor": "創造馬達", - "block.create.crimson_window": "赤紅窗戶", - "block.create.crimson_window_pane": "赤紅窗戶片", - "block.create.crushing_wheel": "粉碎輪", - "block.create.crushing_wheel_controller": "粉碎輪控制器", - "block.create.cuckoo_clock": "布穀鳥鐘", - "block.create.cyan_sail": "藍綠色風帆", - "block.create.cyan_seat": "藍綠色坐墊", - "block.create.cyan_valve_handle": "藍綠色閥門開關", - "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": "置物臺", - "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_slab": "白雲石半磚", - "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_chain_drive": "鏈式傳動箱", - "block.create.encased_fan": "鼓風機", - "block.create.encased_fluid_pipe": "液體管道箱", - "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": "液體管道", - "block.create.fluid_tank": "液體儲存罐", - "block.create.fluid_valve": "液體閥門", - "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": "輝長岩半磚", - "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": "玻璃液體管道", - "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_sail": "灰色風帆", - "block.create.gray_seat": "灰色坐墊", - "block.create.gray_valve_handle": "灰色閥門開關", - "block.create.green_sail": "綠色風帆", - "block.create.green_seat": "綠色坐墊", - "block.create.green_valve_handle": "綠色閥門開關", - "block.create.hand_crank": "手搖把手", - "block.create.honey": "蜂蜜", - "block.create.horizontal_framed_glass": "豎直邊框玻璃", - "block.create.horizontal_framed_glass_pane": "豎直邊框玻璃片", - "block.create.hose_pulley": "軟管滑輪", - "block.create.item_drain": "分液池", - "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.light_blue_sail": "淡藍色風帆", - "block.create.light_blue_seat": "淡藍色坐墊", - "block.create.light_blue_valve_handle": "淡藍色閥門開關", - "block.create.light_gray_sail": "淡灰色風帆", - "block.create.light_gray_seat": "淡灰色坐墊", - "block.create.light_gray_valve_handle": "淡灰色閥門開關", - "block.create.lime_sail": "黃綠色風帆", - "block.create.lime_seat": "黃綠色坐墊", - "block.create.lime_valve_handle": "黃綠色閥門開關", - "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": "碎石灰岩", - "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.lit_blaze_burner": "烈焰使者動力爐(已啟動)", - "block.create.magenta_sail": "洋紅色風帆", - "block.create.magenta_seat": "洋紅色坐墊", - "block.create.magenta_valve_handle": "洋紅色閥門開關", - "block.create.mechanical_arm": "機械手臂", - "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_pump": "機械幫浦", - "block.create.mechanical_saw": "機械切割機", - "block.create.metal_bracket": "金屬支架", - "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_sail": "橙色風帆", - "block.create.orange_seat": "橙色坐墊", - "block.create.orange_valve_handle": "橙色閥門開關", - "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_sail": "粉紅色風帆", - "block.create.pink_seat": "粉紅色坐墊", - "block.create.pink_valve_handle": "粉紅色閥門開關", - "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.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_fluid_interface": "移動式液體口", - "block.create.portable_storage_interface": "移動式物品口", - "block.create.powered_latch": "閂鎖器", - "block.create.powered_toggle_latch": "T型正反器", - "block.create.pulley_magnet": "滑輪磁鐵", - "block.create.pulse_repeater": "脈衝中繼器", - "block.create.purple_sail": "紫色風帆", - "block.create.purple_seat": "紫色坐墊", - "block.create.purple_valve_handle": "紫色閥門開關", - "block.create.radial_chassis": "旋轉底盤", - "block.create.red_sail": "紅色風帆", - "block.create.red_seat": "紅色坐墊", - "block.create.red_valve_handle": "紅色閥門開關", - "block.create.redstone_contact": "接觸式紅石訊號產生器", - "block.create.redstone_link": "無限紅石訊號機", - "block.create.refined_radiance_casing": "光輝機殼", - "block.create.reinforced_rail": "強化鐵軌", - "block.create.rope": "繩索", - "block.create.rope_pulley": "滑輪繩索", - "block.create.rotation_speed_controller": "轉速控制器", - "block.create.sail_frame": "風帆框架", - "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": "機殼底盤2號", - "block.create.sequenced_gearshift": "可程式化齒輪箱", - "block.create.shadow_steel_casing": "暗影機殼", - "block.create.shaft": "傳動軸", - "block.create.smart_fluid_pipe": "智慧液體管道", - "block.create.speedometer": "速度計", - "block.create.spout": "液體灌注器", - "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.turntable": "轉盤", - "block.create.vertical_framed_glass": "豎直邊框玻璃", - "block.create.vertical_framed_glass_pane": "豎直邊框玻璃片", - "block.create.warped_window": "扭曲蕈木窗戶", - "block.create.warped_window_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": "碎風化石灰岩", - "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_sail": "白色風帆", - "block.create.white_seat": "白色坐墊", - "block.create.white_valve_handle": "白色閥門開關", - "block.create.windmill_bearing": "風車軸承", - "block.create.wooden_bracket": "木製支架", - "block.create.yellow_sail": "黃色風帆", - "block.create.yellow_seat": "黃色坐墊", - "block.create.yellow_valve_handle": "黃色閥門開關", - "block.create.zinc_block": "鋅磚", - "block.create.zinc_ore": "鋅礦石", - - "entity.create.contraption": "結構", - "entity.create.seat": "坐墊", - "entity.create.stationary_contraption": "固定結構", - "entity.create.super_glue": "強力膠", - - "fluid.create.chocolate": "巧克力", - "fluid.create.honey": "蜂蜜", - "fluid.create.milk": "牛奶", - "fluid.create.potion": "藥水", - "fluid.create.tea": "茶", - - "item.create.andesite_alloy": "安山合金", - "item.create.attribute_filter": "屬性過濾器", - "item.create.bar_of_chocolate": "巧克力棒", - "item.create.belt_connector": "輸送帶", - "item.create.blaze_cake": "熔岩蛋糕", - "item.create.blaze_cake_base": "熔岩蛋糕胚", - "item.create.brass_hand": "黃銅手部零件", - "item.create.brass_ingot": "黃銅錠", - "item.create.brass_nugget": "黃銅粒", - "item.create.brass_sheet": "黃銅板", - "item.create.builders_tea": "工人茶", - "item.create.chest_minecart_contraption": "裝修過的機械礦車", - "item.create.chocolate_bucket": "巧克力桶", - "item.create.chromatic_compound": "異彩化合物", - "item.create.cinder_flour": "地獄麵粉", - "item.create.copper_ingot": "銅錠", - "item.create.copper_nugget": "銅粒", - "item.create.copper_sheet": "銅板", - "item.create.crafter_slot_cover": "合成器蓋板", - "item.create.crushed_aluminum_ore": "碎狀鋁礦石", - "item.create.crushed_brass": "碎狀黃銅", - "item.create.crushed_copper_ore": "碎狀銅礦石", - "item.create.crushed_gold_ore": "碎狀金礦石", - "item.create.crushed_iron_ore": "碎狀鐵礦石", - "item.create.crushed_lead_ore": "碎狀鉛礦石", - "item.create.crushed_nickel_ore": "碎狀鎳礦石", - "item.create.crushed_osmium_ore": "碎狀鋨礦石", - "item.create.crushed_platinum_ore": "碎狀白金礦石", - "item.create.crushed_quicksilver_ore": "碎狀水銀礦石", - "item.create.crushed_silver_ore": "碎狀銀礦石", - "item.create.crushed_tin_ore": "碎狀錫礦石", - "item.create.crushed_uranium_ore": "碎狀鈾礦石", - "item.create.crushed_zinc_ore": "碎狀鋅礦石", - "item.create.deforester": "連根拔樹斧", - "item.create.dough": "麵團", - "item.create.electron_tube": "真空管", - "item.create.empty_blaze_burner": "空的烈焰使者動力爐", - "item.create.empty_schematic": "空白藍圖", - "item.create.extendo_grip": "伸縮機械手", - "item.create.filter": "過濾器", - "item.create.furnace_minecart_contraption": "裝配過的機械礦車", - "item.create.goggles": "MR護目鏡", - "item.create.golden_sheet": "金板", - "item.create.handheld_blockzapper": "方塊放置器", - "item.create.handheld_worldshaper": "地形雕塑器", - "item.create.honey_bucket": "蜂蜜桶", - "item.create.integrated_circuit": "IC板", - "item.create.iron_sheet": "鐵板", - "item.create.lapis_sheet": "青金石板", - "item.create.minecart_contraption": "裝修過的礦車", - "item.create.minecart_coupling": "礦車連結器", - "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": "鋅粒", - - - "_": "->------------------------] Advancements [------------------------<-", - - "advancement.create.root": "感謝你安裝機械動力模組,強烈建議您安裝JEI配合本模組遊玩", - "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.tunnel": "尋找掩護!", - "advancement.create.tunnel.desc": "在輸送帶上放上物品隧道。", - "advancement.create.splitter_tunnel": "分而治之", - "advancement.create.splitter_tunnel.desc": "用黃銅物品隧道設計一個分流器。", - "advancement.create.chute": "轟然倒塌", - "advancement.create.chute.desc": "放置一個滑道(垂直版本的輸送帶)。", - "advancement.create.upward_chute": "空中攔截", - "advancement.create.upward_chute.desc": "目睹拋出的物品飛入裝有風扇的滑道。", - "advancement.create.belt_funnel": "漏斗的垂簾", - "advancement.create.belt_funnel.desc": "將側向漏斗放在輸送帶或置物臺的上方。", - "advancement.create.belt_funnel_kiss": "比翼雙飛", - "advancement.create.belt_funnel_kiss.desc": "使兩個安裝在輸送帶上的漏斗相連。", - "advancement.create.fan": "機械氣槍", - "advancement.create.fan.desc": "飄浮在鼓風機吹出的氣流上", - "advancement.create.fan_lava": "空間加熱器", - "advancement.create.fan_lava.desc": "感受熔煉物品的氣流。", - "advancement.create.fan_water": "奇怪的洗滌", - "advancement.create.fan_water.desc": "被洗滌的氣流所吸引。", - "advancement.create.fan_smoke": "機械波紋管", - "advancement.create.fan_smoke.desc": "感受煙燻氣流。", - "advancement.create.wrench": "細部調整", - "advancement.create.wrench.desc": "做出一個方便調整方塊的板手", - "advancement.create.goggles": "動能,一目了然", - "advancement.create.goggles.desc": "做出一個能看到機械動能訊息的MR護目鏡", - "advancement.create.speedometer": "精密的速度控制", - "advancement.create.speedometer.desc": "放置一個速度計,並且戴上MR護目鏡來讀取數據", - "advancement.create.stressometer": "精密的動能控制", - "advancement.create.stressometer.desc": "放置一個動能計,並且戴上MR護目鏡來讀取數據", - "advancement.create.aesthetics": "繁榮與美學!", - "advancement.create.aesthetics.desc": "將支架放在傳動軸,管道和齒輪上。", - "advancement.create.reinforced": "超級加固!", - "advancement.create.reinforced.desc": "在傳動軸,管道和輸送帶上使用機殼加固。", - "advancement.create.water_wheel": "治水", - "advancement.create.water_wheel.desc": "放置一個水車並讓它開始旋轉", - "advancement.create.chocolate_wheel": "美味的動能源", - "advancement.create.chocolate_wheel.desc": "用融化的巧克力驅動水車。", - "advancement.create.lava_wheel": "風火輪", - "advancement.create.lava_wheel.desc": "它不應該有用的..。", - "advancement.create.cuckoo": "是時候了?", - "advancement.create.cuckoo.desc": "目睹布穀鳥鐘報就寢時間。", - "advancement.create.millstone": "攜帶式粉碎機", - "advancement.create.millstone.desc": "放置一個石磨並且為其供能", - "advancement.create.windmill": "微風拂過", - "advancement.create.windmill.desc": "組裝風車。", - "advancement.create.maxed_windmill": "強風襲來", - "advancement.create.maxed_windmill.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.blaze_burner": "活生生的壁爐", - "advancement.create.blaze_burner.desc": "獲得一個烈焰使者動力爐。", - "advancement.create.compact": "快樂壓縮", - "advancement.create.compact.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.spout": "裝填!", - "advancement.create.spout.desc": "觀察注液器灌滿物品。", - "advancement.create.spout_potion": "國際級啤酒大廠", - "advancement.create.spout_potion.desc": "觀察注液器注入藥水到玻璃瓶。", - "advancement.create.chocolate": "夢裡的世界", - "advancement.create.chocolate.desc": "獲取一桶熔融巧克力。", - "advancement.create.item_drain": "滾筒洗衣機", - "advancement.create.item_drain.desc": "觀察液體物品被分液池抽空。", - "advancement.create.chained_item_drain": "讓我們一起搖滾!", - "advancement.create.chained_item_drain.desc": "看著物品穿過多個分液池。", - "advancement.create.glass_pipe": "偷窺液體", - "advancement.create.glass_pipe.desc": "透過窗戶觀察液體在管道中流動。使用板手可打開直線液體管道的窗戶。", - "advancement.create.pipe_collision": "永不交會的溪流!", - "advancement.create.pipe_collision.desc": "觀察兩種液體在您的管道中會合", - "advancement.create.pipe_spill": "漏水啦!", - "advancement.create.pipe_spill.desc": "觀察管道的末端將液體排放到到外面。", - "advancement.create.hose_pulley": "工業排放", - "advancement.create.hose_pulley.desc": "放下一個軟管滑輪,觀察它排乾或充滿液體。", - "advancement.create.infinite_water": "抽取海洋", - "advancement.create.infinite_water.desc": "從足以被認為是無限的水源中抽水。", - "advancement.create.infinite_lava": "吸取行星的核心", - "advancement.create.infinite_lava.desc": "從廣闊的岩漿湖中抽出岩漿。", - "advancement.create.infinite_chocolate": "淹沒在幻想中", - "advancement.create.infinite_chocolate.desc": "從廣闊的巧克力海中抽出巧克力。", - "advancement.create.crafter": "自動化流水作業", - "advancement.create.crafter.desc": "放置一些機械合成臺並且為其供能", - "advancement.create.clockwork_bearing": "時差", - "advancement.create.clockwork_bearing.desc": "組裝安裝在發條軸承上的結構。", - "advancement.create.nixie_tube": "風格的跡象", - "advancement.create.nixie_tube.desc": "獲得真空管顯示器並放置。", - "advancement.create.deployer": "指爽沒?", - "advancement.create.deployer.desc": "放置並且啟動一個機械手。這可是你右手完美的複製品", - "advancement.create.speed_controller": "攻城屍討厭他!", - "advancement.create.speed_controller.desc": "放置一個轉速控制器,這是換檔的終極裝置。", - "advancement.create.flywheel": "工廠之心", - "advancement.create.flywheel.desc": "將引擎成功連接到飛輪。", - "advancement.create.overstress_flywheel": "壓力過大", - "advancement.create.overstress_flywheel.desc": "超載熔爐引擎。", - "advancement.create.integrated_circuit": "複雜的運算", - "advancement.create.integrated_circuit.desc": "合成IC板。", - "advancement.create.mechanical_arm": "忙碌的手!", - "advancement.create.mechanical_arm.desc": "製作機械手臂,選擇輸入和輸出,放置並給它動能; 然後看著它完成所有你交代的工作。", - "advancement.create.musical_arm": "沒人能在我的BGM裡打敗我!", - "advancement.create.musical_arm.desc": "使用機械手臂播放唱片。", - "advancement.create.arm_many_targets": "你是要累死我?", - "advancement.create.arm_many_targets.desc": "配置一隻有十個或更多輸出位置的機械手臂。", - "advancement.create.arm_blaze_burner": "燃燒吧!烈焰使者!", - "advancement.create.arm_blaze_burner.desc": "指揮機械臂給烈焰使者動力爐投食。", - "advancement.create.fist_bump": "朋友,來碰個拳", - "advancement.create.fist_bump.desc": "使兩個機械手互相碰拳", - "advancement.create.crushing_wheel": "一對大傢伙", - "advancement.create.crushing_wheel.desc": "製作一對能更快粉碎物品的粉碎輪", - "advancement.create.blaze_cake": "糖份超標", - "advancement.create.blaze_cake.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.chromatic_age": "繽紛時代", - "advancement.create.chromatic_age.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": "piu piu piu!", - "advancement.create.extendo_grip.desc": "拿到一個伸縮機械手", - "advancement.create.dual_extendo_grip": "piu——piu——piu——", - "advancement.create.dual_extendo_grip.desc": "雙持伸縮機械手進一步加長觸碰距離", - "advancement.create.eob": "Beta版結束", - "advancement.create.eob.desc": "期待日後的更新。", - - - "_": "->------------------------] UI & Messages [------------------------<-", - - "itemGroup.create.base": "動力機械", - "itemGroup.create.palettes": "動力機械建築與裝飾方塊", - - "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.fan_washing": "批次洗滌", - "create.recipe.fan_washing.fan": "在水後放置鼓風機", - "create.recipe.fan_smoking": "批次煙燻", - "create.recipe.fan_smoking.fan": "在火焰後放置鼓風機", - "create.recipe.fan_blasting": "批次融煉", - "create.recipe.fan_blasting.fan": "在熔岩後放置鼓風機", - "create.recipe.pressing": "金屬壓片", - "create.recipe.mixing": "混合攪拌", - "create.recipe.automatic_shapeless": "自動攪拌", - "create.recipe.automatic_brewing": "自動釀造", - "create.recipe.packing": "壓塊塑形", - "create.recipe.automatic_packing": "自動打包", - "create.recipe.sawing": "板材切割", - "create.recipe.mechanical_crafting": "自動合成", - "create.recipe.automatic_shaped": "自動合成", - "create.recipe.block_cutting": "方塊切割", - "create.recipe.blockzapper_upgrade": "方塊放置器", - "create.recipe.sandpaper_polishing": "砂紙打磨", - "create.recipe.mystery_conversion": "神秘轉化", - "create.recipe.spout_filling": "注液", - "create.recipe.draining": "分液", - "create.recipe.processing.chance":"%1$s%%概率", - "create.recipe.heat_requirement.none": "不需加熱", - "create.recipe.heat_requirement.heated": "加熱", - "create.recipe.heat_requirement.superheated": "超級加熱", - - "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": "Ticks", - "create.generic.unit.seconds": "秒", - "create.generic.unit.minutes": "分", - "create.generic.unit.rpm": "RPM", - "create.generic.unit.stress": "SU", - "create.generic.unit.degrees": "°", - "create.generic.unit.millibuckets":"%1$smB", - "create.generic.clockwise": "順時鐘方向", - "create.generic.counter_clockwise": "逆時鐘方向", - - "create.action.scroll": "滾輪", - "create.action.confirm": "確認", - "create.action.abort": "退出", - "create.action.saveToFile": "離開", - "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": "[SCROLL] 循環", - "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": "Shift+滑鼠右鍵 以設定雕塑類型", - - "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.minecart_coupling.two_couplings_max": "礦車無法被連接兩個以上的礦車連結器", - "create.minecart_coupling.unloaded": "有一部份礦車存在於未讀取區塊中", - "create.minecart_coupling.no_loops": "礦車連結器不能連成一個環", - "create.minecart_coupling.removed": "從礦車上移除所有礦車連結器", - "create.minecart_coupling.too_far": "礦車距離你太遠了", - - "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.contraptions.windmill.rotation_direction": "旋轉方向", - "create.contraptions.clockwork.clock_hands": "鐘錶指針", - "create.contraptions.clockwork.hour_first": "時針優先", - "create.contraptions.clockwork.minute_first": "分針優先", - "create.contraptions.clockwork.hour_first_24": "24小時制優先", - - "create.logistics.filter": "過濾器", - "create.logistics.recipe_filter": "配方過濾器", - "create.logistics.fluid_filter": "液體過濾器", - "create.logistics.firstFrequency": "頻道. #1", - "create.logistics.secondFrequency": "頻道. #2", - "create.logistics.filter.apply": "將過濾器應用來%1$s。", - "create.logistics.filter.apply_click_again": "將過濾器應用來%1$s,再次點擊以復制數量。", - "create.logistics.filter.apply_count": "使用提取計數過濾。", - - "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": "反轉訊號", - "create.gui.stockpile_switch.move_to_lower_at": "移至下線%1$s%%", - "create.gui.stockpile_switch.move_to_upper_at": "移至上線%1$s%%", - "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.title": "藍圖名:", - "create.schematicAndQuill.convert": "立即存檔並發佈", - "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": "移動 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.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.refresh": "重新整理文件", - "create.gui.schematicTable.open_folder": "打開資料夾", - "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.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.showOptions": "顯示藍圖加農炮設定", - "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.slot.gunpowder": "向藍圖加農炮添加火藥以提供動能", - "create.gui.schematicannon.slot.listPrinter": "在此處放置書以列印藍圖所需的材料清單", - "create.gui.schematicannon.slot.schematic": "在此處添加你的藍圖,務必確保其已被部放置在特定位置", - "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.materialChecklist": "材料清單", - "create.materialChecklist.blocksNotLoaded": "*免責聲明* \n\n由於未讀取相關區塊,材料清單可能不正確。", - - "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": "可放置", - "create.item_attributes.placeable.inverted": "不可放置", - "create.item_attributes.consumable": "可食用", - "create.item_attributes.consumable.inverted": "不可食用", - "create.item_attributes.smeltable": "可被熔爐融煉", - "create.item_attributes.smeltable.inverted": "不可被熔爐融煉", - "create.item_attributes.washable": "可被篩洗", - "create.item_attributes.washable.inverted": "不可被篩洗", - "create.item_attributes.smokable": "可被煙熏", - "create.item_attributes.smokable.inverted": "不可被煙熏", - "create.item_attributes.crushable": "可被粉碎", - "create.item_attributes.crushable.inverted": "不可被粉碎", - "create.item_attributes.blastable": "可被高爐融煉", - "create.item_attributes.blastable.inverted": "不可被高爐融煉", - "create.item_attributes.enchanted": "已被附魔", - "create.item_attributes.enchanted.inverted": "未被附魔", - "create.item_attributes.damaged": "已損壞", - "create.item_attributes.damaged.inverted": "未損壞", - "create.item_attributes.badly_damaged": "嚴重受損", - "create.item_attributes.badly_damaged.inverted": "未嚴重受損", - "create.item_attributes.not_stackable": "無法堆疊", - "create.item_attributes.not_stackable.inverted": "可堆疊", - "create.item_attributes.equipable": "可裝備", - "create.item_attributes.equipable.inverted": "不可裝備", - "create.item_attributes.furnace_fuel": "是燃料", - "create.item_attributes.furnace_fuel.inverted": "不是燃料", - "create.item_attributes.in_tag": "標籤是%1$s", - "create.item_attributes.in_tag.inverted": "標籤不是%1$s", - "create.item_attributes.in_item_group": "屬於%1$s", - "create.item_attributes.in_item_group.inverted": "不屬於%1$s", - "create.item_attributes.added_by": "由%1$s添加", - "create.item_attributes.added_by.inverted": "不是由%1$s添加", - "create.item_attributes.has_enchant": "有附魔效果%1$s", - "create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s", - "create.item_attributes.has_fluid": "包含%1$s", - "create.item_attributes.has_fluid.inverted": "不包含%1$s", - "create.item_attributes.has_name": "有自定義名稱%1$s", - "create.item_attributes.has_name.inverted": "沒有自定義名稱%1$s", - "create.item_attributes.book_author": "由%1$s編寫", - "create.item_attributes.book_author.inverted": "未由%1$s編寫", - "create.item_attributes.book_copy_original": "是原創的", - "create.item_attributes.book_copy_original.inverted": "不是原創的", - "create.item_attributes.book_copy_first": "是第一份複製", - "create.item_attributes.book_copy_first.inverted": "不是第一份複製", - "create.item_attributes.book_copy_second": "是第二份複製", - "create.item_attributes.book_copy_second.inverted": "不是第二份複製", - "create.item_attributes.book_copy_tattered": "是第三份複製", - "create.item_attributes.book_copy_tattered.inverted": "不是第三份複製", - "create.item_attributes.astralsorcery_crystal": "具有晶體屬性%1$s", - "create.item_attributes.astralsorcery_crystal.inverted": "不具有晶體屬性%1$s", - "create.item_attributes.astralsorcery_constellation": "與%1$s調諧", - "create.item_attributes.astralsorcery_constellation.inverted": "未與%1$s調諧", - "create.item_attributes.astralsorcery_perk_gem": "具有特殊屬性%1$s", - "create.item_attributes.astralsorcery_perk_gem.inverted": "不具有特殊屬性%1$s", - "create.item_attributes.astralsorcery_amulet": "提升%1$s", - "create.item_attributes.astralsorcery_amulet.inverted": "不提升%1$s", - - "create.gui.attribute_filter.no_selected_attributes": "沒有標記任何屬性", - "create.gui.attribute_filter.selected_attributes": "已選擇的屬性:", - "create.gui.attribute_filter.add_attribute": "向列表中添加屬性", - "create.gui.attribute_filter.add_inverted_attribute": "向列表中添加相反屬性", - "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.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.mechanical_arm.extract_from": "從%1$s 拿取物品", - "create.mechanical_arm.deposit_to": "向%1$s 儲存物品", - "create.mechanical_arm.summary": "機械手臂有%1$s 輸入以及 %2$s 輸出。", - "create.mechanical_arm.points_outside_range":"%1$s 由於距離限制,選定的交互點被移除。", - - "create.logistics.when_multiple_outputs_available": "當多個輸出可用時", - - "create.mechanical_arm.selection_mode.round_robin": "輪詢調度", - "create.mechanical_arm.selection_mode.forced_round_robin": "強制輪詢調度", - "create.mechanical_arm.selection_mode.prefer_first": "第一目標優先", - - "create.tunnel.selection_mode.split": "分攤", - "create.tunnel.selection_mode.forced_split": "強制分攤", - "create.tunnel.selection_mode.round_robin": "輪詢調度", - "create.tunnel.selection_mode.forced_round_robin": "強制輪詢調度", - "create.tunnel.selection_mode.prefer_nearest": "最近優先", - "create.tunnel.selection_mode.randomize": "隨機", - "create.tunnel.selection_mode.synchronize": "同步輸入", - - "create.tooltip.chute.header": "滑道訊息", - "create.tooltip.chute.items_move_down": "物品向下移動", - "create.tooltip.chute.items_move_up": "物品向上移動", - "create.tooltip.chute.no_fans_attached": "未安裝鼓風機", - "create.tooltip.chute.fans_push_up": "鼓風機從下方進行推動", - "create.tooltip.chute.fans_push_down": "鼓風機從上方進行推動", - "create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", - "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", - - "create.hint.mechanical_arm_no_targets.title": "沒有目標", - "create.hint.mechanical_arm_no_targets": "看起來這個_機械手臂_沒有被分配任何_目標_。在手持機械手臂的同時,右鍵選取輸送帶、置物臺、漏斗或其他設備來設定目標。", - "create.hint.horizontal_funnel.title": "水平漏斗", - "create.hint.horizontal_funnel": "無法_直接_在兩個庫存間移動物品。試著使用輸送帶或者置物臺來從庫存中提取物品。", - "create.hint.upward_funnel.title": "漏斗向上", - "create.hint.upward_funnel": "只可以傳送由_機械手臂_,鼓風機驅動的_滑道_或者被投擲的物品。試著做一些滑道來垂直輸送物品。", - "create.hint.empty_bearing.title": "更新軸承", - "create.hint.empty_bearing": "_空手右鍵_軸承來_添加_你新建造的結構。", - "create.hint.full_deployer.title": "機械手物品溢出", - "create.hint.full_deployer": "_機械手_包含_過剩的物品_需要被_提取._使用_漏斗,__漏斗_或其他方法將溢出解決。", - - "create.gui.config.overlay1": "嗨 :)", - "create.gui.config.overlay2": "這是一個實例層", - "create.gui.config.overlay3": "點擊拖拽你的滑鼠", - "create.gui.config.overlay4": "來將它移動到前方", - "create.gui.config.overlay5": "ESC退出目前界面", - "create.gui.config.overlay6": "並儲存新的位置", - "create.gui.config.overlay7": "輸入/create overlay reset", - "create.gui.config.overlay8": "重置到預設位置", - - "create.command.killTPSCommand": "killtps", - "create.command.killTPSCommand.status.slowed_by.0": "[Create]: 伺服器每秒TICK被降為 %s ms :o", - "create.command.killTPSCommand.status.slowed_by.1": "[Create]: 伺服器現在每秒TICK被降為 >:)", - "create.command.killTPSCommand.status.slowed_by.2": "[Create]: 伺服器現在不延遲了,TPS正常 :D", - "create.command.killTPSCommand.status.usage.0": "[Create]: 用 /killtps stop 來讓伺服器的TPS速度恢復正常", - "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 來手動降低伺服器TPS", - "create.command.killTPSCommand.argument.tickTime": "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": "漏斗吸收", - "create.subtitle.blaze_munch": "烈焰使者開心地吃著", - - - "_": "->------------------------] 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.", - - "block.create.andesite_encased_shaft.tooltip": "安山岩傳動軸箱", - "block.create.andesite_encased_shaft.tooltip.summary": "_創造模式_物品。用安山岩機殼包覆世界中的傳動軸,將不會消耗機殼。", - - "block.create.brass_encased_shaft.tooltip": "黃銅傳動軸箱", - "block.create.brass_encased_shaft.tooltip.summary": "_創造模式_物品。用黃銅機殼包覆世界中的傳動軸,將不會消耗機殼。", - - "block.create.wooden_bracket.tooltip": "木製支架", - "block.create.wooden_bracket.tooltip.summary": "用來裝飾_傳動軸_,_齒輪_和_管道_。", - - "block.create.metal_bracket.tooltip": "金屬支架", - "block.create.metal_bracket.tooltip.summary": "用來裝飾_傳動軸_,_齒輪_和_管道_。", - - "block.create.andesite_casing.tooltip": "安山機殼", - "block.create.andesite_casing.tooltip.summary": "具多種用途簡易機殼,可用來加固並裝飾_傳動軸_,_輸送帶_", - - "block.create.andesite_funnel.tooltip": "安山漏斗", - "block.create.andesite_funnel.tooltip.summary": "一種常用的傳輸裝置,配合各種物流結構傳輸物品,可由_紅石訊號_控制。", - "block.create.andesite_funnel.tooltip.condition1": "一般形態", - "block.create.andesite_funnel.tooltip.behaviour1": "開口的面會吸收面前的_掉落物_,並_傳輸_到它所附著的_容器_裡。", - "block.create.andesite_funnel.tooltip.condition2": "安裝在輸送帶、置物臺等結構上時,會轉為附著形態", - "block.create.andesite_funnel.tooltip.behaviour2": "從容器中向輸送帶、置物臺放置物品,或從中收集物品到容器中。", - "block.create.andesite_funnel.tooltip.condition3": "垂直放置於兩個容器之間時", - "block.create.andesite_funnel.tooltip.behaviour3": "僅向下垂直傳輸物品,類似一個沒有緩衝空間的漏斗。", - - "block.create.andesite_tunnel.tooltip": "安山物品隧道", - "block.create.andesite_tunnel.tooltip.summary": "輸送帶的保護隧道,能讓你的流水線優雅的穿過牆壁。", - "block.create.andesite_tunnel.tooltip.control1": "板手右鍵側面時", - "block.create.andesite_tunnel.tooltip.action1": "如果輸送帶隧道串連的數量達到三個或以上,可在位於中間的隧道側面上開啟或關閉百葉窗。", - - "block.create.brass_funnel.tooltip": "黃銅漏斗", - "block.create.brass_funnel.tooltip.summary": "一種常用的傳輸裝置,配合各種物流結構傳輸物品,可由_紅石訊號_控制,並附有過濾插槽", - "block.create.brass_funnel.tooltip.condition1": "一般形態", - "block.create.brass_funnel.tooltip.behaviour1": "開口的面會吸收面前的_掉落物_,並_傳輸_到它所附著的_容器_里。", - "block.create.brass_funnel.tooltip.condition2": "安裝在輸送帶、置物臺等結構上時", - "block.create.brass_funnel.tooltip.behaviour2": "從容器中向輸送帶、置物臺放置物品,或從中收集物品到容器中。", - "block.create.brass_funnel.tooltip.condition3": "垂直放置於兩個容器之間時", - "block.create.brass_funnel.tooltip.behaviour3": "向下垂直傳輸物品,類似一個沒有緩衝空間的漏斗。", - - "block.create.brass_tunnel.tooltip": "黃銅物品隧道", - "block.create.brass_tunnel.tooltip.summary": "_黃銅物品隧道_擁有_過濾_,_分流_輸送帶上物品的功能。", - "block.create.brass_tunnel.tooltip.condition1": "將它們_並排放置_時", - "block.create.brass_tunnel.tooltip.behaviour1": "相鄰的_黃銅物品隧道_可以讓輸送帶路線上穿過的物品_重定向_到與其並排的輸送帶路線上。", - "block.create.brass_tunnel.tooltip.condition2": "過濾", - "block.create.brass_tunnel.tooltip.behaviour2": "_黃銅物品隧道_的_輸入_方向和_輸出_方向都帶有過濾插槽。如果進入的物品不滿足隧道輸出端的過濾條件,則該物品會從並排的其他隧道出口傳出。", - "block.create.brass_tunnel.tooltip.condition3": "分流", - "block.create.brass_tunnel.tooltip.behaviour3": "_黃銅物品隧道_可以為並排的輸送帶路線提供多個物品分流的方案。", - "block.create.brass_tunnel.tooltip.control1": "扳手右鍵側面時", - "block.create.brass_tunnel.tooltip.action1": "如果輸送帶隧道串聯的數量達到三個或以上,可在位於中間的隧道側面上開啟關閉百葉窗。", - "block.create.brass_tunnel.tooltip.control2": "手持扳手在隧道頂部滾動滑鼠滾輪", - "block.create.brass_tunnel.tooltip.action2": "更改_隧道_的分流模式。", - - "block.create.copper_casing.tooltip": "銅製機殼", - "block.create.copper_casing.tooltip.summary": "具備多種用途的堅固機殼,也可用於裝飾。", - "block.create.copper_casing.tooltip.condition1": "對流體管道使用時", - "block.create.copper_casing.tooltip.behaviour1": "會把管道裝入機殼,裝進機殼的管道會與其他管道分開,以免它們自動相連。", - - "block.create.encased_fluid_pipe.tooltip": "流體管道箱", - "block.create.encased_fluid_pipe.tooltip.summary": "用銅機殼加固后的液體管道。", - - "block.create.copper_valve_handle.tooltip": "銅閥門開關", - "block.create.copper_valve_handle.tooltip.summary": "精確的機械來源,需要玩家手動操作。注意不要讓自己太累!", - "block.create.copper_valve_handle.tooltip.condition1": "右鍵使用時", - "block.create.copper_valve_handle.tooltip.behaviour1": "為連接的設備提供機械。潛行狀態下反向旋轉。", - - "block.create.seat.tooltip": "坐墊", - "block.create.seat.tooltip.summary": "坐下來享受旅程吧!坐墊將會把玩家固定在一個移動裝置上。也可以用來作為居家裝飾,畢竟他有許多顏色。", - "block.create.seat.tooltip.condition1": "對坐墊右鍵", - "block.create.seat.tooltip.behaviour1": "玩家將坐在_坐墊_上,Left-Shift可離開_坐墊_。", - - "block.create.chute.tooltip": "滑道", - "block.create.chute.tooltip.summary": "用來_收集_物品並_垂直運輸_它們。可以從_容器_中抽取也可向_容器_輸入。它的側面可以被_漏斗_、_裝配的安山岩漏斗_和_裝配的黃銅漏斗_等傳輸設備交互", - "block.create.chute.tooltip.condition1": "當被上方的鼓風機通風時", - "block.create.chute.tooltip.behaviour1": "由_鼓風機_驅動的_滑道_可由下向上傳輸_物品_,可以從_置物臺_或者_輸送帶_上吸取物品。", - - "block.create.depot.tooltip": "置物臺", - "block.create.depot.tooltip.summary": "一個方便的放置物品的地方。它為多臺機器提供了一個交互點", - "block.create.depot.tooltip.condition1": "右鍵置物臺", - "block.create.depot.tooltip.behaviour1": "可以在_置物臺_放置或取出物品。可以與_輸送帶_交互的方塊或裝置也可以與_置物臺_交互。", - - "item.create.blaze_cake.tooltip": "熔岩蛋糕", - "item.create.blaze_cake.tooltip.summary": "對辛苦的_烈焰使者_的美味款待。讓他們興奮起來吧!", - - "item.create.empty_blaze_burner.tooltip": "空的烈焰使者動力爐", - "item.create.empty_blaze_burner.tooltip.summary": "你火熱的朋友的一個小小的鐵質的家。我相信你會好好利用他們的!", - "item.create.empty_blaze_burner.tooltip.condition1": "當對著烈焰使者或烈焰使者刷怪籠使用時", - "item.create.empty_blaze_burner.tooltip.behaviour1": "即可_捕獲_烈焰使者", - - "block.create.fluid_pipe.tooltip": "液體管道", - "block.create.fluid_pipe.tooltip.summary": "用來傳輸_液體_。需要一個_機械泵_來提供壓強。", - "block.create.fluid_pipe.tooltip.condition1": "轉移液體", - "block.create.fluid_pipe.tooltip.behaviour1": "可以與_液體容器_如_儲存罐_或_作業盆_相連_。裸露的_管道_末端也可以排放或抽取液體。注意別漏水了!", - "block.create.fluid_pipe.tooltip.control1": "使用扳手右鍵", - "block.create.fluid_pipe.tooltip.action1": "如果可能的話,在管道側面開啟/關閉窗口。", - - "block.create.hose_pulley.tooltip": "軟管滑輪", - "block.create.hose_pulley.tooltip.summary": "用來在_世界_中放置或排放大量的液體。", - "block.create.hose_pulley.tooltip.condition1": "接入機械時", - "block.create.hose_pulley.tooltip.behaviour1": "升高或降低軟管,軟管的位置決定了抽取或填充液體的高度。", - "block.create.hose_pulley.tooltip.condition2": "當軟管滑輪抽取液體時", - "block.create.hose_pulley.tooltip.behaviour2": "開始從軟管末端將其從中取出_液體方塊_。巨大的液體湖將被認定是_無限_的", - "block.create.hose_pulley.tooltip.condition3": "當液體從軟管滑輪中排出時", - "block.create.hose_pulley.tooltip.behaviour3": "開始向世界填充液體,直到達到_軟管末端_的高度。", - - "block.create.fluid_tank.tooltip": "液體儲存罐", - "block.create.fluid_tank.tooltip.summary": "_儲存_任意_液體_", - "block.create.fluid_tank.tooltip.condition1": "使用扳手右鍵", - "block.create.fluid_tank.tooltip.behaviour1": "改變可選窗口", - - "block.create.creative_fluid_tank.tooltip": "創造液體儲存罐", - "block.create.creative_fluid_tank.tooltip.summary": "此液體儲存罐能夠_無限的復制_任何液體。", - "block.create.creative_fluid_tank.tooltip.condition1": "罐中裝有液體時", - "block.create.creative_fluid_tank.tooltip.behaviour1": "任意的_液體提取設備_能夠從中提取無窮無盡的指定液體,液體的導入功能同時也會無效。", - "block.create.creative_fluid_tank.tooltip.condition2": "扳手右擊時", - "block.create.creative_fluid_tank.tooltip.behaviour2": "打開關閉窗戶", - - "block.create.fluid_valve.tooltip": "液體閥門", - "block.create.fluid_valve.tooltip.summary": "阻止液體沿管道向前流動。", - "block.create.fluid_valve.tooltip.condition1": "控制流量", - "block.create.fluid_valve.tooltip.behaviour1": "施加的_旋轉力_將迫使閥門關閉,從而阻止液體流動。_逆轉旋轉方向_以重新打開閥門。", - - "block.create.mechanical_pump.tooltip": "機械泵", - "block.create.mechanical_pump.tooltip.summary": "_接入機械_,能迫使液體_沿管道指定方向移動_。在兩個方向上都有_最大的作用範圍_。(默認為16個方塊距離)", - "block.create.mechanical_pump.tooltip.condition1": "液體流向", - "block.create.mechanical_pump.tooltip.behaviour1": "_接入機械_后會產生壓力,迫使液體通過管道。_反轉機械_的方向以切換液體_流向_。", - "block.create.mechanical_pump.tooltip.control1": "扳手右鍵時", - "block.create.mechanical_pump.tooltip.action1": "反轉泵的方向,從而改變默認的液體流向", - - "block.create.smart_fluid_pipe.tooltip": "智慧液體管道", - "block.create.smart_fluid_pipe.tooltip.summary": "帶有過濾器的_液體管道_。可以指定通過哪個_液體_。", - "block.create.smart_fluid_pipe.tooltip.condition1": "當液體進入時", - "block.create.smart_fluid_pipe.tooltip.behaviour1": "進入的液體與_過濾器_不匹配時,智慧管道將_阻止_其通過。", - "block.create.smart_fluid_pipe.tooltip.condition2": "與_液體容器相鄰_時", - "block.create.smart_fluid_pipe.tooltip.behaviour2": "從_任何容器_開始流動的_智慧管道_只會抽取與其過濾器匹配的液體。", - - "block.create.spout.tooltip": "注液器", - "block.create.spout.tooltip.summary": "一種用來_裝罐_的機器。", - "block.create.spout.tooltip.condition1": "液體傳輸", - "block.create.spout.tooltip.behaviour1": "當下方放置類似_玻璃瓶_,_桶_這樣的液體容器物品時,注液器將試圖將自身儲存的液體注入到下方的_液體容器物品_中。", - "block.create.spout.tooltip.condition2": "液體自動化", - "block.create.spout.tooltip.behaviour2": "注液器位於_輸送帶_或者_置物臺_上方時,將自動為流水線上的_液體容器物品_進行_注入_。", - - "block.create.item_drain.tooltip": "分液池", - "block.create.item_drain.tooltip.summary": "一種用來_抽空液體容器物品_的置物臺", - "block.create.item_drain.tooltip.condition1": "液體傳輸", - "block.create.item_drain.tooltip.behaviour1": "當從側面導入諸如_桶_或_瓶子_之類的_液體容器物品_時,_分液池_將嘗試將其倒入其_自身的液體庫存_中。空的_液體容器物品_將被彈出至_另一側_。", - - "block.create.mechanical_arm.tooltip": "機械臂", - "block.create.mechanical_arm.tooltip.summary": "移動_物品_的高級裝置", - "block.create.mechanical_arm.tooltip.condition1": "轉移物品", - "block.create.mechanical_arm.tooltip.behaviour1": "可以從任意_可夠到的設備_中拿取或放置物品,比如說_輸送帶_,_置物臺_,_漏斗_以及_機械合成器_。", - "block.create.mechanical_arm.tooltip.control1": "手持時", - "block.create.mechanical_arm.tooltip.action1": "右鍵單擊一個_可獲取的容器_來將其設置為_機械臂_的_輸入端_。右鍵雙擊將其設置為_機械臂_的_輸出端_。", - "block.create.mechanical_arm.tooltip.control2": "手持扳手滾動滾輪", - "block.create.mechanical_arm.tooltip.action2": "調整_機械臂_輸出物品時的調度模式。", - - "item.create.wand_of_symmetry.tooltip": "對稱杖", - "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": "打開_gui界面_", - - "item.create.handheld_blockzapper.tooltip": "方塊放置器", - "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": "打開_gui界面_", - - "item.create.handheld_worldshaper.tooltip": "環境塑形器", - "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": "打開工具的_gui界面_", - - "item.create.tree_fertilizer.tooltip": "樹木肥料", - "item.create.tree_fertilizer.tooltip.summary": "適用來常見樹木的快速肥料", - "item.create.tree_fertilizer.tooltip.condition1": "在樹苗上使用時", - "item.create.tree_fertilizer.tooltip.behaviour1": "無論_生長時間_多少,直接長大", - - "item.create.deforester.tooltip": "連根拔樹斧", - "item.create.deforester.tooltip.summary": "_連根拔樹斧_,從最根砍樹時,能夠瞬間連根拔起一棵樹", - - "item.create.extendo_grip.tooltip": "伸縮機械手", - "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_觸碰距離_。", - "item.create.extendo_grip.tooltip.condition1": "放置於副手欄時", - "item.create.extendo_grip.tooltip.behaviour1": "大幅增加_主手_的觸碰距離,與_主手_的伸縮機械手攜同使用,可進一步增加_觸碰距離_。", - - "item.create.filter.tooltip": "過濾器", - "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": "屬性過濾器", - "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": "空白藍圖", - "item.create.empty_schematic.tooltip.summary": "可作為合成材料或在_藍圖桌_使用", - - "item.create.schematic.tooltip": "藍圖", - "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_and_quill.tooltip": "藍圖與筆", - "item.create.schematic_and_quill.tooltip.summary": "用來將世界中的結構保存到.nbt文件。", - "item.create.schematic_and_quill.tooltip.condition1": "第一步", - "item.create.schematic_and_quill.tooltip.behaviour1": "手持藍圖與右鍵旋轉兩個點", - "item.create.schematic_and_quill.tooltip.condition2": "第二步", - "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.control3": "當潛行右鍵時", - "item.create.schematic_and_quill.tooltip.action3": "_重置_並刪除選區。", - - "block.create.schematicannon.tooltip": "藍圖加農炮", - "block.create.schematicannon.tooltip.summary": "通過發射方塊以在世界中重新構建已部署的_全息圖_,使用相鄰箱子中的物品及_火藥_作為燃料。", - "block.create.schematicannon.tooltip.control1": "當右鍵時", - "block.create.schematicannon.tooltip.action1": "打開_gui界面_", - - "block.create.schematic_table.tooltip": "藍圖桌", - "block.create.schematic_table.tooltip.summary": "將保存的藍圖圖寫入_空白藍圖_", - "block.create.schematic_table.tooltip.condition1": "放入空白藍圖時", - "block.create.schematic_table.tooltip.behaviour1": "從Schematics文件夾上傳所選文件", - - "block.create.shaft.tooltip": "傳動軸", - "block.create.shaft.tooltip.summary": "將_旋轉動能_進行直線傳遞。", - - "block.create.cogwheel.tooltip": "齒輪", - "block.create.cogwheel.tooltip.summary": "將_旋轉動能_進行直線傳遞,或者傳遞到鄰近的_齒輪_上", - - "block.create.large_cogwheel.tooltip": "大齒輪", - "block.create.large_cogwheel.tooltip.summary": "大號齒輪傳動結構,連接到_小號齒輪_時改變其_轉速_。", - - "block.create.encased_shaft.tooltip": "傳動軸箱", - "block.create.encased_shaft.tooltip.summary": "將_旋轉動能_進行直線傳遞,其方塊體積使其在穿過牆體時更加_美觀_。", - - "block.create.gearbox.tooltip": "齒輪箱", - "block.create.gearbox.tooltip.summary": "十字傳動旋轉結構,同時將直線旋轉方向_反轉_。", - - "block.create.gearshift.tooltip": "換擋齒輪箱", - "block.create.gearshift.tooltip.summary": "用來反轉傳動軸_旋轉方向_的開關。", - "block.create.gearshift.tooltip.condition1": "當提供紅石訊號時", - "block.create.gearshift.tooltip.behaviour1": "_更改_旋轉方向。", - - "block.create.clutch.tooltip": "離合器", - "block.create.clutch.tooltip.summary": "傳動開關裝置。", - "block.create.clutch.tooltip.condition1": "當提供紅石訊號時", - "block.create.clutch.tooltip.behaviour1": " _停止_ 另一側的旋轉。", - - "block.create.encased_chain_drive.tooltip": "鏈式傳動箱", - "block.create.encased_chain_drive.tooltip.summary": "將動能_鏈式傳遞_給側面相貼的_鏈式傳動箱_,呈_直線_放置形成鏈式傳動箱組,它們的朝向不必一致。", - "block.create.encased_chain_drive.tooltip.condition1": "互相連接時", - "block.create.encased_chain_drive.tooltip.behaviour1": "_鏈式傳動箱組_中的_鏈式傳動箱_將以相同的速度旋轉。", - - "block.create.adjustable_chain_gearshift.tooltip": "可調節鏈式傳動箱", - "block.create.adjustable_chain_gearshift.tooltip.summary": "將動能_鏈式傳遞_給側面相貼的_鏈式傳動箱_,呈_直線_放置形成鏈式傳動箱組,可通過_紅石訊號_改變其內部主齒輪的半徑大小從而提高其耦合齒輪的_轉速_,進而提高其_連攜_的其它_鏈式傳動箱_的_轉速_。", - "block.create.adjustable_chain_gearshift.tooltip.condition1": "紅石控制", - "block.create.adjustable_chain_gearshift.tooltip.behaviour1": "沒有紅石訊號時,_鏈式傳動箱組_中的_鏈式傳動箱_將以相同的速度旋轉。紅石訊號拉滿時,_鏈式傳動箱組_中除自身以外的_鏈式傳動箱_將以兩倍的速度旋轉。介於兩者之間的任何結果都將使其速度提高1-2倍。", - - "item.create.belt_connector.tooltip": "輸送帶", - "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": "MR護目鏡", - "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": "板手", - "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": "創造馬達", - "block.create.creative_motor.tooltip.summary": "可以獲得_無限動能_", - - "block.create.water_wheel.tooltip": "水車", - "block.create.water_wheel.tooltip.summary": "從相鄰的流水中獲得動能", - - "block.create.encased_fan.tooltip": "鼓風機", - "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": "在_被吹出_的水,火,熔岩粒子中放置物品會獲得相應產物(_建議配合jei查看_)。", - - "block.create.nozzle.tooltip": "分散網", - "block.create.nozzle.tooltip.summary": "依附在鼓風機上,能夠將鼓風機的效果_分散_各個方向。", - - "block.create.hand_crank.tooltip": "手搖把手", - "block.create.hand_crank.tooltip.summary": "簡單的動能來源,需要_人工轉動_,不要讓自己累倒了!", - "block.create.hand_crank.tooltip.condition1": "當使用時", - "block.create.hand_crank.tooltip.behaviour1": "向依附的結構提供動能,_潛行_時將會提供_反向_的動能", - - "block.create.cuckoo_clock.tooltip": "布穀鳥鐘", - "block.create.cuckoo_clock.tooltip.summary": "精美的布穀鳥鐘,能夠報時", - "block.create.cuckoo_clock.tooltip.condition1": "連接機械時", - "block.create.cuckoo_clock.tooltip.behaviour1": "顯示_現在時間_且一天會報時_兩次_。中午一次,黃昏可以睡覺時一次 ", - - "block.create.turntable.tooltip": "轉盤", - "block.create.turntable.tooltip.summary": "讓旋轉機械給你帶來一場刺激的旋轉風車體驗。", - - "block.create.millstone.tooltip": "石磨", - "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": "粉碎輪", - "block.create.crushing_wheel.tooltip.summary": "一對能夠_粉碎一切_的粉碎輪。向這對粉碎輪提供_向內_且_相反的動能_後開始工作", - "block.create.crushing_wheel.tooltip.condition1": "當兩個粉碎輪一起工作時", - "block.create.crushing_wheel.tooltip.behaviour1": "_粉碎物品_並獲得產物(請使用JEI查看對應的產物)", - - "block.create.mechanical_press.tooltip": "機械液壓機", - "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": "作業盆", - "block.create.basin.tooltip.summary": "一種_物品容器_,與_液壓機_和_攪拌機_配合使用,可以被_紅石比較器_檢測", - "block.create.basin.tooltip.condition1": "自動輸出", - "block.create.basin.tooltip.behaviour1": "當其他對應容器(例如輸送帶,其他的作業盆,置物臺等)在作業盆的一側下方時,它們將自動收集在作業盆中產出的任何物品/液體。自動化的好夥伴。", - - "block.create.blaze_burner.tooltip": "烈焰使者動力爐", - "block.create.blaze_burner.tooltip.summary": "一個用來加熱_作業盆_的設備,由烈焰使者來驅動。", - "block.create.blaze_burner.tooltip.condition1": "放置於作業盆下方時", - "block.create.blaze_burner.tooltip.behaviour1": "為作業盆_提供熱量_。", - "block.create.blaze_burner.tooltip.condition2": "對本爐使用可燃物時", - "block.create.blaze_burner.tooltip.behaviour2": "_消耗_可燃物,並根據該物在_熔爐中的燃燒時間_來延長_本爐的燃燒時間_,使用_熔岩蛋糕_將提供_更高的溫度_。", - - "block.create.reinforced_rail.tooltip": "強化鐵軌", - "block.create.reinforced_rail.tooltip.summary": "堅固的鐵軌,不需要_方塊的支撐_。", - - "block.create.mechanical_mixer.tooltip": "機械攪拌器", - "block.create.mechanical_mixer.tooltip.summary": "一種能夠動態進行攪拌的機器,需要穩定且足夠快的轉速,並且下方需要放置_作業盆_(中間需要一格高)", - "block.create.mechanical_mixer.tooltip.condition1": "當位於作業盆上方", - "block.create.mechanical_mixer.tooltip.behaviour1": "只要_作業盆_中有滿足配方的物品,將自動進行攪拌", - "block.create.mechanical_mixer.tooltip.control1": "被紅石激活時", - "block.create.mechanical_mixer.tooltip.action1": "停止攪拌,試用來緊急時刻!", - - "block.create.mechanical_crafter.tooltip": "機械合成器", - "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": "熔爐引擎", - "block.create.furnace_engine.tooltip.summary": "一種強力的_旋轉動能_的來源,但是需要_正在工作_的_熔爐_(三種熔爐都可以)", - "block.create.furnace_engine.tooltip.condition1": "當連接正在燃燒的熔爐", - "block.create.furnace_engine.tooltip.behaviour1": "將會帶動_相連_的_飛輪_(需要間隔一格),用高爐速度更快", - - "block.create.flywheel.tooltip": "飛輪", - "block.create.flywheel.tooltip.summary": "一種大型的金屬輪,能將_熔爐引擎_提供的動能穩定化輸出,需要與_熔爐引擎_間隔一個方塊", - "block.create.flywheel.tooltip.condition1": "當連接正在輸出的_熔爐引擎_", - "block.create.flywheel.tooltip.behaviour1": "將會提供相應的_旋轉動能_。", - - "block.create.portable_storage_interface.tooltip": "移動儲存接口", - "block.create.portable_storage_interface.tooltip.summary": "為機械活塞、裝配礦車、旋轉軸承、滑輪_等移動結構_設計的_物流接口_,_移動結構_和_固定結構_之間的物品交換站,兩個接口會面時將_自動對接_,接口必須彼此面對且彼此隔開1-2個方塊。", - "block.create.portable_storage_interface.tooltip.condition1": "裝配在移動結構上時", - "block.create.portable_storage_interface.tooltip.behaviour1": "移動到能夠滿足與_固定結構_上的_移動式儲存接口_對接的條件后,移動結構會_短暫地停下_,開始對接,並直接與_移動結構上的_儲存容器_交互,進行物品的_輸入輸出_。", - "block.create.portable_storage_interface.tooltip.condition2": "被紅石激活時", - "block.create.portable_storage_interface.tooltip.behaviour2": "立即終止任何活動連接。", - - "block.create.portable_fluid_interface.tooltip": "移動液體接口", - "block.create.portable_fluid_interface.tooltip.summary": "為機械活塞、裝配礦車、旋轉軸承、滑輪_等移動結構_設計的_液體接口_,_移動結構_和_固定結構_之間的液體交換站,兩個會面的接口必須彼此面對且彼此隔開1-2個方塊。", - "block.create.portable_fluid_interface.tooltip.condition1": "裝配在移動結構上時", - "block.create.portable_fluid_interface.tooltip.behaviour1": "移動到能夠滿足與_固定結構_上的_移動式液體接口_對接的條件后,移動結構會_短暫地停下_,開始對接,並直接與_移動結構上的_液體儲存罐_交互,進行液體的_導入導出_。", - "block.create.portable_fluid_interface.tooltip.condition2": "被紅石激活時", - "block.create.portable_fluid_interface.tooltip.behaviour2": "立即終止任何活動的連接。", - - "block.create.rotation_speed_controller.tooltip": "轉速控制器", - "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": "機械活塞", - "block.create.mechanical_piston.tooltip.summary": "活塞的高級版本,使用_旋轉動能_精確地移動其連接的方塊,背面可放置活塞桿延長活塞範圍,沒有活塞桿將不會工作,使用_底盤_或者_粘液塊_可以移動多行方塊。", - "block.create.mechanical_piston.tooltip.condition1": "推拉活塞時", - "block.create.mechanical_piston.tooltip.behaviour1": "活塞的_速度_和_方向_與所接受_轉速_的_大小_以及_方向_相關。", - - "block.create.piston_extension_pole.tooltip": "活塞桿", - "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": "機械軸承", - "block.create.mechanical_bearing.tooltip.summary": "由機械驅動,根據機械的方向旋轉,用來建造大型的旋轉結構。", - "block.create.mechanical_bearing.tooltip.condition1": "接入機械時", - "block.create.mechanical_bearing.tooltip.behaviour1": "前方的旋轉盤將帶動_粘液塊_或者_底盤_來驅動更多方塊一同旋轉。", - - "block.create.windmill_bearing.tooltip": "風車軸承", - "block.create.windmill_bearing.tooltip.summary": "借助_風的力量_創造_機械_。用您獨特的設計拼接它並讓它旋轉!", - "block.create.windmill_bearing.tooltip.condition1": "右鍵時", - "block.create.windmill_bearing.tooltip.behaviour1": "啟動軸承,提供由其_附加結構_的旋轉產生的機械。結構必須包括合適的_風帆_或_羊毛_。使用_機殼地盤_,_粘液塊_或_強力膠_可以帶動更多方塊旋轉。", - - "block.create.sail_frame.tooltip": "風帆框架", - "block.create.sail_frame.tooltip.summary": "可用來_組裝風車_的結構方塊,不俗的機械來源。", - - "block.create.white_sail.tooltip": "風帆", - "block.create.white_sail.tooltip.summary": "可用來_組裝風車_的結構方塊,不俗的機械來源,有多種顏色。", - "block.create.white_sail.tooltip.condition1": "使用染料右鍵時", - "block.create.white_sail.tooltip.behaviour1": "改變顏色。", - - "block.create.clockwork_bearing.tooltip": "時鐘軸承", - "block.create.clockwork_bearing.tooltip.summary": "一種高級的機械軸承,可以根據目前遊戲內時間旋轉兩個不同的指針", - "block.create.clockwork_bearing.tooltip.condition1": "接入機械時", - "block.create.clockwork_bearing.tooltip.behaviour1": "旋轉第一個連接的結構作為時針,第二個連接的結構作為分針", - - "block.create.sequenced_gearshift.tooltip": "可編程齒輪箱", - "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": "礦車裝配站", - "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.control1": "放置於軌道上時", - "block.create.cart_assembler.tooltip.action1": "紅石激活時_裝配_經過的礦車,未激活時_卸載_經過的礦車。", - "block.create.cart_assembler.tooltip.control2": "放置於充能鐵軌上時", - "block.create.cart_assembler.tooltip.action2": "紅石激活時_裝配_並加速礦車,未激活時_卸載_並停住經過的礦車。", - "block.create.cart_assembler.tooltip.control3": "放置在探測鐵軌上時", - "block.create.cart_assembler.tooltip.action3": "_裝配_未裝配過的礦車,_卸載_裝配過的礦車。", - "block.create.cart_assembler.tooltip.control4": "放置在激活鐵軌上時", - "block.create.cart_assembler.tooltip.action4": "紅石激活時_卸載_礦車。", - - "block.create.rope_pulley.tooltip": "繩索滑輪", - "block.create.rope_pulley.tooltip.summary": "移動繩索相連的結構。使用_底盤_或者_粘液塊_來移動多行方塊", - "block.create.rope_pulley.tooltip.condition1": "接入機械時", - "block.create.rope_pulley.tooltip.behaviour1": "根據輸入的轉速的大小以及方向,移動鏈接的結構。", - - "block.create.linear_chassis.tooltip": "機殼底盤", - "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": "機殼底盤2號", - "block.create.secondary_linear_chassis.tooltip.summary": "第二種_機殼底盤_,不會與第一種機殼底盤互相連接。", - - "block.create.radial_chassis.tooltip": "旋轉底盤", - "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": "機械鑽頭", - "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": "機械收割機", - "block.create.mechanical_harvester.tooltip.summary": "適用來中型作物自動化的收割機,可以被_機械活塞_和_機械軸承_等帶動。", - "block.create.mechanical_harvester.tooltip.condition1": "當移動時", - "block.create.mechanical_harvester.tooltip.behaviour1": "收割機移動至成熟作物,收割作物並將作物變為初始生長狀態。", - - "block.create.mechanical_plough.tooltip": "機械犁", - "block.create.mechanical_plough.tooltip.summary": "犁是一個非常有用的多功能方塊,它可以被_機械活塞_和_機械軸承_等帶動", - "block.create.mechanical_plough.tooltip.condition1": "當移動時", - "block.create.mechanical_plough.tooltip.behaviour1": "可以打掉無碰撞體積的一些_附著方塊_,比如火把和雪等。可以在不傷害實體的情況下移動它們。能像_鋤頭_一樣翻土耕田。", - - "block.create.mechanical_saw.tooltip": "機械切割機", - "block.create.mechanical_saw.tooltip.summary": "可以用來砍樹,也可以用來切割方塊,可以被_機械活塞_和_機械軸承_等帶動", - "block.create.mechanical_saw.tooltip.condition1": "當向上放置時", - "block.create.mechanical_saw.tooltip.behaviour1": "可以切割各種物品(建議配合jei查看)", - "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": "存量檢測器", - "block.create.stockpile_switch.tooltip.summary": "根據連接的容器_儲存空間_的占用情況切換紅石訊號強度。", - "block.create.stockpile_switch.tooltip.condition1": "低於_下線_或高於_上線_時", - "block.create.stockpile_switch.tooltip.behaviour1": "提供紅石訊號", - - "block.create.content_observer.tooltip": "物品偵測器", - "block.create.content_observer.tooltip.summary": "檢測_容器_和_輸送帶_中過濾器匹配的物品。當觀察到包含匹配的物品時,此組件將發出_紅石訊號_。當觀察到的漏斗_轉移匹配的物品_時,此組件將發出_紅石脈沖_。", - - "block.create.redstone_link.tooltip": "無限紅石訊號終端", - "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": "真空管顯示器", - "block.create.nixie_tube.tooltip.summary": "一個炫泡的_紅石強度_顯示器,範圍:0到15。", - "block.create.nixie_tube.tooltip.condition1": "收到紅時訊號時", - "block.create.nixie_tube.tooltip.behaviour1": "顯示現在的紅時訊號強度", - "block.create.nixie_tube.tooltip.condition2": "被命名牌命名時", - "block.create.nixie_tube.tooltip.behaviour2": "顯示_命名牌內容_,名稱太長時需_排列_多個真空管顯示器。", - - "block.create.redstone_contact.tooltip": "接觸式紅石訊號產生器", - "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": "可調節板條箱", - "block.create.adjustable_crate.tooltip.summary": "該箱子支持玩家對其容量進行調整,最大可以容納_16組_物品。", - "block.create.adjustable_crate.tooltip.control1": "當右鍵時", - "block.create.adjustable_crate.tooltip.action1": "打開箱子", - - "block.create.creative_crate.tooltip": "創造板條箱", - "block.create.creative_crate.tooltip.summary": "這個容器可以給臨近的_藍圖大炮_提供無限物品以及燃料 (創造專用物品)", - "block.create.creative_crate.tooltip.condition1": "當標記了物品時", - "block.create.creative_crate.tooltip.behaviour1": "容器將會從虛空中提供_無限量_的標記物品,並且任何放置到容器中的物品都會被_送入虛空_", - - "block.create.deployer.tooltip": "機械手", - "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.deployer.tooltip.condition3": "配有_過濾器_時", - "block.create.deployer.tooltip.behaviour3": "當_緩存區_的物品與過濾器匹配,機械手才會取出並使用,不匹配的物品_無法從外部輸入_到機械手的_緩存區_中;_緩存區_中與過濾器匹配的物品_無法被提取_。", - - "block.create.brass_casing.tooltip": "黃銅機殼", - "block.create.brass_casing.tooltip.summary": "一種堅固的機殼,有多種用途。", - - "block.create.pulse_repeater.tooltip": "可調節脈沖中繼器", - "block.create.pulse_repeater.tooltip.summary": "一個簡單的電路元件,將通過的紅石訊號變為1tick。", - - "block.create.adjustable_repeater.tooltip": "可調節中繼器", - "block.create.adjustable_repeater.tooltip.summary": "高級中繼器,最大可設置30分鐘延遲", - - "block.create.adjustable_pulse_repeater.tooltip": "可調節脈沖中繼器", - "block.create.adjustable_pulse_repeater.tooltip.summary": "一種單次1tick的紅石脈沖器,可以調節延時至30min", - - "block.create.analog_lever.tooltip": "可調節拉桿", - "block.create.analog_lever.tooltip.summary": "一種可以調節任意訊號強度的推桿。", - - "block.create.powered_toggle_latch.tooltip": "T觸發器", - "block.create.powered_toggle_latch.tooltip.summary": "一種拉桿,在紅石電路中可以用作t觸發器。", - - "block.create.powered_latch.tooltip": "鎖存器", - "block.create.powered_latch.tooltip.summary": "一種拉桿,在紅石電路中用作鎖存器,從后方輸入將會啟用這個拉桿,從側邊輸入將會重置這個拉桿。", - - "block.create.controller_rail.tooltip": "控制鐵軌", - "block.create.controller_rail.tooltip.summary": "單向電動導軌,能夠精細控制礦車的移動速度。", - "block.create.controller_rail.tooltip.condition1": "被紅石激活時", - "block.create.controller_rail.tooltip.behaviour1": "根據訊號強度_加速_或_減速_經過的礦車。將紅石強度傳播到相鄰的控制鐵軌。", - - "block.create.speedometer.tooltip": "速度計", - "block.create.speedometer.tooltip.summary": "測量並展示連接網絡的旋轉速度,支持使用紅石比較器", - "block.create.speedometer.tooltip.condition1": "接入機械時", - "block.create.speedometer.tooltip.behaviour1": "將會用顏色展示速度的大小,綠-慢、藍-中、紫-快。", - - "block.create.stressometer.tooltip": "動能錶", - "block.create.stressometer.tooltip.summary": "測量並展示連接網絡的動能值,支持紅石比較器", - "block.create.stressometer.tooltip.condition1": "接入機械時", - "block.create.stressometer.tooltip.behaviour1": "將會用顏色展示承受的動能。如果網路超載則會癱瘓,必須減少機器或者增加動能", - - "item.create.sand_paper.tooltip": "紅砂紙", - "item.create.sand_paper.tooltip.summary": "用來_打磨_物品的砂紙,可以用_機械手_來實現自動化。", - "item.create.sand_paper.tooltip.condition1": "使用時", - "item.create.sand_paper.tooltip.behaviour1": "打磨_副手_上或者_準心所指_的物品。", - - "item.create.super_glue.tooltip": "強力膠", - "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.builders_tea.tooltip": "建造工茶飲", - "item.create.builders_tea.tooltip.summary": "神清氣爽的一天,從這杯完美茶飲開始。恢復復_饑餓值_並獲得_加速_效果。", - - "item.create.refined_radiance.tooltip": "光輝石", - "item.create.refined_radiance.tooltip.summary": "一種用_光輝_鍛造的化合物材料。", - - "item.create.shadow_steel.tooltip": "暗影鋼", - "item.create.shadow_steel.tooltip.summary": "一種用_虛空_鍛造的化合物材料。", - - "item.create.minecart_coupling.tooltip": "礦車連軸器", - "item.create.minecart_coupling.tooltip.summary": "將多個_礦車_或運輸結構鏈接在一起,構成雄偉的火車。", - "item.create.minecart_coupling.tooltip.condition1": "作用與礦車時", - "item.create.minecart_coupling.tooltip.behaviour1": "將兩個礦車耦合在一起,在移動時將它們保持_恒定的距離_。", - - "item.create.crafter_slot_cover.tooltip": "合成器蓋板", - "item.create.crafter_slot_cover.tooltip.summary": "用來標記_機械合成器_以不放入物品。在制造與桶類似的斜向合成表時非常有用。", - - "create.tooltip.wip": "半成品", - "create.tooltip.workInProgress": "尚在製作中!", - "create.tooltip.randomWipDescription0": "禁止將此物品給兒童。", - "create.tooltip.randomWipDescription1": "每~一~次~你使用此物品時,就會使一隻小熊貓死亡。", - "create.tooltip.randomWipDescription2": "使用此物請自負後果。", - "create.tooltip.randomWipDescription3": "快走開,這不是你要找的東西(搖手指", - "create.tooltip.randomWipDescription4": "啟動自爆模式,10、9、8...。", - "create.tooltip.randomWipDescription5": "你已經沒有退路了。", - "create.tooltip.randomWipDescription6": "作者我將不負任何你使用此物所造成的責任。", - "create.tooltip.randomWipDescription7": "這東西不是給你用的,再找找吧!", - "create.tooltip.randomWipDescription8": "用了就死定了。", - - "_": "Thank you for translating Create!" - -} +{ + "_": "for create 0.3.1c", + + "_": "->------------------------] Game Elements [------------------------<-", + + "block.create.acacia_window": "相思木窗戶", + "block.create.acacia_window_pane": "相思木窗戶片", + "block.create.adjustable_chain_gearshift": "可調式鏈式變速箱", + "block.create.adjustable_crate": "可調式板條箱", + "block.create.adjustable_pulse_repeater": "可調式脈衝中繼器", + "block.create.adjustable_repeater": "可調式中繼器", + "block.create.analog_lever": "可調式拉桿", + "block.create.andesite_belt_funnel": "安山岩輸送帶漏斗", + "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_encased_shaft": "安山傳動軸箱", + "block.create.andesite_funnel": "安山岩漏斗", + "block.create.andesite_pillar": "豎紋安山岩", + "block.create.andesite_tunnel": "安山岩物品隧道", + "block.create.basin": "作業盆", + "block.create.belt": "輸送帶", + "block.create.birch_window": "白樺木窗戶", + "block.create.birch_window_pane": "白樺木窗戶片", + "block.create.black_sail": "黑色風帆", + "block.create.black_seat": "黑色坐墊", + "block.create.black_valve_handle": "黑色閥門開關", + "block.create.blaze_burner": "烈焰使者動力爐", + "block.create.blue_sail": "藍色風帆", + "block.create.blue_seat": "藍色坐墊", + "block.create.blue_valve_handle": "藍色閥門開關", + "block.create.brass_belt_funnel": "黃銅輸送帶漏斗", + "block.create.brass_block": "黃銅磚", + "block.create.brass_casing": "黃銅機殼", + "block.create.brass_encased_shaft": "黃銅傳動軸箱", + "block.create.brass_funnel": "黃銅漏斗", + "block.create.brass_tunnel": "黃銅物品隧道", + "block.create.brown_sail": "棕色風帆", + "block.create.brown_seat": "棕色坐墊", + "block.create.brown_valve_handle": "棕色閥門開關", + "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.chocolate": "巧克力", + "block.create.chute": "滑道", + "block.create.clockwork_bearing": "時鐘軸承", + "block.create.clutch": "離合器", + "block.create.cogwheel": "齒輪", + "block.create.content_observer": "物品偵測器", + "block.create.controller_rail": "控制鐵軌", + "block.create.copper_block": "銅磚", + "block.create.copper_casing": "銅機殼", + "block.create.copper_ore": "銅礦石", + "block.create.copper_shingles": "塊狀銅磚", + "block.create.copper_tiles": "菱形銅磚", + "block.create.copper_valve_handle": "銅製閥門開關", + "block.create.creative_crate": "創造板條箱", + "block.create.creative_fluid_tank": "創造液體儲存罐", + "block.create.creative_motor": "創造馬達", + "block.create.crimson_window": "赤紅窗戶", + "block.create.crimson_window_pane": "赤紅窗戶片", + "block.create.crushing_wheel": "粉碎輪", + "block.create.crushing_wheel_controller": "粉碎輪控制器", + "block.create.cuckoo_clock": "布穀鳥鐘", + "block.create.cyan_sail": "藍綠色風帆", + "block.create.cyan_seat": "藍綠色坐墊", + "block.create.cyan_valve_handle": "藍綠色閥門開關", + "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": "置物臺", + "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_slab": "白雲石半磚", + "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_chain_drive": "鏈式傳動箱", + "block.create.encased_fan": "鼓風機", + "block.create.encased_fluid_pipe": "液體管道箱", + "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": "液體管道", + "block.create.fluid_tank": "液體儲存罐", + "block.create.fluid_valve": "液體閥門", + "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": "輝長岩半磚", + "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.gantry_carriage": "門式起重機", + "block.create.gantry_shaft": "門式起重機滑道", + "block.create.gearbox": "齒輪箱", + "block.create.gearshift": "變速箱", + "block.create.glass_fluid_pipe": "玻璃液體管道", + "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_sail": "灰色風帆", + "block.create.gray_seat": "灰色坐墊", + "block.create.gray_valve_handle": "灰色閥門開關", + "block.create.green_sail": "綠色風帆", + "block.create.green_seat": "綠色坐墊", + "block.create.green_valve_handle": "綠色閥門開關", + "block.create.hand_crank": "手搖把手", + "block.create.honey": "蜂蜜", + "block.create.horizontal_framed_glass": "豎直邊框玻璃", + "block.create.horizontal_framed_glass_pane": "豎直邊框玻璃片", + "block.create.hose_pulley": "軟管滑輪", + "block.create.item_drain": "分液池", + "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.light_blue_sail": "淡藍色風帆", + "block.create.light_blue_seat": "淡藍色坐墊", + "block.create.light_blue_valve_handle": "淡藍色閥門開關", + "block.create.light_gray_sail": "淡灰色風帆", + "block.create.light_gray_seat": "淡灰色坐墊", + "block.create.light_gray_valve_handle": "淡灰色閥門開關", + "block.create.lime_sail": "黃綠色風帆", + "block.create.lime_seat": "黃綠色坐墊", + "block.create.lime_valve_handle": "黃綠色閥門開關", + "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": "碎石灰岩", + "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.lit_blaze_burner": "烈焰使者動力爐(已啟動)", + "block.create.magenta_sail": "洋紅色風帆", + "block.create.magenta_seat": "洋紅色坐墊", + "block.create.magenta_valve_handle": "洋紅色閥門開關", + "block.create.mechanical_arm": "機械手臂", + "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_pump": "機械幫浦", + "block.create.mechanical_saw": "機械切割機", + "block.create.metal_bracket": "金屬支架", + "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_sail": "橙色風帆", + "block.create.orange_seat": "橙色坐墊", + "block.create.orange_valve_handle": "橙色閥門開關", + "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_sail": "粉紅色風帆", + "block.create.pink_seat": "粉紅色坐墊", + "block.create.pink_valve_handle": "粉紅色閥門開關", + "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.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_fluid_interface": "移動式液體口", + "block.create.portable_storage_interface": "移動式物品口", + "block.create.powered_latch": "閂鎖器", + "block.create.powered_toggle_latch": "T型正反器", + "block.create.pulley_magnet": "滑輪磁鐵", + "block.create.pulse_repeater": "脈衝中繼器", + "block.create.purple_sail": "紫色風帆", + "block.create.purple_seat": "紫色坐墊", + "block.create.purple_valve_handle": "紫色閥門開關", + "block.create.radial_chassis": "旋轉底盤", + "block.create.red_sail": "紅色風帆", + "block.create.red_seat": "紅色坐墊", + "block.create.red_valve_handle": "紅色閥門開關", + "block.create.redstone_contact": "接觸式紅石訊號產生器", + "block.create.redstone_link": "無限紅石訊號機", + "block.create.refined_radiance_casing": "光輝機殼", + "block.create.reinforced_rail": "強化鐵軌", + "block.create.rope": "繩索", + "block.create.rope_pulley": "滑輪繩索", + "block.create.rotation_speed_controller": "轉速控制器", + "block.create.sail_frame": "風帆框架", + "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": "機殼底盤2號", + "block.create.sequenced_gearshift": "可程式化齒輪箱", + "block.create.shadow_steel_casing": "暗影機殼", + "block.create.shaft": "傳動軸", + "block.create.smart_chute": "智慧滑道", + "block.create.smart_fluid_pipe": "智慧液體管道", + "block.create.speedometer": "速度計", + "block.create.spout": "液體灌注器", + "block.create.spruce_window": "雲杉木窗戶", + "block.create.spruce_window_pane": "雲杉木窗戶片", + "block.create.sticker": "方塊黏著器", + "block.create.sticky_mechanical_piston": "黏性機械活塞", + "block.create.stockpile_switch": "存量偵測器", + "block.create.stressometer": "動能錶", + "block.create.tiled_glass": "十字玻璃窗", + "block.create.tiled_glass_pane": "十字玻璃窗戶片", + "block.create.turntable": "轉盤", + "block.create.vertical_framed_glass": "豎直邊框玻璃", + "block.create.vertical_framed_glass_pane": "豎直邊框玻璃片", + "block.create.warped_window": "扭曲蕈木窗戶", + "block.create.warped_window_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": "碎風化石灰岩", + "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.weighted_ejector": "物品彈射器", + "block.create.white_sail": "白色風帆", + "block.create.white_seat": "白色坐墊", + "block.create.white_valve_handle": "白色閥門開關", + "block.create.windmill_bearing": "風車軸承", + "block.create.wooden_bracket": "木製支架", + "block.create.yellow_sail": "黃色風帆", + "block.create.yellow_seat": "黃色坐墊", + "block.create.yellow_valve_handle": "黃色閥門開關", + "block.create.zinc_block": "鋅磚", + "block.create.zinc_ore": "鋅礦石", + + "entity.create.contraption": "結構", + "entity.create.gantry_contraption": "門式結構", + "entity.create.seat": "坐墊", + "entity.create.stationary_contraption": "固定結構", + "entity.create.super_glue": "強力膠", + + "fluid.create.milk": "牛奶", + "fluid.create.potion": "藥水", + "fluid.create.tea": "茶", + + "item.create.andesite_alloy": "安山合金", + "item.create.attribute_filter": "屬性過濾器", + "item.create.bar_of_chocolate": "巧克力棒", + "item.create.belt_connector": "輸送帶", + "item.create.blaze_cake": "熔岩蛋糕", + "item.create.blaze_cake_base": "熔岩蛋糕胚", + "item.create.brass_hand": "黃銅手部零件", + "item.create.brass_ingot": "黃銅錠", + "item.create.brass_nugget": "黃銅粒", + "item.create.brass_sheet": "黃銅板", + "item.create.builders_tea": "工人茶", + "item.create.chest_minecart_contraption": "裝修過的機械礦車", + "item.create.chocolate_bucket": "巧克力桶", + "item.create.chocolate_glazed_berries": "巧克力甜莓", + "item.create.chromatic_compound": "異彩化合物", + "item.create.cinder_flour": "地獄麵粉", + "item.create.copper_ingot": "銅錠", + "item.create.copper_nugget": "銅粒", + "item.create.copper_sheet": "銅板", + "item.create.crafter_slot_cover": "合成器蓋板", + "item.create.crushed_aluminum_ore": "碎狀鋁礦石", + "item.create.crushed_brass": "碎狀黃銅", + "item.create.crushed_copper_ore": "碎狀銅礦石", + "item.create.crushed_gold_ore": "碎狀金礦石", + "item.create.crushed_iron_ore": "碎狀鐵礦石", + "item.create.crushed_lead_ore": "碎狀鉛礦石", + "item.create.crushed_nickel_ore": "碎狀鎳礦石", + "item.create.crushed_osmium_ore": "碎狀鋨礦石", + "item.create.crushed_platinum_ore": "碎狀白金礦石", + "item.create.crushed_quicksilver_ore": "碎狀水銀礦石", + "item.create.crushed_silver_ore": "碎狀銀礦石", + "item.create.crushed_tin_ore": "碎狀錫礦石", + "item.create.crushed_uranium_ore": "碎狀鈾礦石", + "item.create.crushed_zinc_ore": "碎狀鋅礦石", + "item.create.deforester": "連根拔樹斧", + "item.create.dough": "麵團", + "item.create.electron_tube": "真空管", + "item.create.empty_blaze_burner": "空的烈焰使者動力爐", + "item.create.empty_schematic": "空白藍圖", + "item.create.extendo_grip": "伸縮機械手", + "item.create.filter": "過濾器", + "item.create.furnace_minecart_contraption": "裝配過的機械礦車", + "item.create.goggles": "MR護目鏡", + "item.create.golden_sheet": "金板", + "item.create.handheld_blockzapper": "方塊放置器", + "item.create.handheld_worldshaper": "地形雕塑器", + "item.create.honey_bucket": "蜂蜜桶", + "item.create.honeyed_apple": "蜂蜜蘋果", + "item.create.integrated_circuit": "IC板", + "item.create.iron_sheet": "鐵板", + "item.create.lapis_sheet": "青金石板", + "item.create.minecart_contraption": "裝修過的礦車", + "item.create.minecart_coupling": "礦車連結器", + "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.sweet_roll": "甜捲捲", + "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": "鋅粒", + + + "_": "->------------------------] Advancements [------------------------<-", + + "advancement.create.root": "感謝你安裝機械動力模組,強烈建議您安裝JEI配合本模組遊玩", + "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.tunnel": "尋找掩護!", + "advancement.create.tunnel.desc": "在輸送帶上放上物品隧道。", + "advancement.create.splitter_tunnel": "分而治之", + "advancement.create.splitter_tunnel.desc": "用黃銅物品隧道設計一個分流器。", + "advancement.create.chute": "轟然倒塌", + "advancement.create.chute.desc": "放置一個滑道(垂直版本的輸送帶)。", + "advancement.create.upward_chute": "空中攔截", + "advancement.create.upward_chute.desc": "目睹拋出的物品飛入裝有風扇的滑道。", + "advancement.create.belt_funnel": "漏斗的垂簾", + "advancement.create.belt_funnel.desc": "將側向漏斗放在輸送帶或置物臺的上方。", + "advancement.create.belt_funnel_kiss": "比翼雙飛", + "advancement.create.belt_funnel_kiss.desc": "使兩個安裝在輸送帶上的漏斗相連。", + "advancement.create.fan": "機械氣槍", + "advancement.create.fan.desc": "飄浮在鼓風機吹出的氣流上", + "advancement.create.fan_lava": "空間加熱器", + "advancement.create.fan_lava.desc": "感受熔煉物品的氣流。", + "advancement.create.fan_water": "奇怪的洗滌", + "advancement.create.fan_water.desc": "被洗滌的氣流所吸引。", + "advancement.create.fan_smoke": "機械波紋管", + "advancement.create.fan_smoke.desc": "感受煙燻氣流。", + "advancement.create.wrench": "細部調整", + "advancement.create.wrench.desc": "做出一個方便調整方塊的板手", + "advancement.create.goggles": "動能,一目了然", + "advancement.create.goggles.desc": "做出一個能看到機械動能訊息的MR護目鏡", + "advancement.create.speedometer": "精密的速度控制", + "advancement.create.speedometer.desc": "放置一個速度計,並且戴上MR護目鏡來讀取數據", + "advancement.create.stressometer": "精密的動能控制", + "advancement.create.stressometer.desc": "放置一個動能錶,並且戴上MR護目鏡來讀取數據", + "advancement.create.aesthetics": "繁榮與美學!", + "advancement.create.aesthetics.desc": "將支架放在傳動軸,管道和齒輪上。", + "advancement.create.reinforced": "超級加固!", + "advancement.create.reinforced.desc": "在傳動軸,管道和輸送帶上使用機殼加固。", + "advancement.create.water_wheel": "治水", + "advancement.create.water_wheel.desc": "放置一個水車並讓它開始旋轉", + "advancement.create.chocolate_wheel": "美味的動能源", + "advancement.create.chocolate_wheel.desc": "用融化的巧克力驅動水車。", + "advancement.create.lava_wheel": "風火輪", + "advancement.create.lava_wheel.desc": "它不應該有用的..。", + "advancement.create.cuckoo": "是時候了?", + "advancement.create.cuckoo.desc": "目睹布穀鳥鐘報就寢時間。", + "advancement.create.millstone": "攜帶式粉碎機", + "advancement.create.millstone.desc": "放置一個石磨並且為其供能", + "advancement.create.windmill": "微風拂過", + "advancement.create.windmill.desc": "組裝風車。", + "advancement.create.maxed_windmill": "強風襲來", + "advancement.create.maxed_windmill.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.blaze_burner": "活生生的壁爐", + "advancement.create.blaze_burner.desc": "獲得一個烈焰使者動力爐。", + "advancement.create.compact": "快樂壓縮", + "advancement.create.compact.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.spout": "裝填!", + "advancement.create.spout.desc": "觀察注液器灌滿物品。", + "advancement.create.spout_potion": "國際級啤酒大廠", + "advancement.create.spout_potion.desc": "觀察注液器注入藥水到玻璃瓶。", + "advancement.create.chocolate": "夢裡的世界", + "advancement.create.chocolate.desc": "獲取一桶熔融巧克力。", + "advancement.create.item_drain": "滾筒洗衣機", + "advancement.create.item_drain.desc": "觀察液體物品被分液池抽空。", + "advancement.create.chained_item_drain": "讓我們一起搖滾!", + "advancement.create.chained_item_drain.desc": "看著物品穿過多個分液池。", + "advancement.create.glass_pipe": "偷窺液體", + "advancement.create.glass_pipe.desc": "透過窗戶觀察液體在管道中流動。使用板手可打開直線液體管道的窗戶。", + "advancement.create.pipe_collision": "永不交會的溪流!", + "advancement.create.pipe_collision.desc": "觀察兩種液體在您的管道中會合", + "advancement.create.pipe_spill": "漏水啦!", + "advancement.create.pipe_spill.desc": "觀察管道的末端將液體排放到到外面。", + "advancement.create.hose_pulley": "工業排放", + "advancement.create.hose_pulley.desc": "放下一個軟管滑輪,觀察它排乾或充滿液體。", + "advancement.create.infinite_water": "抽取海洋", + "advancement.create.infinite_water.desc": "從足以被認為是無限的水源中抽水。", + "advancement.create.infinite_lava": "吸取行星的核心", + "advancement.create.infinite_lava.desc": "從廣闊的岩漿湖中抽出岩漿。", + "advancement.create.infinite_chocolate": "淹沒在幻想中", + "advancement.create.infinite_chocolate.desc": "從廣闊的巧克力海中抽出巧克力。", + "advancement.create.crafter": "自動化流水作業", + "advancement.create.crafter.desc": "放置一些機械合成臺並且為其供能", + "advancement.create.clockwork_bearing": "時差", + "advancement.create.clockwork_bearing.desc": "組裝安裝在發條軸承上的結構。", + "advancement.create.nixie_tube": "風格的跡象", + "advancement.create.nixie_tube.desc": "獲得真空管顯示器並放置。", + "advancement.create.deployer": "指爽沒?", + "advancement.create.deployer.desc": "放置並且啟動一個機械手。這可是你右手完美的複製品", + "advancement.create.speed_controller": "攻城屍討厭他!", + "advancement.create.speed_controller.desc": "放置一個轉速控制器,這是換檔的終極裝置。", + "advancement.create.flywheel": "工廠之心", + "advancement.create.flywheel.desc": "將引擎成功連接到飛輪。", + "advancement.create.overstress_flywheel": "壓力過大", + "advancement.create.overstress_flywheel.desc": "超載熔爐引擎。", + "advancement.create.integrated_circuit": "複雜的運算", + "advancement.create.integrated_circuit.desc": "合成IC板。", + "advancement.create.mechanical_arm": "忙碌的手!", + "advancement.create.mechanical_arm.desc": "製作機械手臂,選擇輸入和輸出,放置並給它動能; 然後看著它完成所有你交代的工作。", + "advancement.create.musical_arm": "沒人能在我的BGM裡打敗我!", + "advancement.create.musical_arm.desc": "使用機械手臂播放唱片。", + "advancement.create.arm_many_targets": "你是要累死我?", + "advancement.create.arm_many_targets.desc": "配置一隻有十個或更多輸出位置的機械手臂。", + "advancement.create.arm_blaze_burner": "燃燒吧!烈焰使者!", + "advancement.create.arm_blaze_burner.desc": "指揮機械手臂給烈焰使者動力爐投食。", + "advancement.create.fist_bump": "朋友,來擊拳", + "advancement.create.fist_bump.desc": "使兩個機械手互相碰拳", + "advancement.create.crushing_wheel": "一對大傢伙", + "advancement.create.crushing_wheel.desc": "製作一對能更快粉碎物品的粉碎輪", + "advancement.create.blaze_cake": "糖份超標", + "advancement.create.blaze_cake.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.chromatic_age": "繽紛時代", + "advancement.create.chromatic_age.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": "piu piu piu!", + "advancement.create.extendo_grip.desc": "拿到一個伸縮機械手", + "advancement.create.dual_extendo_grip": "piu——piu——piu——", + "advancement.create.dual_extendo_grip.desc": "雙持伸縮機械手進一步加長觸碰距離", + "advancement.create.eob": "Beta版結束", + "advancement.create.eob.desc": "期待日後的更新。", + + + "_": "->------------------------] UI & Messages [------------------------<-", + + "itemGroup.create.base": "動力機械", + "itemGroup.create.palettes": "動力機械建築與裝飾方塊", + + "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.fan_washing": "批次洗滌", + "create.recipe.fan_washing.fan": "在水後放置鼓風機", + "create.recipe.fan_smoking": "批次煙燻", + "create.recipe.fan_smoking.fan": "在火焰後放置鼓風機", + "create.recipe.fan_blasting": "批次融煉", + "create.recipe.fan_blasting.fan": "在熔岩後放置鼓風機", + "create.recipe.pressing": "金屬壓片", + "create.recipe.mixing": "混合攪拌", + "create.recipe.automatic_shapeless": "自動攪拌", + "create.recipe.automatic_brewing": "自動釀造", + "create.recipe.packing": "壓塊塑形", + "create.recipe.automatic_packing": "自動打包", + "create.recipe.sawing": "板材切割", + "create.recipe.mechanical_crafting": "自動合成", + "create.recipe.automatic_shaped": "自動合成", + "create.recipe.block_cutting": "方塊切割", + "create.recipe.wood_cutting": "木材切割", + "create.recipe.blockzapper_upgrade": "方塊放置器升級", + "create.recipe.sandpaper_polishing": "砂紙打磨", + "create.recipe.mystery_conversion": "神秘轉化", + "create.recipe.spout_filling": "注液", + "create.recipe.draining": "分液", + "create.recipe.processing.chance": "%1$s%%概率", + "create.recipe.heat_requirement.none": "不需要加熱", + "create.recipe.heat_requirement.heated": "普通加熱", + "create.recipe.heat_requirement.superheated": "超級加熱", + + "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": "Ticks", + "create.generic.unit.seconds": "秒", + "create.generic.unit.minutes": "分", + "create.generic.unit.rpm": "RPM", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "度", + "create.generic.unit.millibuckets": "%1$smB", + "create.generic.clockwise": "順時鐘方向", + "create.generic.counter_clockwise": "逆時鐘方向", + + "create.action.scroll": "滾輪", + "create.action.confirm": "確認", + "create.action.abort": "退出", + "create.action.saveToFile": "離開", + "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": "[SCROLL] 循環", + "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": "Shift+滑鼠右鍵 以設定雕塑類型", + + "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.minecart_coupling.two_couplings_max": "礦車無法被連接兩個以上的礦車連結器", + "create.minecart_coupling.unloaded": "有一部份礦車存在於未讀取區塊中", + "create.minecart_coupling.no_loops": "礦車連結器不能連成一個環", + "create.minecart_coupling.removed": "從礦車上移除所有礦車連結器", + "create.minecart_coupling.too_far": "礦車距離你太遠了", + + "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.contraptions.windmill.rotation_direction": "旋轉方向", + "create.contraptions.clockwork.clock_hands": "鐘錶指針", + "create.contraptions.clockwork.hour_first": "時針優先", + "create.contraptions.clockwork.minute_first": "分針優先", + "create.contraptions.clockwork.hour_first_24": "24小時制優先", + + "create.logistics.filter": "過濾器", + "create.logistics.recipe_filter": "配方過濾器", + "create.logistics.fluid_filter": "液體過濾器", + "create.logistics.firstFrequency": "頻道. #1", + "create.logistics.secondFrequency": "頻道. #2", + "create.logistics.filter.apply": "將過濾器應用來%1$s。", + "create.logistics.filter.apply_click_again": "將過濾器應用來%1$s,再次點擊以復制數量。", + "create.logistics.filter.apply_count": "使用提取計數過濾。", + + "create.gui.goggles.generator_stats": "產能器狀態:", + "create.gui.goggles.kinetic_stats": "機械狀態:", + "create.gui.goggles.at_current_speed": "目前動能值", + "create.gui.goggles.pole_length": "活塞桿長度:", + "create.gui.goggles.fluid_container": "液體容器資訊:", + "create.gui.goggles.fluid_container.capacity": "容量: ", + "create.gui.assembly.exception": "該結構無法組合:", + "create.gui.assembly.exception.unmovableBlock": "無法移動的方塊 (%4$s) 位於 [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "位於 [%1$s,%2$s,%3$s] 方塊屬未載入區塊", + "create.gui.assembly.exception.structureTooLarge": "結構中的方塊數量過多.\nThe 可放置的數量最大為: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "活塞的活塞桿數量過多\nThe 可放置的數量最大為: %1$s", + "create.gui.assembly.exception.noPistonPoles": "這個活塞遺失了一些活塞桿", + "create.gui.assembly.exception.not_enough_sails": "結構中所需的風帆類方塊數量不足: %1$s\n最少需要的數量為: %2$s", + "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": "反轉訊號", + "create.gui.stockpile_switch.move_to_lower_at": "移至下線%1$s%%", + "create.gui.stockpile_switch.move_to_upper_at": "移至上線%1$s%%", + "create.gui.sequenced_gearshift.title": "可程式化齒輪箱", + "create.gui.sequenced_gearshift.instruction": "指令", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "以特定角度旋轉", + "create.gui.sequenced_gearshift.instruction.turn_angle": "旋轉", + "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "帶動 活塞/滑輪/門式起重機", + "create.gui.sequenced_gearshift.instruction.turn_distance": "驅動活塞", + "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "延遲時間", + "create.gui.sequenced_gearshift.instruction.delay": "延遲", + "create.gui.sequenced_gearshift.instruction.delay.duration": "間隔", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "結束", + "create.gui.sequenced_gearshift.instruction.end": "停止", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "等待新的紅石脈衝", + "create.gui.sequenced_gearshift.instruction.await": "等待", + "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.title": "藍圖名:", + "create.schematicAndQuill.convert": "立即存檔並發佈", + "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": "移動 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.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.refresh": "重新整理文件", + "create.gui.schematicTable.open_folder": "打開資料夾", + "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.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.showOptions": "顯示藍圖加農炮設定", + "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.slot.gunpowder": "向藍圖加農炮添加火藥以提供動能", + "create.gui.schematicannon.slot.listPrinter": "在此處放置書以列印藍圖所需的材料清單", + "create.gui.schematicannon.slot.schematic": "在此處添加你的藍圖,務必確保其已被部放置在特定位置", + "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.materialChecklist": "材料清單", + "create.materialChecklist.blocksNotLoaded": "*免責聲明* \n\n由於未讀取相關區塊,材料清單可能不正確。", + + "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": "可放置", + "create.item_attributes.placeable.inverted": "不可放置", + "create.item_attributes.consumable": "可食用", + "create.item_attributes.consumable.inverted": "不可食用", + "create.item_attributes.smeltable": "可被熔爐融煉", + "create.item_attributes.smeltable.inverted": "不可被熔爐融煉", + "create.item_attributes.washable": "可被篩洗", + "create.item_attributes.washable.inverted": "不可被篩洗", + "create.item_attributes.smokable": "可被煙熏", + "create.item_attributes.smokable.inverted": "不可被煙熏", + "create.item_attributes.crushable": "可被粉碎", + "create.item_attributes.crushable.inverted": "不可被粉碎", + "create.item_attributes.blastable": "可被高爐融煉", + "create.item_attributes.blastable.inverted": "不可被高爐融煉", + "create.item_attributes.enchanted": "已被附魔", + "create.item_attributes.enchanted.inverted": "未被附魔", + "create.item_attributes.damaged": "已損壞", + "create.item_attributes.damaged.inverted": "未損壞", + "create.item_attributes.badly_damaged": "嚴重受損", + "create.item_attributes.badly_damaged.inverted": "未嚴重受損", + "create.item_attributes.not_stackable": "無法堆疊", + "create.item_attributes.not_stackable.inverted": "可堆疊", + "create.item_attributes.equipable": "可裝備", + "create.item_attributes.equipable.inverted": "不可裝備", + "create.item_attributes.furnace_fuel": "是燃料", + "create.item_attributes.furnace_fuel.inverted": "不是燃料", + "create.item_attributes.in_tag": "標籤是%1$s", + "create.item_attributes.in_tag.inverted": "標籤不是%1$s", + "create.item_attributes.in_item_group": "屬於%1$s", + "create.item_attributes.in_item_group.inverted": "不屬於%1$s", + "create.item_attributes.added_by": "由%1$s添加", + "create.item_attributes.added_by.inverted": "不是由%1$s添加", + "create.item_attributes.has_enchant": "有附魔效果%1$s", + "create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s", + "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", + "create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s", + "create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level", + "create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level", + "create.item_attributes.has_fluid": "包含%1$s", + "create.item_attributes.has_fluid.inverted": "不包含%1$s", + "create.item_attributes.has_name": "有自定義名稱%1$s", + "create.item_attributes.has_name.inverted": "沒有自定義名稱%1$s", + "create.item_attributes.book_author": "由%1$s編寫", + "create.item_attributes.book_author.inverted": "未由%1$s編寫", + "create.item_attributes.book_copy_original": "是原創的", + "create.item_attributes.book_copy_original.inverted": "不是原創的", + "create.item_attributes.book_copy_first": "是第一份複製", + "create.item_attributes.book_copy_first.inverted": "不是第一份複製", + "create.item_attributes.book_copy_second": "是第二份複製", + "create.item_attributes.book_copy_second.inverted": "不是第二份複製", + "create.item_attributes.book_copy_tattered": "是第三份複製", + "create.item_attributes.book_copy_tattered.inverted": "不是第三份複製", + "create.item_attributes.astralsorcery_crystal": "具有晶體屬性%1$s", + "create.item_attributes.astralsorcery_crystal.inverted": "不具有晶體屬性%1$s", + "create.item_attributes.astralsorcery_constellation": "與%1$s調諧", + "create.item_attributes.astralsorcery_constellation.inverted": "未與%1$s調諧", + "create.item_attributes.astralsorcery_perk_gem": "具有特殊屬性%1$s", + "create.item_attributes.astralsorcery_perk_gem.inverted": "不具有特殊屬性%1$s", + "create.item_attributes.astralsorcery_amulet": "提升%1$s", + "create.item_attributes.astralsorcery_amulet.inverted": "不提升%1$s", + + "create.gui.attribute_filter.no_selected_attributes": "沒有標記任何屬性", + "create.gui.attribute_filter.selected_attributes": "已選擇的屬性:", + "create.gui.attribute_filter.add_attribute": "向列表中添加屬性", + "create.gui.attribute_filter.add_inverted_attribute": "向列表中添加相反屬性", + "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.holdForDescription": "按住 [%1$s] 來讀取物品概要", + "create.tooltip.holdForControls": "按住 [%1$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.generationSpeed": "產生%1$s %2$s", + "create.tooltip.analogStrength": "調節強度:%1$s/15", + + "create.mechanical_arm.extract_from": "從%1$s 拿取物品", + "create.mechanical_arm.deposit_to": "向%1$s 儲存物品", + "create.mechanical_arm.summary": "機械手臂有%1$s 輸入以及 %2$s 輸出。", + "create.mechanical_arm.points_outside_range": "%1$s 由於距離限制,選定的交互點被移除。", + + "create.weighted_ejector.target_set": "已選取目的地", + "create.weighted_ejector.target_not_valid": "彈射到鄰近的方塊 (目的地無效)", + "create.weighted_ejector.no_target": "彈射到鄰近的方塊 (未選取目的地)", + "create.weighted_ejector.targeting": "彈射到 [%1$s,%2$s,%3$s]", + "create.weighted_ejector.stack_size": "彈射物品數量", + + "create.logistics.when_multiple_outputs_available": "當多個輸出可用時", + + "create.mechanical_arm.selection_mode.round_robin": "輪詢調度", + "create.mechanical_arm.selection_mode.forced_round_robin": "強制輪詢調度", + "create.mechanical_arm.selection_mode.prefer_first": "第一目標優先", + + "create.tunnel.selection_mode.split": "分攤", + "create.tunnel.selection_mode.forced_split": "強制分攤", + "create.tunnel.selection_mode.round_robin": "輪詢調度", + "create.tunnel.selection_mode.forced_round_robin": "強制輪詢調度", + "create.tunnel.selection_mode.prefer_nearest": "最近優先", + "create.tunnel.selection_mode.randomize": "隨機", + "create.tunnel.selection_mode.synchronize": "同步輸入", + + "create.tooltip.chute.header": "滑道訊息", + "create.tooltip.chute.items_move_down": "物品向下移動", + "create.tooltip.chute.items_move_up": "物品向上移動", + "create.tooltip.chute.no_fans_attached": "未安裝鼓風機", + "create.tooltip.chute.fans_push_up": "鼓風機從下方進行推動", + "create.tooltip.chute.fans_push_down": "鼓風機從上方進行推動", + "create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", + "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", + "create.tooltip.chute.contains": "物品: %1$s x%2$s", + + "create.hint.hose_pulley.title": "無限供應", + "create.hint.hose_pulley": "目標液體為無限供應", + "create.hint.mechanical_arm_no_targets.title": "沒有目標", + "create.hint.mechanical_arm_no_targets": "看起來這個_機械手臂_沒有被分配任何_目標_。在手持機械手臂的同時,右鍵選取輸送帶、置物臺、漏斗或其他設備來設定目標。", + "create.hint.empty_bearing.title": "更新軸承", + "create.hint.empty_bearing": "_空手右鍵_軸承來_添加_你新建造的結構。", + "create.hint.full_deployer.title": "機械手物品溢出", + "create.hint.full_deployer": "_機械手_包含_過剩的物品_需要被_取出._使用漏斗_或其他方法將溢出解決。", + + "create.gui.config.overlay1": "嗨 :)", + "create.gui.config.overlay2": "這是一個實例層", + "create.gui.config.overlay3": "點擊拖拽你的滑鼠", + "create.gui.config.overlay4": "來將它移動到前方", + "create.gui.config.overlay5": "ESC退出目前介面", + "create.gui.config.overlay6": "並儲存新的位置", + "create.gui.config.overlay7": "輸入/create overlay reset", + "create.gui.config.overlay8": "重置到預設位置", + + "create.command.killTPSCommand": "killtps", + "create.command.killTPSCommand.status.slowed_by.0": "[Create]: 伺服器每秒TICK被降為 %s ms :o", + "create.command.killTPSCommand.status.slowed_by.1": "[Create]: 伺服器現在每秒TICK被降為 >:)", + "create.command.killTPSCommand.status.slowed_by.2": "[Create]: 伺服器現在不延遲了,TPS正常 :D", + "create.command.killTPSCommand.status.usage.0": "[Create]: 用 /killtps stop 來讓伺服器的TPS速度恢復正常", + "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 來手動降低伺服器TPS", + "create.command.killTPSCommand.argument.tickTime": "tickTime", + + "create.contraption.minecart_contraption_too_big": "這個礦車結構太大了而無法撿取", + + + "_": "->------------------------] Subtitles [------------------------<-", + + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", + "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", + "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.mechanical_press_activation_belt": "液壓機工作", + "create.subtitle.mechanical_press_activation": "液壓機工作", + "create.subtitle.blockzapper_deny": "放置失敗", + "create.subtitle.blockzapper_confirm": "選擇方塊", + "create.subtitle.blockzapper_place": "放置方塊", + "create.subtitle.blaze_munch": "烈焰使者開心地吃著", + + + "_": "->------------------------] 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.", + + "block.create.wooden_bracket.tooltip": "木製支架", + "block.create.wooden_bracket.tooltip.summary": "用來裝飾_傳動軸_,_齒輪_和_管道_。", + + "block.create.metal_bracket.tooltip": "金屬支架", + "block.create.metal_bracket.tooltip.summary": "用來裝飾_傳動軸_,_齒輪_和_管道_。", + + "block.create.copper_casing.tooltip": "銅製機殼", + "block.create.copper_casing.tooltip.summary": "具備多種用途的堅固機殼,也可用於裝飾。", + "block.create.copper_casing.tooltip.condition1": "對液體管道使用時", + "block.create.copper_casing.tooltip.behaviour1": "會把管道裝入機殼,裝進機殼的管道會與其他管道分開,以免它們自動相連。", + + "block.create.encased_fluid_pipe.tooltip": "液體管道箱", + "block.create.encased_fluid_pipe.tooltip.summary": "用銅機殼加固后的液體管道。", + + "block.create.seat.tooltip": "坐墊", + "block.create.seat.tooltip.summary": "坐下來享受旅程吧!坐墊將會把玩家固定在一個移動裝置上。也可以用來作為居家裝飾,畢竟他有許多顏色。", + "block.create.seat.tooltip.condition1": "對坐墊右鍵", + "block.create.seat.tooltip.behaviour1": "玩家將坐在_坐墊_上,Left-Shift可離開_坐墊_。", + + "item.create.blaze_cake.tooltip": "熔岩蛋糕", + "item.create.blaze_cake.tooltip.summary": "對辛苦的_烈焰使者_的美味款待。讓他們興奮起來吧!", + + "block.create.fluid_pipe.tooltip": "液體管道", + "block.create.fluid_pipe.tooltip.summary": "用來傳輸_液體_。需要一個_機械泵_來提供壓強。", + "block.create.fluid_pipe.tooltip.condition1": "轉移液體", + "block.create.fluid_pipe.tooltip.behaviour1": "可以與_液體容器_如_儲存罐_或_作業盆_相連_。裸露的_管道_末端也可以排放或抽取液體。注意別漏水了!", + "block.create.fluid_pipe.tooltip.condition2": "使用扳手對其右鍵時", + "block.create.fluid_pipe.tooltip.behaviour2": "在狀況許可的情況下在管道上安裝透明窗", + + "block.create.hose_pulley.tooltip": "軟管滑輪", + "block.create.hose_pulley.tooltip.summary": "用來在_世界_中放置或排放大量的液體。", + "block.create.hose_pulley.tooltip.condition1": "接入機械時", + "block.create.hose_pulley.tooltip.behaviour1": "升高或降低軟管,軟管的位置決定了抽取或填充液體的高度。", + "block.create.hose_pulley.tooltip.condition2": "當軟管滑輪抽取液體時", + "block.create.hose_pulley.tooltip.behaviour2": "開始從軟管末端將其從中取出_液體方塊_。巨大的液體湖將被認定是_無限_的", + "block.create.hose_pulley.tooltip.condition3": "當液體從軟管滑輪中排出時", + "block.create.hose_pulley.tooltip.behaviour3": "開始向世界填充液體,直到達到_軟管末端_的高度。", + + "block.create.fluid_tank.tooltip": "液體儲存罐", + "block.create.fluid_tank.tooltip.summary": "_儲存_任意_液體_", + "block.create.fluid_tank.tooltip.condition1": "使用扳手右鍵", + "block.create.fluid_tank.tooltip.behaviour1": "改變可選窗口", + + "block.create.creative_fluid_tank.tooltip": "創造液體儲存罐", + "block.create.creative_fluid_tank.tooltip.summary": "此液體儲存罐能夠_無限的復制_任何液體。", + "block.create.creative_fluid_tank.tooltip.condition1": "罐中裝有液體時", + "block.create.creative_fluid_tank.tooltip.behaviour1": "任意的_液體提取設備_能夠從中提取無窮無盡的指定液體,液體的導入功能同時也會無效。", + "block.create.creative_fluid_tank.tooltip.condition2": "扳手右擊時", + "block.create.creative_fluid_tank.tooltip.behaviour2": "打開關閉窗戶", + + "block.create.fluid_valve.tooltip": "液體閥門", + "block.create.fluid_valve.tooltip.summary": "阻止液體沿管道向前流動。", + "block.create.fluid_valve.tooltip.condition1": "控制流量", + "block.create.fluid_valve.tooltip.behaviour1": "施加的_動能_將迫使閥門關閉,從而阻止液體流動。_逆轉旋轉方向_以重新打開閥門。", + + "block.create.mechanical_pump.tooltip": "機械泵", + "block.create.mechanical_pump.tooltip.summary": "_接入機械_,能迫使液體_沿管道指定方向移動_。在兩個方向上都有_最大的作用範圍_。(默認為16個方塊距離)", + "block.create.mechanical_pump.tooltip.condition1": "液體流向", + "block.create.mechanical_pump.tooltip.behaviour1": "_接入機械_后會產生壓力,迫使液體通過管道。_反轉機械_的方向以切換液體_流向_。", + "block.create.mechanical_pump.tooltip.control1": "扳手右鍵時", + "block.create.mechanical_pump.tooltip.action1": "反轉泵的方向,從而改變默認的液體流向", + + "block.create.smart_fluid_pipe.tooltip": "智慧液體管道", + "block.create.smart_fluid_pipe.tooltip.summary": "帶有過濾器的_液體管道_。可以指定通過哪個_液體_。", + "block.create.smart_fluid_pipe.tooltip.condition1": "當液體進入時", + "block.create.smart_fluid_pipe.tooltip.behaviour1": "進入的液體與_過濾器_不匹配時,智慧管道將_阻止_其通過。", + "block.create.smart_fluid_pipe.tooltip.condition2": "與_液體容器相鄰_時", + "block.create.smart_fluid_pipe.tooltip.behaviour2": "從_任何容器_開始流動的_智慧管道_只會抽取與其過濾器匹配的液體。", + + "block.create.spout.tooltip": "注液器", + "block.create.spout.tooltip.summary": "一種用來_裝罐_的機器。", + "block.create.spout.tooltip.condition1": "液體傳輸", + "block.create.spout.tooltip.behaviour1": "當下方放置類似_玻璃瓶_,_桶_這樣的液體容器物品時,注液器將試圖將自身儲存的液體注入到下方的_液體容器物品_中。", + "block.create.spout.tooltip.condition2": "液體自動化", + "block.create.spout.tooltip.behaviour2": "注液器位於_輸送帶_或者_置物臺_上方時,將自動為流水線上的_液體容器物品_進行_注入_。", + + "block.create.item_drain.tooltip": "分液池", + "block.create.item_drain.tooltip.summary": "一種用來_抽空液體容器物品_的置物臺", + "block.create.item_drain.tooltip.condition1": "液體傳輸", + "block.create.item_drain.tooltip.behaviour1": "當從側面導入諸如_桶_或_瓶子_之類的_液體容器物品_時,_分液池_將嘗試將其倒入其_自身的液體庫存_中。空的_液體容器物品_將被彈出至_另一側_。", + + "item.create.wand_of_symmetry.tooltip": "對稱杖", + "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": "打開_gui介面_", + + "item.create.handheld_blockzapper.tooltip": "方塊放置器", + "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": "打開_gui介面_", + + "item.create.handheld_worldshaper.tooltip": "環境塑形器", + "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": "打開工具的_gui介面_", + + "item.create.tree_fertilizer.tooltip": "樹木肥料", + "item.create.tree_fertilizer.tooltip.summary": "適用來常見樹木的快速肥料", + "item.create.tree_fertilizer.tooltip.condition1": "在樹苗上使用時", + "item.create.tree_fertilizer.tooltip.behaviour1": "無論_生長時間_多少,直接長大", + + "item.create.deforester.tooltip": "連根拔樹斧", + "item.create.deforester.tooltip.summary": "_連根拔樹斧_,從最根砍樹時,能夠瞬間連根拔起一棵樹", + + "item.create.extendo_grip.tooltip": "伸縮機械手", + "item.create.extendo_grip.tooltip.summary": "biubiubiu! 大幅度_增加了_使用者的_觸碰距離_。", + "item.create.extendo_grip.tooltip.condition1": "放置於副手欄時", + "item.create.extendo_grip.tooltip.behaviour1": "大幅增加_主手_的觸碰距離,與_主手_的伸縮機械手攜同使用,可進一步增加_觸碰距離_。", + + "item.create.filter.tooltip": "過濾器", + "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": "屬性過濾器", + "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": "空白藍圖", + "item.create.empty_schematic.tooltip.summary": "可作為合成材料或在_藍圖桌_使用", + + "item.create.schematic.tooltip": "藍圖", + "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_and_quill.tooltip": "藍圖與筆", + "item.create.schematic_and_quill.tooltip.summary": "用來將世界中的結構存到.nbt文件。", + "item.create.schematic_and_quill.tooltip.condition1": "第一步", + "item.create.schematic_and_quill.tooltip.behaviour1": "手持藍圖與右鍵旋轉兩個點", + "item.create.schematic_and_quill.tooltip.condition2": "第二步", + "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.control3": "當潛行右鍵時", + "item.create.schematic_and_quill.tooltip.action3": "_重置_並刪除選區。", + + "block.create.schematicannon.tooltip": "藍圖加農炮", + "block.create.schematicannon.tooltip.summary": "通過發射方塊以在世界中重新構建已部署的_全息圖_,使用相鄰箱子中的物品及_火藥_作為燃料。", + "block.create.schematicannon.tooltip.condition1": "當你對加農砲右鍵時", + "block.create.schematicannon.tooltip.behaviour1": "打開加農砲的設定介面", + + "block.create.schematic_table.tooltip": "藍圖桌", + "block.create.schematic_table.tooltip.summary": "將保存的藍圖圖寫入_空白藍圖_", + "block.create.schematic_table.tooltip.condition1": "放入空白藍圖時", + "block.create.schematic_table.tooltip.behaviour1": "從Schematics文件夾上傳所選文件", + + "item.create.goggles.tooltip": "MR護目鏡", + "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.goggles.tooltip.condition3": "當裝備後看向液體容器時", + "item.create.goggles.tooltip.behaviour3": "將會顯示儲存在該容器內的 _液體_ 以及其 _容量_ 等資訊。", + + "item.create.wrench.tooltip": "板手", + "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.nozzle.tooltip": "分散網", + "block.create.nozzle.tooltip.summary": "依附在鼓風機上,能夠將鼓風機的效果_分散_各個方向。", + + "block.create.cuckoo_clock.tooltip": "布穀鳥鐘", + "block.create.cuckoo_clock.tooltip.summary": "精美的布穀鳥鐘,能夠報時", + "block.create.cuckoo_clock.tooltip.condition1": "連接機械時", + "block.create.cuckoo_clock.tooltip.behaviour1": "顯示_現在時間_且一天會報時_兩次_。中午一次,黃昏可以睡覺時一次 ", + + "block.create.turntable.tooltip": "轉盤", + "block.create.turntable.tooltip.summary": "讓旋轉機械給你帶來一場刺激的旋轉風車體驗。", + + "block.create.portable_fluid_interface.tooltip": "移動液體接口", + "block.create.portable_fluid_interface.tooltip.summary": "為機械活塞、裝配礦車、旋轉軸承、滑輪_等移動結構_設計的_液體接口_,_移動結構_和_固定結構_之間的液體交換站,兩個會面的接口必須彼此面對且彼此隔開1-2個方塊。", + "block.create.portable_fluid_interface.tooltip.condition1": "裝配在移動結構上時", + "block.create.portable_fluid_interface.tooltip.behaviour1": "移動到能夠滿足與_固定結構_上的_移動式液體接口_對接的條件后,移動結構會_短暫地停下_,開始對接,並直接與_移動結構上的_液體儲存罐_交互,進行液體的_導入導出_。", + "block.create.portable_fluid_interface.tooltip.condition2": "被紅石激活時", + "block.create.portable_fluid_interface.tooltip.behaviour2": "立即終止任何活動的連接。", + + "block.create.stockpile_switch.tooltip": "存量偵測器", + "block.create.stockpile_switch.tooltip.summary": "根據連接的容器_儲存空間_的占用情況切換紅石訊號強度。", + "block.create.stockpile_switch.tooltip.condition1": "低於_下線_或高於_上線_時", + "block.create.stockpile_switch.tooltip.behaviour1": "提供紅石訊號", + + "block.create.content_observer.tooltip": "物品偵測器", + "block.create.content_observer.tooltip.summary": "偵測_容器_和_輸送帶_中過濾器匹配的物品。當觀察到包含匹配的物品時,此組件將發出_紅石訊號_。當觀察到的漏斗_轉移匹配的物品_時,此組件將發出_紅石脈沖_。", + + "block.create.adjustable_crate.tooltip": "可調節板條箱", + "block.create.adjustable_crate.tooltip.summary": "這個箱子可以調整容量,最大可以收納_16組_物品。", + "block.create.adjustable_crate.tooltip.condition1": "當你對箱子按右鍵時", + "block.create.adjustable_crate.tooltip.behaviour1": "打開箱子的設定介面", + + "block.create.creative_crate.tooltip": "創造板條箱", + "block.create.creative_crate.tooltip.summary": "這個容器可以給臨近的_藍圖大炮_提供無限物品以及燃料 (創造專用物品)", + "block.create.creative_crate.tooltip.condition1": "當標記了物品時", + "block.create.creative_crate.tooltip.behaviour1": "容器將會從虛空中提供_無限量_的標記物品,並且任何放置到容器中的物品都會被_送入虛空_", + + "block.create.controller_rail.tooltip": "控制鐵軌", + "block.create.controller_rail.tooltip.summary": "單向電動導軌,能夠精細控制礦車的移動速度。", + "block.create.controller_rail.tooltip.condition1": "被紅石激活時", + "block.create.controller_rail.tooltip.behaviour1": "根據訊號強度_加速_或_減速_經過的礦車。將紅石強度傳播到相鄰的控制鐵軌。", + + "item.create.sand_paper.tooltip": "紅砂紙", + "item.create.sand_paper.tooltip.summary": "用來_打磨_物品的砂紙,可以用_機械手_來實現自動化。", + "item.create.sand_paper.tooltip.condition1": "使用時", + "item.create.sand_paper.tooltip.behaviour1": "打磨_副手_上或者_準心所指_的物品。", + + "item.create.builders_tea.tooltip": "工人茶", + "item.create.builders_tea.tooltip.summary": "神清氣爽的一天,從這杯完美茶飲開始。恢復復_饑餓值_並獲得_加速_效果。", + + "item.create.refined_radiance.tooltip": "光輝石", + "item.create.refined_radiance.tooltip.summary": "一種用_光輝_鍛造的化合物材料。", + + "item.create.shadow_steel.tooltip": "暗影鋼", + "item.create.shadow_steel.tooltip.summary": "一種用_虛空_鍛造的化合物材料。", + + "item.create.minecart_coupling.tooltip": "礦車連軸器", + "item.create.minecart_coupling.tooltip.summary": "將多個_礦車_或運輸結構鏈接在一起,構成雄偉的火車。", + "item.create.minecart_coupling.tooltip.condition1": "作用與礦車時", + "item.create.minecart_coupling.tooltip.behaviour1": "將兩個礦車耦合在一起,在移動時將它們保持_恒定的距離_。", + + "create.tooltip.wip": "半成品", + "create.tooltip.workInProgress": "尚在製作中!", + "create.tooltip.randomWipDescription0": "禁止將此物品給屁孩。", + "create.tooltip.randomWipDescription1": "每~一~次~你使用此物品時,就會使一隻小熊貓死亡。", + "create.tooltip.randomWipDescription2": "使用此物品請自負後果。", + "create.tooltip.randomWipDescription3": "快走開,這不是你要找的東西(搖手指", + "create.tooltip.randomWipDescription4": "啟動自爆模式,10、9、8...。", + "create.tooltip.randomWipDescription5": "你已經沒有退路了。", + "create.tooltip.randomWipDescription6": "作者我將不負任何你使用此物所造成的責任。", + "create.tooltip.randomWipDescription7": "這東西不是給你用的,再找找吧!", + "create.tooltip.randomWipDescription8": "用了就死定了。", + + + "_": "->------------------------] Ponder Content [------------------------<-", + + "create.ponder.hold_to_ponder": "按住 [%1$s] 來思考此物品", + "create.ponder.subject": "本場景的主題", + "create.ponder.pondering": "思考有關於...", + "create.ponder.identify_mode": "暫停模式已啟動\n按 [%1$s] 來取消暫停模式", + "create.ponder.associated": "相關物品", + "create.ponder.close": "關閉", + "create.ponder.identify": "暫停", + "create.ponder.next": "下個場景", + "create.ponder.previous": "上個場景", + "create.ponder.replay": "重放", + "create.ponder.think_back": "返回", + "create.ponder.slow_text": "降低文字顯示速度", + "create.ponder.shared.movement_anchors": "有了機殼底盤和強力膠就可以移動大型結構", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.sneak_and": "潛行 +", + "create.ponder.shared.storage_on_contraption": "與結構相連的儲物空間會自動撿取物品", + "create.ponder.shared.behaviour_modify_wrench": "使用扳手來調整這個動作", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "轉速: 16 RPM", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.tag.kinetic_sources": "動能產生裝置", + "create.ponder.tag.kinetic_sources.description": "該裝置能夠產生動能", + "create.ponder.tag.contraption_actor": "Contraption Actors", + "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "機械手臂的目標物", + "create.ponder.tag.arm_targets.description": "該裝置可作為機械手臂的工作目標", + "create.ponder.tag.logistics": "傳輸物品", + "create.ponder.tag.logistics.description": "該裝置用於物品的傳輸", + "create.ponder.tag.movement_anchor": "Movement Anchors", + "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.creative": "創造模式", + "create.ponder.tag.creative.description": "該裝置無法在生存模式中獲得", + "create.ponder.tag.kinetic_relays": "動能傳遞方塊", + "create.ponder.tag.kinetic_relays.description": "該裝置用於傳遞動能", + "create.ponder.tag.windmill_sails": "風車軸承的帆", + "create.ponder.tag.windmill_sails.description": "建造風車時用於產生動能的帆,每個帆對風車產生的效果都是同等的", + "create.ponder.tag.contraption_assembly": "方塊連接物件", + "create.ponder.tag.contraption_assembly.description": "此物件用於連接各個零件以便組成一個成品", + "create.ponder.tag.decoration": "裝飾", + "create.ponder.tag.decoration.description": "這些零件通常用於裝飾", + "create.ponder.tag.kinetic_appliances": "動能利用裝置", + "create.ponder.tag.kinetic_appliances.description": "這些裝置利用動能運作", + "create.ponder.tag.redstone": "邏輯控制裝置", + "create.ponder.tag.redstone.description": "這些裝置會在紅石電路中發揮用處", + "create.ponder.tag.fluids": "液體控制裝置", + "create.ponder.tag.fluids.description": "這些裝置可傳輸並利用液體", + + "create.ponder.adjustable_pulse_repeater.header": "使用可調式脈衝中繼器來控制訊號", + "create.ponder.adjustable_pulse_repeater.text_1": "可調式脈衝中繼器每次運作時會產生一個短脈衝", + "create.ponder.adjustable_pulse_repeater.text_2": "使用滑鼠滾輪來設定啟動後到產生脈衝的延遲", + "create.ponder.adjustable_pulse_repeater.text_3": "延遲可設定到最大30分鐘", + + "create.ponder.adjustable_repeater.header": "使用可調式中繼器來控制訊號", + "create.ponder.adjustable_repeater.text_1": "可調式中繼器就像一般的中繼器", + "create.ponder.adjustable_repeater.text_2": "收到訊號後在設定好的時間過後才啟動...", + "create.ponder.adjustable_repeater.text_3": "...訊號停止後也需要相隔同樣的時間過後才會停止", + "create.ponder.adjustable_repeater.text_4": "使用滑鼠滾輪來設定延遲", + "create.ponder.adjustable_repeater.text_5": "延遲可設定到最大30分鐘", + + "create.ponder.analog_lever.header": "使用可調式拉桿來控制訊號", + "create.ponder.analog_lever.text_1": "可調式拉桿是一種小巧而輕準的紅石能源", + "create.ponder.analog_lever.text_2": "右鍵來增加其紅石訊號輸出", + "create.ponder.analog_lever.text_3": "潛行並右鍵來減少其紅石訊號輸出", + + "create.ponder.andesite_tunnel.header": "使用安山岩物品隧道", + "create.ponder.andesite_tunnel.text_1": "安山岩物品隧道可以覆蓋在輸送帶上", + "create.ponder.andesite_tunnel.text_2": "當安山岩物品隧道側邊連接到另一條輸送帶時...", + "create.ponder.andesite_tunnel.text_3": "...隧道將會從經過的整組物品中拿出一個丟到另一條輸送帶上", + "create.ponder.andesite_tunnel.text_4": "剩餘物品則按照原路輸出", + + "create.ponder.basin.header": "在作業盆中處理物品", + "create.ponder.basin.text_1": "作業盆可以放入物品或液體來進行處理", + "create.ponder.basin.text_2": "在每次的處理完成後, 作業盆會試著輸出成品到他的側面下方", + "create.ponder.basin.text_3": "當側面下方有一個有效的容器或設備, 作業盆側面會出現一個輸出嘴", + "create.ponder.basin.text_4": "有很多的容器或設備可以觸發上述現象", + "create.ponder.basin.text_5": "作業盆輸出的成品會被儲存到該容器或設備內", + "create.ponder.basin.text_6": "如果側面沒有出現輸出嘴, 則作業盆內的成品則不會輸出", + "create.ponder.basin.text_7": "這個原理用在產生的成品為下一輪處理的原料時相當有用", + "create.ponder.basin.text_8": "期望的成品將會從作業盆中輸出", + "create.ponder.basin.text_9": "加裝過濾器可防止未被處理的物品輸出", + + "create.ponder.bearing_modes.header": "機械軸承的工作模式", + "create.ponder.bearing_modes.text_1": "當機械軸承停止時,它會控制整個結構停在最近的垂直線上並實體化", + "create.ponder.bearing_modes.text_2": "你可以控制它不要實體化,或是在結構起始位置才實體化", + + "create.ponder.belt_casing.header": "包裹住輸送帶", + "create.ponder.belt_casing.text_1": "安山岩機殼或黃銅機殼可以用來裝飾輸送帶", + "create.ponder.belt_casing.text_2": "使用扳手可以移除機殼", + + "create.ponder.belt_connector.header": "使用輸送帶", + "create.ponder.belt_connector.text_1": "手持輸送帶對兩根傳動軸右鍵以安裝輸送帶", + "create.ponder.belt_connector.text_2": "不小心點到傳動軸的話可以用潛行+右鍵來取消選取", + "create.ponder.belt_connector.text_3": "輸送帶間只要有空間就能安裝額外的傳動軸", + "create.ponder.belt_connector.text_4": "相同輸送帶接出來的傳動軸轉速及轉向會相同", + "create.ponder.belt_connector.text_5": "使用扳手可以移除已安裝的傳動軸", + "create.ponder.belt_connector.text_6": "輸送帶可以被各種染料染色", + + "create.ponder.belt_directions.header": "輸送帶正確的安裝方向", + "create.ponder.belt_directions.text_1": "輸送帶不可以隨意聯結", + "create.ponder.belt_directions.text_2": "1. 輸送帶可以水平連結", + "create.ponder.belt_directions.text_3": "2. 輸送帶可以對角連結", + "create.ponder.belt_directions.text_4": "3. 輸送帶可以垂直連結", + "create.ponder.belt_directions.text_5": "4. 也可以連結在垂直的傳動軸上", + "create.ponder.belt_directions.text_6": "這些都是可以使用的連接方式,輸送帶可以放置的長度為2~20格", + + "create.ponder.belt_transport.header": "將輸送帶用於後勤", + "create.ponder.belt_transport.text_1": "被啟動的輸送帶能運送物品及實體", + "create.ponder.belt_transport.text_2": "空手對輸送帶上的物品右鍵即可從輸送帶上取下物品", + + "create.ponder.blaze_burner.header": "餵食烈焰使者動力爐", + "create.ponder.blaze_burner.text_1": "烈焰使者動力爐可以用來加熱作業盆", + "create.ponder.blaze_burner.text_2": "你需要餵食可以燃燒的物品來加熱作業盆", + "create.ponder.blaze_burner.text_3": "餵食熔岩蛋糕可以讓烈焰使者動力爐加熱到另一個更高的境界", + "create.ponder.blaze_burner.text_4": "使用機械手或機械手臂來將餵食自動化", + + "create.ponder.brass_funnel.header": "黃銅漏斗", + "create.ponder.brass_funnel.text_1": "安山岩漏斗每次只能傳輸一個物品", + "create.ponder.brass_funnel.text_2": "但黃銅漏斗每次可以傳輸整組物品", + "create.ponder.brass_funnel.text_3": "對漏斗上的過濾格使用滾輪可以調整每次輸出物品的數量", + "create.ponder.brass_funnel.text_4": "手持物品對漏斗上的過濾格右鍵可以限制漏斗只輸出該物品", + + "create.ponder.brass_tunnel.header": "使用黃銅隧道", + "create.ponder.brass_tunnel.text_1": "黃銅隧道必須裝設在輸送帶上", + "create.ponder.brass_tunnel.text_2": "黃銅隧道輸出入口上都有過濾格", + "create.ponder.brass_tunnel.text_3": "在輸入口上的過濾器會阻擋不相符的物品", + "create.ponder.brass_tunnel.text_4": "在輸出口上的過濾器可依種類整理排列物品", + "create.ponder.brass_tunnel.text_5": "如果數種與過濾相符的物品通過隧道, 隧道的分配模式將決定如何處理這些物品", + "create.ponder.brass_tunnel.text_6": "在平行相鄰的輸送帶上,相鄰的黃銅隧道將會成為一組", + "create.ponder.brass_tunnel.text_7": "輸入該組內的物品將會採用該組隧道的分配模式輸送", + "create.ponder.brass_tunnel.text_8": "在這個情況下, 物品也能被直接輸入到隧道方塊", + + "create.ponder.brass_tunnel_modes.header": "黃銅隧道的分配模式", + "create.ponder.brass_tunnel_modes.text_1": "使用扳手來調整隧道的分配模式", + "create.ponder.brass_tunnel_modes.text_10": "'同步輸入' 是一種黃銅隧道的特殊設定", + "create.ponder.brass_tunnel_modes.text_11": "當同組內的所有隧道都有一個可通過的物品時,所有隧道才可輸出物品", + "create.ponder.brass_tunnel_modes.text_12": "這確保了同組隧道所在的輸送帶都能以同一速率輸出物品", + "create.ponder.brass_tunnel_modes.text_2": "'分流輸出' 此模式會將物品輸出到該組隧道可用的輸出口", + "create.ponder.brass_tunnel_modes.text_3": "如果該組隧道內某個輸出口無法再輸出物品,則該輸出口會被跳過", + "create.ponder.brass_tunnel_modes.text_4": "'強制分流輸出' 模式不會跳過某個無法輸出物品的輸出口, 直到該輸出口可以輸出物品", + "create.ponder.brass_tunnel_modes.text_5": "'輪詢輸入' 模式將會保持整組物品完整性, 然後在有輸出口可以輸出時才輸入物品", + "create.ponder.brass_tunnel_modes.text_6": "如果該組隧道內某個輸出口無法再輸出物品,則該輸出口會被跳過", + "create.ponder.brass_tunnel_modes.text_7": "'強制輪詢輸入' 模式不會跳過某個無法輸出物品的輸出口, 直到該輸出口可以輸出物品", + "create.ponder.brass_tunnel_modes.text_8": "'鄰近優先' 模式會將物品輸出到該組隧道離物品輸入口最近的出口", + "create.ponder.brass_tunnel_modes.text_9": "'隨機輸出' 模式會隨機選擇同組隧道的一個輸出口輸出", + + "create.ponder.cart_assembler.header": "使用礦車裝修站裝修礦車來移動結構", + "create.ponder.cart_assembler.text_1": "礦車裝修站會將所有連接到礦車的結構裝在礦車上", + "create.ponder.cart_assembler.text_2": "如果沒有紅時訊號,它會將礦車結構分解成方塊", + "create.ponder.cart_assembler.text_3": "對礦車結構使用扳手可以將礦車變成物品", + + "create.ponder.cart_assembler_dual.header": "雙礦車結構", + "create.ponder.cart_assembler_dual.text_1": "當兩台礦車在同一礦車結構上", + "create.ponder.cart_assembler_dual.text_2": "任一礦車裝修站收到紅石訊號時,會形成完整的一個礦車結構", + "create.ponder.cart_assembler_dual.text_3": "整個礦車結構會類似於用礦車連結器連接兩個礦車結構", + + "create.ponder.cart_assembler_modes.header": "礦車結構的方向設定", + "create.ponder.cart_assembler_modes.text_1": "礦車結構會隨著礦車方向改變", + "create.ponder.cart_assembler_modes.text_2": "如果在裝修站鎖定其方向,則結構方向不會隨礦車方向改變", + + "create.ponder.cart_assembler_rails.header": "其他種類的礦車和鐵軌", + "create.ponder.cart_assembler_rails.text_1": "放在普通鐵軌上的礦車裝修站不會影響礦車的動作", + "create.ponder.cart_assembler_rails.text_2": "如果裝修站在沒有紅石訊號的動力鐵軌或控制鐵軌上,則礦車會停下直到鐵軌收到紅石訊號", + "create.ponder.cart_assembler_rails.text_3": "有幾種礦車可以當作錨來使用", + "create.ponder.cart_assembler_rails.text_4": "熔爐礦車會盡可能維持熔煉狀態,並會拿取鄰近儲存結構上的燃料", + + "create.ponder.chain_drive.header": "使用鏈式傳動箱傳遞動能", + "create.ponder.chain_drive.text_1": "同一排上的鏈式傳動箱會互相傳遞動能", + "create.ponder.chain_drive.text_2": "所有傳動軸此時會朝相同方向旋轉", + "create.ponder.chain_drive.text_3": "任一個鏈式傳動箱被旋轉90度時所有鏈式傳動箱仍可正常運作", + + "create.ponder.chain_gearshift.header": "使用可調式鏈式變速箱來調整轉速", + "create.ponder.chain_gearshift.text_1": "未被控制的可調式鏈式變速箱與鏈式傳動箱無異", + "create.ponder.chain_gearshift.text_2": "當可調式鏈式變速箱被啟動後,它會把轉速提升兩倍傳至其他鏈式傳動箱", + "create.ponder.chain_gearshift.text_3": "當被啟動的可調式鏈式變速箱並不是動能輸入端,則它會把轉速減半", + "create.ponder.chain_gearshift.text_4": "上述兩種狀況中,其他鏈式傳動箱都會被可調式鏈式變速箱提升兩倍的轉速", + "create.ponder.chain_gearshift.text_5": "利用紅石訊號的強弱可以調整轉速倍率為x1或x2", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "使用滑道向下輸送物品", + "create.ponder.chute.text_1": "滑道可以在兩個垂直的儲物空間中輸送物品", + "create.ponder.chute.text_2": "使用扳手可以讓它產生一個觀景窗", + "create.ponder.chute.text_3": "在滑道的側面放置另一個滑道,會產生一個斜狀的滑道", + + "create.ponder.chute_upward.header": "使用滑道向上輸送物品", + "create.ponder.chute_upward.text_1": "在滑道上方或下方使用鼓風機時,物品會根據被向上或向下吹", + "create.ponder.chute_upward.text_2": "裝備MR護目鏡以觀測物品的傳輸方向", + "create.ponder.chute_upward.text_3": "如滑道底端被擋住,則物品只能由側邊進行輸出入", + + "create.ponder.clockwork_bearing.header": "使用時鐘軸承來建造時鐘結構", + "create.ponder.clockwork_bearing.text_1": "時鐘軸承會黏住其前方方塊產生一個時針結構", + "create.ponder.clockwork_bearing.text_2": "在輸入動能後,該結構會依照遊戲時間來旋轉", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "對軸承右鍵會使結構啟動或停止", + "create.ponder.clockwork_bearing.text_6": "在時針結構的前方可再增加一組分針結構", + "create.ponder.clockwork_bearing.text_7": "你必須確保時針分針結構間未被使用強力膠之類的相連零件", + "create.ponder.clockwork_bearing.text_8": "分針結構此時將正常運作", + + "create.ponder.clutch.header": "使用離合器控制動能", + "create.ponder.clutch.text_1": "離合器能將動能直線傳遞", + "create.ponder.clutch.text_2": "當離合器被啟動,離合器會中斷動能傳遞", + + "create.ponder.cog_speedup.header": "使用大小齒輪來變速", + "create.ponder.cog_speedup.text_1": "大齒輪與小齒輪可以斜向傳遞動能", + "create.ponder.cog_speedup.text_2": "從大齒輪傳遞動能至小齒輪時,轉速加倍", + "create.ponder.cog_speedup.text_3": "從小齒輪傳遞動能至大齒輪時,轉速減半", + + "create.ponder.cogwheel.header": "使用齒輪來傳遞動能", + "create.ponder.cogwheel.text_1": "齒輪會將動力傳遞至臨近的齒輪", + "create.ponder.cogwheel.text_2": "以此方式連接的齒輪,旋轉方向相反", + + "create.ponder.creative_motor.header": "使用創造馬達產生動能", + "create.ponder.creative_motor.text_1": "創造馬達不僅能夠手動設定輸出動能,而且體積相當小巧", + "create.ponder.creative_motor.text_2": "對其背後面板滾動滾輪,可以改變馬達的轉速", + + "create.ponder.crushing_wheels.header": "使用粉碎輪處理物品", + "create.ponder.crushing_wheels.text_1": "一對粉碎輪,磨物快又準", + "create.ponder.crushing_wheels.text_2": "接入的動能必須使這兩個輪子契合轉動", + "create.ponder.crushing_wheels.text_3": "扔入或者放入的物品都會被粉碎處理", + "create.ponder.crushing_wheels.text_4": "你也可以使用自動化進行物品的輸入以及撿取", + + "create.ponder.deployer.header": "使用機械手", + "create.ponder.deployer.text_1": "在機械手獲得動能後能夠模仿玩家的各種行為", + "create.ponder.deployer.text_10": "對機械手手部右鍵,即可將手上的物品給它使用", + "create.ponder.deployer.text_11": "物品也可以自動化輸入到機械手內", + "create.ponder.deployer.text_12": "機械手附帶一個過濾格", + "create.ponder.deployer.text_13": "當設定了過濾後,只有當它的手中物品與過濾格相符時,它才會工作", + "create.ponder.deployer.text_14": "只有與過濾格相符的物品才可輸入...", + "create.ponder.deployer.text_15": "...不符的物品可被取出來", + "create.ponder.deployer.text_2": "它只會與它正前方兩格處的位置進行互動", + "create.ponder.deployer.text_3": "放在在它面前的方塊不會阻攔它的工作", + "create.ponder.deployer.text_4": "機械手可以:", + "create.ponder.deployer.text_5": "放置方塊", + "create.ponder.deployer.text_6": "使用物品", + "create.ponder.deployer.text_7": "啟動方塊", + "create.ponder.deployer.text_8": "採收方塊", + "create.ponder.deployer.text_9": "以及攻擊生物", + + "create.ponder.deployer_contraption.header": "在裝置上使用機械手", + "create.ponder.deployer_contraption.text_1": "當機械手在移動的結構上時...", + "create.ponder.deployer_contraption.text_2": "機械手會對每一個經過的方塊使用裝置中任意容器內的物品", + "create.ponder.deployer_contraption.text_3": "可以透過過濾格來指定其從存儲空間中抽取的物品", + + "create.ponder.deployer_modes.header": "機械手的工作模式", + "create.ponder.deployer_modes.text_1": "在設設情況下,機械手模仿玩家的右鍵", + "create.ponder.deployer_modes.text_2": "使用扳手可以將模式調整為模仿玩家的左鍵", + + "create.ponder.deployer_redstone.header": "使用紅石控制機械手", + "create.ponder.deployer_redstone.text_1": "當機械手收到紅時訊號時會停止工作", + "create.ponder.deployer_redstone.text_2": "在停止工作前,機械手會完成目前手頭上的工作", + "create.ponder.deployer_redstone.text_3": "因此,輸入脈衝訊號可以使其每次只進行一個週期的工作", + + "_": "m", + + "create.ponder.depot.header": "使用置物台", + "create.ponder.depot.text_1": "置物台可以被當成一個“靜止的”傳送帶原件使用", + "create.ponder.depot.text_2": "右擊可以手動放置或取下物品", + "create.ponder.depot.text_3": "與傳送帶一樣,它也可以將其內的物品轉送到其他設備中進行加工...", + "create.ponder.depot.text_4": "...同時物品也可以被機械手存取", + + "create.ponder.empty_blaze_burner.header": "使用空的烈焰人燃燒室", + "create.ponder.empty_blaze_burner.text_1": "手持空的烈焰人燃燒室右擊烈焰人來抓取烈焰人", + "create.ponder.empty_blaze_burner.text_2": "或者,也可以透過右擊烈焰人刷怪籠來填充啟動烈焰人燃燒室", + "create.ponder.empty_blaze_burner.text_3": "這樣,你便有了一個可供部分機器加工的熱源", + "create.ponder.empty_blaze_burner.text_4": "如果是為了美觀,空的烈焰人燃燒室也可以被打火石點燃", + "create.ponder.empty_blaze_burner.text_5": "但是,這樣的熱源不足以給機器提加工供足夠的熱量", + + "create.ponder.fan_direction.header": "鼓風機的氣流", + "create.ponder.fan_direction.text_1": "鼓風機使用動能來製造氣流", + "create.ponder.fan_direction.text_2": "流速以及方向由所接收動能的強弱以及方向而定", + + "create.ponder.fan_processing.header": "使用鼓風機加工物品", + "create.ponder.fan_processing.text_1": "當氣流吹過熔岩時,氣流會被加熱", + "create.ponder.fan_processing.text_2": "熱氣流中的物品會被冶煉", + "create.ponder.fan_processing.text_3": "但在氣流中的食物會被直接燒成灰", + "create.ponder.fan_processing.text_4": "而想要烹飪食物,必須要透過吹過火焰的氣流來煙燻食物", + "create.ponder.fan_processing.text_5": "當氣流吹過水後,便可用於洗滌物品", + "create.ponder.fan_processing.text_6": "這種加工方法可以做到不少有趣的事情", + "create.ponder.fan_processing.text_7": "鼓風機的轉速對加工的速度沒有影響,只影響氣流的吹拂距離", + "create.ponder.fan_processing.text_8": "而那些放置在置物台或者傳送帶上的物品,鼓風機也是可以處理的", + + "create.ponder.fan_source.header": "使用鼓風機來產生動能", + "create.ponder.fan_source.text_1": "如鼓風機的扇葉向下朝著熱源放置,鼓風機可以藉此產生動能", + "create.ponder.fan_source.text_2": "當鼓風機接受紅石訊號後,它便會向外供給動能", + + "create.ponder.flywheel.header": "使用飛輪來產生動能", + "create.ponder.flywheel.text_1": "飛輪和熔爐引擎必須配套使用,方可產生動能", + "create.ponder.flywheel.text_2": "如此產生的動能具有非常大的應力值", + "create.ponder.flywheel.text_3": "使用高爐會使得引擎的效率翻倍", + + "create.ponder.funnel_compat.header": "漏斗的相容性", + "create.ponder.funnel_compat.text_1": "漏斗可以與一些其他組件互動", + "create.ponder.funnel_compat.text_2": "動力鋸", + "create.ponder.funnel_compat.text_3": "置物台", + "create.ponder.funnel_compat.text_4": "分液池", + + "create.ponder.funnel_direction.header": "物流方向", + "create.ponder.funnel_direction.text_1": "直接放置時,漏斗會將物品從容器中取出", + "create.ponder.funnel_direction.text_2": "潛行時放置時,漏斗會將物品置入容器中", + "create.ponder.funnel_direction.text_3": "使用扳手可以改變漏斗的存/取模式", + "create.ponder.funnel_direction.text_4": "對大多數朝向放置的漏斗都具有此特性", + "create.ponder.funnel_direction.text_5": "在傳送帶末端放置的漏斗會根據傳送帶的傳動方向存/取物品", + + "create.ponder.funnel_intro.header": "使用漏斗", + "create.ponder.funnel_intro.text_1": "用漏斗來存取物品欄內的物品,可謂又快又好", + + "create.ponder.funnel_redstone.header": "紅石訊號控制", + "create.ponder.funnel_redstone.text_1": "紅石訊號會使漏斗停止工作", + + "create.ponder.funnel_transfer.header": "直接運輸", + "create.ponder.funnel_transfer.text_1": "漏斗無法將物品傳輸到非開放式的物品欄中", + "create.ponder.funnel_transfer.text_2": "溜槽和智慧溜槽更適用於這樣的場景", + "create.ponder.funnel_transfer.text_3": "水平傳輸也是如此,也許傳送帶更方便快捷", + + "create.ponder.furnace_engine.header": "使用熔爐引擎生產動能", + "create.ponder.furnace_engine.text_1": "熔爐引擎會在與其相連熔爐工作時生產動能", + "create.ponder.furnace_engine.text_2": "如此產生的動能具有非常大的應力值", + "create.ponder.furnace_engine.text_3": "使用高爐會使得引擎的效率翻倍", + + "create.ponder.gantry_carriage.header": "使用起重機取物器", + "create.ponder.gantry_carriage.text_1": "起重機取物器可以被放置在起重機杆上,並且可以沿著起重機杆運動", + "create.ponder.gantry_carriage.text_2": "起重機可以移動其黏附的方塊", + + "create.ponder.gantry_cascaded.header": "串聯起重機", + "create.ponder.gantry_cascaded.text_1": "無需強力膠,取物器便可與起重機杆相連", + "create.ponder.gantry_cascaded.text_2": "即使是在移動的起重機杆上也是如此", + "create.ponder.gantry_cascaded.text_3": "因此,起重機系統可以串聯起來,如此可以影響到多軸向的運動", + + "create.ponder.gantry_direction.header": "起重機移動方向", + "create.ponder.gantry_direction.text_1": "起重機杆可以有相反的方向", + "create.ponder.gantry_direction.text_2": "取物器的移動方向取決於起重機杆的方向", + "create.ponder.gantry_direction.text_3": "......以及起重機杆的旋轉方向", + "create.ponder.gantry_direction.text_4": "在旋轉傳遞中,此規則同樣適用", + + "create.ponder.gantry_redstone.header": "起重機的力傳遞", + "create.ponder.gantry_redstone.text_1": "被紅石訊號啟動的起重機,將不會移動其上的取物器", + "create.ponder.gantry_redstone.text_2": "作為替代,杆上的動能會傳遞到取物器的輸出杆上", + + "create.ponder.gantry_shaft.header": "使用起重機杆", + "create.ponder.gantry_shaft.text_1": "起重機杆組成了起重機結構的基礎。與其相接的載物器可以沿著杆進行移動。", + "create.ponder.gantry_shaft.text_2": "起重機結構可以移動與其相接的方塊。", + + "create.ponder.gearbox.header": "使用十字齒輪箱傳遞動能", + "create.ponder.gearbox.text_1": "更改旋轉軸,很容易使得整個旋轉體系變得臃腫不堪", + "create.ponder.gearbox.text_2": "十字齒輪箱則是替代方案,它的體積更為小巧緊", + "create.ponder.gearbox.text_3": "側邊連接的傳動桿,旋轉方向與輸入端一致", + "create.ponder.gearbox.text_4": "直線連接的傳動桿,旋轉方向會被反轉", + + "create.ponder.gearshift.header": "使用反轉齒輪箱控制動能", + "create.ponder.gearshift.text_1": "反轉齒輪箱可以直線傳輸旋轉", + "create.ponder.gearshift.text_2": "通入紅石訊號後,輸出端的旋轉方向會被反轉", + + "create.ponder.hand_crank.header": "使用手搖把手產生動能", + "create.ponder.hand_crank.text_1": "玩家可以使用手搖把手來手動產生動能", + "create.ponder.hand_crank.text_2": "按住右鍵可以逆時針旋轉它", + "create.ponder.hand_crank.text_3": "它產生的轉速相對較高", + "create.ponder.hand_crank.text_4": "潛行長按右鍵可以順時針旋轉它", + + "create.ponder.large_cogwheel.header": "使用大齒輪傳遞動能", + "create.ponder.large_cogwheel.text_1": "大齒輪可以以特定的角度相互連接", + "create.ponder.large_cogwheel.text_2": "可以利用大齒輪變更旋轉軸向", + + "create.ponder.linear_chassis_attachment.header": "使用機殼底盤黏合方塊", + "create.ponder.linear_chassis_attachment.text_1": "它的開放面可以變為黏性面", + "create.ponder.linear_chassis_attachment.text_2": "再次點擊黏性面,可以將它的相反面也變得具有黏性", + "create.ponder.linear_chassis_attachment.text_3": "空手潛行右擊可以移除此面的黏性物", + "create.ponder.linear_chassis_attachment.text_4": "黏性面可以將此面前方的一長條方塊黏住", + "create.ponder.linear_chassis_attachment.text_5": "使用扳手可以精確控制底盤的影響範圍", + "create.ponder.linear_chassis_attachment.text_6": "按住 Ctrl 滑動滾輪,你可以一次性調節所有底盤的影響範圍", + "create.ponder.linear_chassis_attachment.text_7": "若想讓底盤的其他面也能黏方塊,你需要用到強力膠", + "create.ponder.linear_chassis_attachment.text_8": "利用這些機制,任何形狀的機制都可以像裝置那樣移動", + + "create.ponder.linear_chassis_group.header": "成組移動機殼底盤", + "create.ponder.linear_chassis_group.text_1": "相鄰的機殼底盤可以相互連接在一起", + "create.ponder.linear_chassis_group.text_2": "其中的一個底盤若被移動,其餘的底盤也會跟著移動", + "create.ponder.linear_chassis_group.text_3": "不同種類的底盤,或者是朝向不一致的底盤,將不會相連", + + "create.ponder.mechanical_arm.header": "設定動力臂", + "create.ponder.mechanical_arm.text_1": "你得在放置動力臂之前就設定好它的輸入以及輸出端", + "create.ponder.mechanical_arm.text_2": "手持動力臂右擊某個存儲空間,可以將其指定為目標", + "create.ponder.mechanical_arm.text_3": "再次右擊可以將其在輸入端(藍色)以及輸出端(橙色)之間切換", + "create.ponder.mechanical_arm.text_4": "左擊此組件可以移除選擇", + "create.ponder.mechanical_arm.text_5": "將動力臂放下來後,它會將此前選擇的方塊作為目標", + "create.ponder.mechanical_arm.text_6": "在有效範圍內,機械手臂可以有任意數量的輸出以及輸入端", + "create.ponder.mechanical_arm.text_7": "然而,並不是所有的存儲空間可以被直接互動", + "create.ponder.mechanical_arm.text_8": "在此情況下,漏斗和置物台可以解決此問題", + + "create.ponder.mechanical_arm_filtering.header": "過濾動力臂的輸出端", + "create.ponder.mechanical_arm_filtering.text_1": "輸入", + "create.ponder.mechanical_arm_filtering.text_2": "輸出", + "create.ponder.mechanical_arm_filtering.text_3": "有時,你會想著利用某種過濾限煞車力臂的目標", + "create.ponder.mechanical_arm_filtering.text_4": "動力臂自身並不提供任何過濾選項", + "create.ponder.mechanical_arm_filtering.text_5": "然而,若將黃銅漏斗作為目標,則漏斗的過濾槽則可以應用至動力臂上", + "create.ponder.mechanical_arm_filtering.text_6": "動力臂足夠智慧,它不會去拿取那些它無法分配的物品", + + "create.ponder.mechanical_arm_modes.header": "動力臂的分配模式", + "create.ponder.mechanical_arm_modes.text_1": "輸入", + "create.ponder.mechanical_arm_modes.text_2": "輸出", + "create.ponder.mechanical_arm_modes.text_3": "若動力臂必須在數個有效的輸出端之間作出選擇...", + "create.ponder.mechanical_arm_modes.text_4": "...它會依照自己的設定選擇特定的行為", + "create.ponder.mechanical_arm_modes.text_5": "手持扳手對其滑動滾輪,可以改變其設定", + "create.ponder.mechanical_arm_modes.text_6": "輪詢調度模式很好理解,即循環輸出至所有有效的輸出端", + "create.ponder.mechanical_arm_modes.text_7": "如果某個輸出端無法容納更多物品,則它會被跳過", + "create.ponder.mechanical_arm_modes.text_8": "強制輪詢調度不會跳過任何輸出端,動力臂會一直等待,直到輸出端有空位容納物品輸入", + "create.ponder.mechanical_arm_modes.text_9": "最近優先模式會使得動力臂先將物品輸出至更早被選擇的輸出端", + + "create.ponder.mechanical_arm_redstone.header": "利用紅石訊號控制動力臂", + "create.ponder.mechanical_arm_redstone.text_1": "通入紅石訊號後,動力臂會停止工作", + "create.ponder.mechanical_arm_redstone.text_2": "在停止工作前,它會完成目前正在進行的工作週期", + "create.ponder.mechanical_arm_redstone.text_3": "因此,通入單次負紅石脈衝可以精確控制動力臂,使其每次只進行單個週期的工作", + + "create.ponder.mechanical_bearing.header": "使用動力軸承移動結構", + "create.ponder.mechanical_bearing.text_1": "動力軸承會與其前方的方塊黏合在一起", + "create.ponder.mechanical_bearing.text_2": "接收到動能後,它會將這一黏合結構組裝為旋轉裝置", + + "create.ponder.mechanical_crafter.header": "設置動力合成器", + "create.ponder.mechanical_crafter.text_1": "動力合成器陣列可用於自動化任何合成配方的製作", + "create.ponder.mechanical_crafter.text_2": "使用扳手可以調控合成器的合成通路", + "create.ponder.mechanical_crafter.text_3": "所有的合成通路必須匯集到任意一側的一個出口,整套合成器方可算是設置正確", + "create.ponder.mechanical_crafter.text_4": "輸出產物會被放入位於出口的存儲空間中", + "create.ponder.mechanical_crafter.text_5": "動力合成器的運轉需要動能的供應", + "create.ponder.mechanical_crafter.text_6": "右擊合成器正面,可以手動放入物品", + "create.ponder.mechanical_crafter.text_7": "一旦合成通路上的所有合成槽位都有了物品,合成就會開始", + "create.ponder.mechanical_crafter.text_8": "而對於那些沒有完全占滿所有合成器槽位的配方,你可以通入紅石訊號強制開啟合成", + + "create.ponder.mechanical_crafter_connect.header": "為合成器連接物品欄", + "create.ponder.mechanical_crafter_connect.text_1": "合成器可以自動接受向其輸入的物品", + "create.ponder.mechanical_crafter_connect.text_2": "對其背面使用扳手,可以連接合成器", + "create.ponder.mechanical_crafter_connect.text_3": "所有相連的合成器可以訪問同一個位置的輸入", + + "create.ponder.mechanical_crafter_covers.header": "蓋住動力合成器的合成槽", + "create.ponder.mechanical_crafter_covers.text_1": "有些配方需要額外的合成器,來補足合成通路上的間隙", + "create.ponder.mechanical_crafter_covers.text_2": "使用合成槽蓋板,合成器會在合成進行時的行為就如同一個空的合成槽位", + "create.ponder.mechanical_crafter_covers.text_3": "被蓋住的合成器並不會阻斷共享輸入端的影響", + + "create.ponder.mechanical_drill.header": "使用機械鑽頭破壞方塊", + "create.ponder.mechanical_drill.text_1": "當向其通入動能後,機械鑽頭會破壞它面前的方塊", + "create.ponder.mechanical_drill.text_2": "它的挖掘速度取決於通入的動能轉速", + + "create.ponder.mechanical_drill_contraption.header": "在裝置中使用機械鑽頭", + "create.ponder.mechanical_drill_contraption.text_1": "在運動裝置中使用機械鑽頭時...", + "create.ponder.mechanical_drill_contraption.text_2": "...它會破壞掉它撞上的方塊", + + "create.ponder.mechanical_harvester.header": "在裝置中使用動力收割機", + "create.ponder.mechanical_harvester.text_1": "在運動裝置中使用動力收割機時...", + "create.ponder.mechanical_harvester.text_2": "它會採收其路徑上的作物,並重設這些作物的生長進度", + + "create.ponder.mechanical_mixer.header": "使用動力攪拌器處理物品", + "create.ponder.mechanical_mixer.text_1": "使用攪拌器和工作盆,你可以自動化某些合成配方", + "create.ponder.mechanical_mixer.text_2": "有效配方包括各種無序合成配方,以及一些額外的配方", + "create.ponder.mechanical_mixer.text_3": "一些配方可能需要使用烈焰人燃燒室提供熱量", + "create.ponder.mechanical_mixer.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", + + "create.ponder.mechanical_piston.header": "使用動力活塞移動結構", + "create.ponder.mechanical_piston.text_1": "動力活塞可以移動它前方的方塊", + "create.ponder.mechanical_piston.text_2": "移動速度和方向取決於通入活塞的動能", + "create.ponder.mechanical_piston.text_3": "黏性動力活塞可以將相接的方塊拉回來", + + "create.ponder.mechanical_piston_modes.header": "動力活塞的移動模式", + "create.ponder.mechanical_piston_modes.text_1": "一旦活塞停下,被移動的結構就會回退到方塊狀態", + "create.ponder.mechanical_piston_modes.text_2": "你也可以將其設定為從不方塊化,或者只在起始位置方塊化", + + "create.ponder.mechanical_plough.header": "在裝置中使用動力犁", + "create.ponder.mechanical_plough.text_1": "在運動裝置中使用動力犁時...", + "create.ponder.mechanical_plough.text_2": "...它會破壞掉那些不具有固體碰撞箱的方塊", + "create.ponder.mechanical_plough.text_3": "此外,動力犁可以耕地", + "create.ponder.mechanical_plough.text_4": "...它也可以在不傷害實體的情況下推動它們", + + "create.ponder.mechanical_press.header": "使用機械液壓機處理物品", + "create.ponder.mechanical_press.text_1": "機械液壓機可以處理位於其下方的物品", + "create.ponder.mechanical_press.text_2": "在其下方丟入物品,或者將物品放在置物台上,都算作有效的物品輸入", + "create.ponder.mechanical_press.text_3": "若物品被輸入時正位於傳送帶上...", + "create.ponder.mechanical_press.text_4": "輥軋機會使物品停下,然後自動處理這一物品", + + "create.ponder.mechanical_press_compacting.header": "使用機械液壓機壓縮物品", + "create.ponder.mechanical_press_compacting.text_1": "對放置於工作盆內的物品進行輥軋,可以將這些物品壓縮在一起", + "create.ponder.mechanical_press_compacting.text_2": "壓縮意指任何同種物品填滿了 2x2 或者 3x3 網格的配方,以及一些額外的配方", + "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃燒室提供熱量", + "create.ponder.mechanical_press_compacting.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", + + "create.ponder.mechanical_saw_breaker.header": "使用動力鋸伐木", + "create.ponder.mechanical_saw_breaker.text_1": "向其通入動能後,動力鋸可以直接砍伐掉它面前的樹木", + "create.ponder.mechanical_saw_breaker.text_2": "想要一次性砍掉整棵樹,鋸子必須破壞掉樹與地面連接的最後一個方塊", + + "create.ponder.mechanical_saw_contraption.header": "在裝置中使用動力鋸", + "create.ponder.mechanical_saw_contraption.text_1": "若在運動裝置中使用動力鋸...", + "create.ponder.mechanical_saw_contraption.text_2": "...它會將撞到它的樹木破壞掉", + + "create.ponder.mechanical_saw_processing.header": "使用動力鋸處理物品", + "create.ponder.mechanical_saw_processing.text_1": "面向朝上的動力鋸可以將物品處理為其變種", + "create.ponder.mechanical_saw_processing.text_2": "處理過後的物品的彈出方向始終與通入鋸中的旋轉轉向相反", + "create.ponder.mechanical_saw_processing.text_3": "鋸子可以", + "create.ponder.mechanical_saw_processing.text_4": "若輸入原料有多種可能產物,你可以用動力鋸上的過濾槽指定只產出某種產物", + "create.ponder.mechanical_saw_processing.text_5": "若沒有使用過濾槽,動力鋸會在各產物中按順序循環輸出", + + "create.ponder.millstone.header": "使用石磨處理物品", + "create.ponder.millstone.text_1": "石磨會對輸入的物品進行磨製", + "create.ponder.millstone.text_2": "在其側邊使用齒輪與其相耦合,方可為其通入動力", + "create.ponder.millstone.text_3": "頂部可以丟入或者塞入物品", + "create.ponder.millstone.text_4": "一段時間過後,右擊石磨可以拿出其中的產物", + "create.ponder.millstone.text_5": "產物的提取也是可以自動化的", + + "create.ponder.nixie_tube.header": "使用真空管顯示器", + "create.ponder.nixie_tube.text_1": "通入紅石訊號後,真空管顯示器會顯示出紅石訊號的強度", + "create.ponder.nixie_tube.text_2": "使用命名牌在鐵砧上為其命名,可以自訂它的顯示文本", + + "create.ponder.piston_pole.header": "活塞延長杆", + "create.ponder.piston_pole.text_1": "若無相接的延長杆,動力活塞無法移動其他方塊", + "create.ponder.piston_pole.text_2": "在其背面安裝的延長杆長度,決定了活塞的推動範圍", + + "create.ponder.portable_storage_interface.header": "裝置存儲交換", + "create.ponder.portable_storage_interface.text_1": "玩家無法與運動裝置內的存儲空間進行互動", + "create.ponder.portable_storage_interface.text_2": "這一組件可以在不停止裝置的情況下與裝置內的存儲空間進行互動", + "create.ponder.portable_storage_interface.text_3": "放置第二個介面時,記得要與裝置介面相隔 1 格或者 2 格的距離", + "create.ponder.portable_storage_interface.text_4": "當它們彼此經過時,它們會連接在一起", + "create.ponder.portable_storage_interface.text_5": "連接狀態下,固定側介面便會作為整個裝置的存儲空間代理", + "create.ponder.portable_storage_interface.text_6": "物品會被輸入到裝置內...", + "create.ponder.portable_storage_interface.text_7": "...或是從裝置中提取出來", + "create.ponder.portable_storage_interface.text_8": "物品交換完畢後,裝置仍然會停留在原地一小會,然後才會繼續前行", + + "create.ponder.portable_storage_interface_redstone.header": "紅石控制", + "create.ponder.portable_storage_interface_redstone.text_1": "通入紅石訊號可以阻止固定側介面的連接行為", + + "create.ponder.powered_latch.header": "使用閂鎖器控制訊號", + "create.ponder.powered_latch.text_1": "閂鎖器是一種可以用紅石訊號控制的拉杆", + "create.ponder.powered_latch.text_2": "後方輸入的訊號會將其設為開啟狀態", + "create.ponder.powered_latch.text_3": "側邊輸入的訊號會將其設為關閉狀態", + "create.ponder.powered_latch.text_4": "你也可以手動切換其狀態", + + "create.ponder.powered_toggle_latch.header": "使用T型正反器控制訊號", + "create.ponder.powered_toggle_latch.text_1": "T型正反器是一種可以用紅石訊號控制的拉杆", + "create.ponder.powered_toggle_latch.text_2": "後方訊號輸入可以改變它的狀態", + "create.ponder.powered_toggle_latch.text_3": "...開啟或者是關閉", + "create.ponder.powered_toggle_latch.text_4": "你也可以手動切換其狀態", + + "create.ponder.pulse_repeater.header": "使用脈衝中繼器控制訊號", + "create.ponder.pulse_repeater.text_1": "脈衝中繼器會將所有通入的紅石訊號縮減為一次脈衝", + + "create.ponder.radial_chassis.header": "使用旋轉底盤黏著方塊", + "create.ponder.radial_chassis.text_1": "同一行上的旋轉底盤會相互連接在一起", + "create.ponder.radial_chassis.text_2": "當其中的一個底盤被裝置帶動時,其餘的底盤也會被帶動", + "create.ponder.radial_chassis.text_3": "底盤的側邊可以變為黏性面", + "create.ponder.radial_chassis.text_4": "再次點擊黏性面,可以讓其所有面都變得帶黏性", + "create.ponder.radial_chassis.text_5": "空手潛行右擊可以移除其上的黏性物", + "create.ponder.radial_chassis.text_6": "若有物品與底盤的黏性面相接觸...", + "create.ponder.radial_chassis.text_7": "...底盤便會與同層且位於半徑內的所有可及方塊黏著在一起", + "create.ponder.radial_chassis.text_8": "使用扳手可以精確指定底盤的影響範圍", + "create.ponder.radial_chassis.text_9": "黏性面一側的不可及方塊不會被黏著", + + "create.ponder.redstone_contact.header": "接觸式紅石訊號發生器", + "create.ponder.redstone_contact.text_1": "當兩個接觸式紅石訊號發生器面對面時,它們會發出紅石訊號", + "create.ponder.redstone_contact.text_2": "並且,若有一方位於運動裝置上,此特性也能正常生效", + + "create.ponder.redstone_link.header": "使用無線紅石訊號機", + "create.ponder.redstone_link.text_1": "無線紅石訊號機可以無線傳輸紅石訊號", + "create.ponder.redstone_link.text_2": "潛行右擊可以改變其接收模式", + "create.ponder.redstone_link.text_3": "手持扳手右擊也可以", + "create.ponder.redstone_link.text_4": "接收端會發出由傳輸端發來的訊號,有效距離為 128 格", + "create.ponder.redstone_link.text_5": "在它們所帶的槽位中放上物品,可以為它們指定頻道", + "create.ponder.redstone_link.text_6": "只有頻道相互匹配的機方可互通", + + "create.ponder.rope_pulley.header": "使用繩索滑輪移動結構", + "create.ponder.rope_pulley.text_1": "繩索滑輪在接受動能時可以垂直移動方塊結構", + "create.ponder.rope_pulley.text_2": "移動的方向及速度取決於提供的轉速", + + "create.ponder.rope_pulley_attachment.header": "繩索滑輪與裝置一同運動", + "create.ponder.rope_pulley_attachment.text_1": "當繩索滑輪本身在裝置中被帶動時...", + "create.ponder.rope_pulley_attachment.text_2": "...它附著在滑輪上的結構會被滑輪拉著一同移動", + "create.ponder.rope_pulley_attachment.text_3": "注意,只有繩索滑輪停止工作時才能被移動", + + "create.ponder.rope_pulley_modes.header": "繩索滑輪的運動模式", + "create.ponder.rope_pulley_modes.text_1": "當繩索滑輪停止運動時,它所附屬的移動結構便會方塊化", + "create.ponder.rope_pulley_modes.text_2": "你可以調整整個結構永不方塊化,或者僅在結構的初始位置方塊化", + + "create.ponder.rotation_speed_controller.header": "使用轉速控制器", + "create.ponder.rotation_speed_controller.text_1": "轉速控制器將動能從其轉軸傳遞至它上方的大齒輪", + "create.ponder.rotation_speed_controller.text_2": "在其側面滾動滑鼠滾輪,可以調節輸出轉速", + + "create.ponder.sail.header": "使用風帆來組裝風車", + "create.ponder.sail.text_1": "風帆是製作風車的趁手材料", + "create.ponder.sail.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", + "create.ponder.sail.text_3": "手持染料右擊可對其染色", + "create.ponder.sail.text_4": "手持剪刀右擊可剪除帆布,使其變迴風帆框架", + + "create.ponder.sail_frame.header": "使用風帆框架來組裝風車", + "create.ponder.sail_frame.text_1": "風帆框架是製作風車的趁手材料", + "create.ponder.sail_frame.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", + + "create.ponder.sequenced_gearshift.header": "使用可編程齒輪箱來控制轉速", + "create.ponder.sequenced_gearshift.text_1": "可編程齒輪箱能夠根據玩家設置的預設時序表來傳遞旋轉", + "create.ponder.sequenced_gearshift.text_2": "對其右擊可以打開設置面板", + "create.ponder.sequenced_gearshift.text_3": "接受紅石訊號時,它會開始執行其內部已設定好的時序指令表", + "create.ponder.sequenced_gearshift.text_4": "當完成時序指令表後,它會進入待機狀態,再次接受紅石訊號後,它才會再次執行時序指令表內容", + "create.ponder.sequenced_gearshift.text_5": "紅石比較器可以讀取目前時序指令表完成進度", + + "create.ponder.shaft.header": "使用傳動軸來傳送動能", + "create.ponder.shaft.text_1": "傳動軸可以直線傳送動能", + + "create.ponder.shaft_casing.header": "包裹傳動軸", + "create.ponder.shaft_casing.text_1": "黃銅及安山岩機殼可以用來裝飾傳動軸", + + "create.ponder.smart_chute.header": "使用智慧滑道來過濾物品", + "create.ponder.smart_chute.text_1": "智慧滑道是一種可以被控制的滑道", + "create.ponder.smart_chute.text_2": "當在其過濾槽內指定了物品後,溜槽只會傳輸這一指定標記的物品", + "create.ponder.smart_chute.text_3": "使用滑鼠滾輪可以指定被過濾的物品數量", + "create.ponder.smart_chute.text_4": "通入紅石訊號,智慧溜槽將會完全暫停工作", + + "create.ponder.speedometer.header": "使用速度計來監測轉速", + "create.ponder.speedometer.text_1": "速度計能顯示相接組件的轉速", + "create.ponder.speedometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", + "create.ponder.speedometer.text_3": "紅石比較器可以根據速度計的數值輸出不同強弱的紅石訊號", + + "create.ponder.stabilized_bearings.header": "裝置固定朝向", + "create.ponder.stabilized_bearings.text_1": "當動力軸承在結構被帶動時...", + "create.ponder.stabilized_bearings.text_2": "...它會確保它轉盤的垂直朝向不變", + "create.ponder.stabilized_bearings.text_3": "跟預設的一樣,動力軸承會黏著它前方的方塊", + "create.ponder.stabilized_bearings.text_4": "這種情況下,它所黏著的子結構的垂直朝向也不會改變", + + "create.ponder.sticker.header": "使用方塊黏著器來黏取方塊", + "create.ponder.sticker.text_1": "方塊黏著器是一個很棒的裝置,他受控於紅石訊號", + "create.ponder.sticker.text_2": "當接收到訊號時,他會黏起面前的一個方塊", + "create.ponder.sticker.text_3": "如果此時方塊黏著器被移動,被黏到的方塊會跟著移動", + "create.ponder.sticker.text_4": "再次接收到訊號後,黏著器會放下它面前的方塊", + + "create.ponder.stressometer.header": "使用動能錶來監測應力", + "create.ponder.stressometer.text_1": "動能錶能顯示目前動能網路內的應力訊息", + "create.ponder.stressometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", + "create.ponder.stressometer.text_3": "紅石比較器可以根據動能錶的數值輸出不同強弱的紅石訊號", + + "create.ponder.super_glue.header": "使用強力膠來黏附方塊", + "create.ponder.super_glue.text_1": "強力膠可以在任意兩個方塊間使用", + "create.ponder.super_glue.text_2": "當被黏合的方塊被組裝為裝置時,他們會一起運動", + "create.ponder.super_glue.text_3": "當強力膠在副手時...", + "create.ponder.super_glue.text_4": "...新放置的方塊會自動被黏附在所放置方塊的面上", + "create.ponder.super_glue.text_5": "左擊可以清除強力膠", + + "create.ponder.valve_handle.header": "使用閥門手輪產生動能", + "create.ponder.valve_handle.text_1": "玩家可以手動使用閥門手輪來產生動能", + "create.ponder.valve_handle.text_2": "右擊可使它逆時針旋轉", + "create.ponder.valve_handle.text_3": "它的轉速慢而精確", + "create.ponder.valve_handle.text_4": "潛行右擊可使它順時針旋轉", + "create.ponder.valve_handle.text_5": "可以透過染色來美化閥門手輪", + + "create.ponder.water_wheel.header": "使用水車產生動能", + "create.ponder.water_wheel.text_1": "水車利用臨近的水流來進行應力發生", + "create.ponder.water_wheel.text_2": "水車接觸水流的麵越多,它的轉速越高", + "create.ponder.water_wheel.text_3": "水車葉片應逆著水流方向擺放", + "create.ponder.water_wheel.text_4": "如果順著水流擺放,它的效率則會降低", + + "create.ponder.weighted_ejector.header": "使用彈射置物台", + "create.ponder.weighted_ejector.text_1": "手持彈射置物台時,潛行時右擊可以設置彈射目標位置", + "create.ponder.weighted_ejector.text_10": "現在,只有等被放置的物品數量等於所設定數量時,彈射置物台才會彈射物品", + "create.ponder.weighted_ejector.text_11": "當其他實體站在彈射置物台上時會被直接彈射", + "create.ponder.weighted_ejector.text_2": "現在,放置下的彈射置物台會將物品彈射至目標位置", + "create.ponder.weighted_ejector.text_3": "限制範圍內的任意距離和高度均可作為有效目標地點", + "create.ponder.weighted_ejector.text_4": "但是,目標位置與置物台的連線,必須垂直於置物台的側面", + "create.ponder.weighted_ejector.text_5": "如果沒有設置有效目標位置,彈射置物台會直接將其前方一格設為默認目標位置", + "create.ponder.weighted_ejector.text_6": "提供動能可為其蓄力", + "create.ponder.weighted_ejector.text_7": "蓄力完畢後,放置在它上方的物品會被立刻彈射出去", + "create.ponder.weighted_ejector.text_8": "如果目標為容器,則彈射置物台會等待容器有位置後再彈射物品", + "create.ponder.weighted_ejector.text_9": "使用扳手可以調整彈射所要求的物品數量", + + "create.ponder.weighted_ejector_redstone.header": "使用紅石控制彈射置物台", + "create.ponder.weighted_ejector_redstone.text_1": "當被紅石充能時,彈射置物台停止工作", + "create.ponder.weighted_ejector_redstone.text_2": "此外,置物台彈射的瞬間可以被偵測器偵測", + "create.ponder.weighted_ejector_tunnel.header": "使用彈射置物台來分流物品", + "create.ponder.weighted_ejector_tunnel.text_1": "與黃銅隧道搭配使用時,彈射置物台可以將物品以特定數量進行分流", + "create.ponder.weighted_ejector_tunnel.text_2": "首先,將黃銅隧道調整為“最近優先”模式,從而讓它優先側面輸出", + "create.ponder.weighted_ejector_tunnel.text_3": "置物台上所設置的物品數量則為被分流出去的物品數量", + "create.ponder.weighted_ejector_tunnel.text_4": "當所設置的物品數量被分流出去後...", + "create.ponder.weighted_ejector_tunnel.text_5": "...剩餘的物品則會繼續前進", + + "create.ponder.windmill_source.header": "使用風車軸承產生動能", + "create.ponder.windmill_source.text_1": "風車軸承會黏著它面前的方塊結構", + "create.ponder.windmill_source.text_2": "如果黏著的方塊結構包含足夠的風帆方塊即為風車", + "create.ponder.windmill_source.text_3": "右鍵啟動風車後,風車開始提供動能", + "create.ponder.windmill_source.text_4": "產生的動能將取決於所黏風帆方塊之數量", + "create.ponder.windmill_source.text_5": "使用扳手來調整其旋轉方向", + "create.ponder.windmill_source.text_6": "對風車軸承右鍵可使其停止方便你維修風車", + + "create.ponder.windmill_structure.header": "風車結構", + "create.ponder.windmill_structure.text_1": "任一包含至少8個風帆方塊的結構即為有效的風車", + + "_": "Thank you for translating Create!" + +} \ No newline at end of file From 62026e3f130b70b36f7ffb0134f59dc0e73424ed Mon Sep 17 00:00:00 2001 From: dunois2737 <78353924+dunois2737@users.noreply.github.com> Date: Sat, 22 May 2021 16:10:23 +0900 Subject: [PATCH 03/21] update zh_tw for create 0.3.1 --- src/main/resources/assets/create/lang/zh_tw.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/create/lang/zh_tw.json b/src/main/resources/assets/create/lang/zh_tw.json index e9b7b29bf..45c124d4c 100644 --- a/src/main/resources/assets/create/lang/zh_tw.json +++ b/src/main/resources/assets/create/lang/zh_tw.json @@ -1028,10 +1028,10 @@ "create.item_attributes.added_by.inverted": "不是由%1$s添加", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s", - "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", - "create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s", - "create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level", - "create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level", + "create.item_attributes.color": "已被染色成 %1$s", + "create.item_attributes.color.inverted": "未被染色成 %1$s", + "create.item_attributes.max_enchanted": "已達到最高附魔等級", + "create.item_attributes.max_enchanted.inverted": "未達到最高附魔等級", "create.item_attributes.has_fluid": "包含%1$s", "create.item_attributes.has_fluid.inverted": "不包含%1$s", "create.item_attributes.has_name": "有自定義名稱%1$s", From 73fd42baf5a353cad48c18cac33819195db3dc2d Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Tue, 25 May 2021 22:33:44 -0400 Subject: [PATCH 04/21] Add button to open new config menu --- .../create/foundation/config/CClient.java | 14 +++ .../config/ui/OpenConfigButton.java | 114 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java 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 ce9017241..ebe8f1e31 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CClient.java +++ b/src/main/java/com/simibubi/create/foundation/config/CClient.java @@ -19,6 +19,20 @@ public class CClient extends ConfigBase { 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"); + public ConfigInt mainMenuConfigButtonRow = i(2, 0, 4, "mainMenuConfigButtonRow", + "Choose the menu row that the Create config button appears on in the main menu", + "Set to 0 to disable the button altogether"); + public ConfigInt mainMenuConfigButtonOffsetX = i(-4, Integer.MIN_VALUE, Integer.MAX_VALUE, "mainMenuConfigButtonOffsetX", + "Offset the Create config button in the main menu by this many pixels on the X axis", + "The sign (+/-) of this value determines what side of the row the button appears on (right/left)"); + + public ConfigInt ingameMenuConfigButtonRow = i(3, 0, 5, "ingameMenuConfigButtonRow", + "Choose the menu row that the Create config button appears on in the in-game menu", + "Set to 0 to disable the button altogether"); + public ConfigInt ingameMenuConfigButtonOffsetX = i(-4, Integer.MIN_VALUE, Integer.MAX_VALUE, "ingameMenuConfigButtonOffsetX", + "Offset the Create config button in the in-game menu by this many pixels on the X axis", + "The sign (+/-) of this value determines what side of the row the button appears on (right/left)"); + public ConfigBool ignoreFabulousWarning = b(false, "ignoreFabulousWarning", "Setting this to true will prevent Create from sending you a warning when playing with Fabulous graphics enabled"); diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java b/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java new file mode 100644 index 000000000..07dd44942 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java @@ -0,0 +1,114 @@ +package com.simibubi.create.foundation.config.ui; + +import com.mojang.blaze3d.matrix.MatrixStack; + +import com.simibubi.create.AllItems; + +import com.simibubi.create.foundation.config.AllConfigs; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.IngameMenuScreen; +import net.minecraft.client.gui.screen.MainMenuScreen; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.button.Button; +import net.minecraft.client.resources.I18n; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class OpenConfigButton extends Button { + + public static ItemStack icon = AllItems.GOGGLES.asStack(); + + public OpenConfigButton(int x, int y) { + super(x, y, 20, 20, StringTextComponent.EMPTY, OpenConfigButton::click); + } + + @Override + public void render(MatrixStack mstack, int mouseX, int mouseY, float pticks) { + super.render(mstack, mouseX, mouseY, pticks); + Minecraft.getInstance().getItemRenderer().renderItemIntoGUI(icon, x + 2, y + 2); + } + + public static void click(Button b) { + Minecraft.getInstance().displayGuiScreen(new BaseConfigScreen(Minecraft.getInstance().currentScreen)); + } + + public static class SingleMenuRow { + public final String left, right; + public SingleMenuRow(String left, String right) { + this.left = I18n.format(left); + this.right = I18n.format(right); + } + public SingleMenuRow(String center) { + this(center, center); + } + } + + public static class MenuRows { + public static final MenuRows MAIN_MENU = new MenuRows(Arrays.asList( + new SingleMenuRow("menu.singleplayer"), + new SingleMenuRow("menu.multiplayer"), + new SingleMenuRow("fml.menu.mods", "menu.online"), + new SingleMenuRow("narrator.button.language", "narrator.button.accessibility") + )); + + public static final MenuRows INGAME_MENU = new MenuRows(Arrays.asList( + new SingleMenuRow("menu.returnToGame"), + new SingleMenuRow("gui.advancements", "gui.stats"), + new SingleMenuRow("menu.sendFeedback", "menu.reportBugs"), + new SingleMenuRow("menu.options", "menu.shareToLan"), + new SingleMenuRow("menu.returnToMenu") + )); + + protected final List leftButtons, rightButtons; + + public MenuRows(List variants) { + leftButtons = variants.stream().map(r -> r.left).collect(Collectors.toList()); + rightButtons = variants.stream().map(r -> r.right).collect(Collectors.toList()); + } + } + + @EventBusSubscriber(value = Dist.CLIENT) + public static class OpenConfigButtonHandler { + + @SubscribeEvent + public static void onGuiInit(GuiScreenEvent.InitGuiEvent event) { + Screen gui = event.getGui(); + + MenuRows menu = null; + int rowIdx = 0, offsetX = 0; + if (gui instanceof MainMenuScreen) { + menu = MenuRows.MAIN_MENU; + rowIdx = AllConfigs.CLIENT.mainMenuConfigButtonRow.get(); + offsetX = AllConfigs.CLIENT.mainMenuConfigButtonOffsetX.get(); + } else if (gui instanceof IngameMenuScreen) { + menu = MenuRows.INGAME_MENU; + rowIdx = AllConfigs.CLIENT.ingameMenuConfigButtonRow.get(); + offsetX = AllConfigs.CLIENT.ingameMenuConfigButtonOffsetX.get(); + } + + if (rowIdx != 0 && menu != null) { + boolean onLeft = offsetX < 0; + String target = (onLeft ? menu.leftButtons : menu.rightButtons).get(rowIdx - 1); + + int offsetX_ = offsetX; + event.getWidgetList().stream() + .filter(w -> w.getMessage().getString().equals(target)) + .findFirst() + .ifPresent(w -> event.addWidget( + new OpenConfigButton(w.x + offsetX_ + (onLeft ? -20 : w.getWidth()), w.y) + )); + } + } + + } + +} From 09691b4b40fc339a4e3dedec83358472e3e01725 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 26 May 2021 22:03:06 +0200 Subject: [PATCH 05/21] Redstone gamepads - Added the Linked Controller --- src/generated/resources/.cache/cache | 33 +-- .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 7 + .../assets/create/lang/unfinished/de_de.json | 9 +- .../assets/create/lang/unfinished/es_es.json | 9 +- .../assets/create/lang/unfinished/es_mx.json | 9 +- .../assets/create/lang/unfinished/fr_fr.json | 9 +- .../assets/create/lang/unfinished/it_it.json | 9 +- .../assets/create/lang/unfinished/ja_jp.json | 9 +- .../assets/create/lang/unfinished/ko_kr.json | 9 +- .../assets/create/lang/unfinished/nl_nl.json | 9 +- .../assets/create/lang/unfinished/pl_pl.json | 9 +- .../assets/create/lang/unfinished/pt_br.json | 9 +- .../assets/create/lang/unfinished/ru_ru.json | 9 +- .../assets/create/lang/unfinished/zh_cn.json | 9 +- .../assets/create/lang/unfinished/zh_tw.json | 9 +- .../create/models/item/linked_controller.json | 3 + .../data/create/advancements/aesthetics.json | 4 +- .../simibubi/create/AllContainerTypes.java | 5 + .../java/com/simibubi/create/AllItems.java | 8 + .../goggles/GoggleOverlayRenderer.java | 4 +- .../content/logistics/IRedstoneLinkable.java | 23 ++ .../logistics/RedstoneLinkNetworkHandler.java | 66 +++-- .../item/LinkedControllerBindPacket.java | 55 +++++ .../item/LinkedControllerClientHandler.java | 225 ++++++++++++++++++ .../item/LinkedControllerContainer.java | 152 ++++++++++++ .../item/LinkedControllerInputPacket.java | 50 ++++ .../logistics/item/LinkedControllerItem.java | 116 +++++++++ .../item/LinkedControllerItemRenderer.java | 134 +++++++++++ .../logistics/item/LinkedControllerModel.java | 20 ++ .../item/LinkedControllerPacketBase.java | 37 +++ .../item/LinkedControllerScreen.java | 134 +++++++++++ .../item/LinkedControllerServerHandler.java | 123 ++++++++++ .../item/filter/AbstractFilterContainer.java | 7 +- .../item/filter/AbstractFilterScreen.java | 4 +- .../item/filter/AttributeFilterContainer.java | 2 +- .../item/filter/FilterScreenPacket.java | 10 +- .../simibubi/create/events/ClientEvents.java | 4 + .../simibubi/create/events/CommonEvents.java | 2 + .../create/foundation/gui/AllGuiTextures.java | 2 + .../foundation/gui/ClearContainerPacket.java | 36 +++ .../foundation/gui/IClearableContainer.java | 13 + .../foundation/networking/AllPackets.java | 8 +- .../foundation/renderState/RenderTypes.java | 2 +- .../tileEntity/TileEntityBehaviour.java | 1 - .../behaviour/linked/LinkBehaviour.java | 38 ++- .../behaviour/linked/LinkHandler.java | 11 +- .../assets/create/lang/default/messages.json | 6 + .../models/item/linked_controller/button.json | 22 ++ .../models/item/linked_controller/item.json | 166 +++++++++++++ .../item/linked_controller/powered.json | 94 ++++++++ .../create/textures/gui/curiosities2.png | Bin 0 -> 1407 bytes .../textures/item/linked_controller.png | Bin 0 -> 351 bytes .../item/linked_controller_powered.png | Bin 0 -> 350 bytes .../create/textures/item/refined_radiance.png | Bin 242 -> 262 bytes 55 files changed, 1649 insertions(+), 96 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/linked_controller.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerModel.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java create mode 100644 src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java create mode 100644 src/main/java/com/simibubi/create/foundation/gui/IClearableContainer.java create mode 100644 src/main/resources/assets/create/models/item/linked_controller/button.json create mode 100644 src/main/resources/assets/create/models/item/linked_controller/item.json create mode 100644 src/main/resources/assets/create/models/item/linked_controller/powered.json create mode 100644 src/main/resources/assets/create/textures/gui/curiosities2.png create mode 100644 src/main/resources/assets/create/textures/item/linked_controller.png create mode 100644 src/main/resources/assets/create/textures/item/linked_controller_powered.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index fb6f24a64..091f2d332 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -407,21 +407,21 @@ 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 -a6d814f94926d88764c38862cc4ece9c367e023b assets/create/lang/en_ud.json -d1838140c8383ee4537db90eb8f657d0c268fe91 assets/create/lang/en_us.json -4fcda300efe5a2ad8695b5ae3f24a54ea109a954 assets/create/lang/unfinished/de_de.json -6a1dde57b2224d4b0287ebc705d6a75d329b5e1f assets/create/lang/unfinished/es_es.json -93ee0e30a56b405a9e766d353c36276e36a84b5c assets/create/lang/unfinished/es_mx.json -49a691320c73e09f921cd0ea97398126231e99fa assets/create/lang/unfinished/fr_fr.json -cf14b3828b6c11013f606f277d88fb63245bb2a8 assets/create/lang/unfinished/it_it.json -73c1c1489833cbcb28bb1ce90541c8c8bdf329c0 assets/create/lang/unfinished/ja_jp.json -924303b9bcf56aedbbfc46108655f71324308e12 assets/create/lang/unfinished/ko_kr.json -079aea6843e756efbfca0976983be1957863717c assets/create/lang/unfinished/nl_nl.json -b7bab15167400ee48a9728f81446e572c494fd8d assets/create/lang/unfinished/pl_pl.json -07e84cc3eee3faa1ab3d26e0c85c7f09c8573368 assets/create/lang/unfinished/pt_br.json -6ffb0cf20d712aee23a42a9ec440dd7dc92293d6 assets/create/lang/unfinished/ru_ru.json -0ae98a18e59f478da41d8c5d832737b65f6a8c8a assets/create/lang/unfinished/zh_cn.json -4c96e5a76e72368a59190b7588d389fdd2cc75e1 assets/create/lang/unfinished/zh_tw.json +e9c463e0cf56ed28ee26a33debeae3ecc2e941d2 assets/create/lang/en_ud.json +a9a31be19fc2e109967e68b63746dee766b8b4d1 assets/create/lang/en_us.json +916eb5e579f283b81f100098bf168203d75db5c5 assets/create/lang/unfinished/de_de.json +fc1a5dc58cb00012cd311f909de3cd6085664994 assets/create/lang/unfinished/es_es.json +7716f8e2a1cc161778e627f6c1f527356cfd34f9 assets/create/lang/unfinished/es_mx.json +2e032434706937780312c8c9a72ec0e0a8f1a8e6 assets/create/lang/unfinished/fr_fr.json +011b39c4217c2d5da59d0c8f4fd3c5f272a91c3e assets/create/lang/unfinished/it_it.json +dd04db4e469ece034e9edde1d182d40ece3c917f assets/create/lang/unfinished/ja_jp.json +a46af574991af844c58a7fe75b4c2b0ac888b4e0 assets/create/lang/unfinished/ko_kr.json +1ee72b0c9ac509ffcd17b19d17ab1f4b3506c9ce assets/create/lang/unfinished/nl_nl.json +b23f249ef0b28b2e2312e63f2fccf4401b282ac4 assets/create/lang/unfinished/pl_pl.json +73030bf3d5aace5c3e991c6bf265322bba42286f assets/create/lang/unfinished/pt_br.json +73b1927e1d32e4229caa96e8d1bc25d39fb51377 assets/create/lang/unfinished/ru_ru.json +aa3f0b918d948795e10878c3d42dbd4c39f71795 assets/create/lang/unfinished/zh_cn.json +1f15238d524e7b94b0ce5bcd09703b4742b9f960 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1452,6 +1452,7 @@ ebdf23b99b7895e347c29057c8070a6e16e56beb assets/create/models/item/limestone_cob 288da8b29a4e9d0d0b694567a61b5a816a2859b8 assets/create/models/item/limestone_cobblestone_wall.json 8065de871ad2fbaed711735561b8ed91a2ce0004 assets/create/models/item/limestone_pillar.json d245aa4994ff197b1ffeb7980d05f96bd20cdeb3 assets/create/models/item/linear_chassis.json +2866bff509b060cd3ee99b4eef25a4e1e4639703 assets/create/models/item/linked_controller.json 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 @@ -1652,7 +1653,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json 096382a4c025b5ffdde9c496ee9da0d5345fbe17 assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 83c046bd200623933545c9e4326f782fb02c87fa data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 12c9bc03a..80d533b06 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -468,6 +468,7 @@ "item.create.integrated_circuit": "\u0287\u0131n\u0254\u0279\u0131\u0186 p\u01DD\u0287\u0250\u0279b\u01DD\u0287uI", "item.create.iron_sheet": "\u0287\u01DD\u01DD\u0265S uo\u0279I", "item.create.lapis_sheet": "\u0287\u01DD\u01DD\u0265S s\u0131d\u0250\uA780", + "item.create.linked_controller": "\u0279\u01DD\u05DF\u05DFo\u0279\u0287uo\u0186 p\u01DD\u029Eu\u0131\uA780", "item.create.minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", "item.create.minecart_coupling": "bu\u0131\u05DFdno\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W", "item.create.polished_rose_quartz": "z\u0287\u0279\u0250n\u1F49 \u01DDso\u1D1A p\u01DD\u0265s\u0131\u05DFo\u0500", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 427d2c658..5386c44f9 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -474,6 +474,7 @@ "item.create.integrated_circuit": "Integrated Circuit", "item.create.iron_sheet": "Iron Sheet", "item.create.lapis_sheet": "Lapis Sheet", + "item.create.linked_controller": "Linked Controller", "item.create.minecart_contraption": "Minecart Contraption", "item.create.minecart_coupling": "Minecart Coupling", "item.create.polished_rose_quartz": "Polished Rose Quartz", @@ -1104,6 +1105,12 @@ "create.tooltip.chute.fans_pull_down": "Fans pull from Below", "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "Bind mode active", + "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Bottomless Supply", "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "No Targets", 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 bffa0a121..35b456937 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: 942", + "_": "Missing Localizations: 948", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Integrierter Schaltkreis", "item.create.iron_sheet": "Eisenblech", "item.create.lapis_sheet": "Lapislazuliblech", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Loren Vorrichtung", "item.create.minecart_coupling": "Lorenkupplung", "item.create.polished_rose_quartz": "Polierter Rosenquarz", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "Propeller ziehen von unterhalb", "create.tooltip.chute.contains": "Enthält: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Endlose Versorgung", "create.hint.hose_pulley": "Das angewählte Gewässer wird als unendlich betrachtet.", "create.hint.mechanical_arm_no_targets.title": "Keine Ziele", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 12880cfef..0d801148c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 643", + "_": "Missing Localizations: 649", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Chip de circuito integrado", "item.create.iron_sheet": "Lámina de hierro", "item.create.lapis_sheet": "Lámina de lapislázuli", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Artilugio de vagoneta", "item.create.minecart_coupling": "Acoplamiento de vagoneta", "item.create.polished_rose_quartz": "Cuarzo rosado pulido", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "Los ventiladores tiran desde abajo", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Suministro sin fondo", "create.hint.hose_pulley": "La masa de fluido objetivo se considera infinita", "create.hint.mechanical_arm_no_targets.title": "No hay objetivos", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index f3de8dd15..6919bdae1 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1266", + "_": "Missing Localizations: 1272", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Circuito Integrado", "item.create.iron_sheet": "Lámina de Hierro", "item.create.lapis_sheet": "Lámina de Lapislázuli", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Artefacto de Vagón", "item.create.minecart_coupling": "Acoplamiento de Vagonetas", "item.create.polished_rose_quartz": "Cuarzo Rosa Pulido", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", 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 558c2ff87..f6b6cc6a8 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: 1194", + "_": "Missing Localizations: 1200", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Circuit intégré", "item.create.iron_sheet": "Plaque de Fer", "item.create.lapis_sheet": "Feuille de lapis", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Engin de wagonnet", "item.create.minecart_coupling": "Lien pour wagonnet", "item.create.polished_rose_quartz": "Quartz rose poli", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", 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 afa0b3942..687d7ca8b 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: 660", + "_": "Missing Localizations: 666", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Circuito integrato", "item.create.iron_sheet": "Lamiera di ferro", "item.create.lapis_sheet": "Lamiera di lapislazzuli", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Contrazione per carrello da miniera", "item.create.minecart_coupling": "Aggancio per carrelli da miniera", "item.create.polished_rose_quartz": "Quarzo rosa levigato", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "I ventilatori tirano da sotto", "create.tooltip.chute.contains": "Contiene: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Buco senza fondo", "create.hint.hose_pulley": "Il corpo fluido selezionato è considerato infinito.", "create.hint.mechanical_arm_no_targets.title": "Nessun bersaglio", 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 9bf53aabf..57dc32780 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: 24", + "_": "Missing Localizations: 30", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "集積回路", "item.create.iron_sheet": "鉄板", "item.create.lapis_sheet": "ラピスラズリ板", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "からくり付きトロッコ", "item.create.minecart_coupling": "トロッコ連結器", "item.create.polished_rose_quartz": "磨かれたローズクォーツ", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "ファンが下から吸い込んでいます", "create.tooltip.chute.contains": "内容物: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "底なし搬出", "create.hint.hose_pulley": "対象となる液体は無限とみなされています。", "create.hint.mechanical_arm_no_targets.title": "ターゲットが見つかりません", 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 17289ec89..2b0032b45 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: 713", + "_": "Missing Localizations: 719", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "집적 회로", "item.create.iron_sheet": "철 판", "item.create.lapis_sheet": "청금석 판", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "광산 수레 장치", "item.create.minecart_coupling": "광산 수레 커플링", "item.create.polished_rose_quartz": "윤나는 장밋빛 석영", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "선풍기가 아래에서 당김", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "목표 없음", 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 acb783a8e..a6cd4e26d 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: 1577", + "_": "Missing Localizations: 1583", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.iron_sheet": "IJzeren Platen", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index 3b4dd77cd..e52917f1b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 38", + "_": "Missing Localizations: 44", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Układ scalony", "item.create.iron_sheet": "Arkusz żelaza", "item.create.lapis_sheet": "Arkusz lazurytu", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Maszyna w wagoniku", "item.create.minecart_coupling": "Łącznik wagoników", "item.create.polished_rose_quartz": "Wypolerowany kwarc różowy", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "Wiatraki ciągną od dołu", "create.tooltip.chute.contains": "Zawiera: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Niewyczerpany zapas", "create.hint.hose_pulley": "Wybrane zbiornik cieczy jest uznany za nieskończony", "create.hint.mechanical_arm_no_targets.title": "Brak celi", 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 4d81d99bb..dc42dec85 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: 1629", + "_": "Missing Localizations: 1635", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.iron_sheet": "Placas de Ferro", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "UNLOCALIZED: Minecart Contraption", "item.create.minecart_coupling": "UNLOCALIZED: Minecart Coupling", "item.create.polished_rose_quartz": "UNLOCALIZED: Polished Rose Quartz", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "UNLOCALIZED: Fans pull from Below", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "UNLOCALIZED: No Targets", 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 1f092d472..994185e4e 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: 557", + "_": "Missing Localizations: 563", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "Интегральная схема", "item.create.iron_sheet": "Железный лист", "item.create.lapis_sheet": "Лазуритовый лист", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "Вагонеточная штуковина", "item.create.minecart_coupling": "Связыватель вагонеток", "item.create.polished_rose_quartz": "Полированный розовый кварц", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "Вентилятор тянет снизу", "create.tooltip.chute.contains": "Содержит: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Безграничное снабжение", "create.hint.hose_pulley": "Целевой водный резервуар считается бесконечным.", "create.hint.mechanical_arm_no_targets.title": "Нет целей", 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 513325f0d..2e733b1b0 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: 43", + "_": "Missing Localizations: 49", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "集成电路板", "item.create.iron_sheet": "铁板", "item.create.lapis_sheet": "青金石板", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "装配过的矿车", "item.create.minecart_coupling": "矿车连轴器", "item.create.polished_rose_quartz": "磨制玫瑰石英", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "鼓风机从下方进行吸引", "create.tooltip.chute.contains": "内含物品:%1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "无限供应", "create.hint.hose_pulley": "目标液体对象被视为无限量的。", "create.hint.mechanical_arm_no_targets.title": "没有目标", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 8b3a4f40a..5514b4f70 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 662", + "_": "Missing Localizations: 668", "_": "->------------------------] Game Elements [------------------------<-", @@ -475,6 +475,7 @@ "item.create.integrated_circuit": "IC板", "item.create.iron_sheet": "鐵板", "item.create.lapis_sheet": "青金石板", + "item.create.linked_controller": "UNLOCALIZED: Linked Controller", "item.create.minecart_contraption": "裝修過的礦車", "item.create.minecart_coupling": "礦車連結器", "item.create.polished_rose_quartz": "磨製玫瑰石英", @@ -1105,6 +1106,12 @@ "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", + "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "UNLOCALIZED: Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "沒有目標", diff --git a/src/generated/resources/assets/create/models/item/linked_controller.json b/src/generated/resources/assets/create/models/item/linked_controller.json new file mode 100644 index 000000000..6bf114f21 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/linked_controller.json @@ -0,0 +1,3 @@ +{ + "parent": "create:item/linked_controller/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/AllContainerTypes.java b/src/main/java/com/simibubi/create/AllContainerTypes.java index 2e5e87d8d..e171543a9 100644 --- a/src/main/java/com/simibubi/create/AllContainerTypes.java +++ b/src/main/java/com/simibubi/create/AllContainerTypes.java @@ -2,6 +2,8 @@ package com.simibubi.create; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateContainer; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; +import com.simibubi.create.content.logistics.item.LinkedControllerContainer; +import com.simibubi.create.content.logistics.item.LinkedControllerScreen; import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer; import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; import com.simibubi.create.content.logistics.item.filter.FilterContainer; @@ -35,6 +37,9 @@ public class AllContainerTypes { public static final ContainerEntry ATTRIBUTE_FILTER = register("attribute_filter", AttributeFilterContainer::new, () -> AttributeFilterScreen::new); + + public static final ContainerEntry LINKED_CONTROLLER = + register("linked_controller", LinkedControllerContainer::new, () -> LinkedControllerScreen::new); private static > ContainerEntry register(String name, ForgeContainerFactory factory, NonNullSupplier> screenFactory) { return Create.registrate().container(name, factory, screenFactory).register(); diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 901ab6710..25a418064 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -41,6 +41,8 @@ import com.simibubi.create.content.curiosities.tools.SandPaperItem; import com.simibubi.create.content.curiosities.tools.SandPaperItemRenderer.SandPaperModel; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperItem; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperModel; +import com.simibubi.create.content.logistics.item.LinkedControllerItem; +import com.simibubi.create.content.logistics.item.LinkedControllerModel; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.schematics.item.SchematicAndQuillItem; import com.simibubi.create.content.schematics.item.SchematicItem; @@ -227,6 +229,12 @@ public class AllItems { .lang("Creative Worldshaper") .model(AssetLookup.itemModelWithPartials()) .register(); + + public static final ItemEntry LINKED_CONTROLLER = + REGISTRATE.item("linked_controller", LinkedControllerItem::new) + .transform(CreateRegistrate.customRenderedItem(() -> LinkedControllerModel::new)) + .model(AssetLookup.itemModelWithPartials()) + .register(); public static final ItemEntry MINECART_CONTRAPTION = REGISTRATE.item("minecart_contraption", MinecartContraptionItem::rideable) diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java index 1caccf3d5..3bd7cebd9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GoggleOverlayRenderer.java @@ -172,8 +172,8 @@ public class GoggleOverlayRenderer { ms.pop(); } - private static final class TooltipScreen extends Screen { - private TooltipScreen(ITextComponent p_i51108_1_) { + public static final class TooltipScreen extends Screen { + public TooltipScreen(ITextComponent p_i51108_1_) { super(p_i51108_1_); } diff --git a/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java b/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java new file mode 100644 index 000000000..34286e6f6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/IRedstoneLinkable.java @@ -0,0 +1,23 @@ +package com.simibubi.create.content.logistics; + +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; + +import net.minecraft.util.math.BlockPos; + +public interface IRedstoneLinkable { + + public int getTransmittedStrength(); + + public void setReceivedStrength(int power); + + public boolean isListening(); + + public boolean isAlive(); + + public Pair getNetworkKey(); + + public BlockPos getLocation(); + +} 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 867a9edf5..38ab8b08c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/RedstoneLinkNetworkHandler.java @@ -18,11 +18,11 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.world.IWorld; -import net.minecraft.world.World; public class RedstoneLinkNetworkHandler { - static final Map, Set>> connections = new IdentityHashMap<>(); + static final Map, Set>> connections = + new IdentityHashMap<>(); public static class Frequency { public static final Frequency EMPTY = new Frequency(ItemStack.EMPTY); @@ -60,7 +60,7 @@ public class RedstoneLinkNetworkHandler { if (this == obj) return true; return obj instanceof Frequency ? ((Frequency) obj).item == item && ((Frequency) obj).color == color - : false; + : false; } } @@ -75,45 +75,40 @@ public class RedstoneLinkNetworkHandler { Create.LOGGER.debug("Removed Redstone Network Space for " + WorldHelper.getDimensionID(world)); } - public Set getNetworkOf(LinkBehaviour actor) { - Map, Set> networksInWorld = networksIn(actor.getWorld()); + public Set getNetworkOf(IWorld world, IRedstoneLinkable actor) { + Map, Set> networksInWorld = networksIn(world); Pair key = actor.getNetworkKey(); if (!networksInWorld.containsKey(key)) networksInWorld.put(key, new LinkedHashSet<>()); return networksInWorld.get(key); } - public void addToNetwork(LinkBehaviour actor) { - getNetworkOf(actor).add(actor); - updateNetworkOf(actor); + public void addToNetwork(IWorld world, IRedstoneLinkable actor) { + getNetworkOf(world, actor).add(actor); + updateNetworkOf(world, actor); } - public void removeFromNetwork(LinkBehaviour actor) { - Set network = getNetworkOf(actor); + public void removeFromNetwork(IWorld world, IRedstoneLinkable actor) { + Set network = getNetworkOf(world, actor); network.remove(actor); if (network.isEmpty()) { - networksIn(actor.getWorld()).remove(actor.getNetworkKey()); + networksIn(world).remove(actor.getNetworkKey()); return; } - updateNetworkOf(actor); + updateNetworkOf(world, actor); } - public void updateNetworkOf(LinkBehaviour actor) { - Set network = getNetworkOf(actor); + public void updateNetworkOf(IWorld world, IRedstoneLinkable actor) { + Set network = getNetworkOf(world, actor); int power = 0; - for (Iterator iterator = network.iterator(); iterator.hasNext();) { - LinkBehaviour other = iterator.next(); - if (other.tileEntity.isRemoved()) { + for (Iterator iterator = network.iterator(); iterator.hasNext();) { + IRedstoneLinkable other = iterator.next(); + if (!other.isAlive()) { iterator.remove(); continue; } - World world = actor.getWorld(); - if (!world.isBlockPresent(other.tileEntity.getPos())) { - iterator.remove(); - continue; - } - if (world.getTileEntity(other.tileEntity.getPos()) != other.tileEntity) { + if (!world.isAreaLoaded(other.getLocation(), 0)) { iterator.remove(); continue; } @@ -124,28 +119,31 @@ public class RedstoneLinkNetworkHandler { power = Math.max(other.getTransmittedStrength(), power); } - // fix one-to-one loading order problem - if (actor.isListening()) { - actor.newPosition = true; - actor.updateReceiver(power); + if (actor instanceof LinkBehaviour) { + LinkBehaviour linkBehaviour = (LinkBehaviour) actor; + // fix one-to-one loading order problem + if (linkBehaviour.isListening()) { + linkBehaviour.newPosition = true; + linkBehaviour.setReceivedStrength(power); + } } - for (LinkBehaviour other : network) { + for (IRedstoneLinkable other : network) { if (other != actor && other.isListening() && withinRange(actor, other)) - other.updateReceiver(power); + other.setReceivedStrength(power); } } - public static boolean withinRange(LinkBehaviour from, LinkBehaviour to) { + public static boolean withinRange(IRedstoneLinkable from, IRedstoneLinkable to) { if (from == to) return true; - return from.getPos().withinDistance(to.getPos(), AllConfigs.SERVER.logistics.linkRange.get()); + return from.getLocation() + .withinDistance(to.getLocation(), AllConfigs.SERVER.logistics.linkRange.get()); } - public Map, Set> networksIn(IWorld world) { + public Map, Set> networksIn(IWorld world) { if (!connections.containsKey(world)) { - Create.LOGGER.warn( - "Tried to Access unprepared network space of " + WorldHelper.getDimensionID(world)); + Create.LOGGER.warn("Tried to Access unprepared network space of " + WorldHelper.getDimensionID(world)); return new HashMap<>(); } return connections.get(world); diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java new file mode 100644 index 000000000..c3c7cc060 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerBindPacket.java @@ -0,0 +1,55 @@ +package com.simibubi.create.content.logistics.item; + +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.items.ItemStackHandler; + +public class LinkedControllerBindPacket extends LinkedControllerPacketBase { + + private int button; + private BlockPos linkLocation; + + public LinkedControllerBindPacket(int button, BlockPos linkLocation) { + this.button = button; + this.linkLocation = linkLocation; + } + + public LinkedControllerBindPacket(PacketBuffer buffer) { + this.button = buffer.readVarInt(); + this.linkLocation = buffer.readBlockPos(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeVarInt(button); + buffer.writeBlockPos(linkLocation); + } + + @Override + protected void handle(ServerPlayerEntity player, ItemStack heldItem) { + ItemStackHandler frequencyItems = LinkedControllerItem.getFrequencyItems(heldItem); + LinkBehaviour linkBehaviour = TileEntityBehaviour.get(player.world, linkLocation, LinkBehaviour.TYPE); + if (linkBehaviour == null) + return; + + Pair pair = linkBehaviour.getNetworkKey(); + frequencyItems.setStackInSlot(button * 2, pair.getKey() + .getStack() + .copy()); + frequencyItems.setStackInSlot(button * 2 + 1, pair.getValue() + .getStack() + .copy()); + + heldItem.getTag() + .put("Items", frequencyItems.serializeNBT()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java new file mode 100644 index 000000000..d37eb293a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java @@ -0,0 +1,225 @@ +package com.simibubi.create.content.logistics.item; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Vector; + +import org.lwjgl.glfw.GLFW; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllItems; +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.goggles.GoggleOverlayRenderer.TooltipScreen; +import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.linked.LinkBehaviour; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.client.GameSettings; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.client.util.InputMappings; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; + +public class LinkedControllerClientHandler { + + enum Mode { + IDLE, ACTIVE, BIND + } + + public static Mode MODE = Mode.IDLE; + public static int PACKET_RATE = 5; + public static Collection currentlyPressed = new HashSet<>(); + private static BlockPos selectedLocation = BlockPos.ZERO; + private static Vector controls; + + private static int packetCooldown; + + public static Vector getControls() { + if (controls == null) { + GameSettings gameSettings = Minecraft.getInstance().gameSettings; + controls = new Vector<>(6); + controls.add(gameSettings.keyBindForward); + controls.add(gameSettings.keyBindBack); + controls.add(gameSettings.keyBindLeft); + controls.add(gameSettings.keyBindRight); + controls.add(gameSettings.keyBindJump); + controls.add(gameSettings.keySneak); + } + return controls; + } + + public static void toggleBindMode(BlockPos location) { + if (MODE == Mode.IDLE) { + MODE = Mode.BIND; + selectedLocation = location; + } else { + MODE = Mode.IDLE; + onReset(); + } + } + + public static void toggle() { + if (MODE == Mode.IDLE) + MODE = Mode.ACTIVE; + else { + MODE = Mode.IDLE; + onReset(); + } + } + + protected static void onReset() { + getControls().forEach(kb -> kb.setPressed(isActuallyPressed(kb))); + packetCooldown = 0; + selectedLocation = BlockPos.ZERO; + + if (!currentlyPressed.isEmpty()) + AllPackets.channel.sendToServer(new LinkedControllerInputPacket(currentlyPressed, false)); + currentlyPressed.clear(); + } + + protected static boolean isActuallyPressed(KeyBinding kb) { + return InputMappings.isKeyDown(Minecraft.getInstance() + .getWindow() + .getHandle(), + kb.getKey() + .getKeyCode()); + } + + public static void tick() { + LinkedControllerItemRenderer.tick(); + if (MODE == Mode.IDLE) + return; + if (packetCooldown > 0) + packetCooldown--; + + Minecraft mc = Minecraft.getInstance(); + ClientPlayerEntity player = mc.player; + ItemStack heldItem = player.getHeldItemMainhand(); + + if (mc.gameSettings.keyBindInventory.isPressed() || InputMappings.isKeyDown(mc.getWindow() + .getHandle(), GLFW.GLFW_KEY_ESCAPE)) { + MODE = Mode.IDLE; + onReset(); + return; + } + + if (!AllItems.LINKED_CONTROLLER.isIn(heldItem)) { + heldItem = player.getHeldItemOffhand(); + if (!AllItems.LINKED_CONTROLLER.isIn(heldItem)) { + MODE = Mode.IDLE; + onReset(); + return; + } + } + + Vector controls = getControls(); + Collection pressedKeys = new HashSet<>(); + for (int i = 0; i < controls.size(); i++) { + if (isActuallyPressed(controls.get(i))) + pressedKeys.add(i); + } + + Collection newKeys = new HashSet<>(pressedKeys); + Collection releasedKeys = currentlyPressed; + newKeys.removeAll(releasedKeys); + releasedKeys.removeAll(pressedKeys); + + if (MODE == Mode.ACTIVE) { + // Released Keys + if (!releasedKeys.isEmpty()) + AllPackets.channel.sendToServer(new LinkedControllerInputPacket(releasedKeys, false)); + + // Newly Pressed Keys + if (!newKeys.isEmpty()) { + AllPackets.channel.sendToServer(new LinkedControllerInputPacket(newKeys, true)); + packetCooldown = PACKET_RATE; + } + + // Keepalive Pressed Keys + if (packetCooldown == 0) { + if (!pressedKeys.isEmpty()) { + AllPackets.channel.sendToServer(new LinkedControllerInputPacket(pressedKeys, true)); + packetCooldown = PACKET_RATE; + } + } + } + + if (MODE == Mode.BIND) { + VoxelShape shape = mc.world.getBlockState(selectedLocation) + .getShape(mc.world, selectedLocation); + if (!shape.isEmpty()) + CreateClient.OUTLINER.showAABB("controller", shape.getBoundingBox() + .offset(selectedLocation)) + .colored(0xB73C2D) + .lineWidth(1 / 16f); + + for (Integer integer : newKeys) { + LinkBehaviour linkBehaviour = TileEntityBehaviour.get(mc.world, selectedLocation, LinkBehaviour.TYPE); + if (linkBehaviour != null) { + AllPackets.channel.sendToServer(new LinkedControllerBindPacket(integer, selectedLocation)); + Lang.sendStatus(mc.player, "linked_controller.key_bound", controls.get(integer) + .getBoundKeyLocalizedText() + .getString()); + } + MODE = Mode.IDLE; + break; + } + } + + currentlyPressed = pressedKeys; + controls.forEach(kb -> kb.setPressed(false)); + } + + public static void renderOverlay(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, + float partialTicks) { + if (MODE != Mode.BIND) + return; + Minecraft mc = Minecraft.getInstance(); + + ms.push(); + Screen tooltipScreen = new TooltipScreen(null); + tooltipScreen.init(mc, mc.getWindow() + .getScaledWidth(), + mc.getWindow() + .getScaledHeight()); + + Object[] keys = new Object[6]; + Vector controls = getControls(); + for (int i = 0; i < controls.size(); i++) { + KeyBinding keyBinding = controls.get(i); + keys[i] = keyBinding.getBoundKeyLocalizedText() + .getString(); + } + + List list = new ArrayList<>(); + list.add(Lang.createTranslationTextComponent("linked_controller.bind_mode") + .formatted(TextFormatting.GOLD)); + list.addAll( + TooltipHelper.cutTextComponent(Lang.createTranslationTextComponent("linked_controller.press_keybind", keys), + TextFormatting.GRAY, TextFormatting.GRAY)); + + int width = 0; + int height = list.size() * mc.fontRenderer.FONT_HEIGHT; + for (ITextComponent iTextComponent : list) + width = Math.max(width, mc.fontRenderer.getWidth(iTextComponent)); + int x = (tooltipScreen.width / 3) - width / 2; + int y = tooltipScreen.height - height; + + tooltipScreen.renderTooltip(ms, list, x, y); + + ms.pop(); + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java new file mode 100644 index 000000000..5f834d46b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerContainer.java @@ -0,0 +1,152 @@ +package com.simibubi.create.content.logistics.item; + +import com.simibubi.create.foundation.gui.IClearableContainer; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.container.ClickType; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.ContainerType; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.SlotItemHandler; + +public class LinkedControllerContainer extends Container implements IClearableContainer { + + public PlayerEntity player; + protected PlayerInventory playerInventory; + public ItemStack mainItem; + public ItemStackHandler filterInventory; + + public LinkedControllerContainer(ContainerType type, int id, PlayerInventory inv, PacketBuffer extraData) { + this(type, id, inv, extraData.readItemStack()); + } + + public LinkedControllerContainer(ContainerType type, int id, PlayerInventory inv, ItemStack filterItem) { + super(type, id); + player = inv.player; + playerInventory = inv; + this.mainItem = filterItem; + init(); + } + + protected void init() { + this.filterInventory = createFilterInventory(); +// readData(mainItem); + addPlayerSlots(); + addLinkSlots(); + detectAndSendChanges(); + } + + @Override + public void clearContents() { + for (int i = 0; i < filterInventory.getSlots(); i++) + filterInventory.setStackInSlot(i, ItemStack.EMPTY); + } + + protected void addPlayerSlots() { + int x = 22; + int y = 142; + + for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) + this.addSlot(new Slot(playerInventory, hotbarSlot, x + hotbarSlot * 18, y + 58)); + for (int row = 0; row < 3; ++row) + for (int col = 0; col < 9; ++col) + this.addSlot(new Slot(playerInventory, col + row * 9 + 9, x + col * 18, y + row * 18)); + } + + protected void addLinkSlots() { + int slot = 0; + int x = 12; + int y = 44; + + for (int column = 0; column < 6; column++) { + for (int row = 0; row < 2; ++row) + addSlot(new SlotItemHandler(filterInventory, slot++, x, y + row * 18)); + x += 24; + if (column == 3) + x += 11; + } + } + + @Override + public boolean canMergeSlot(ItemStack stack, Slot slotIn) { + return canDragIntoSlot(slotIn); + } + + @Override + public boolean canDragIntoSlot(Slot slotIn) { + return slotIn.inventory == playerInventory; + } + + @Override + public boolean canInteractWith(PlayerEntity playerIn) { + return true; + } + + @Override + public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, PlayerEntity player) { + if (slotId == playerInventory.currentItem && clickTypeIn != ClickType.THROW) + return ItemStack.EMPTY; + + ItemStack held = playerInventory.getItemStack(); + if (slotId < 36) + return super.slotClick(slotId, dragType, clickTypeIn, player); + if (clickTypeIn == ClickType.THROW) + return ItemStack.EMPTY; + + int slot = slotId - 36; + if (clickTypeIn == ClickType.CLONE) { + if (player.isCreative() && held.isEmpty()) { + ItemStack stackInSlot = filterInventory.getStackInSlot(slot) + .copy(); + stackInSlot.setCount(64); + playerInventory.setItemStack(stackInSlot); + return ItemStack.EMPTY; + } + return ItemStack.EMPTY; + } + + if (held.isEmpty()) { + filterInventory.setStackInSlot(slot, ItemStack.EMPTY); + return ItemStack.EMPTY; + } + + ItemStack insert = held.copy(); + insert.setCount(1); + filterInventory.setStackInSlot(slot, insert); + return held; + } + + protected ItemStackHandler createFilterInventory() { + return LinkedControllerItem.getFrequencyItems(mainItem); + } + + @Override + public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) { + if (index < 36) { + ItemStack stackToInsert = playerInventory.getStackInSlot(index); + for (int i = 0; i < filterInventory.getSlots(); i++) { + ItemStack stack = filterInventory.getStackInSlot(i); + if (stack.isEmpty()) { + ItemStack copy = stackToInsert.copy(); + copy.setCount(1); + filterInventory.insertItem(i, copy, false); + break; + } + } + } else + filterInventory.extractItem(index - 36, 1, false); + return ItemStack.EMPTY; + } + + @Override + public void onContainerClosed(PlayerEntity playerIn) { + super.onContainerClosed(playerIn); + mainItem.getOrCreateTag() + .put("Items", filterInventory.serializeNBT()); +// saveData(filterItem); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java new file mode 100644 index 000000000..7d70ed4f9 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerInputPacket.java @@ -0,0 +1,50 @@ +package com.simibubi.create.content.logistics.item; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.UUID; +import java.util.stream.Collectors; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class LinkedControllerInputPacket extends LinkedControllerPacketBase { + + private Collection activatedButtons; + private boolean press; + + public LinkedControllerInputPacket(Collection activatedButtons, boolean press) { + this.activatedButtons = activatedButtons; + this.press = press; + } + + public LinkedControllerInputPacket(PacketBuffer buffer) { + activatedButtons = new ArrayList<>(); + press = buffer.readBoolean(); + int size = buffer.readVarInt(); + for (int i = 0; i < size; i++) + activatedButtons.add(buffer.readVarInt()); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeBoolean(press); + buffer.writeVarInt(activatedButtons.size()); + activatedButtons.forEach(buffer::writeVarInt); + } + + @Override + protected void handle(ServerPlayerEntity player, ItemStack heldItem) { + World world = player.getEntityWorld(); + UUID uniqueID = player.getUniqueID(); + BlockPos pos = player.getBlockPos(); + + LinkedControllerServerHandler.receivePressed(world, pos, uniqueID, activatedButtons.stream() + .map(i -> LinkedControllerItem.toFrequency(heldItem, i)) + .collect(Collectors.toList()), press); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java new file mode 100644 index 000000000..882c3bcc7 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItem.java @@ -0,0 +1,116 @@ +package com.simibubi.create.content.logistics.item; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllContainerTypes; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; +import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; +import com.simibubi.create.foundation.utility.Couple; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.inventory.container.Container; +import net.minecraft.inventory.container.INamedContainerProvider; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemUseContext; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ActionResult; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.Hand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.items.ItemStackHandler; + +public class LinkedControllerItem extends Item implements INamedContainerProvider { + + public LinkedControllerItem(Properties p_i48487_1_) { + super(p_i48487_1_); + } + + @Override + public ActionResultType onItemUse(ItemUseContext ctx) { + PlayerEntity player = ctx.getPlayer(); + if (player == null) + return ActionResultType.PASS; + World world = ctx.getWorld(); + + if (!player.isSneaking() && player.isAllowEdit() + && AllBlocks.REDSTONE_LINK.has(world.getBlockState(ctx.getPos()))) { + if (world.isRemote) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.toggleBindMode(ctx.getPos())); + player.getCooldownTracker() + .setCooldown(this, 2); + return ActionResultType.SUCCESS; + } + + return onItemRightClick(world, player, ctx.getHand()).getType(); + } + + @Override + public ActionResult onItemRightClick(World world, PlayerEntity player, Hand hand) { + ItemStack heldItem = player.getHeldItem(hand); + + if (player.isSneaking() && hand == Hand.MAIN_HAND) { + if (!world.isRemote && player instanceof ServerPlayerEntity && player.isAllowEdit()) + NetworkHooks.openGui((ServerPlayerEntity) player, this, buf -> { + buf.writeItemStack(heldItem); + }); + return ActionResult.success(heldItem); + } + + if (!player.isSneaking()) { + if (world.isRemote) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> this::toggleActive); + player.getCooldownTracker() + .setCooldown(this, 2); + } + + return ActionResult.pass(heldItem); + } + + @OnlyIn(Dist.CLIENT) + private void toggleBindMode(BlockPos pos) { + LinkedControllerClientHandler.toggleBindMode(pos); + } + + @OnlyIn(Dist.CLIENT) + private void toggleActive() { + LinkedControllerClientHandler.toggle(); + } + + public static ItemStackHandler getFrequencyItems(ItemStack stack) { + ItemStackHandler newInv = new ItemStackHandler(12); + if (AllItems.LINKED_CONTROLLER.get() != stack.getItem()) + throw new IllegalArgumentException("Cannot get frequency items from non-controller: " + stack); + CompoundNBT invNBT = stack.getOrCreateChildTag("Items"); + if (!invNBT.isEmpty()) + newInv.deserializeNBT(invNBT); + return newInv; + } + + public static Couple toFrequency(ItemStack controller, int slot) { + ItemStackHandler frequencyItems = getFrequencyItems(controller); + return Couple.create(Frequency.of(frequencyItems.getStackInSlot(slot * 2)), + Frequency.of(frequencyItems.getStackInSlot(slot * 2 + 1))); + } + + @Override + public Container createMenu(int id, PlayerInventory inv, PlayerEntity player) { + ItemStack heldItem = player.getHeldItemMainhand(); + return new LinkedControllerContainer(AllContainerTypes.LINKED_CONTROLLER.get(), id, inv, heldItem); + } + + @Override + public ITextComponent getDisplayName() { + return new TranslationTextComponent(getTranslationKey()); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java new file mode 100644 index 000000000..2155442ec --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerItemRenderer.java @@ -0,0 +1,134 @@ +package com.simibubi.create.content.logistics.item; + +import java.util.Vector; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler.Mode; +import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; +import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemCameraTransforms; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; +import net.minecraft.item.ItemStack; +import net.minecraft.util.HandSide; +import net.minecraft.util.math.MathHelper; + +public class LinkedControllerItemRenderer extends CustomRenderedItemModelRenderer { + + static LerpedFloat equipProgress; + static Vector buttons; + + static { + equipProgress = LerpedFloat.linear() + .startWithValue(0); + buttons = new Vector<>(6); + for (int i = 0; i < 6; i++) + buttons.add(LerpedFloat.linear() + .startWithValue(0)); + } + + static void tick() { + boolean active = LinkedControllerClientHandler.MODE != Mode.IDLE; + equipProgress.chase(active ? 1 : 0, .2f, Chaser.EXP); + equipProgress.tickChaser(); + + if (!active) + return; + + for (int i = 0; i < buttons.size(); i++) { + LerpedFloat lerpedFloat = buttons.get(i); + lerpedFloat.chase(LinkedControllerClientHandler.currentlyPressed.contains(i) ? 1 : 0, .4f, Chaser.EXP); + lerpedFloat.tickChaser(); + } + } + + @Override + protected void render(ItemStack stack, LinkedControllerModel model, PartialItemModelRenderer renderer, + ItemCameraTransforms.TransformType transformType, MatrixStack ms, IRenderTypeBuffer buffer, int light, + int overlay) { + float pt = AnimationTickHolder.getPartialTicks(); + MatrixStacker msr = MatrixStacker.of(ms); + + ms.push(); + + Minecraft mc = Minecraft.getInstance(); + boolean rightHanded = mc.gameSettings.mainHand == HandSide.RIGHT; + TransformType mainHand = + rightHanded ? TransformType.FIRST_PERSON_RIGHT_HAND : TransformType.FIRST_PERSON_LEFT_HAND; + TransformType offHand = + rightHanded ? TransformType.FIRST_PERSON_LEFT_HAND : TransformType.FIRST_PERSON_RIGHT_HAND; + + boolean active = false; + boolean noControllerInMain = !AllItems.LINKED_CONTROLLER.isIn(mc.player.getHeldItemMainhand()); + + if (transformType == mainHand || (transformType == offHand && noControllerInMain)) { + float equip = equipProgress.getValue(pt); + int handModifier = transformType == TransformType.FIRST_PERSON_LEFT_HAND ? -1 : 1; + msr.translate(0, equip / 4, equip / 4 * handModifier); + msr.rotateY(equip * -30 * handModifier); + msr.rotateZ(equip * -30); + active = true; + } + + if (transformType == TransformType.GUI) { + if (stack == mc.player.getHeldItemMainhand()) + active = true; + if (stack == mc.player.getHeldItemOffhand() && noControllerInMain) + active = true; + } + + active &= LinkedControllerClientHandler.MODE != Mode.IDLE; + renderer.render(active ? model.getPartial("powered") : model.getOriginalModel(), light); + + if (!active) { + ms.pop(); + return; + } + + IBakedModel button = model.getPartial("button"); + float s = 1 / 16f; + float b = s * -.75f; + int index = 0; + + if (LinkedControllerClientHandler.MODE == Mode.BIND) { + int i = (int) MathHelper.lerp((MathHelper.sin(AnimationTickHolder.getRenderTime() / 4f) + 1) / 2, 5, 15); + light = i << 20; + } + + ms.push(); + msr.translate(2 * s, 0, 8 * s); + button(renderer, ms, light, pt, button, b, index++); + msr.translate(4 * s, 0, 0); + button(renderer, ms, light, pt, button, b, index++); + msr.translate(-2 * s, 0, 2 * s); + button(renderer, ms, light, pt, button, b, index++); + msr.translate(0, 0, -4 * s); + button(renderer, ms, light, pt, button, b, index++); + ms.pop(); + + msr.translate(3 * s, 0, 3 * s); + button(renderer, ms, light, pt, button, b, index++); + msr.translate(2 * s, 0, 0); + button(renderer, ms, light, pt, button, b, index++); + + ms.pop(); + } + + protected void button(PartialItemModelRenderer renderer, MatrixStack ms, int light, float pt, IBakedModel button, + float b, int index) { + ms.push(); + ms.translate(0, b * buttons.get(index) + .getValue(pt), 0); + renderer.renderSolid(button, light); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerModel.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerModel.java new file mode 100644 index 000000000..075880dfd --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerModel.java @@ -0,0 +1,20 @@ +package com.simibubi.create.content.logistics.item; + +import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.tileentity.ItemStackTileEntityRenderer; + +public class LinkedControllerModel extends CustomRenderedItemModel { + + public LinkedControllerModel(IBakedModel template) { + super(template, "linked_controller"); + addPartials("powered", "button"); + } + + @Override + public ItemStackTileEntityRenderer createRenderer() { + return new LinkedControllerItemRenderer(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java new file mode 100644 index 000000000..bbc5918c4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerPacketBase.java @@ -0,0 +1,37 @@ +package com.simibubi.create.content.logistics.item; + +import java.util.function.Supplier; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public abstract class LinkedControllerPacketBase extends SimplePacketBase { + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity player = context.get() + .getSender(); + if (player == null) + return; + + ItemStack heldItem = player.getHeldItemMainhand(); + if (!AllItems.LINKED_CONTROLLER.isIn(heldItem)) { + heldItem = player.getHeldItemOffhand(); + if (!AllItems.LINKED_CONTROLLER.isIn(heldItem)) + return; + } + handle(player, heldItem); + }); + context.get() + .setPacketHandled(true); + } + + protected abstract void handle(ServerPlayerEntity player, ItemStack heldItem); + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java new file mode 100644 index 000000000..24a7acab3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerScreen.java @@ -0,0 +1,134 @@ +package com.simibubi.create.content.logistics.item; + +import static com.simibubi.create.foundation.gui.AllGuiTextures.PLAYER_INVENTORY; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.widgets.IconButton; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.client.renderer.Rectangle2d; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; + +public class LinkedControllerScreen extends AbstractSimiContainerScreen { + + protected AllGuiTextures background; + private List extraAreas = Collections.emptyList(); + + private IconButton resetButton; + private IconButton confirmButton; + + public LinkedControllerScreen(LinkedControllerContainer container, PlayerInventory inv, ITextComponent title) { + super(container, inv, title); + this.background = AllGuiTextures.LINKED_CONTROLLER; + } + + @Override + protected void drawMouseoverTooltip(MatrixStack ms, int x, int y) { + if (!this.client.player.inventory.getItemStack() + .isEmpty() || this.hoveredSlot == null || this.hoveredSlot.getHasStack()) { + super.drawMouseoverTooltip(ms, x, y); + return; + } + renderWrappedToolTip(ms, addToTooltip(new LinkedList<>(), hoveredSlot.getSlotIndex()), x, y, textRenderer); + } + + @Override + public List getTooltipFromItem(ItemStack stack) { + List list = super.getTooltipFromItem(stack); + return hoveredSlot != null ? addToTooltip(list, hoveredSlot.getSlotIndex()) : list; + } + + private List addToTooltip(List list, int slot) { + if (slot < 0 || slot >= 12) + return list; + list.add(Lang + .createTranslationTextComponent("linked_controller.frequency_slot_" + ((slot % 2) + 1), + LinkedControllerClientHandler.getControls() + .get(slot / 2) + .getBoundKeyLocalizedText() + .getString()) + .formatted(TextFormatting.GOLD)); + return list; + } + + @Override + protected void init() { + setWindowSize(PLAYER_INVENTORY.width + 50, background.height + PLAYER_INVENTORY.height + 20); + super.init(); + widgets.clear(); + int x = guiLeft - 50; + int offset = guiTop < 30 ? 30 - guiTop : 0; + extraAreas = + ImmutableList.of(new Rectangle2d(x, guiTop + offset, background.width + 70, background.height - offset)); + + resetButton = new IconButton(x + background.width - 12, guiTop + background.height - 14, AllIcons.I_TRASH); + confirmButton = new IconButton(x + background.width + 16, guiTop + background.height - 14, AllIcons.I_CONFIRM); + + widgets.add(resetButton); + widgets.add(confirmButton); + } + + @Override + protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) { + int x = guiLeft; + int y = guiTop + 10; + background.draw(ms, this, x, y); + + int invX = guiLeft + 14; + int invY = y + background.height + 5; + PLAYER_INVENTORY.draw(ms, this, invX, invY); + textRenderer.draw(ms, playerInventory.getDisplayName(), invX + 7, invY + 6, 0x666666); + textRenderer.draw(ms, I18n.format(container.mainItem.getTranslationKey()), x + 15, y + 4, 0x442000); + + GuiGameElement.of(container.mainItem).at(x + background.width - 8, guiTop + background.height - 53, -200) + .scale(5) + .render(ms); + + } + + @Override + public void tick() { + super.tick(); + if (!container.player.getHeldItemMainhand() + .equals(container.mainItem, false)) + client.player.closeScreen(); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + boolean mouseClicked = super.mouseClicked(x, y, button); + + if (button == 0) { + if (confirmButton.isHovered()) { + client.player.closeScreen(); + return true; + } + if (resetButton.isHovered()) { + container.clearContents(); + container.sendClearPacket(); + return true; + } + } + + return mouseClicked; + } + + @Override + public List getExtraAreas() { + return extraAreas; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java new file mode 100644 index 000000000..8e35e0cb6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerServerHandler.java @@ -0,0 +1,123 @@ +package com.simibubi.create.content.logistics.item; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; + +import org.apache.commons.lang3.tuple.Pair; + +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.IRedstoneLinkable; +import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.WorldAttached; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; + +public class LinkedControllerServerHandler { + + public static WorldAttached>> receivedInputs = + new WorldAttached<>(HashMap::new); + static final int TIMEOUT = 30; + + public static void tick(IWorld world) { + Map> map = receivedInputs.get(world); + for (Iterator>> iterator = map.entrySet() + .iterator(); iterator.hasNext();) { + + Entry> entry = iterator.next(); + Collection list = entry.getValue(); + + for (Iterator entryIterator = list.iterator(); entryIterator.hasNext();) { + ManualFrequencyEntry manualFrequencyEntry = entryIterator.next(); + manualFrequencyEntry.decrement(); + if (!manualFrequencyEntry.isAlive()) { + Create.REDSTONE_LINK_NETWORK_HANDLER.removeFromNetwork(world, manualFrequencyEntry); + entryIterator.remove(); + } + } + + if (list.isEmpty()) + iterator.remove(); + } + } + + public static void receivePressed(IWorld world, BlockPos pos, UUID uniqueID, List> collect, + boolean pressed) { + Map> map = receivedInputs.get(world); + Collection list = map.computeIfAbsent(uniqueID, $ -> new ArrayList<>()); + + WithNext: for (Couple activated : collect) { + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + ManualFrequencyEntry entry = iterator.next(); + if (entry.getSecond() + .equals(activated)) { + if (!pressed) + entry.setFirst(0); + else + entry.updatePosition(pos); + continue WithNext; + } + } + + if (!pressed) + continue; + + ManualFrequencyEntry entry = new ManualFrequencyEntry(pos, activated); + Create.REDSTONE_LINK_NETWORK_HANDLER.addToNetwork(world, entry); + list.add(entry); + } + } + + static class ManualFrequencyEntry extends IntAttached> implements IRedstoneLinkable { + + private BlockPos pos; + + public ManualFrequencyEntry(BlockPos pos, Couple second) { + super(TIMEOUT, second); + this.pos = pos; + } + + public void updatePosition(BlockPos pos) { + this.pos = pos; + setFirst(TIMEOUT); + } + + @Override + public int getTransmittedStrength() { + return isAlive() ? 15 : 0; + } + + @Override + public boolean isAlive() { + return getFirst() > 0; + } + + @Override + public BlockPos getLocation() { + return pos; + } + + @Override + public void setReceivedStrength(int power) {} + + @Override + public boolean isListening() { + return false; + } + + @Override + public Pair getNetworkKey() { + return Pair.of(getSecond().getFirst(), getSecond().getSecond()); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java index 1bd54d34d..ef433e77e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java @@ -1,5 +1,7 @@ package com.simibubi.create.content.logistics.item.filter; +import com.simibubi.create.foundation.gui.IClearableContainer; + import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.container.ClickType; @@ -11,7 +13,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -public abstract class AbstractFilterContainer extends Container { +public abstract class AbstractFilterContainer extends Container implements IClearableContainer { public PlayerEntity player; protected PlayerInventory playerInventory; @@ -38,7 +40,8 @@ public abstract class AbstractFilterContainer extends Container { detectAndSendChanges(); } - protected void clearContents() { + @Override + public void clearContents() { for (int i = 0; i < filterInventory.getSlots(); i++) filterInventory.setStackInSlot(i, ItemStack.EMPTY); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java index bade51cb0..de8703059 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java @@ -30,7 +30,7 @@ import net.minecraft.util.text.ITextComponent; public abstract class AbstractFilterScreen extends AbstractSimiContainerScreen { protected AllGuiTextures background; - private List extraAreas = Collections.EMPTY_LIST; + private List extraAreas = Collections.emptyList(); private IconButton resetButton; private IconButton confirmButton; @@ -146,7 +146,7 @@ public abstract class AbstractFilterScreen ex if (resetButton.isHovered()) { container.clearContents(); contentsCleared(); - sendOptionUpdate(Option.CLEAR); + container.sendClearPacket(); return true; } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java index 589f1a9e3..487f801d7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java @@ -48,7 +48,7 @@ public class AttributeFilterContainer extends AbstractFilterContainer { } @Override - protected void clearContents() { + public void clearContents() { selectedAttributes.clear(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java index 071baffa2..ac4b1c7a8 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/FilterScreenPacket.java @@ -13,7 +13,7 @@ import net.minecraftforge.fml.network.NetworkEvent.Context; public class FilterScreenPacket extends SimplePacketBase { public enum Option { - CLEAR, WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, UPDATE_FILTER_ITEM, ADD_TAG, ADD_INVERTED_TAG; + WHITELIST, WHITELIST2, BLACKLIST, RESPECT_DATA, IGNORE_DATA, UPDATE_FILTER_ITEM, ADD_TAG, ADD_INVERTED_TAG; } private final Option option; @@ -46,14 +46,6 @@ public class FilterScreenPacket extends SimplePacketBase { if (player == null) return; - if (player.openContainer instanceof AbstractFilterContainer) { - AbstractFilterContainer c = (AbstractFilterContainer) player.openContainer; - if (option == Option.CLEAR) { - c.clearContents(); - return; - } - } - if (player.openContainer instanceof FilterContainer) { FilterContainer c = (FilterContainer) player.openContainer; if (option == Option.WHITELIST) diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 37c126432..30db2de2a 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -30,6 +30,7 @@ import com.simibubi.create.content.curiosities.zapper.ZapperRenderHandler; import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler; import com.simibubi.create.content.logistics.block.depot.EjectorTargetHandler; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler; +import com.simibubi.create.content.logistics.item.LinkedControllerClientHandler; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.ui.BaseConfigScreen; import com.simibubi.create.foundation.fluid.FluidHelper; @@ -101,9 +102,11 @@ public class ClientEvents { return; if (event.phase == Phase.START) { + LinkedControllerClientHandler.tick(); AirCurrent.tickClientPlayerSounds(); return; } + SoundScapes.tick(); AnimationTickHolder.tick(); @@ -221,6 +224,7 @@ public class ClientEvents { public static void onRenderHotbar(MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay, float partialTicks) { CreateClient.SCHEMATIC_HANDLER.renderOverlay(ms, buffer, light, overlay, partialTicks); + LinkedControllerClientHandler.renderOverlay(ms, buffer, light, overlay, partialTicks); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/events/CommonEvents.java b/src/main/java/com/simibubi/create/events/CommonEvents.java index 7fcd4f57a..6664931dd 100644 --- a/src/main/java/com/simibubi/create/events/CommonEvents.java +++ b/src/main/java/com/simibubi/create/events/CommonEvents.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipe import com.simibubi.create.content.contraptions.wrench.WrenchItem; import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler; import com.simibubi.create.content.curiosities.zapper.ZapperItem; +import com.simibubi.create.content.logistics.item.LinkedControllerServerHandler; import com.simibubi.create.foundation.command.AllCommands; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -93,6 +94,7 @@ public class CommonEvents { ContraptionHandler.tick(world); CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); + LinkedControllerServerHandler.tick(world); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index db6fdea92..8055e15ce 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -57,6 +57,8 @@ public enum AllGuiTextures implements IScreenRenderable { SEQUENCER_END("sequencer.png", 0, 80, 162, 22), SEQUENCER_EMPTY("sequencer.png", 0, 102, 162, 22), SEQUENCER_AWAIT("sequencer.png", 0, 160, 162, 22), + + LINKED_CONTROLLER("curiosities2.png", 180, 109), // JEI JEI_SLOT("jei/widgets.png", 18, 18), diff --git a/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java b/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java new file mode 100644 index 000000000..4714c273c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/ClearContainerPacket.java @@ -0,0 +1,36 @@ +package com.simibubi.create.foundation.gui; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.networking.SimplePacketBase; + +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fml.network.NetworkEvent.Context; + +public class ClearContainerPacket extends SimplePacketBase { + + public ClearContainerPacket() {} + + public ClearContainerPacket(PacketBuffer buffer) {} + + @Override + public void write(PacketBuffer buffer) {} + + @Override + public void handle(Supplier context) { + context.get() + .enqueueWork(() -> { + ServerPlayerEntity player = context.get() + .getSender(); + if (player == null) + return; + if (!(player.openContainer instanceof IClearableContainer)) + return; + ((IClearableContainer) player.openContainer).clearContents(); + }); + context.get() + .setPacketHandled(true); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/IClearableContainer.java b/src/main/java/com/simibubi/create/foundation/gui/IClearableContainer.java new file mode 100644 index 000000000..eea746881 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/IClearableContainer.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.gui; + +import com.simibubi.create.foundation.networking.AllPackets; + +public interface IClearableContainer { + + default void sendClearPacket() { + AllPackets.channel.sendToServer(new ClearContainerPacket()); + } + + public void clearContents(); + +} 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 faa37475d..26cb098a5 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -28,6 +28,8 @@ import com.simibubi.create.content.logistics.block.depot.EjectorElytraPacket; import com.simibubi.create.content.logistics.block.depot.EjectorPlacementPacket; import com.simibubi.create.content.logistics.block.depot.EjectorTriggerPacket; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmPlacementPacket; +import com.simibubi.create.content.logistics.item.LinkedControllerBindPacket; +import com.simibubi.create.content.logistics.item.LinkedControllerInputPacket; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; @@ -38,9 +40,10 @@ import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; -import com.simibubi.create.foundation.command.SConfigureConfigPacket; import com.simibubi.create.foundation.command.HighlightPacket; +import com.simibubi.create.foundation.command.SConfigureConfigPacket; import com.simibubi.create.foundation.config.ui.CConfigureConfigPacket; +import com.simibubi.create.foundation.gui.ClearContainerPacket; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket; import com.simibubi.create.foundation.utility.ServerSpeedProvider; @@ -67,6 +70,7 @@ public enum AllPackets { PLAY_TO_SERVER), PLACE_SCHEMATIC(SchematicPlacePacket.class, SchematicPlacePacket::new, PLAY_TO_SERVER), UPLOAD_SCHEMATIC(SchematicUploadPacket.class, SchematicUploadPacket::new, PLAY_TO_SERVER), + CLEAR_CONTAINER(ClearContainerPacket.class, ClearContainerPacket::new, PLAY_TO_SERVER), CONFIGURE_FILTER(FilterScreenPacket.class, FilterScreenPacket::new, PLAY_TO_SERVER), CONFIGURE_FILTERING_AMOUNT(FilteringCountUpdatePacket.class, FilteringCountUpdatePacket::new, PLAY_TO_SERVER), CONFIGURE_SCROLLABLE(ScrollValueUpdatePacket.class, ScrollValueUpdatePacket::new, PLAY_TO_SERVER), @@ -81,6 +85,8 @@ public enum AllPackets { PLACE_EJECTOR(EjectorPlacementPacket.class, EjectorPlacementPacket::new, PLAY_TO_SERVER), TRIGGER_EJECTOR(EjectorTriggerPacket.class, EjectorTriggerPacket::new, PLAY_TO_SERVER), EJECTOR_ELYTRA(EjectorElytraPacket.class, EjectorElytraPacket::new, PLAY_TO_SERVER), + LINKED_CONTROLLER_INPUT(LinkedControllerInputPacket.class, LinkedControllerInputPacket::new, PLAY_TO_SERVER), + LINKED_CONTROLLER_BIND(LinkedControllerBindPacket.class, LinkedControllerBindPacket::new, PLAY_TO_SERVER), C_CONFIGURE_CONFIG(CConfigureConfigPacket.class, CConfigureConfigPacket::new, PLAY_TO_SERVER), // Server to Client diff --git a/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java b/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java index 31c129642..41cc284bd 100644 --- a/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java +++ b/src/main/java/com/simibubi/create/foundation/renderState/RenderTypes.java @@ -83,7 +83,7 @@ public class RenderTypes extends RenderState { .transparency(TRANSLUCENT_TRANSPARENCY) .diffuseLighting(ENABLE_DIFFUSE_LIGHTING) .alpha(ONE_TENTH_ALPHA) - .cull(DISABLE_CULLING) + .cull(ENABLE_CULLING) .lightmap(ENABLE_LIGHTMAP) .overlay(ENABLE_OVERLAY_COLOR) .build(true)); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java index cfba21b6b..e7d0cfac9 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java @@ -4,7 +4,6 @@ import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.block.BlockState; -import net.minecraft.item.Item; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java index 9b9ef352d..75aa226e0 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkBehaviour.java @@ -7,6 +7,7 @@ import java.util.function.IntSupplier; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.IRedstoneLinkable; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler; import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler.Frequency; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -17,9 +18,10 @@ import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; -public class LinkBehaviour extends TileEntityBehaviour { +public class LinkBehaviour extends TileEntityBehaviour implements IRedstoneLinkable { public static BehaviourType TYPE = new BehaviourType<>(); @@ -76,33 +78,37 @@ public class LinkBehaviour extends TileEntityBehaviour { frequencyLast = behaviour.frequencyLast; } + @Override public boolean isListening() { return mode == Mode.RECEIVE; } + @Override public int getTransmittedStrength() { return mode == Mode.TRANSMIT ? transmission.getAsInt() : 0; } - public void updateReceiver(int networkPower) { + @Override + public void setReceivedStrength(int networkPower) { if (!newPosition) return; signalCallback.accept(networkPower); } public void notifySignalChange() { - Create.REDSTONE_LINK_NETWORK_HANDLER.updateNetworkOf(this); + Create.REDSTONE_LINK_NETWORK_HANDLER.updateNetworkOf(getWorld(), this); } @Override public void initialize() { super.initialize(); - if (tileEntity.getWorld().isRemote) + if (getWorld().isRemote) return; - getHandler().addToNetwork(this); + getHandler().addToNetwork(getWorld(), this); newPosition = true; } + @Override public Pair getNetworkKey() { return Pair.of(frequencyFirst, frequencyLast); } @@ -110,13 +116,15 @@ public class LinkBehaviour extends TileEntityBehaviour { @Override public void remove() { super.remove(); - if (tileEntity.getWorld().isRemote) + if (getWorld().isRemote) return; - getHandler().removeFromNetwork(this); + getHandler().removeFromNetwork(getWorld(), this); } @Override - public boolean isSafeNBT() { return true; } + public boolean isSafeNBT() { + return true; + } @Override public void write(CompoundNBT nbt, boolean clientPacket) { @@ -149,7 +157,7 @@ public class LinkBehaviour extends TileEntityBehaviour { !ItemStack.areItemsEqual(stack, toCompare) || !ItemStack.areItemStackTagsEqual(stack, toCompare); if (changed) - getHandler().removeFromNetwork(this); + getHandler().removeFromNetwork(getWorld(), this); if (first) frequencyFirst = Frequency.of(stack); @@ -160,7 +168,7 @@ public class LinkBehaviour extends TileEntityBehaviour { return; tileEntity.sendData(); - getHandler().addToNetwork(this); + getHandler().addToNetwork(getWorld(), this); } @Override @@ -197,4 +205,14 @@ public class LinkBehaviour extends TileEntityBehaviour { return (first ? firstSlot : secondSlot).testHit(state, localHit); } + @Override + public boolean isAlive() { + return !tileEntity.isRemoved() && getWorld().getTileEntity(getPos()) == tileEntity; + } + + @Override + public BlockPos getLocation() { + return getPos(); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java index 30a88de18..1c5e6319f 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/linked/LinkHandler.java @@ -2,10 +2,12 @@ package com.simibubi.create.foundation.tileEntity.behaviour.linked; import java.util.Arrays; +import com.simibubi.create.AllItems; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.RaycastHelper; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; import net.minecraft.util.SoundCategory; @@ -35,14 +37,19 @@ public class LinkHandler { if (behaviour == null) return; + ItemStack heldItem = player.getHeldItem(hand); BlockRayTraceResult ray = RaycastHelper.rayTraceRange(world, player, 10); if (ray == null) return; + if (AllItems.LINKED_CONTROLLER.isIn(heldItem)) + return; + if (AllItems.WRENCH.isIn(heldItem)) + return; for (boolean first : Arrays.asList(false, true)) { if (behaviour.testHit(first, ray.getHitVec())) { - if (event.getSide() != LogicalSide.CLIENT) - behaviour.setFrequency(first, player.getHeldItem(hand)); + if (event.getSide() != LogicalSide.CLIENT) + behaviour.setFrequency(first, heldItem); event.setCanceled(true); event.setCancellationResult(ActionResultType.SUCCESS); world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, SoundCategory.BLOCKS, .25f, .1f); diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 22a691d46..ce2e8e7e6 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -464,6 +464,12 @@ "create.tooltip.chute.fans_pull_down": "Fans pull from Below", "create.tooltip.chute.contains": "Contains: %1$s x%2$s", + "create.linked_controller.bind_mode": "Bind mode active", + "create.linked_controller.press_keybind": "Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", + "create.linked_controller.key_bound": "Frequency bound to %1$s", + "create.linked_controller.frequency_slot_1": "Keybind: %1$s, Freq. #1", + "create.linked_controller.frequency_slot_2": "Keybind: %1$s, Freq. #2", + "create.hint.hose_pulley.title": "Bottomless Supply", "create.hint.hose_pulley": "The targeted body of fluid is considered infinite.", "create.hint.mechanical_arm_no_targets.title": "No Targets", diff --git a/src/main/resources/assets/create/models/item/linked_controller/button.json b/src/main/resources/assets/create/models/item/linked_controller/button.json new file mode 100644 index 000000000..9859c72ab --- /dev/null +++ b/src/main/resources/assets/create/models/item/linked_controller/button.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "create:item/linked_controller/powered", + "textures": { + "particle": "create:item/linked_controller", + "redstone_bridge": "create:item/linked_controller" + }, + "elements": [ + { + "from": [3, 1, 0.5], + "to": [5, 3, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/linked_controller/item.json b/src/main/resources/assets/create/models/item/linked_controller/item.json new file mode 100644 index 000000000..88c8e9cdc --- /dev/null +++ b/src/main/resources/assets/create/models/item/linked_controller/item.json @@ -0,0 +1,166 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna", + "particle": "create:item/linked_controller", + "redstone_bridge": "create:item/linked_controller" + }, + "elements": [ + { + "name": "Controller", + "from": [4, 0, 1.5], + "to": [12, 2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, + "east": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, + "south": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, + "west": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, + "up": {"uv": [0, 0, 13, 8], "rotation": 270, "texture": "#redstone_bridge"}, + "down": {"uv": [0, 0, 13, 8], "rotation": 90, "texture": "#redstone_bridge"} + } + }, + { + "name": "AntennaTop", + "from": [3, 6, 4.5], + "to": [4, 7, 5.5], + "rotation": {"angle": 0, "axis": "z", "origin": [4, 2, 14.5]}, + "faces": { + "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [3, 0, 3.5], + "to": [4, 8, 6.5], + "rotation": {"angle": 0, "axis": "z", "origin": [4, 2, 14.5]}, + "faces": { + "east": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaX", + "from": [2, 0, 4.5], + "to": [5, 8, 5.5], + "rotation": {"angle": 0, "axis": "z", "origin": [4, 2, 14.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"}, + "south": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} + } + }, + { + "from": [9, 1, 8.5], + "to": [11, 3, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + }, + { + "from": [5, 1, 8.5], + "to": [7, 3, 10.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + }, + { + "from": [7, 1, 10.5], + "to": [9, 3, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + }, + { + "from": [7, 1, 6.5], + "to": [9, 3, 8.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + }, + { + "from": [8, 1, 3.5], + "to": [10, 3, 5.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + }, + { + "from": [6, 1, 3.5], + "to": [8, 3, 5.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "east": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "south": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "west": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"}, + "up": {"uv": [2, 11, 4, 13], "texture": "#redstone_bridge"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, -90, -74], + "translation": [-3, 3.25, 4.5], + "scale": [0.7, 0.7, 0.7] + }, + "thirdperson_lefthand": { + "rotation": [0, 90, 74], + "translation": [-3, 3.5, 5], + "scale": [0.7, 0.7, 0.7] + }, + "firstperson_righthand": { + "rotation": [0, -90, -13], + "translation": [1.13, 3, 1.13], + "scale": [0.68, 0.68, 0.68] + }, + "firstperson_lefthand": { + "rotation": [0, 71, 17], + "translation": [1.13, 3, 1.13], + "scale": [0.68, 0.68, 0.68] + }, + "ground": { + "translation": [0, 3, 0], + "scale": [0.65, 0.65, 0.65] + }, + "gui": { + "rotation": [30, -44, 0], + "translation": [0, 3.5, 0], + "scale": [0.76, 0.76, 0.76] + }, + "head": { + "rotation": [0, 180, 0], + "translation": [0, 13, 0] + }, + "fixed": { + "rotation": [0, 90, -90], + "translation": [0, 0, -8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/item/linked_controller/powered.json b/src/main/resources/assets/create/models/item/linked_controller/powered.json new file mode 100644 index 000000000..1a747b4fa --- /dev/null +++ b/src/main/resources/assets/create/models/item/linked_controller/powered.json @@ -0,0 +1,94 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "redstone_antenna": "create:block/redstone_antenna_powered", + "particle": "create:item/linked_controller_powered", + "redstone_bridge": "create:item/linked_controller_powered" + }, + "elements": [ + { + "name": "Controller", + "from": [4, 0, 1.5], + "to": [12, 2, 14.5], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0.5]}, + "faces": { + "north": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, + "east": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, + "south": {"uv": [13, 0, 15, 8], "rotation": 90, "texture": "#redstone_bridge"}, + "west": {"uv": [0, 8, 13, 10], "texture": "#redstone_bridge"}, + "up": {"uv": [0, 0, 13, 8], "rotation": 270, "texture": "#redstone_bridge"}, + "down": {"uv": [0, 0, 13, 8], "rotation": 90, "texture": "#redstone_bridge"} + } + }, + { + "name": "AntennaTop", + "from": [3, 6, 4.5], + "to": [4, 7, 5.5], + "rotation": {"angle": 0, "axis": "z", "origin": [4, 2, 14.5]}, + "faces": { + "up": {"uv": [1, 1, 2, 2], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaZ", + "from": [3, 0, 3.5], + "to": [4, 8, 6.5], + "rotation": {"angle": 0, "axis": "z", "origin": [4, 2, 14.5]}, + "faces": { + "east": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"}, + "west": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"} + } + }, + { + "name": "AntennaX", + "from": [2, 0, 4.5], + "to": [5, 8, 5.5], + "rotation": {"angle": 0, "axis": "z", "origin": [4, 2, 14.5]}, + "faces": { + "north": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"}, + "south": {"uv": [0, 0, 3, 8], "texture": "#redstone_antenna"}, + "down": {"uv": [0, 9, 3, 10], "texture": "#redstone_antenna"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, -90, -74], + "translation": [-3, 3.25, 4.5], + "scale": [0.7, 0.7, 0.7] + }, + "thirdperson_lefthand": { + "rotation": [0, 90, 74], + "translation": [-3, 3.5, 5], + "scale": [0.7, 0.7, 0.7] + }, + "firstperson_righthand": { + "rotation": [0, -113, -27], + "translation": [-2, 9, 1.13], + "scale": [0.97, 0.97, 0.97] + }, + "firstperson_lefthand": { + "rotation": [0, 47, 27], + "translation": [-2, 9, 1.13], + "scale": [0.97, 0.97, 0.97] + }, + "ground": { + "translation": [0, 2, 0], + "scale": [0.75, 0.75, 0.75] + }, + "gui": { + "rotation": [30, -44, 0], + "translation": [0, 1.75, 0], + "scale": [0.76, 0.76, 0.76] + }, + "head": { + "rotation": [0, 180, 0], + "translation": [0, 13, 0] + }, + "fixed": { + "rotation": [0, 90, -90], + "translation": [0, 0, -8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/gui/curiosities2.png b/src/main/resources/assets/create/textures/gui/curiosities2.png new file mode 100644 index 0000000000000000000000000000000000000000..26fce588cc9c0e159e2d3e60a9024ef4c584931b GIT binary patch literal 1407 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5D>38$lZxy-8q?;Kn_c~qpu?a z!^VE@KZ&eBen@~%h%1n0Wo2bzVq#-s`*bjuk&$u#ESGRihBzZe78aHX6DCwtRP5NX z!@}G~Tg%}8|Nq_H-R9=z$BrEf4Gm38OMCR_QAtV3jT<*_+_-W5`t>DCmH-X(?)&i< zNXe80`2_>D-~tTdn;u;Us^cv1h%9Dc;5!7ujG`J|4M4Z{c)B=-RK&fV-B@(XK)~gy zn#inWjSRjDfBx5p9m}4Ox*@wb=;_Vcd5I4nxm-Hkwr%Fh;`?{XpU?Z#-0u=;pFi*F z^$*Xt#o7IwzFfrOyN$Taww&&08~gt=m`^WdNjSaDqk#p85;`|cWZ;~@kaKg|tM!K> z7UfJk%?eZ~z9CB2R@;A7j_qpsk5vkXr>~Uya5>(T`@jA=6-is}xbM#&t*pDG0#s?e zb9(&EiiDNZO`fl3+4HaNbm?BU^X_r$Iaym?FWD3yfT}r^%bHE`^K{qG zNrlX}yiMm%T+R4A^e^+i-saEC^vvIXm*;sN$b2ilC}ZAw#;=Dh|0mw#*irdEfcaJX zuW9dWa@_W@g*^Q%`sU55SDW*H_x{}bd-vxRjBlfNeU5T4K7Y00RPEM<72#L63*XQ2 zx7c6)e{JQLI_Z0t=Ki10_Jj5O%{?3DxbtS*H!?YYu|aR!=LL*2+P|FNZ1TYN*nZ*Y zbIoiIn8VHfezxJQ_-0_^?BZ89nzc-d}k%&jg5v`4N?o(RxqBG zN-j5jC~`vc-4%v6HzZ6QcmtTPG^F)z+&!y+>xoEt7DHK1kCcE(!sfn>bJ=-c+`D9d z{z`+yU$+xw>%KGm)m*@)uzW`_^M>SPV6cNU&oVvs4xcqfCI?=b+kb!N$o%f_v*-70 z{FyJsi(h}dUWV7B-u6Kh&;*28he|KSrJ6PT*?;~#N6t;L=O4=7eezUKi00ZoZ|$4! zLJhjNl^BHr<}}zF%3q!0dBDA8^|If8(}kEf3vT%P$7YFvfjr~w!-}nqlAIpN3rZOO z>3&dB=xjX18dA>|!FqTEc`dE;cnh> z#RZieEHmcszar0A|Ks#eX2x&N^}pFFSo{xlX!<<;w_1hme^-aD&(pOP7?>u_sdr<# zG^gHd2g|v;pD$Rz`}~b)78&qol`;+ E0C|39xc~qF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/linked_controller.png b/src/main/resources/assets/create/textures/item/linked_controller.png new file mode 100644 index 0000000000000000000000000000000000000000..474b3bf2c1cd3547b1d4f2fac136655b40585339 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|-oBh$T275NS1_?)yw*0tEpC^Kma(MWYxw`F9oQW5kwlJL|Qx6>2~ zwvY;AWb|fa?2OeZ^3iV1@~KO7&keH&8dGtjc|DL4D+%%o{*MhXFkU+F1gL_uz$3Dl zfr0NZ2s0kfUy%Y7Z1Hq)4ABVA?PcUUtia(KxJpbUc6Z_b)$g)rrN(|c(z543dxz7U z{>R&LHLZ_ISe)S!6j>g-#cbU%-=+LMJS(S)UiGPJe~}cmb>qrYGlXMrtdf!r`z9+H zzp$fKAxf?0+_D}?8J>?5C+`l{JHBK}(G(ljf4m)^E5CAgT(A7vU9VkU*YaEXT{zD& TfzR%s5M%Ik^>bP0l+XkKkgS3_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/linked_controller_powered.png b/src/main/resources/assets/create/textures/item/linked_controller_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0dcb3d3bba9d786edeb51edb7bebc7ce5aff7d GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|~0G|-oBh$T275NS1_?)yw*0tEpC^Kma(MWYxpU%Kwr6TBWB;lzqZl@^} zY$0`)fnf^+Luaf`k&pKN?dvwJSTJK^7tomXPm=q9lvqiSU+{lyfPwMSfhRx}oCO|{ z#S9F5hd`K7RKu$QDA?@j;uxY4oZHLI$E?V~8u({XMtStR`m1(lm%TKTHB=O?5SaM+ z^+tZhBPmbzCT~AgIic5U>b0GkRtF%}28J29*~C-ZWmqHw)*fKQ0))q5xY|Npo9$fE!M zzrFo>bJ5D4ufHB1J+~dG`o-C;l|YKKB*-uLKNK(o`&S5o1PeSOiy0XB4ude`@%$Aj zK*4xV7sn8d;L>y4Tn7v|m@i1oef!tnre1pS28WfE0h-??)*tYxWfYjXaaD+gK&ac- zsSIxYJt{YpGj_;)Z984$*mP8?NLN1K`+Qs1M>gTe~DWM4fJ2zo8 delta 226 zcmV<803H8^0`dWn7=Hu<0002(-QrRJ000DMK}|sb0I`n?{9y$E001FSOjJbx003=q zU+wkT#m={Xg=zKr;i9RGyTqc^-pK#|_W%F>w1D3n00001bW%=J06^y0W&i*HZ%IT! zR0!8&U_b_|AQacCjs;+PMaQZt5MxExs#VK@LR?)dXRQJWaa&c*oH+|5#8tF%=FC-% z6BxKsyJoH`Rs=CLR+SrvOkm*53|(H_I%NU_!?dX@TEjAd=5S^%a><+kGI3hUOfb#B cITOVN0Q8S0kPivr+5i9m07*qoM6N<$f+!?hr2qf` From 462089b43aa7a1e0e56c0e20245b6e91e3f874a9 Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Wed, 26 May 2021 19:47:19 -0700 Subject: [PATCH 06/21] Clean up in world processing - Use static RecipeWrapper for finding recipes instead of making a new TileEntity every time - Move InWorldProcessing from logistics to contraptions/processing - Fix #799 by disallowing blasting processing on fireproof items --- .../deployer/BeltDeployerCallbacks.java | 2 +- .../components/fan/AirCurrent.java | 4 +- .../components/fan/SplashingRecipe.java | 8 +-- .../press/BeltPressingCallbacks.java | 2 +- .../press/MechanicalPressTileEntity.java | 2 +- .../particle/AirFlowParticle.java | 2 +- .../processing}/InWorldProcessing.java | 63 +++++++------------ .../belt/transport/TransportedItemStack.java | 2 +- .../logistics/item/filter/ItemAttribute.java | 2 +- .../advancement/AllAdvancements.java | 2 +- .../foundation/advancement/AllTriggers.java | 2 +- 11 files changed, 38 insertions(+), 53 deletions(-) rename src/main/java/com/simibubi/create/content/{logistics => contraptions/processing}/InWorldProcessing.java (86%) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java index 6cfc09ede..7d007d11e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/BeltDeployerCallbacks.java @@ -9,10 +9,10 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.curiosities.tools.SandPaperPolishingRecipe; -import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java index 3b4d2ba91..72001c7ee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/AirCurrent.java @@ -8,8 +8,8 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.particle.AirFlowParticleData; -import com.simibubi.create.content.logistics.InWorldProcessing; -import com.simibubi.create.content.logistics.InWorldProcessing.Type; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing.Type; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java index e6eafe17f..9bf446385 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/SplashingRecipe.java @@ -3,22 +3,22 @@ package com.simibubi.create.content.contraptions.components.fan; import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing.SplashingWrapper; import com.simibubi.create.content.contraptions.processing.ProcessingRecipeBuilder.ProcessingRecipeParams; -import com.simibubi.create.content.logistics.InWorldProcessing; -import com.simibubi.create.content.logistics.InWorldProcessing.SplashingInv; import net.minecraft.world.World; @ParametersAreNonnullByDefault -public class SplashingRecipe extends ProcessingRecipe { +public class SplashingRecipe extends ProcessingRecipe { public SplashingRecipe(ProcessingRecipeParams params) { super(AllRecipeTypes.SPLASHING, params); } @Override - public boolean matches(SplashingInv inv, World worldIn) { + public boolean matches(SplashingWrapper inv, World worldIn) { if (inv.isEmpty()) return false; return ingredients.get(0) 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 93f0d1cb4..3bc960959 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 @@ -9,9 +9,9 @@ import java.util.stream.Collectors; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity.Mode; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; -import com.simibubi.create.content.logistics.InWorldProcessing; import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour.ProcessingResult; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; 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 36eabc127..36651a7d6 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 @@ -10,7 +10,7 @@ import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.processing.BasinOperatingTileEntity; import com.simibubi.create.content.contraptions.processing.BasinTileEntity; -import com.simibubi.create.content.logistics.InWorldProcessing; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.advancement.ITriggerable; import com.simibubi.create.foundation.config.AllConfigs; diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java index 3d5c41c8a..d4399cde7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/AirFlowParticle.java @@ -4,7 +4,7 @@ import javax.annotation.Nonnull; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.fan.IAirCurrentSource; -import com.simibubi.create.content.logistics.InWorldProcessing; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java similarity index 86% rename from src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java rename to src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java index 670f02cfc..0858c17ed 100644 --- a/src/main/java/com/simibubi/create/content/logistics/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java @@ -1,4 +1,4 @@ -package com.simibubi.create.content.logistics; +package com.simibubi.create.content.contraptions.processing; import static com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.getHeatLevelOf; @@ -12,7 +12,6 @@ import javax.annotation.Nullable; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; -import com.simibubi.create.content.contraptions.processing.ProcessingRecipe; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.config.AllConfigs; @@ -37,9 +36,6 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.ParticleTypes; import net.minecraft.particles.RedstoneParticleData; import net.minecraft.tags.BlockTags; -import net.minecraft.tileentity.BlastFurnaceTileEntity; -import net.minecraft.tileentity.FurnaceTileEntity; -import net.minecraft.tileentity.SmokerTileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.world.IBlockReader; @@ -50,13 +46,8 @@ import net.minecraftforge.items.wrapper.RecipeWrapper; public class InWorldProcessing { - public static class SplashingInv extends RecipeWrapper { - public SplashingInv() { - super(new ItemStackHandler(1)); - } - } - - public static SplashingInv splashingInv = new SplashingInv(); + private static final RecipeWrapper WRAPPER = new RecipeWrapper(new ItemStackHandler(1)); + private static final SplashingWrapper SPLASHING_WRAPPER = new SplashingWrapper(); public enum Type { SMOKING, BLASTING, SPLASHING, NONE @@ -103,17 +94,13 @@ public class InWorldProcessing { } private static boolean canProcess(ItemStack stack, Type type, World world) { - if (type == Type.BLASTING) { - return true; - } + if (type == Type.BLASTING) + return !stack.getItem().isFireproof(); if (type == Type.SMOKING) { - // FIXME this does not need to be a TE - SmokerTileEntity smoker = new SmokerTileEntity(); - smoker.setLocation(world, BlockPos.ZERO); - smoker.setInventorySlotContents(0, stack); + WRAPPER.setInventorySlotContents(0, stack); Optional recipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMOKING, smoker, world); + .getRecipe(IRecipeType.SMOKING, WRAPPER, world); return recipe.isPresent(); } @@ -124,8 +111,8 @@ public class InWorldProcessing { } public static boolean isWashable(ItemStack stack, World world) { - splashingInv.setInventorySlotContents(0, stack); - Optional recipe = AllRecipeTypes.SPLASHING.find(splashingInv, world); + SPLASHING_WRAPPER.setInventorySlotContents(0, stack); + Optional recipe = AllRecipeTypes.SPLASHING.find(SPLASHING_WRAPPER, world); return recipe.isPresent(); } @@ -179,38 +166,29 @@ public class InWorldProcessing { private static List process(ItemStack stack, Type type, World world) { if (type == Type.SPLASHING) { - splashingInv.setInventorySlotContents(0, stack); - Optional recipe = AllRecipeTypes.SPLASHING.find(splashingInv, world); + SPLASHING_WRAPPER.setInventorySlotContents(0, stack); + Optional recipe = AllRecipeTypes.SPLASHING.find(SPLASHING_WRAPPER, world); if (recipe.isPresent()) return applyRecipeOn(stack, recipe.get()); return null; } - // FIXME this does not need to be a TE - SmokerTileEntity smoker = new SmokerTileEntity(); - smoker.setLocation(world, BlockPos.ZERO); - smoker.setInventorySlotContents(0, stack); + WRAPPER.setInventorySlotContents(0, stack); Optional smokingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMOKING, smoker, world); + .getRecipe(IRecipeType.SMOKING, WRAPPER, world); if (type == Type.BLASTING) { - // FIXME this does not need to be a TE - FurnaceTileEntity furnace = new FurnaceTileEntity(); - furnace.setLocation(world, BlockPos.ZERO); - furnace.setInventorySlotContents(0, stack); + WRAPPER.setInventorySlotContents(0, stack); Optional smeltingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMELTING, furnace, world); + .getRecipe(IRecipeType.SMELTING, WRAPPER, world); if (!smokingRecipe.isPresent()) { if (smeltingRecipe.isPresent()) return applyRecipeOn(stack, smeltingRecipe.get()); - // FIXME this does not need to be a TE - BlastFurnaceTileEntity blastFurnace = new BlastFurnaceTileEntity(); - blastFurnace.setLocation(world, BlockPos.ZERO); - blastFurnace.setInventorySlotContents(0, stack); + WRAPPER.setInventorySlotContents(0, stack); Optional blastingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.BLASTING, blastFurnace, world); + .getRecipe(IRecipeType.BLASTING, WRAPPER, world); if (blastingRecipe.isPresent()) return applyRecipeOn(stack, blastingRecipe.get()); @@ -299,6 +277,7 @@ public class InWorldProcessing { return stacks; } + public static void spawnParticlesForProcessing(@Nullable World world, Vector3d vec, Type type) { if (world == null || !world.isRemote) return; @@ -325,4 +304,10 @@ public class InWorldProcessing { } } + public static class SplashingWrapper extends RecipeWrapper { + public SplashingWrapper() { + super(new ItemStackHandler(1)); + } + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java index 5202ea1df..85cea6d9a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/TransportedItemStack.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.relays.belt.transport; import java.util.Random; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; -import com.simibubi.create.content.logistics.InWorldProcessing; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; 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 884156c60..7e7e1bb15 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 @@ -12,7 +12,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import com.simibubi.create.AllRecipeTypes; -import com.simibubi.create.content.logistics.InWorldProcessing; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import com.simibubi.create.content.logistics.item.filter.attribute.BookAuthorAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.BookCopyAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.ColorAttribute; diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java index 96392244e..18fcb1deb 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllAdvancements.java @@ -16,7 +16,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllFluids; import com.simibubi.create.AllItems; import com.simibubi.create.Create; -import com.simibubi.create.content.logistics.InWorldProcessing; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.Advancement.Builder; diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 1e0c67527..959043354 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -4,7 +4,7 @@ import java.util.LinkedList; import java.util.List; import java.util.function.Predicate; -import com.simibubi.create.content.logistics.InWorldProcessing; +import com.simibubi.create.content.contraptions.processing.InWorldProcessing; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.Block; From 773f74d33e9deabf1fcae6e100e4401732bf49ef Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Wed, 26 May 2021 20:13:07 -0700 Subject: [PATCH 07/21] Add piglin compat - Fix #678 by adding golden sheets and crushed gold ore to the piglin_loved tag --- src/main/java/com/simibubi/create/AllItems.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 25a418064..527a82549 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -58,6 +58,7 @@ import net.minecraft.item.Food; import net.minecraft.item.Item; import net.minecraft.item.Rarity; import net.minecraft.tags.ITag; +import net.minecraft.tags.ItemTags; import net.minecraft.util.ResourceLocation; public class AllItems { @@ -147,11 +148,11 @@ public class AllItems { COPPER_SHEET = taggedIngredient("copper_sheet", forgeItemTag("plates/copper"), PLATES.tag), BRASS_SHEET = taggedIngredient("brass_sheet", forgeItemTag("plates/brass"), PLATES.tag), IRON_SHEET = taggedIngredient("iron_sheet", forgeItemTag("plates/iron"), PLATES.tag), - GOLDEN_SHEET = taggedIngredient("golden_sheet", forgeItemTag("plates/gold"), PLATES.tag), + GOLDEN_SHEET = taggedIngredient("golden_sheet", forgeItemTag("plates/gold"), PLATES.tag, ItemTags.PIGLIN_LOVED), LAPIS_SHEET = taggedIngredient("lapis_sheet", forgeItemTag("plates/lapis_lazuli"), PLATES.tag), CRUSHED_IRON = taggedIngredient("crushed_iron_ore", CRUSHED_ORES.tag), - CRUSHED_GOLD = taggedIngredient("crushed_gold_ore", CRUSHED_ORES.tag), + CRUSHED_GOLD = taggedIngredient("crushed_gold_ore", CRUSHED_ORES.tag, ItemTags.PIGLIN_LOVED), CRUSHED_COPPER = taggedIngredient("crushed_copper_ore", CRUSHED_ORES.tag), CRUSHED_ZINC = taggedIngredient("crushed_zinc_ore", CRUSHED_ORES.tag), CRUSHED_BRASS = taggedIngredient("crushed_brass", CRUSHED_ORES.tag); From bcb365baa900bd14a5f9176a912ddfee66da62e4 Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Wed, 26 May 2021 20:54:17 -0700 Subject: [PATCH 08/21] Fix processing for fireproof items with recipes - Check for smelting and blasting recipes before checking for fireproof-ness --- .../processing/InWorldProcessing.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java index 0858c17ed..b433755f1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/InWorldProcessing.java @@ -94,8 +94,23 @@ public class InWorldProcessing { } private static boolean canProcess(ItemStack stack, Type type, World world) { - if (type == Type.BLASTING) + if (type == Type.BLASTING) { + WRAPPER.setInventorySlotContents(0, stack); + Optional smeltingRecipe = world.getRecipeManager() + .getRecipe(IRecipeType.SMELTING, WRAPPER, world); + + if (smeltingRecipe.isPresent()) + return true; + + WRAPPER.setInventorySlotContents(0, stack); + Optional blastingRecipe = world.getRecipeManager() + .getRecipe(IRecipeType.BLASTING, WRAPPER, world); + + if (blastingRecipe.isPresent()) + return true; + return !stack.getItem().isFireproof(); + } if (type == Type.SMOKING) { WRAPPER.setInventorySlotContents(0, stack); @@ -178,11 +193,11 @@ public class InWorldProcessing { .getRecipe(IRecipeType.SMOKING, WRAPPER, world); if (type == Type.BLASTING) { - WRAPPER.setInventorySlotContents(0, stack); - Optional smeltingRecipe = world.getRecipeManager() - .getRecipe(IRecipeType.SMELTING, WRAPPER, world); - if (!smokingRecipe.isPresent()) { + WRAPPER.setInventorySlotContents(0, stack); + Optional smeltingRecipe = world.getRecipeManager() + .getRecipe(IRecipeType.SMELTING, WRAPPER, world); + if (smeltingRecipe.isPresent()) return applyRecipeOn(stack, smeltingRecipe.get()); From 3903631c7b9dcd25e856f525406aec1fe9e7b305 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 27 May 2021 14:36:24 +0200 Subject: [PATCH 09/21] Post-PR datagen --- src/generated/resources/.cache/cache | 5 +- .../assets/create/lang/unfinished/pl_pl.json | 86 +- .../assets/create/lang/unfinished/zh_tw.json | 1546 ++++++++--------- .../minecraft/tags/items/piglin_loved.json | 7 + 4 files changed, 826 insertions(+), 818 deletions(-) create mode 100644 src/generated/resources/data/minecraft/tags/items/piglin_loved.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 091f2d332..e1e64b2e5 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -417,11 +417,11 @@ fc1a5dc58cb00012cd311f909de3cd6085664994 assets/create/lang/unfinished/es_es.jso dd04db4e469ece034e9edde1d182d40ece3c917f assets/create/lang/unfinished/ja_jp.json a46af574991af844c58a7fe75b4c2b0ac888b4e0 assets/create/lang/unfinished/ko_kr.json 1ee72b0c9ac509ffcd17b19d17ab1f4b3506c9ce assets/create/lang/unfinished/nl_nl.json -b23f249ef0b28b2e2312e63f2fccf4401b282ac4 assets/create/lang/unfinished/pl_pl.json +c80b1e4310942e34b46f3cfed724e104782f1c65 assets/create/lang/unfinished/pl_pl.json 73030bf3d5aace5c3e991c6bf265322bba42286f assets/create/lang/unfinished/pt_br.json 73b1927e1d32e4229caa96e8d1bc25d39fb51377 assets/create/lang/unfinished/ru_ru.json aa3f0b918d948795e10878c3d42dbd4c39f71795 assets/create/lang/unfinished/zh_cn.json -1f15238d524e7b94b0ce5bcd09703b4742b9f960 assets/create/lang/unfinished/zh_tw.json +f6aef786fdc291201f388c661fb9ff2d0b936ba2 assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -3708,6 +3708,7 @@ f6c8f34ceb475546dba5cc6ff288863ea795d20b data/forge/tags/items/storage_blocks/co 0d188ad2c33d10ee8f0d455c4e63a4460a8302fb data/minecraft/tags/blocks/stairs.json 92584f914c53e00c111f9ff5e3894e2e3594946b data/minecraft/tags/blocks/walls.json 09d26bcd0f94459f945219997277c4fbf14adeb7 data/minecraft/tags/fluids/water.json +49cadea86f6b63d5065b859a0d0e7ad772cf51d6 data/minecraft/tags/items/piglin_loved.json 29e6f7e3d4be9a9b0af1fca5d32fa55e29905ce2 data/minecraft/tags/items/slabs.json 0d188ad2c33d10ee8f0d455c4e63a4460a8302fb data/minecraft/tags/items/stairs.json 92584f914c53e00c111f9ff5e3894e2e3594946b data/minecraft/tags/items/walls.json diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index e52917f1b..c6cda6c14 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 44", + "_": "Missing Localizations: 6", "_": "->------------------------] Game Elements [------------------------<-", @@ -58,7 +58,7 @@ "block.create.cogwheel": "Koło zębate", "block.create.content_observer": "Detektor zawartości", "block.create.controller_rail": "Tory sterujące", - "block.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "block.create.copper_backtank": "Miedziany zbiornik w plecaku", "block.create.copper_block": "Blok miedzi", "block.create.copper_casing": "Miedziana Obudowa", "block.create.copper_ore": "Ruda miedzi", @@ -439,7 +439,7 @@ "item.create.chocolate_glazed_berries": "Jagody w czekoladzie", "item.create.chromatic_compound": "Związek chromatyczny", "item.create.cinder_flour": "Rozżarzona mąka", - "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", + "item.create.copper_backtank": "Miedziany zbiornik w plecaku", "item.create.copper_ingot": "Sztabka miedzi", "item.create.copper_nugget": "Bryłka miedzi", "item.create.copper_sheet": "Arkusz miedzi", @@ -458,8 +458,8 @@ "item.create.crushed_tin_ore": "Rozkruszona ruda cyny", "item.create.crushed_uranium_ore": "Rozkruszona ruda uranu", "item.create.crushed_zinc_ore": "Rozkruszona ruda cynku", - "item.create.diving_boots": "UNLOCALIZED: Diving Boots", - "item.create.diving_helmet": "UNLOCALIZED: Diving Helmet", + "item.create.diving_boots": "Buty do nurkowania", + "item.create.diving_helmet": "Hełm do nurkowania", "item.create.dough": "Ciasto", "item.create.electron_tube": "Lampa elektronowa", "item.create.empty_blaze_burner": "Pusty płomienny palnik", @@ -683,7 +683,7 @@ "create.recipe.fan_blasting.fan": "Wiatrak za lawą", "create.recipe.pressing": "Tłoczenie", "create.recipe.mixing": "Mieszanie", - "create.recipe.deploying": "UNLOCALIZED: Deploying", + "create.recipe.deploying": "Aplikowanie", "create.recipe.automatic_shapeless": "Zautomatyzowanie nieokreślone konstruowanie", "create.recipe.automatic_brewing": "Zautomatyzowane warzenie", "create.recipe.packing": "Prasowanie", @@ -750,15 +750,15 @@ "create.orientation.alongX": "Wzdłuż X", "create.gui.terrainzapper.title": "Ręczny kształter", - "create.gui.terrainzapper.searchDiagonal": "UNLOCALIZED: Follow Diagonals", - "create.gui.terrainzapper.searchFuzzy": "UNLOCALIZED: Ignore Material Borders", - "create.gui.terrainzapper.patternSection": "UNLOCALIZED: Pattern", - "create.gui.terrainzapper.pattern.solid": "UNLOCALIZED: Solid", - "create.gui.terrainzapper.pattern.checkered": "UNLOCALIZED: Checkerboard", - "create.gui.terrainzapper.pattern.inversecheckered": "UNLOCALIZED: Inverted Checkerboard", - "create.gui.terrainzapper.pattern.chance25": "UNLOCALIZED: 25% Roll", - "create.gui.terrainzapper.pattern.chance50": "UNLOCALIZED: 50% Roll", - "create.gui.terrainzapper.pattern.chance75": "UNLOCALIZED: 75% Roll", + "create.gui.terrainzapper.searchDiagonal": "Wzdłuż linii ukośnych", + "create.gui.terrainzapper.searchFuzzy": "Ignoruj krawędzie materiałów", + "create.gui.terrainzapper.patternSection": "Wzór", + "create.gui.terrainzapper.pattern.solid": "Ciągły", + "create.gui.terrainzapper.pattern.checkered": "Szachownica", + "create.gui.terrainzapper.pattern.inversecheckered": "Odrócona szachownica", + "create.gui.terrainzapper.pattern.chance25": "Obrót o 25%", + "create.gui.terrainzapper.pattern.chance50": "Obrót o 50%", + "create.gui.terrainzapper.pattern.chance75": "Obrót o 75%", "create.gui.terrainzapper.placement": "Położenie", "create.gui.terrainzapper.placement.merged": "Połączony", "create.gui.terrainzapper.placement.attached": "Przyłączony", @@ -767,8 +767,8 @@ "create.gui.terrainzapper.brush.cuboid": "Prostopadłościan", "create.gui.terrainzapper.brush.sphere": "Kula", "create.gui.terrainzapper.brush.cylinder": "Walec", - "create.gui.terrainzapper.brush.surface": "UNLOCALIZED: Surface", - "create.gui.terrainzapper.brush.cluster": "UNLOCALIZED: Cluster", + "create.gui.terrainzapper.brush.surface": "Powierzchnia", + "create.gui.terrainzapper.brush.cluster": "Grupa", "create.gui.terrainzapper.tool": "Narzędzie", "create.gui.terrainzapper.tool.fill": "Wypełnianie", "create.gui.terrainzapper.tool.place": "Stawianie", @@ -778,8 +778,8 @@ "create.gui.terrainzapper.tool.flatten": "Wypłaszczanie", "create.terrainzapper.shiftRightClickToSet": "Shift+Prawe kliknięcie, aby wybrać kształt", - "create.terrainzapper.usingBlock": "UNLOCALIZED: Using: %1$s", - "create.terrainzapper.leftClickToSet": "UNLOCALIZED: Left-Click a Block to set Material", + "create.terrainzapper.usingBlock": "Używając: %1$s", + "create.terrainzapper.leftClickToSet": "Kliknij LPM na blok aby ustawić materiał", "create.minecart_coupling.two_couplings_max": "Wagoniki nie mogą mieć więcej niż dwa łączniki każdy", "create.minecart_coupling.unloaded": "Część twojego pociągu wydaje się być w niezaładowanych Chunkach.", @@ -1138,35 +1138,35 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: Użyj \"/killtps start\", aby sztucznie spowolnić serwer\n", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "create.contraption.minecart_contraption_too_big": "Ta maszyna w wagoniku jest zbyt duża, aby ją podnieść", "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.cogs": "Koła zębate terkoczą", "create.subtitle.slime_added": "Szlam plaska", - "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", - "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", - "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", - "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", - "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.contraption_disassemble": "Maszyna staje", + "create.subtitle.wrench_rotate": "Klucz skrzypi", + "create.subtitle.mixing": "Dźwięki mieszania", + "create.subtitle.mechanical_press_activation_belt": "Mechaniczna prasa stuka", + "create.subtitle.worldshaper_place": "Kształter strzela", + "create.subtitle.deployer_polish": "Aplikator poleruje", + "create.subtitle.depot_slide": "Przedmiot ślizga się", + "create.subtitle.deny": "Dźwięk odmowy", "create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa", "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", - "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", + "create.subtitle.funnel_flap": "Lejek trzepocze", + "create.subtitle.copper_armor_equip": "Sprzęt do nurkowania pobrzękuje", "create.subtitle.schematicannon_finish": "Schematoarmata skończyła", - "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.scroll_value": "Kliknięcie", "create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia", - "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", - "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", - "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", - "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", + "create.subtitle.contraption_assemble": "Maszyna przesuwa się", + "create.subtitle.crafter_craft": "Mechaniczny stół rzemieślniczy konstruuje", + "create.subtitle.cranking": "Ręczna korba obraca się", + "create.subtitle.crafter_click": "Mechaniczny stół rzemieślniczy stuka", + "create.subtitle.wrench_remove": "Komponent niszczy się", + "create.subtitle.depot_plop": "Przedmiot ląduje", + "create.subtitle.confirm": "Dźwięk potwierdzenia", "_": "->------------------------] Item Descriptions [------------------------<-", @@ -1545,11 +1545,11 @@ "create.ponder.blaze_burner.text_3": "Z użyciem płomiennego ciasta, palnik może uzyskać szczególnie wysoką temperaturę", "create.ponder.blaze_burner.text_4": "Dostarczanie płomykowi przedmiotów może zostać zautomatyzowane z użyciem aplikatorów lub mechanicznych ramion", - "create.ponder.brass_funnel.header": "Mosiężny lejek", - "create.ponder.brass_funnel.text_1": "Andezytowe lejki mogą pobierać jedynie pojedyncze przedmioty", - "create.ponder.brass_funnel.text_2": "Mosiężne lejki mogą pobierać nawet pełne stosy", + "create.ponder.brass_funnel.header": "Mosiężny lej", + "create.ponder.brass_funnel.text_1": "Andezytowe leje mogą pobierać jedynie pojedyncze przedmioty", + "create.ponder.brass_funnel.text_2": "Mosiężne leje mogą pobierać nawet pełne stosy", "create.ponder.brass_funnel.text_3": "Przewijanie na slocie filtrującym pozwala na precyzyjną kontrolę nad maksymalną wielkością stosu", - "create.ponder.brass_funnel.text_4": "Użycie przedmiotów patrząc na slot filtrujący spowoduje, że lejek będzie przesyłał tylko pasujące przedmioty", + "create.ponder.brass_funnel.text_4": "Użycie przedmiotu patrząc na slot filtrujący spowoduje, że lej będzie przesyłał tylko pasujące przedmioty", "create.ponder.brass_tunnel.header": "Używanie mosiężnych tuneli", "create.ponder.brass_tunnel.text_1": "Mosiężne tunele mogą być użyte do przykrycia Twoich taśmociągów", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 5514b4f70..137dc29d9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 668", + "_": "Missing Localizations: 42", "_": "->------------------------] Game Elements [------------------------<-", @@ -165,8 +165,8 @@ "block.create.gabbro_cobblestone_stairs": "碎輝長岩樓梯", "block.create.gabbro_cobblestone_wall": "碎輝長岩牆", "block.create.gabbro_pillar": "豎紋輝長岩", - "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", - "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", + "block.create.gantry_carriage": "門式起重機", + "block.create.gantry_shaft": "門式起重機滑道", "block.create.gearbox": "齒輪箱", "block.create.gearshift": "變速箱", "block.create.glass_fluid_pipe": "玻璃液體管道", @@ -373,15 +373,15 @@ "block.create.sequenced_gearshift": "可程式化齒輪箱", "block.create.shadow_steel_casing": "暗影機殼", "block.create.shaft": "傳動軸", - "block.create.smart_chute": "UNLOCALIZED: Smart Chute", + "block.create.smart_chute": "智慧滑道", "block.create.smart_fluid_pipe": "智慧液體管道", "block.create.speedometer": "速度計", "block.create.spout": "液體灌注器", "block.create.spruce_window": "雲杉木窗戶", "block.create.spruce_window_pane": "雲杉木窗戶片", - "block.create.sticker": "UNLOCALIZED: Sticker", + "block.create.sticker": "方塊黏著器", "block.create.sticky_mechanical_piston": "黏性機械活塞", - "block.create.stockpile_switch": "存量檢測器", + "block.create.stockpile_switch": "存量偵測器", "block.create.stressometer": "動能錶", "block.create.tiled_glass": "十字玻璃窗", "block.create.tiled_glass_pane": "十字玻璃窗戶片", @@ -401,7 +401,7 @@ "block.create.weathered_limestone_cobblestone_stairs": "碎風化石灰岩樓梯", "block.create.weathered_limestone_cobblestone_wall": "碎風化石灰岩牆", "block.create.weathered_limestone_pillar": "豎紋風化石灰岩", - "block.create.weighted_ejector": "UNLOCALIZED: Weighted Ejector", + "block.create.weighted_ejector": "物品彈射器", "block.create.white_sail": "白色風帆", "block.create.white_seat": "白色坐墊", "block.create.white_valve_handle": "白色閥門開關", @@ -414,7 +414,7 @@ "block.create.zinc_ore": "鋅礦石", "entity.create.contraption": "結構", - "entity.create.gantry_contraption": "UNLOCALIZED: Gantry Contraption", + "entity.create.gantry_contraption": "門式結構", "entity.create.seat": "坐墊", "entity.create.stationary_contraption": "固定結構", "entity.create.super_glue": "強力膠", @@ -436,7 +436,7 @@ "item.create.builders_tea": "工人茶", "item.create.chest_minecart_contraption": "裝修過的機械礦車", "item.create.chocolate_bucket": "巧克力桶", - "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", + "item.create.chocolate_glazed_berries": "巧克力甜莓", "item.create.chromatic_compound": "異彩化合物", "item.create.cinder_flour": "地獄麵粉", "item.create.copper_backtank": "UNLOCALIZED: Copper Backtank", @@ -471,7 +471,7 @@ "item.create.golden_sheet": "金板", "item.create.handheld_worldshaper": "地形雕塑器", "item.create.honey_bucket": "蜂蜜桶", - "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", + "item.create.honeyed_apple": "蜂蜜蘋果", "item.create.integrated_circuit": "IC板", "item.create.iron_sheet": "鐵板", "item.create.lapis_sheet": "青金石板", @@ -489,13 +489,13 @@ "item.create.schematic_and_quill": "藍圖與筆", "item.create.shadow_steel": "暗影鋼", "item.create.super_glue": "強力膠", - "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", + "item.create.sweet_roll": "甜捲捲", "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.wrench": "扳手", "item.create.zinc_ingot": "鋅錠", "item.create.zinc_nugget": "鋅粒", @@ -510,8 +510,8 @@ "advancement.create.its_alive.desc": "首次使齒輪結構的旋轉。", "advancement.create.shifting_gears": "換檔,加速,起飛!", "advancement.create.shifting_gears.desc": "將大齒輪連接到小齒輪上,機械結構的轉速將會翻倍", - "advancement.create.overstressed": "超載", - "advancement.create.overstressed.desc": "首次使動能網路超載。", + "advancement.create.overstressed": "過載", + "advancement.create.overstressed.desc": "首次使動能網路過載。", "advancement.create.belt": "流水線作業", "advancement.create.belt.desc": "用輸送帶連接兩個傳動軸", "advancement.create.tunnel": "尋找掩護!", @@ -537,11 +537,11 @@ "advancement.create.wrench": "細部調整", "advancement.create.wrench.desc": "做出一個方便調整方塊的板手", "advancement.create.goggles": "動能,一目了然", - "advancement.create.goggles.desc": "做出一個能看到機械動能訊息的MR護目鏡", + "advancement.create.goggles.desc": "做出一個能看到機械動能訊息的MR護目鏡", "advancement.create.speedometer": "精密的速度控制", - "advancement.create.speedometer.desc": "放置一個速度計,並且戴上MR護目鏡來讀取數據", + "advancement.create.speedometer.desc": "放置一個速度計,並且戴上MR護目鏡來讀取數據", "advancement.create.stressometer": "精密的動能控制", - "advancement.create.stressometer.desc": "放置一個動能計,並且戴上MR護目鏡來讀取數據", + "advancement.create.stressometer.desc": "放置一個動能錶,並且戴上MR護目鏡來讀取數據", "advancement.create.aesthetics": "繁榮與美學!", "advancement.create.aesthetics.desc": "將支架放在傳動軸,管道和齒輪上。", "advancement.create.reinforced": "超級加固!", @@ -633,8 +633,8 @@ "advancement.create.arm_many_targets": "你是要累死我?", "advancement.create.arm_many_targets.desc": "配置一隻有十個或更多輸出位置的機械手臂。", "advancement.create.arm_blaze_burner": "燃燒吧!烈焰使者!", - "advancement.create.arm_blaze_burner.desc": "指揮機械臂給烈焰使者動力爐投食。", - "advancement.create.fist_bump": "朋友,來碰個拳", + "advancement.create.arm_blaze_burner.desc": "指揮機械手臂給烈焰使者動力爐投食。", + "advancement.create.fist_bump": "朋友,來擊拳", "advancement.create.fist_bump.desc": "使兩個機械手互相碰拳", "advancement.create.crushing_wheel": "一對大傢伙", "advancement.create.crushing_wheel.desc": "製作一對能更快粉碎物品的粉碎輪", @@ -692,14 +692,14 @@ "create.recipe.mechanical_crafting": "自動合成", "create.recipe.automatic_shaped": "自動合成", "create.recipe.block_cutting": "方塊切割", - "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", + "create.recipe.wood_cutting": "木材切割", "create.recipe.sandpaper_polishing": "砂紙打磨", "create.recipe.mystery_conversion": "神秘轉化", "create.recipe.spout_filling": "注液", "create.recipe.draining": "分液", "create.recipe.processing.chance": "%1$s%%概率", - "create.recipe.heat_requirement.none": "不需加熱", - "create.recipe.heat_requirement.heated": "加熱", + "create.recipe.heat_requirement.none": "不需要加熱", + "create.recipe.heat_requirement.heated": "普通加熱", "create.recipe.heat_requirement.superheated": "超級加熱", "create.generic.range": "範圍", @@ -713,8 +713,8 @@ "create.generic.unit.seconds": "秒", "create.generic.unit.minutes": "分", "create.generic.unit.rpm": "RPM", - "create.generic.unit.stress": "SU", - "create.generic.unit.degrees": "°", + "create.generic.unit.stress": "su", + "create.generic.unit.degrees": "度", "create.generic.unit.millibuckets": "%1$smB", "create.generic.clockwise": "順時鐘方向", "create.generic.counter_clockwise": "逆時鐘方向", @@ -814,18 +814,18 @@ "create.logistics.filter.apply_count": "使用提取計數過濾。", "create.gui.goggles.generator_stats": "產能器狀態:", - "create.gui.goggles.kinetic_stats": "機械學狀態:", - "create.gui.goggles.at_current_speed": "現在速度動能值", - "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", - "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", - "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", - "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", - "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk", - "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", - "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", - "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", - "create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", + "create.gui.goggles.kinetic_stats": "機械狀態:", + "create.gui.goggles.at_current_speed": "目前動能值", + "create.gui.goggles.pole_length": "活塞桿長度:", + "create.gui.goggles.fluid_container": "液體容器資訊:", + "create.gui.goggles.fluid_container.capacity": "容量: ", + "create.gui.assembly.exception": "該結構無法組合:", + "create.gui.assembly.exception.unmovableBlock": "無法移動的方塊 (%4$s) 位於 [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "位於 [%1$s,%2$s,%3$s] 方塊屬未載入區塊", + "create.gui.assembly.exception.structureTooLarge": "結構中的方塊數量過多.\nThe 可放置的數量最大為: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "活塞的活塞桿數量過多\nThe 可放置的數量最大為: %1$s", + "create.gui.assembly.exception.noPistonPoles": "這個活塞遺失了一些活塞桿", + "create.gui.assembly.exception.not_enough_sails": "結構中所需的風帆類方塊數量不足: %1$s\n最少需要的數量為: %2$s", "create.gui.gauge.info_header": "儀表訊息:", "create.gui.speedometer.title": "旋轉速度", "create.gui.stressometer.title": "網路動能", @@ -842,19 +842,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "移至上線%1$s%%", "create.gui.sequenced_gearshift.title": "可程式化齒輪箱", "create.gui.sequenced_gearshift.instruction": "指令", - "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "以特定角度旋轉", "create.gui.sequenced_gearshift.instruction.turn_angle": "旋轉", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "角度", - "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "帶動 活塞/滑輪/門式起重機", "create.gui.sequenced_gearshift.instruction.turn_distance": "驅動活塞", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "距離", - "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", - "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", - "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", - "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "延遲時間", + "create.gui.sequenced_gearshift.instruction.delay": "延遲", + "create.gui.sequenced_gearshift.instruction.delay.duration": "間隔", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "結束", "create.gui.sequenced_gearshift.instruction.end": "停止", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", - "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "等待新的紅石脈衝", + "create.gui.sequenced_gearshift.instruction.await": "等待", "create.gui.sequenced_gearshift.speed": "速度,速度方向", "create.gui.sequenced_gearshift.speed.forward": "一倍速,正向", "create.gui.sequenced_gearshift.speed.forward_fast": "兩倍速,正向", @@ -1012,10 +1012,10 @@ "create.item_attributes.added_by.inverted": "不是由%1$s添加", "create.item_attributes.has_enchant": "有附魔效果%1$s", "create.item_attributes.has_enchant.inverted": "沒有附魔效果%1$s", - "create.item_attributes.color": "UNLOCALIZED: is dyed %1$s", - "create.item_attributes.color.inverted": "UNLOCALIZED: is not dyed %1$s", - "create.item_attributes.max_enchanted": "UNLOCALIZED: is enchanted at max level", - "create.item_attributes.max_enchanted.inverted": "UNLOCALIZED: is not enchanted at max level", + "create.item_attributes.color": "已被染色成 %1$s", + "create.item_attributes.color.inverted": "未被染色成 %1$s", + "create.item_attributes.max_enchanted": "已達到最高附魔等級", + "create.item_attributes.max_enchanted.inverted": "未達到最高附魔等級", "create.item_attributes.has_fluid": "包含%1$s", "create.item_attributes.has_fluid.inverted": "不包含%1$s", "create.item_attributes.has_name": "有自定義名稱%1$s", @@ -1051,8 +1051,8 @@ "create.gui.attribute_filter.deny_list.description": "只要沒有上述屬性,就可以通過", "create.gui.attribute_filter.add_reference_item": "添加參考物品", - "create.tooltip.holdForDescription": "UNLOCALIZED: Hold [%1$s] for Summary", - "create.tooltip.holdForControls": "UNLOCALIZED: Hold [%1$s] for Controls", + "create.tooltip.holdForDescription": "按住 [%1$s] 來讀取物品概要", + "create.tooltip.holdForControls": "按住 [%1$s] 來讀取控制方法", "create.tooltip.keyShift": "Shift", "create.tooltip.keyCtrl": "Ctrl", "create.tooltip.speedRequirement": "需求速度:%1$s", @@ -1076,11 +1076,11 @@ "create.mechanical_arm.summary": "機械手臂有%1$s 輸入以及 %2$s 輸出。", "create.mechanical_arm.points_outside_range": "%1$s 由於距離限制,選定的交互點被移除。", - "create.weighted_ejector.target_set": "UNLOCALIZED: Target Selected", - "create.weighted_ejector.target_not_valid": "UNLOCALIZED: Ejecting to Adjacent block (Target was not Valid)", - "create.weighted_ejector.no_target": "UNLOCALIZED: Ejecting to Adjacent block (No Target was Selected)", - "create.weighted_ejector.targeting": "UNLOCALIZED: Ejecting to [%1$s,%2$s,%3$s]", - "create.weighted_ejector.stack_size": "UNLOCALIZED: Ejected Stack Size", + "create.weighted_ejector.target_set": "已選取目的地", + "create.weighted_ejector.target_not_valid": "彈射到鄰近的方塊 (目的地無效)", + "create.weighted_ejector.no_target": "彈射到鄰近的方塊 (未選取目的地)", + "create.weighted_ejector.targeting": "彈射到 [%1$s,%2$s,%3$s]", + "create.weighted_ejector.stack_size": "彈射物品數量", "create.logistics.when_multiple_outputs_available": "當多個輸出可用時", @@ -1104,7 +1104,7 @@ "create.tooltip.chute.fans_push_down": "鼓風機從上方進行推動", "create.tooltip.chute.fans_pull_up": "鼓風機從下方進行吸引", "create.tooltip.chute.fans_pull_down": "鼓風機從上方進行吸引", - "create.tooltip.chute.contains": "UNLOCALIZED: Contains: %1$s x%2$s", + "create.tooltip.chute.contains": "物品: %1$s x%2$s", "create.linked_controller.bind_mode": "UNLOCALIZED: Bind mode active", "create.linked_controller.press_keybind": "UNLOCALIZED: Press %1$s, %2$s, %3$s, %4$s, %5$s or %6$s, to bind this frequency to the respective key", @@ -1112,20 +1112,20 @@ "create.linked_controller.frequency_slot_1": "UNLOCALIZED: Keybind: %1$s, Freq. #1", "create.linked_controller.frequency_slot_2": "UNLOCALIZED: Keybind: %1$s, Freq. #2", - "create.hint.hose_pulley.title": "UNLOCALIZED: Bottomless Supply", - "create.hint.hose_pulley": "UNLOCALIZED: The targeted body of fluid is considered infinite.", + "create.hint.hose_pulley.title": "無限供應", + "create.hint.hose_pulley": "目標液體為無限供應", "create.hint.mechanical_arm_no_targets.title": "沒有目標", "create.hint.mechanical_arm_no_targets": "看起來這個_機械手臂_沒有被分配任何_目標_。在手持機械手臂的同時,右鍵選取輸送帶、置物臺、漏斗或其他設備來設定目標。", "create.hint.empty_bearing.title": "更新軸承", "create.hint.empty_bearing": "_空手右鍵_軸承來_添加_你新建造的結構。", "create.hint.full_deployer.title": "機械手物品溢出", - "create.hint.full_deployer": "_機械手_包含_過剩的物品_需要被_提取._使用_漏斗,__漏斗_或其他方法將溢出解決。", + "create.hint.full_deployer": "_機械手_包含_過剩的物品_需要被_取出._使用漏斗_或其他方法將溢出解決。", "create.gui.config.overlay1": "嗨 :)", "create.gui.config.overlay2": "這是一個實例層", "create.gui.config.overlay3": "點擊拖拽你的滑鼠", "create.gui.config.overlay4": "來將它移動到前方", - "create.gui.config.overlay5": "ESC退出目前界面", + "create.gui.config.overlay5": "ESC退出目前介面", "create.gui.config.overlay6": "並儲存新的位置", "create.gui.config.overlay7": "輸入/create overlay reset", "create.gui.config.overlay8": "重置到預設位置", @@ -1138,7 +1138,7 @@ "create.command.killTPSCommand.status.usage.1": "[Create]: 用 /killtps start 來手動降低伺服器TPS", "create.command.killTPSCommand.argument.tickTime": "tickTime", - "create.contraption.minecart_contraption_too_big": "UNLOCALIZED: This Cart Contraption seems too big to pick up", + "create.contraption.minecart_contraption_too_big": "這個礦車結構太大了而無法撿取", "_": "->------------------------] Subtitles [------------------------<-", @@ -1148,7 +1148,7 @@ "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", - "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", + "create.subtitle.mechanical_press_activation_belt": "液壓機工作", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", @@ -1188,10 +1188,10 @@ "block.create.copper_casing.tooltip": "銅製機殼", "block.create.copper_casing.tooltip.summary": "具備多種用途的堅固機殼,也可用於裝飾。", - "block.create.copper_casing.tooltip.condition1": "對流體管道使用時", + "block.create.copper_casing.tooltip.condition1": "對液體管道使用時", "block.create.copper_casing.tooltip.behaviour1": "會把管道裝入機殼,裝進機殼的管道會與其他管道分開,以免它們自動相連。", - "block.create.encased_fluid_pipe.tooltip": "流體管道箱", + "block.create.encased_fluid_pipe.tooltip": "液體管道箱", "block.create.encased_fluid_pipe.tooltip.summary": "用銅機殼加固后的液體管道。", "block.create.seat.tooltip": "坐墊", @@ -1206,8 +1206,8 @@ "block.create.fluid_pipe.tooltip.summary": "用來傳輸_液體_。需要一個_機械泵_來提供壓強。", "block.create.fluid_pipe.tooltip.condition1": "轉移液體", "block.create.fluid_pipe.tooltip.behaviour1": "可以與_液體容器_如_儲存罐_或_作業盆_相連_。裸露的_管道_末端也可以排放或抽取液體。注意別漏水了!", - "block.create.fluid_pipe.tooltip.condition2": "UNLOCALIZED: Right-clicked with Wrench", - "block.create.fluid_pipe.tooltip.behaviour2": "UNLOCALIZED: Places a window on the pipe if available", + "block.create.fluid_pipe.tooltip.condition2": "使用扳手對其右鍵時", + "block.create.fluid_pipe.tooltip.behaviour2": "在狀況許可的情況下在管道上安裝透明窗", "block.create.hose_pulley.tooltip": "軟管滑輪", "block.create.hose_pulley.tooltip.summary": "用來在_世界_中放置或排放大量的液體。", @@ -1233,7 +1233,7 @@ "block.create.fluid_valve.tooltip": "液體閥門", "block.create.fluid_valve.tooltip.summary": "阻止液體沿管道向前流動。", "block.create.fluid_valve.tooltip.condition1": "控制流量", - "block.create.fluid_valve.tooltip.behaviour1": "施加的_旋轉力_將迫使閥門關閉,從而阻止液體流動。_逆轉旋轉方向_以重新打開閥門。", + "block.create.fluid_valve.tooltip.behaviour1": "施加的_動能_將迫使閥門關閉,從而阻止液體流動。_逆轉旋轉方向_以重新打開閥門。", "block.create.mechanical_pump.tooltip": "機械泵", "block.create.mechanical_pump.tooltip.summary": "_接入機械_,能迫使液體_沿管道指定方向移動_。在兩個方向上都有_最大的作用範圍_。(默認為16個方塊距離)", @@ -1270,7 +1270,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": "打開_gui界面_", + "item.create.wand_of_symmetry.tooltip.action3": "打開_gui介面_", "item.create.handheld_worldshaper.tooltip": "環境塑形器", "item.create.handheld_worldshaper.tooltip.summary": "_大面積_更改地形的手持工具", @@ -1279,7 +1279,7 @@ "item.create.handheld_worldshaper.tooltip.control2": "當右鍵方塊時", "item.create.handheld_worldshaper.tooltip.action2": "_放置_或_替換_目標方塊", "item.create.handheld_worldshaper.tooltip.control3": "當潛行右鍵時", - "item.create.handheld_worldshaper.tooltip.action3": "打開工具的_gui界面_", + "item.create.handheld_worldshaper.tooltip.action3": "打開工具的_gui介面_", "item.create.tree_fertilizer.tooltip": "樹木肥料", "item.create.tree_fertilizer.tooltip.summary": "適用來常見樹木的快速肥料", @@ -1294,9 +1294,9 @@ "item.create.filter.tooltip": "過濾器", "item.create.filter.tooltip.summary": "將物品更精確地進行_篩選分類_,可以同時_篩選_多個物品或者將已標記的_過濾器_放在另一個_過濾器_里_嵌套_使用。", "item.create.filter.tooltip.condition1": "放置於過濾插槽中時", - "item.create.filter.tooltip.behaviour1": "根據_過濾器_的配置,來_決定_物品是否能夠通過", + "item.create.filter.tooltip.behaviour1": "根據_過濾器_的設定,來_決定_物品是否能夠通過", "item.create.filter.tooltip.condition2": "當右鍵時", - "item.create.filter.tooltip.behaviour2": "打開_配置面板_", + "item.create.filter.tooltip.behaviour2": "打開_設定面板_", "item.create.attribute_filter.tooltip": "屬性過濾器", "item.create.attribute_filter.tooltip.summary": "比起普通過濾器,_屬性過濾器_可以根據不同物品的_屬性_來進行過濾", @@ -1309,20 +1309,20 @@ "item.create.empty_schematic.tooltip.summary": "可作為合成材料或在_藍圖桌_使用", "item.create.schematic.tooltip": "藍圖", - "item.create.schematic.tooltip.summary": "將工程結構的_全息圖_放置於_世界中_,並使用_藍圖加農炮_進行構建。", - "item.create.schematic.tooltip.condition1": "當全息圖存在時", + "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": "藍圖與筆", - "item.create.schematic_and_quill.tooltip.summary": "用來將世界中的結構保存到.nbt文件。", + "item.create.schematic_and_quill.tooltip.summary": "用來將世界中的結構存到.nbt文件。", "item.create.schematic_and_quill.tooltip.condition1": "第一步", "item.create.schematic_and_quill.tooltip.behaviour1": "手持藍圖與右鍵旋轉兩個點", "item.create.schematic_and_quill.tooltip.condition2": "第二步", - "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.action1": "選取點/確認存檔", "item.create.schematic_and_quill.tooltip.control2": "按住Ctrl滑鼠滾輪", "item.create.schematic_and_quill.tooltip.action2": "在_空中_選擇點滾動以調整距離。", "item.create.schematic_and_quill.tooltip.control3": "當潛行右鍵時", @@ -1330,8 +1330,8 @@ "block.create.schematicannon.tooltip": "藍圖加農炮", "block.create.schematicannon.tooltip.summary": "通過發射方塊以在世界中重新構建已部署的_全息圖_,使用相鄰箱子中的物品及_火藥_作為燃料。", - "block.create.schematicannon.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.schematicannon.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_", + "block.create.schematicannon.tooltip.condition1": "當你對加農砲右鍵時", + "block.create.schematicannon.tooltip.behaviour1": "打開加農砲的設定介面", "block.create.schematic_table.tooltip": "藍圖桌", "block.create.schematic_table.tooltip.summary": "將保存的藍圖圖寫入_空白藍圖_", @@ -1341,11 +1341,11 @@ "item.create.goggles.tooltip": "MR護目鏡", "item.create.goggles.tooltip.summary": "一副特殊的眼鏡,能夠讓你看見_動能_的信息。", "item.create.goggles.tooltip.condition1": "當裝備後", - "item.create.goggles.tooltip.behaviour1": "將會展示該機械元件的_速度_、_動能_等數值", + "item.create.goggles.tooltip.behaviour1": "將會顯示該機械元件的_速度_、_動能_等數值。", "item.create.goggles.tooltip.condition2": "當裝備後看向儀表時", - "item.create.goggles.tooltip.behaviour2": "將會展示該儀表所連接網路的_速度_、_動能_等數值。", - "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", - "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", + "item.create.goggles.tooltip.behaviour2": "將會顯示該儀表所連接網路的_速度_、_動能_等數值。", + "item.create.goggles.tooltip.condition3": "當裝備後看向液體容器時", + "item.create.goggles.tooltip.behaviour3": "將會顯示儲存在該容器內的 _液體_ 以及其 _容量_ 等資訊。", "item.create.wrench.tooltip": "板手", "item.create.wrench.tooltip.summary": "一種常用的工具,能夠調整_動能_的_方向_、_配置_等。", @@ -1372,18 +1372,18 @@ "block.create.portable_fluid_interface.tooltip.condition2": "被紅石激活時", "block.create.portable_fluid_interface.tooltip.behaviour2": "立即終止任何活動的連接。", - "block.create.stockpile_switch.tooltip": "存量檢測器", + "block.create.stockpile_switch.tooltip": "存量偵測器", "block.create.stockpile_switch.tooltip.summary": "根據連接的容器_儲存空間_的占用情況切換紅石訊號強度。", "block.create.stockpile_switch.tooltip.condition1": "低於_下線_或高於_上線_時", "block.create.stockpile_switch.tooltip.behaviour1": "提供紅石訊號", "block.create.content_observer.tooltip": "物品偵測器", - "block.create.content_observer.tooltip.summary": "檢測_容器_和_輸送帶_中過濾器匹配的物品。當觀察到包含匹配的物品時,此組件將發出_紅石訊號_。當觀察到的漏斗_轉移匹配的物品_時,此組件將發出_紅石脈沖_。", + "block.create.content_observer.tooltip.summary": "偵測_容器_和_輸送帶_中過濾器匹配的物品。當觀察到包含匹配的物品時,此組件將發出_紅石訊號_。當觀察到的漏斗_轉移匹配的物品_時,此組件將發出_紅石脈沖_。", "block.create.adjustable_crate.tooltip": "可調節板條箱", - "block.create.adjustable_crate.tooltip.summary": "該箱子支持玩家對其容量進行調整,最大可以容納_16組_物品。", - "block.create.adjustable_crate.tooltip.condition1": "UNLOCALIZED: When R-Clicked", - "block.create.adjustable_crate.tooltip.behaviour1": "UNLOCALIZED: Opens the _Interface_.", + "block.create.adjustable_crate.tooltip.summary": "這個箱子可以調整容量,最大可以收納_16組_物品。", + "block.create.adjustable_crate.tooltip.condition1": "當你對箱子按右鍵時", + "block.create.adjustable_crate.tooltip.behaviour1": "打開箱子的設定介面", "block.create.creative_crate.tooltip": "創造板條箱", "block.create.creative_crate.tooltip.summary": "這個容器可以給臨近的_藍圖大炮_提供無限物品以及燃料 (創造專用物品)", @@ -1400,7 +1400,7 @@ "item.create.sand_paper.tooltip.condition1": "使用時", "item.create.sand_paper.tooltip.behaviour1": "打磨_副手_上或者_準心所指_的物品。", - "item.create.builders_tea.tooltip": "建造工茶飲", + "item.create.builders_tea.tooltip": "工人茶", "item.create.builders_tea.tooltip.summary": "神清氣爽的一天,從這杯完美茶飲開始。恢復復_饑餓值_並獲得_加速_效果。", "item.create.refined_radiance.tooltip": "光輝石", @@ -1416,9 +1416,9 @@ "create.tooltip.wip": "半成品", "create.tooltip.workInProgress": "尚在製作中!", - "create.tooltip.randomWipDescription0": "禁止將此物品給兒童。", + "create.tooltip.randomWipDescription0": "禁止將此物品給屁孩。", "create.tooltip.randomWipDescription1": "每~一~次~你使用此物品時,就會使一隻小熊貓死亡。", - "create.tooltip.randomWipDescription2": "使用此物請自負後果。", + "create.tooltip.randomWipDescription2": "使用此物品請自負後果。", "create.tooltip.randomWipDescription3": "快走開,這不是你要找的東西(搖手指", "create.tooltip.randomWipDescription4": "啟動自爆模式,10、9、8...。", "create.tooltip.randomWipDescription5": "你已經沒有退路了。", @@ -1429,688 +1429,688 @@ "_": "->------------------------] Ponder Content [------------------------<-", - "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", - "create.ponder.subject": "UNLOCALIZED: Subject of this scene", - "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", - "create.ponder.associated": "UNLOCALIZED: Associated Entries", - "create.ponder.close": "UNLOCALIZED: Close", - "create.ponder.identify": "UNLOCALIZED: Identify", - "create.ponder.next": "UNLOCALIZED: Next Scene", - "create.ponder.previous": "UNLOCALIZED: Previous Scene", - "create.ponder.replay": "UNLOCALIZED: Replay", - "create.ponder.think_back": "UNLOCALIZED: Think Back", - "create.ponder.slow_text": "UNLOCALIZED: Comfy Reading", - "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", - "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", - "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", - "create.ponder.shared.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", - "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", - "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", - "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", - "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", - "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", - "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", - "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", - "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", - "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", - "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", - "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", - "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", - "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", - "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", - "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", - "create.ponder.tag.windmill_sails": "UNLOCALIZED: Sails for Windmill Bearings", - "create.ponder.tag.windmill_sails.description": "UNLOCALIZED: Blocks that count towards the strength of a Windmill Contraption when assembled. Each of these have equal efficiency in doing so.", - "create.ponder.tag.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", - "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", - "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", - "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", - "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", - "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", - "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", - "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", - "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", - "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - - "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", - "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", - "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", - "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", - - "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", - "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", - "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", - "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", - "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", - "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", - - "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", - "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", - "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", - "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", - - "create.ponder.andesite_tunnel.header": "UNLOCALIZED: Using Andesite Tunnels", - "create.ponder.andesite_tunnel.text_1": "UNLOCALIZED: Andesite Tunnels can be used to cover up your belts", - "create.ponder.andesite_tunnel.text_2": "UNLOCALIZED: Whenever an Andesite Tunnel has connections to the sides...", - "create.ponder.andesite_tunnel.text_3": "UNLOCALIZED: ...they will split exactly one item off of any passing stacks", - "create.ponder.andesite_tunnel.text_4": "UNLOCALIZED: The remainder will continue on its path", - - "create.ponder.basin.header": "UNLOCALIZED: Processing Items in the Basin", - "create.ponder.basin.text_1": "UNLOCALIZED: A Basin can hold Items and Fluids for Processing", - "create.ponder.basin.text_2": "UNLOCALIZED: After a processing step, basins try to output below to the side of them", - "create.ponder.basin.text_3": "UNLOCALIZED: When a valid component is present, the Basin will show an output faucet", - "create.ponder.basin.text_4": "UNLOCALIZED: A number of options are applicable here", - "create.ponder.basin.text_5": "UNLOCALIZED: Outputs will be caught by the inventory below", - "create.ponder.basin.text_6": "UNLOCALIZED: Without output faucet, the Basin will retain items created in its processing", - "create.ponder.basin.text_7": "UNLOCALIZED: This can be useful if outputs should be re-used as ingredients", - "create.ponder.basin.text_8": "UNLOCALIZED: Desired outputs will then have to be extracted from the basin", - "create.ponder.basin.text_9": "UNLOCALIZED: A Filter might be necessary to avoid pulling out un-processed items", - - "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", - "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", - "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", - - "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", - - "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", - "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", - "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", - "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", - "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", - "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", - "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", - - "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", - "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", - "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", - "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", - "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", - "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", - "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions. Belts can span any Length between 2 and 20 blocks", - - "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", - "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", - "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", - - "create.ponder.blaze_burner.header": "UNLOCALIZED: Feeding Blaze Burners", - "create.ponder.blaze_burner.text_1": "UNLOCALIZED: Blaze Burners can provide Heat to Items processed in a Basin", - "create.ponder.blaze_burner.text_2": "UNLOCALIZED: For this, the Blaze has to be fed with flammable items", - "create.ponder.blaze_burner.text_3": "UNLOCALIZED: With a Blaze Cake, the Burner can reach an even stronger level of heat", - "create.ponder.blaze_burner.text_4": "UNLOCALIZED: The feeding process can be automated using Deployers or Mechanical Arms", - - "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.brass_tunnel.header": "UNLOCALIZED: Using Brass Tunnels", - "create.ponder.brass_tunnel.text_1": "UNLOCALIZED: Brass Tunnels can be used to cover up your belts", - "create.ponder.brass_tunnel.text_2": "UNLOCALIZED: Brass Tunnels have filter slots on each open side", - "create.ponder.brass_tunnel.text_3": "UNLOCALIZED: Filters on inbound connections simply block non-matching items", - "create.ponder.brass_tunnel.text_4": "UNLOCALIZED: Filters on outbound connections can be used to sort items by type", - "create.ponder.brass_tunnel.text_5": "UNLOCALIZED: Whenever a passing item has multiple valid exits, the distribution mode will decide how to handle it", - "create.ponder.brass_tunnel.text_6": "UNLOCALIZED: Brass Tunnels on parallel belts will form a group", - "create.ponder.brass_tunnel.text_7": "UNLOCALIZED: Incoming Items will now be distributed across all connected exits", - "create.ponder.brass_tunnel.text_8": "UNLOCALIZED: For this, items can also be inserted into the Tunnel block directly", - - "create.ponder.brass_tunnel_modes.header": "UNLOCALIZED: Distribution Modes of the Brass Tunnel", - "create.ponder.brass_tunnel_modes.text_1": "UNLOCALIZED: Using a Wrench, the distribution behaviour of Brass Tunnels can be configured", - "create.ponder.brass_tunnel_modes.text_10": "UNLOCALIZED: 'Synchronize Inputs' is a unique setting for Brass Tunnels", - "create.ponder.brass_tunnel_modes.text_11": "UNLOCALIZED: Items are only allowed past if every tunnel in the group has one waiting", - "create.ponder.brass_tunnel_modes.text_12": "UNLOCALIZED: This ensures that all affected belts supply items at the same rate", - "create.ponder.brass_tunnel_modes.text_2": "UNLOCALIZED: 'Split' will attempt to distribute the stack evenly between available outputs", - "create.ponder.brass_tunnel_modes.text_3": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_4": "UNLOCALIZED: 'Forced Split' will never skip outputs, and instead wait until they are free", - "create.ponder.brass_tunnel_modes.text_5": "UNLOCALIZED: 'Round Robin' keeps stacks whole, and cycles through outputs iteratively", - "create.ponder.brass_tunnel_modes.text_6": "UNLOCALIZED: Once Again, if an output is unable to take more items, it will be skipped", - "create.ponder.brass_tunnel_modes.text_7": "UNLOCALIZED: 'Forced Round Robin' never skips outputs", - "create.ponder.brass_tunnel_modes.text_8": "UNLOCALIZED: 'Prefer Nearest' prioritizes the outputs closest to the items' input location", - "create.ponder.brass_tunnel_modes.text_9": "UNLOCALIZED: 'Randomize' will distribute whole stacks to randomly picked outputs", - - "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", - "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", - "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", - "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", - - "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", - "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", - "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", - "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", - - "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", - "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", - "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", - - "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", - "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", - "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", - "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", - "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", - - "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", - "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", - "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", - "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - - "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", - "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", - "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", - "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", - "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", - "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", - "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - - "create.ponder.chute.header": "UNLOCALIZED: Transporting Items downward via Chutes", - "create.ponder.chute.text_1": "UNLOCALIZED: Chutes can transport items vertically from and to inventories", - "create.ponder.chute.text_2": "UNLOCALIZED: Using the Wrench, a window can be created", - "create.ponder.chute.text_3": "UNLOCALIZED: Placing chutes targeting the side faces of another will make it diagonal", - - "create.ponder.chute_upward.header": "UNLOCALIZED: Transporting Items upward via Chutes", - "create.ponder.chute_upward.text_1": "UNLOCALIZED: Using Encased Fans at the top or bottom, a Chute can move items upward", - "create.ponder.chute_upward.text_2": "UNLOCALIZED: Inspecting chutes with Engineers' Goggles reveals information about the movement direction", - "create.ponder.chute_upward.text_3": "UNLOCALIZED: On the 'blocked' end, items will have to be inserted/taken from the sides", - - "create.ponder.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", - "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", - "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", - "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", - "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", - "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", - "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", - "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", - "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", - - "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - - "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - - "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - - "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", - "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", - "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", - - "create.ponder.crushing_wheels.header": "UNLOCALIZED: Processing Items with Crushing Wheels", - "create.ponder.crushing_wheels.text_1": "UNLOCALIZED: A pair of Crushing Wheels can grind items very effectively", - "create.ponder.crushing_wheels.text_2": "UNLOCALIZED: Their Rotational Input has to make them spin into each other", - "create.ponder.crushing_wheels.text_3": "UNLOCALIZED: Items thrown or inserted into the top will get processed", - "create.ponder.crushing_wheels.text_4": "UNLOCALIZED: Items can be inserted and picked up through automated means as well", - - "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", - "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", - "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", - "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", - "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", - "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", - "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", - "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", - "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", - "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", - "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", - "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", - "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", - "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", - "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", - "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", - - "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", - "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", - "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", - "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", - - "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", - "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", - "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", - - "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", - "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", - "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", - "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.depot.header": "UNLOCALIZED: Using Depots", - "create.ponder.depot.text_1": "UNLOCALIZED: Depots can serve as 'stationary' belt elements", - "create.ponder.depot.text_2": "UNLOCALIZED: Right-Click to manually place or remove Items from it", - "create.ponder.depot.text_3": "UNLOCALIZED: Just like Mechanical Belts, it can provide items to processing", - "create.ponder.depot.text_4": "UNLOCALIZED: ...as well as provide Items to Mechanical Arms", - - "create.ponder.empty_blaze_burner.header": "UNLOCALIZED: Using Empty Blaze Burners", - "create.ponder.empty_blaze_burner.text_1": "UNLOCALIZED: Right-click a Blaze with the empty burner to capture it", - "create.ponder.empty_blaze_burner.text_2": "UNLOCALIZED: Alternatively, Blazes can be collected from their Spawners directly", - "create.ponder.empty_blaze_burner.text_3": "UNLOCALIZED: You now have an ideal heat source for various machines", - "create.ponder.empty_blaze_burner.text_4": "UNLOCALIZED: For Aesthetic purposes, Empty Blaze Burners can also be lit using Flint and Steel", - "create.ponder.empty_blaze_burner.text_5": "UNLOCALIZED: However, these are not suitable for industrial heating", - - "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", - "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", - "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", - - "create.ponder.fan_processing.header": "UNLOCALIZED: Processing Items using Encased Fans", - "create.ponder.fan_processing.text_1": "UNLOCALIZED: When passing through lava, the Air Flow becomes Heated", - "create.ponder.fan_processing.text_2": "UNLOCALIZED: Items caught in the area will be smelted", - "create.ponder.fan_processing.text_3": "UNLOCALIZED: Food items thrown here would be incinerated", - "create.ponder.fan_processing.text_4": "UNLOCALIZED: Instead, a setup for Smoking using Fire should be used for them", - "create.ponder.fan_processing.text_5": "UNLOCALIZED: Air Flows passing through water create a Washing Setup", - "create.ponder.fan_processing.text_6": "UNLOCALIZED: Some interesting new processing can be done with it", - "create.ponder.fan_processing.text_7": "UNLOCALIZED: The Speed of the Fan does NOT affect the processing speed, only its range", - "create.ponder.fan_processing.text_8": "UNLOCALIZED: Fan Processing can also be applied to Items on Depots and Belts", - - "create.ponder.fan_source.header": "UNLOCALIZED: Generating Rotational Force using Encased Fans", - "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", - "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", - - "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", - "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", - "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", - "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", - "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", - "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting", - - "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", - "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement. A mechanical belt should help here.", - - "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", - "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", - "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", - "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", - - "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - - "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - - "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", - "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", - "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", - "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - - "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - - "create.ponder.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", - "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", - "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", - "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", - "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", - "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", - "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", - "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", - - "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", - "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", - "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", - - "create.ponder.mechanical_arm.header": "UNLOCALIZED: Setting up Mechanical Arms", - "create.ponder.mechanical_arm.text_1": "UNLOCALIZED: Mechanical Arms have to be assigned their in- and outputs before they are placed", - "create.ponder.mechanical_arm.text_2": "UNLOCALIZED: Right-Click inventories while holding the Arm to assign them as Targets", - "create.ponder.mechanical_arm.text_3": "UNLOCALIZED: Right-Click again to toggle between Input (Blue) and Output (Orange)", - "create.ponder.mechanical_arm.text_4": "UNLOCALIZED: Left-Click components to remove their Selection", - "create.ponder.mechanical_arm.text_5": "UNLOCALIZED: Once placed, the Mechanical Arm will target the blocks selected previously", - "create.ponder.mechanical_arm.text_6": "UNLOCALIZED: They can have any amount of in- and outputs within their range", - "create.ponder.mechanical_arm.text_7": "UNLOCALIZED: However, not every type of Inventory can be interacted with directly", - "create.ponder.mechanical_arm.text_8": "UNLOCALIZED: Funnels and Depots can help to Bridge that gap", - - "create.ponder.mechanical_arm_filtering.header": "UNLOCALIZED: Filtering Outputs of the Mechanical Arm", - "create.ponder.mechanical_arm_filtering.text_1": "UNLOCALIZED: Inputs", - "create.ponder.mechanical_arm_filtering.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_filtering.text_3": "UNLOCALIZED: Sometimes it is desirable to restrict targets of the Arm by matching a filter", - "create.ponder.mechanical_arm_filtering.text_4": "UNLOCALIZED: Mechanical Arms by themselves do not provide any options for filtering", - "create.ponder.mechanical_arm_filtering.text_5": "UNLOCALIZED: Brass Funnels as Targets do however communicate their own filter to the Arm", - "create.ponder.mechanical_arm_filtering.text_6": "UNLOCALIZED: The Arm is smart enough not to pick up items it couldn't distribute", - - "create.ponder.mechanical_arm_modes.header": "UNLOCALIZED: Distribution modes of the Mechanical Arm", - "create.ponder.mechanical_arm_modes.text_1": "UNLOCALIZED: Input", - "create.ponder.mechanical_arm_modes.text_2": "UNLOCALIZED: Outputs", - "create.ponder.mechanical_arm_modes.text_3": "UNLOCALIZED: Whenever an Arm has to choose between multiple valid outputs...", - "create.ponder.mechanical_arm_modes.text_4": "UNLOCALIZED: ...it will act according to its setting", - "create.ponder.mechanical_arm_modes.text_5": "UNLOCALIZED: Scrolling with a Wrench will allow you to configure it", - "create.ponder.mechanical_arm_modes.text_6": "UNLOCALIZED: Round Robin mode simply cycles through all outputs that are available", - "create.ponder.mechanical_arm_modes.text_7": "UNLOCALIZED: If an output is unable to take more items, it will be skipped", - "create.ponder.mechanical_arm_modes.text_8": "UNLOCALIZED: Forced Round Robin mode will never skip outputs, and instead wait until they are free", - "create.ponder.mechanical_arm_modes.text_9": "UNLOCALIZED: Prefer First prioritizes the outputs selected earliest when configuring this Arm", - - "create.ponder.mechanical_arm_redstone.header": "UNLOCALIZED: Controlling Mechanical Arms with Redstone", - "create.ponder.mechanical_arm_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Mechanical Arms will not activate", - "create.ponder.mechanical_arm_redstone.text_2": "UNLOCALIZED: Before stopping, it will finish any started cycles", - "create.ponder.mechanical_arm_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", - - "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", - "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", - "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", - - "create.ponder.mechanical_crafter.header": "UNLOCALIZED: Setting up Mechanical Crafters", - "create.ponder.mechanical_crafter.text_1": "UNLOCALIZED: An array of Mechanical Crafters can be used to automate any Crafting Recipe", - "create.ponder.mechanical_crafter.text_2": "UNLOCALIZED: Using a Wrench, the Crafters' paths can be arranged", - "create.ponder.mechanical_crafter.text_3": "UNLOCALIZED: For a valid setup, all paths have to converge into one exit at any side", - "create.ponder.mechanical_crafter.text_4": "UNLOCALIZED: The outputs will be placed into the inventory at the exit", - "create.ponder.mechanical_crafter.text_5": "UNLOCALIZED: Mechanical Crafters require Rotational Force to operate", - "create.ponder.mechanical_crafter.text_6": "UNLOCALIZED: Right-Click the front to insert Items manually", - "create.ponder.mechanical_crafter.text_7": "UNLOCALIZED: Once every slot of a path contains an Item, the crafting process will begin", - "create.ponder.mechanical_crafter.text_8": "UNLOCALIZED: For recipes not fully occupying the crafter setup, the start can be forced using a Redstone Pulse", - - "create.ponder.mechanical_crafter_connect.header": "UNLOCALIZED: Connecting Inventories of Crafters", - "create.ponder.mechanical_crafter_connect.text_1": "UNLOCALIZED: Items can be inserted to Crafters automatically", - "create.ponder.mechanical_crafter_connect.text_2": "UNLOCALIZED: Using the Wrench at their backs, Mechanical Crafter inputs can be combined", - "create.ponder.mechanical_crafter_connect.text_3": "UNLOCALIZED: All connected Crafters can now be accessed by the same input location", - - "create.ponder.mechanical_crafter_covers.header": "UNLOCALIZED: Covering slots of Mechanical Crafters", - "create.ponder.mechanical_crafter_covers.text_1": "UNLOCALIZED: Some recipes will require additional Crafters to bridge gaps in the path", - "create.ponder.mechanical_crafter_covers.text_2": "UNLOCALIZED: Using Slot Covers, Crafters can be set to act as an Empty Slot in the arrangement", - "create.ponder.mechanical_crafter_covers.text_3": "UNLOCALIZED: Shared Inputs created with the Wrench at the back can also reach across covered Crafters", - - "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", - "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", - "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", - - "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", - "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", - "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", - - "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", - "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", - "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", - - "create.ponder.mechanical_mixer.header": "UNLOCALIZED: Processing Items with the Mechanical Mixer", - "create.ponder.mechanical_mixer.text_1": "UNLOCALIZED: With a Mixer and Basin, some Crafting Recipes can be automated", - "create.ponder.mechanical_mixer.text_2": "UNLOCALIZED: Available recipes include any Shapeless Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_mixer.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_mixer.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", - "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", - "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", - "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", - - "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", - "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", - "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", - "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", - "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", - "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", - "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", - - "create.ponder.mechanical_press.header": "UNLOCALIZED: Processing Items with the Mechanical Press", - "create.ponder.mechanical_press.text_1": "UNLOCALIZED: The Mechanical Press can process items provided beneath it", - "create.ponder.mechanical_press.text_2": "UNLOCALIZED: The Input items can be dropped or placed on a Depot under the Press", - "create.ponder.mechanical_press.text_3": "UNLOCALIZED: When items are provided on a belt...", - "create.ponder.mechanical_press.text_4": "UNLOCALIZED: The Press will hold and process them automatically", - - "create.ponder.mechanical_press_compacting.header": "UNLOCALIZED: Compacting items with the Mechanical Press", - "create.ponder.mechanical_press_compacting.text_1": "UNLOCALIZED: Pressing items held in a Basin will cause them to be Compacted", - "create.ponder.mechanical_press_compacting.text_2": "UNLOCALIZED: Compacting includes any filled 2x2 or 3x3 Crafting Recipe, plus a couple extra ones", - "create.ponder.mechanical_press_compacting.text_3": "UNLOCALIZED: Some of those recipes may require the heat of a Blaze Burner", - "create.ponder.mechanical_press_compacting.text_4": "UNLOCALIZED: The filter slot can be used in case two recipes are conflicting.", - - "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", - "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", - "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", - - "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", - "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", - "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", - - "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", - "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", - "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", - "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", - "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", - "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", - - "create.ponder.millstone.header": "UNLOCALIZED: Processing Items in the Millstone", - "create.ponder.millstone.text_1": "UNLOCALIZED: Millstones process items by grinding them", - "create.ponder.millstone.text_2": "UNLOCALIZED: They can be powered from the side using cogwheels", - "create.ponder.millstone.text_3": "UNLOCALIZED: Throw or Insert items at the top", - "create.ponder.millstone.text_4": "UNLOCALIZED: After some time, the result can be obtained via Right-click", - "create.ponder.millstone.text_5": "UNLOCALIZED: The outputs can also be extracted by automation", - - "create.ponder.nixie_tube.header": "UNLOCALIZED: Using Nixie Tubes", - "create.ponder.nixie_tube.text_1": "UNLOCALIZED: When powered by Redstone, Nixie Tubes will display the redstone signals' strength", - "create.ponder.nixie_tube.text_2": "UNLOCALIZED: Using name tags edited with an anvil, custom text can be displayed", - - "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", - "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", - "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", - - "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - - "create.ponder.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", - "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", - "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", - "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", - "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", - - "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", - "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", - "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", - "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", - "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", - - "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", - "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", - - "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", - "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", - "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", - "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", - "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", - "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", - "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", - "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", - "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", - "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", - - "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", - "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", - "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", - - "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", - "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", - "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", - "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", - "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", - - "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", - "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", - "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", - - "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", - "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", - "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", - "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", - - "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", - "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", - "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", - - "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", - "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", - "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", - - "create.ponder.sail.header": "UNLOCALIZED: Assembling Windmills using Sails", - "create.ponder.sail.text_1": "UNLOCALIZED: Sails are handy blocks to create Windmills with", - "create.ponder.sail.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - "create.ponder.sail.text_3": "UNLOCALIZED: Right-Click with Dye to paint them", - "create.ponder.sail.text_4": "UNLOCALIZED: Right-Click with Shears to turn them back into frames", - - "create.ponder.sail_frame.header": "UNLOCALIZED: Assembling Windmills using Sail Frames", - "create.ponder.sail_frame.text_1": "UNLOCALIZED: Sail Frames are handy blocks to create Windmills with", - "create.ponder.sail_frame.text_2": "UNLOCALIZED: They will attach to blocks and each other without the need of Super Glue or Chassis Blocks", - - "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", - "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", - "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", - "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", - "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", - "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", - - "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.smart_chute.header": "UNLOCALIZED: Filtering Items using Smart Chutes", - "create.ponder.smart_chute.text_1": "UNLOCALIZED: Smart Chutes are vertical chutes with additional control", - "create.ponder.smart_chute.text_2": "UNLOCALIZED: Items in the filter slot specify what exactly they can extract and transfer", - "create.ponder.smart_chute.text_3": "UNLOCALIZED: Use the Mouse Wheel to specify the extracted stack size", - "create.ponder.smart_chute.text_4": "UNLOCALIZED: Redstone power will prevent Smart Chutes from acting.", - - "create.ponder.speedometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Speedometer", - "create.ponder.speedometer.text_1": "UNLOCALIZED: The Speedometer displays the current Speed of the attached components", - "create.ponder.speedometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.speedometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Speedometer's measurements", - - "create.ponder.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", - "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", - "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", - "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", - "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", - - "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", - "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", - "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", - "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", - "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", - - "create.ponder.stressometer.header": "UNLOCALIZED: Monitoring Kinetic information using the Stressometer", - "create.ponder.stressometer.text_1": "UNLOCALIZED: The Stressometer displays the current Stress Capacity of the attached kinetic network", - "create.ponder.stressometer.text_2": "UNLOCALIZED: When wearing Engineers' Goggles, the player can get more detailed information from the Gauge", - "create.ponder.stressometer.text_3": "UNLOCALIZED: Comparators can emit analog Restone Signals relative to the Stressometer's measurements", - - "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", - "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", - "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", - "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", - "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", - "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", - - "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", - "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", - "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", - "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", - "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", - "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", - - "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", - "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", - "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", - "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", - "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", - - "create.ponder.weighted_ejector.header": "UNLOCALIZED: Using Weighted Ejectors", - "create.ponder.weighted_ejector.text_1": "UNLOCALIZED: Sneak and Right-Click holding an Ejector to select its target location", - "create.ponder.weighted_ejector.text_10": "UNLOCALIZED: It is now limited to this stack size, and only activates when its held stack reaches this amount", - "create.ponder.weighted_ejector.text_11": "UNLOCALIZED: Other Entities will always trigger an Ejector when stepping on it", - "create.ponder.weighted_ejector.text_2": "UNLOCALIZED: The placed ejector will now launch objects to the marked location", - "create.ponder.weighted_ejector.text_3": "UNLOCALIZED: A valid target can be at any height or distance within range", - "create.ponder.weighted_ejector.text_4": "UNLOCALIZED: They cannot however be off to a side", - "create.ponder.weighted_ejector.text_5": "UNLOCALIZED: If no valid Target was selected, it will simply target the block directly in front", - "create.ponder.weighted_ejector.text_6": "UNLOCALIZED: Supply Rotational Force in order to charge it up", - "create.ponder.weighted_ejector.text_7": "UNLOCALIZED: Items placed on the ejector cause it to trigger", - "create.ponder.weighted_ejector.text_8": "UNLOCALIZED: If Inventories are targeted, the ejector will wait until there is space", - "create.ponder.weighted_ejector.text_9": "UNLOCALIZED: Using the Wrench, a required Stack Size can be configured", - - "create.ponder.weighted_ejector_redstone.header": "UNLOCALIZED: Controlling Weighted Ejectors with Redstone", - "create.ponder.weighted_ejector_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Ejectors will not activate", - "create.ponder.weighted_ejector_redstone.text_2": "UNLOCALIZED: Furthermore, Observers can detect when Ejectors activate", - - "create.ponder.weighted_ejector_tunnel.header": "UNLOCALIZED: Splitting item stacks using Weighted Ejectors", - "create.ponder.weighted_ejector_tunnel.text_1": "UNLOCALIZED: Combined with Brass Tunnels, Ejectors can split item stacks by specific amounts", - "create.ponder.weighted_ejector_tunnel.text_2": "UNLOCALIZED: First, configure the Brass Tunnel to 'Prefer Nearest', in order to prioritize its side output", - "create.ponder.weighted_ejector_tunnel.text_3": "UNLOCALIZED: The Stack Size set on the Ejector now determines the amount to be split off", - "create.ponder.weighted_ejector_tunnel.text_4": "UNLOCALIZED: While a new stack of the configured size exits the side output...", - "create.ponder.weighted_ejector_tunnel.text_5": "UNLOCALIZED: ...the remainder will continue on its path", - - "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", - "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", - "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", - "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", - "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", - "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", - "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", - - "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", - "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "create.ponder.hold_to_ponder": "按住 [%1$s] 來思考此物品", + "create.ponder.subject": "本場景的主題", + "create.ponder.pondering": "思考有關於...", + "create.ponder.identify_mode": "暫停模式已啟動\n按 [%1$s] 來取消暫停模式", + "create.ponder.associated": "相關物品", + "create.ponder.close": "關閉", + "create.ponder.identify": "暫停", + "create.ponder.next": "下個場景", + "create.ponder.previous": "上個場景", + "create.ponder.replay": "重放", + "create.ponder.think_back": "返回", + "create.ponder.slow_text": "降低文字顯示速度", + "create.ponder.shared.movement_anchors": "有了機殼底盤和強力膠就可以移動大型結構", + "create.ponder.shared.rpm32": "32 RPM", + "create.ponder.shared.sneak_and": "潛行 +", + "create.ponder.shared.storage_on_contraption": "與結構相連的儲物空間會自動撿取物品", + "create.ponder.shared.behaviour_modify_wrench": "使用扳手來調整這個動作", + "create.ponder.shared.rpm8": "8 RPM", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "轉速: 16 RPM", + "create.ponder.shared.rpm16": "16 RPM", + "create.ponder.tag.kinetic_sources": "動能產生裝置", + "create.ponder.tag.kinetic_sources.description": "該裝置能夠產生動能", + "create.ponder.tag.contraption_actor": "Contraption Actors", + "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "機械手臂的目標物", + "create.ponder.tag.arm_targets.description": "該裝置可作為機械手臂的工作目標", + "create.ponder.tag.logistics": "傳輸物品", + "create.ponder.tag.logistics.description": "該裝置用於物品的傳輸", + "create.ponder.tag.movement_anchor": "Movement Anchors", + "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.creative": "創造模式", + "create.ponder.tag.creative.description": "該裝置無法在生存模式中獲得", + "create.ponder.tag.kinetic_relays": "動能傳遞方塊", + "create.ponder.tag.kinetic_relays.description": "該裝置用於傳遞動能", + "create.ponder.tag.windmill_sails": "風車軸承的帆", + "create.ponder.tag.windmill_sails.description": "建造風車時用於產生動能的帆,每個帆對風車產生的效果都是同等的", + "create.ponder.tag.contraption_assembly": "方塊連接物件", + "create.ponder.tag.contraption_assembly.description": "此物件用於連接各個零件以便組成一個成品", + "create.ponder.tag.decoration": "裝飾", + "create.ponder.tag.decoration.description": "這些零件通常用於裝飾", + "create.ponder.tag.kinetic_appliances": "動能利用裝置", + "create.ponder.tag.kinetic_appliances.description": "這些裝置利用動能運作", + "create.ponder.tag.redstone": "邏輯控制裝置", + "create.ponder.tag.redstone.description": "這些裝置會在紅石電路中發揮用處", + "create.ponder.tag.fluids": "液體控制裝置", + "create.ponder.tag.fluids.description": "這些裝置可傳輸並利用液體", + + "create.ponder.adjustable_pulse_repeater.header": "使用可調式脈衝中繼器來控制訊號", + "create.ponder.adjustable_pulse_repeater.text_1": "可調式脈衝中繼器每次運作時會產生一個短脈衝", + "create.ponder.adjustable_pulse_repeater.text_2": "使用滑鼠滾輪來設定啟動後到產生脈衝的延遲", + "create.ponder.adjustable_pulse_repeater.text_3": "延遲可設定到最大30分鐘", + + "create.ponder.adjustable_repeater.header": "使用可調式中繼器來控制訊號", + "create.ponder.adjustable_repeater.text_1": "可調式中繼器就像一般的中繼器", + "create.ponder.adjustable_repeater.text_2": "收到訊號後在設定好的時間過後才啟動...", + "create.ponder.adjustable_repeater.text_3": "...訊號停止後也需要相隔同樣的時間過後才會停止", + "create.ponder.adjustable_repeater.text_4": "使用滑鼠滾輪來設定延遲", + "create.ponder.adjustable_repeater.text_5": "延遲可設定到最大30分鐘", + + "create.ponder.analog_lever.header": "使用可調式拉桿來控制訊號", + "create.ponder.analog_lever.text_1": "可調式拉桿是一種小巧而輕準的紅石能源", + "create.ponder.analog_lever.text_2": "右鍵來增加其紅石訊號輸出", + "create.ponder.analog_lever.text_3": "潛行並右鍵來減少其紅石訊號輸出", + + "create.ponder.andesite_tunnel.header": "使用安山岩物品隧道", + "create.ponder.andesite_tunnel.text_1": "安山岩物品隧道可以覆蓋在輸送帶上", + "create.ponder.andesite_tunnel.text_2": "當安山岩物品隧道側邊連接到另一條輸送帶時...", + "create.ponder.andesite_tunnel.text_3": "...隧道將會從經過的整組物品中拿出一個丟到另一條輸送帶上", + "create.ponder.andesite_tunnel.text_4": "剩餘物品則按照原路輸出", + + "create.ponder.basin.header": "在作業盆中處理物品", + "create.ponder.basin.text_1": "作業盆可以放入物品或液體來進行處理", + "create.ponder.basin.text_2": "在每次的處理完成後, 作業盆會試著輸出成品到他的側面下方", + "create.ponder.basin.text_3": "當側面下方有一個有效的容器或設備, 作業盆側面會出現一個輸出嘴", + "create.ponder.basin.text_4": "有很多的容器或設備可以觸發上述現象", + "create.ponder.basin.text_5": "作業盆輸出的成品會被儲存到該容器或設備內", + "create.ponder.basin.text_6": "如果側面沒有出現輸出嘴, 則作業盆內的成品則不會輸出", + "create.ponder.basin.text_7": "這個原理用在產生的成品為下一輪處理的原料時相當有用", + "create.ponder.basin.text_8": "期望的成品將會從作業盆中輸出", + "create.ponder.basin.text_9": "加裝過濾器可防止未被處理的物品輸出", + + "create.ponder.bearing_modes.header": "機械軸承的工作模式", + "create.ponder.bearing_modes.text_1": "當機械軸承停止時,它會控制整個結構停在最近的垂直線上並實體化", + "create.ponder.bearing_modes.text_2": "你可以控制它不要實體化,或是在結構起始位置才實體化", + + "create.ponder.belt_casing.header": "包裹住輸送帶", + "create.ponder.belt_casing.text_1": "安山岩機殼或黃銅機殼可以用來裝飾輸送帶", + "create.ponder.belt_casing.text_2": "使用扳手可以移除機殼", + + "create.ponder.belt_connector.header": "使用輸送帶", + "create.ponder.belt_connector.text_1": "手持輸送帶對兩根傳動軸右鍵以安裝輸送帶", + "create.ponder.belt_connector.text_2": "不小心點到傳動軸的話可以用潛行+右鍵來取消選取", + "create.ponder.belt_connector.text_3": "輸送帶間只要有空間就能安裝額外的傳動軸", + "create.ponder.belt_connector.text_4": "相同輸送帶接出來的傳動軸轉速及轉向會相同", + "create.ponder.belt_connector.text_5": "使用扳手可以移除已安裝的傳動軸", + "create.ponder.belt_connector.text_6": "輸送帶可以被各種染料染色", + + "create.ponder.belt_directions.header": "輸送帶正確的安裝方向", + "create.ponder.belt_directions.text_1": "輸送帶不可以隨意聯結", + "create.ponder.belt_directions.text_2": "1. 輸送帶可以水平連結", + "create.ponder.belt_directions.text_3": "2. 輸送帶可以對角連結", + "create.ponder.belt_directions.text_4": "3. 輸送帶可以垂直連結", + "create.ponder.belt_directions.text_5": "4. 也可以連結在垂直的傳動軸上", + "create.ponder.belt_directions.text_6": "這些都是可以使用的連接方式,輸送帶可以放置的長度為2~20格", + + "create.ponder.belt_transport.header": "將輸送帶用於後勤", + "create.ponder.belt_transport.text_1": "被啟動的輸送帶能運送物品及實體", + "create.ponder.belt_transport.text_2": "空手對輸送帶上的物品右鍵即可從輸送帶上取下物品", + + "create.ponder.blaze_burner.header": "餵食烈焰使者動力爐", + "create.ponder.blaze_burner.text_1": "烈焰使者動力爐可以用來加熱作業盆", + "create.ponder.blaze_burner.text_2": "你需要餵食可以燃燒的物品來加熱作業盆", + "create.ponder.blaze_burner.text_3": "餵食熔岩蛋糕可以讓烈焰使者動力爐加熱到另一個更高的境界", + "create.ponder.blaze_burner.text_4": "使用機械手或機械手臂來將餵食自動化", + + "create.ponder.brass_funnel.header": "黃銅漏斗", + "create.ponder.brass_funnel.text_1": "安山岩漏斗每次只能傳輸一個物品", + "create.ponder.brass_funnel.text_2": "但黃銅漏斗每次可以傳輸整組物品", + "create.ponder.brass_funnel.text_3": "對漏斗上的過濾格使用滾輪可以調整每次輸出物品的數量", + "create.ponder.brass_funnel.text_4": "手持物品對漏斗上的過濾格右鍵可以限制漏斗只輸出該物品", + + "create.ponder.brass_tunnel.header": "使用黃銅隧道", + "create.ponder.brass_tunnel.text_1": "黃銅隧道必須裝設在輸送帶上", + "create.ponder.brass_tunnel.text_2": "黃銅隧道輸出入口上都有過濾格", + "create.ponder.brass_tunnel.text_3": "在輸入口上的過濾器會阻擋不相符的物品", + "create.ponder.brass_tunnel.text_4": "在輸出口上的過濾器可依種類整理排列物品", + "create.ponder.brass_tunnel.text_5": "如果數種與過濾相符的物品通過隧道, 隧道的分配模式將決定如何處理這些物品", + "create.ponder.brass_tunnel.text_6": "在平行相鄰的輸送帶上,相鄰的黃銅隧道將會成為一組", + "create.ponder.brass_tunnel.text_7": "輸入該組內的物品將會採用該組隧道的分配模式輸送", + "create.ponder.brass_tunnel.text_8": "在這個情況下, 物品也能被直接輸入到隧道方塊", + + "create.ponder.brass_tunnel_modes.header": "黃銅隧道的分配模式", + "create.ponder.brass_tunnel_modes.text_1": "使用扳手來調整隧道的分配模式", + "create.ponder.brass_tunnel_modes.text_10": "'同步輸入' 是一種黃銅隧道的特殊設定", + "create.ponder.brass_tunnel_modes.text_11": "當同組內的所有隧道都有一個可通過的物品時,所有隧道才可輸出物品", + "create.ponder.brass_tunnel_modes.text_12": "這確保了同組隧道所在的輸送帶都能以同一速率輸出物品", + "create.ponder.brass_tunnel_modes.text_2": "'分流輸出' 此模式會將物品輸出到該組隧道可用的輸出口", + "create.ponder.brass_tunnel_modes.text_3": "如果該組隧道內某個輸出口無法再輸出物品,則該輸出口會被跳過", + "create.ponder.brass_tunnel_modes.text_4": "'強制分流輸出' 模式不會跳過某個無法輸出物品的輸出口, 直到該輸出口可以輸出物品", + "create.ponder.brass_tunnel_modes.text_5": "'輪詢輸入' 模式將會保持整組物品完整性, 然後在有輸出口可以輸出時才輸入物品", + "create.ponder.brass_tunnel_modes.text_6": "如果該組隧道內某個輸出口無法再輸出物品,則該輸出口會被跳過", + "create.ponder.brass_tunnel_modes.text_7": "'強制輪詢輸入' 模式不會跳過某個無法輸出物品的輸出口, 直到該輸出口可以輸出物品", + "create.ponder.brass_tunnel_modes.text_8": "'鄰近優先' 模式會將物品輸出到該組隧道離物品輸入口最近的出口", + "create.ponder.brass_tunnel_modes.text_9": "'隨機輸出' 模式會隨機選擇同組隧道的一個輸出口輸出", + + "create.ponder.cart_assembler.header": "使用礦車裝修站裝修礦車來移動結構", + "create.ponder.cart_assembler.text_1": "礦車裝修站會將所有連接到礦車的結構裝在礦車上", + "create.ponder.cart_assembler.text_2": "如果沒有紅時訊號,它會將礦車結構分解成方塊", + "create.ponder.cart_assembler.text_3": "對礦車結構使用扳手可以將礦車變成物品", + + "create.ponder.cart_assembler_dual.header": "雙礦車結構", + "create.ponder.cart_assembler_dual.text_1": "當兩台礦車在同一礦車結構上", + "create.ponder.cart_assembler_dual.text_2": "任一礦車裝修站收到紅石訊號時,會形成完整的一個礦車結構", + "create.ponder.cart_assembler_dual.text_3": "整個礦車結構會類似於用礦車連結器連接兩個礦車結構", + + "create.ponder.cart_assembler_modes.header": "礦車結構的方向設定", + "create.ponder.cart_assembler_modes.text_1": "礦車結構會隨著礦車方向改變", + "create.ponder.cart_assembler_modes.text_2": "如果在裝修站鎖定其方向,則結構方向不會隨礦車方向改變", + + "create.ponder.cart_assembler_rails.header": "其他種類的礦車和鐵軌", + "create.ponder.cart_assembler_rails.text_1": "放在普通鐵軌上的礦車裝修站不會影響礦車的動作", + "create.ponder.cart_assembler_rails.text_2": "如果裝修站在沒有紅石訊號的動力鐵軌或控制鐵軌上,則礦車會停下直到鐵軌收到紅石訊號", + "create.ponder.cart_assembler_rails.text_3": "有幾種礦車可以當作錨來使用", + "create.ponder.cart_assembler_rails.text_4": "熔爐礦車會盡可能維持熔煉狀態,並會拿取鄰近儲存結構上的燃料", + + "create.ponder.chain_drive.header": "使用鏈式傳動箱傳遞動能", + "create.ponder.chain_drive.text_1": "同一排上的鏈式傳動箱會互相傳遞動能", + "create.ponder.chain_drive.text_2": "所有傳動軸此時會朝相同方向旋轉", + "create.ponder.chain_drive.text_3": "任一個鏈式傳動箱被旋轉90度時所有鏈式傳動箱仍可正常運作", + + "create.ponder.chain_gearshift.header": "使用可調式鏈式變速箱來調整轉速", + "create.ponder.chain_gearshift.text_1": "未被控制的可調式鏈式變速箱與鏈式傳動箱無異", + "create.ponder.chain_gearshift.text_2": "當可調式鏈式變速箱被啟動後,它會把轉速提升兩倍傳至其他鏈式傳動箱", + "create.ponder.chain_gearshift.text_3": "當被啟動的可調式鏈式變速箱並不是動能輸入端,則它會把轉速減半", + "create.ponder.chain_gearshift.text_4": "上述兩種狀況中,其他鏈式傳動箱都會被可調式鏈式變速箱提升兩倍的轉速", + "create.ponder.chain_gearshift.text_5": "利用紅石訊號的強弱可以調整轉速倍率為x1或x2", + "create.ponder.chain_gearshift.text_6": "12 RPM", + + "create.ponder.chute.header": "使用滑道向下輸送物品", + "create.ponder.chute.text_1": "滑道可以在兩個垂直的儲物空間中輸送物品", + "create.ponder.chute.text_2": "使用扳手可以讓它產生一個觀景窗", + "create.ponder.chute.text_3": "在滑道的側面放置另一個滑道,會產生一個斜狀的滑道", + + "create.ponder.chute_upward.header": "使用滑道向上輸送物品", + "create.ponder.chute_upward.text_1": "在滑道上方或下方使用鼓風機時,物品會根據被向上或向下吹", + "create.ponder.chute_upward.text_2": "裝備MR護目鏡以觀測物品的傳輸方向", + "create.ponder.chute_upward.text_3": "如滑道底端被擋住,則物品只能由側邊進行輸出入", + + "create.ponder.clockwork_bearing.header": "使用時鐘軸承來建造時鐘結構", + "create.ponder.clockwork_bearing.text_1": "時鐘軸承會黏住其前方方塊產生一個時針結構", + "create.ponder.clockwork_bearing.text_2": "在輸入動能後,該結構會依照遊戲時間來旋轉", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "對軸承右鍵會使結構啟動或停止", + "create.ponder.clockwork_bearing.text_6": "在時針結構的前方可再增加一組分針結構", + "create.ponder.clockwork_bearing.text_7": "你必須確保時針分針結構間未被使用強力膠之類的相連零件", + "create.ponder.clockwork_bearing.text_8": "分針結構此時將正常運作", + + "create.ponder.clutch.header": "使用離合器控制動能", + "create.ponder.clutch.text_1": "離合器能將動能直線傳遞", + "create.ponder.clutch.text_2": "當離合器被啟動,離合器會中斷動能傳遞", + + "create.ponder.cog_speedup.header": "使用大小齒輪來變速", + "create.ponder.cog_speedup.text_1": "大齒輪與小齒輪可以斜向傳遞動能", + "create.ponder.cog_speedup.text_2": "從大齒輪傳遞動能至小齒輪時,轉速加倍", + "create.ponder.cog_speedup.text_3": "從小齒輪傳遞動能至大齒輪時,轉速減半", + + "create.ponder.cogwheel.header": "使用齒輪來傳遞動能", + "create.ponder.cogwheel.text_1": "齒輪會將動力傳遞至臨近的齒輪", + "create.ponder.cogwheel.text_2": "以此方式連接的齒輪,旋轉方向相反", + + "create.ponder.creative_motor.header": "使用創造馬達產生動能", + "create.ponder.creative_motor.text_1": "創造馬達不僅能夠手動設定輸出動能,而且體積相當小巧", + "create.ponder.creative_motor.text_2": "對其背後面板滾動滾輪,可以改變馬達的轉速", + + "create.ponder.crushing_wheels.header": "使用粉碎輪處理物品", + "create.ponder.crushing_wheels.text_1": "一對粉碎輪,磨物快又準", + "create.ponder.crushing_wheels.text_2": "接入的動能必須使這兩個輪子契合轉動", + "create.ponder.crushing_wheels.text_3": "扔入或者放入的物品都會被粉碎處理", + "create.ponder.crushing_wheels.text_4": "你也可以使用自動化進行物品的輸入以及撿取", + + "create.ponder.deployer.header": "使用機械手", + "create.ponder.deployer.text_1": "在機械手獲得動能後能夠模仿玩家的各種行為", + "create.ponder.deployer.text_10": "對機械手手部右鍵,即可將手上的物品給它使用", + "create.ponder.deployer.text_11": "物品也可以自動化輸入到機械手內", + "create.ponder.deployer.text_12": "機械手附帶一個過濾格", + "create.ponder.deployer.text_13": "當設定了過濾後,只有當它的手中物品與過濾格相符時,它才會工作", + "create.ponder.deployer.text_14": "只有與過濾格相符的物品才可輸入...", + "create.ponder.deployer.text_15": "...不符的物品可被取出來", + "create.ponder.deployer.text_2": "它只會與它正前方兩格處的位置進行互動", + "create.ponder.deployer.text_3": "放在在它面前的方塊不會阻攔它的工作", + "create.ponder.deployer.text_4": "機械手可以:", + "create.ponder.deployer.text_5": "放置方塊", + "create.ponder.deployer.text_6": "使用物品", + "create.ponder.deployer.text_7": "啟動方塊", + "create.ponder.deployer.text_8": "採收方塊", + "create.ponder.deployer.text_9": "以及攻擊生物", + + "create.ponder.deployer_contraption.header": "在裝置上使用機械手", + "create.ponder.deployer_contraption.text_1": "當機械手在移動的結構上時...", + "create.ponder.deployer_contraption.text_2": "機械手會對每一個經過的方塊使用裝置中任意容器內的物品", + "create.ponder.deployer_contraption.text_3": "可以透過過濾格來指定其從存儲空間中抽取的物品", + + "create.ponder.deployer_modes.header": "機械手的工作模式", + "create.ponder.deployer_modes.text_1": "在設設情況下,機械手模仿玩家的右鍵", + "create.ponder.deployer_modes.text_2": "使用扳手可以將模式調整為模仿玩家的左鍵", + + "create.ponder.deployer_redstone.header": "使用紅石控制機械手", + "create.ponder.deployer_redstone.text_1": "當機械手收到紅時訊號時會停止工作", + "create.ponder.deployer_redstone.text_2": "在停止工作前,機械手會完成目前手頭上的工作", + "create.ponder.deployer_redstone.text_3": "因此,輸入脈衝訊號可以使其每次只進行一個週期的工作", + + "create.ponder.depot.header": "使用置物台", + "create.ponder.depot.text_1": "置物台可以被當成一個“靜止的”傳送帶原件使用", + "create.ponder.depot.text_2": "右擊可以手動放置或取下物品", + "create.ponder.depot.text_3": "與傳送帶一樣,它也可以將其內的物品轉送到其他設備中進行加工...", + "create.ponder.depot.text_4": "...同時物品也可以被機械手存取", + + "create.ponder.empty_blaze_burner.header": "使用空的烈焰人燃燒室", + "create.ponder.empty_blaze_burner.text_1": "手持空的烈焰人燃燒室右擊烈焰人來抓取烈焰人", + "create.ponder.empty_blaze_burner.text_2": "或者,也可以透過右擊烈焰人刷怪籠來填充啟動烈焰人燃燒室", + "create.ponder.empty_blaze_burner.text_3": "這樣,你便有了一個可供部分機器加工的熱源", + "create.ponder.empty_blaze_burner.text_4": "如果是為了美觀,空的烈焰人燃燒室也可以被打火石點燃", + "create.ponder.empty_blaze_burner.text_5": "但是,這樣的熱源不足以給機器提加工供足夠的熱量", + + "create.ponder.fan_direction.header": "鼓風機的氣流", + "create.ponder.fan_direction.text_1": "鼓風機使用動能來製造氣流", + "create.ponder.fan_direction.text_2": "流速以及方向由所接收動能的強弱以及方向而定", + + "create.ponder.fan_processing.header": "使用鼓風機加工物品", + "create.ponder.fan_processing.text_1": "當氣流吹過熔岩時,氣流會被加熱", + "create.ponder.fan_processing.text_2": "熱氣流中的物品會被冶煉", + "create.ponder.fan_processing.text_3": "但在氣流中的食物會被直接燒成灰", + "create.ponder.fan_processing.text_4": "而想要烹飪食物,必須要透過吹過火焰的氣流來煙燻食物", + "create.ponder.fan_processing.text_5": "當氣流吹過水後,便可用於洗滌物品", + "create.ponder.fan_processing.text_6": "這種加工方法可以做到不少有趣的事情", + "create.ponder.fan_processing.text_7": "鼓風機的轉速對加工的速度沒有影響,只影響氣流的吹拂距離", + "create.ponder.fan_processing.text_8": "而那些放置在置物台或者傳送帶上的物品,鼓風機也是可以處理的", + + "create.ponder.fan_source.header": "使用鼓風機來產生動能", + "create.ponder.fan_source.text_1": "如鼓風機的扇葉向下朝著熱源放置,鼓風機可以藉此產生動能", + "create.ponder.fan_source.text_2": "當鼓風機接受紅石訊號後,它便會向外供給動能", + + "create.ponder.flywheel.header": "使用飛輪來產生動能", + "create.ponder.flywheel.text_1": "飛輪和熔爐引擎必須配套使用,方可產生動能", + "create.ponder.flywheel.text_2": "如此產生的動能具有非常大的應力值", + "create.ponder.flywheel.text_3": "使用高爐會使得引擎的效率翻倍", + + "create.ponder.funnel_compat.header": "漏斗的相容性", + "create.ponder.funnel_compat.text_1": "漏斗可以與一些其他組件互動", + "create.ponder.funnel_compat.text_2": "動力鋸", + "create.ponder.funnel_compat.text_3": "置物台", + "create.ponder.funnel_compat.text_4": "分液池", + + "create.ponder.funnel_direction.header": "物流方向", + "create.ponder.funnel_direction.text_1": "直接放置時,漏斗會將物品從容器中取出", + "create.ponder.funnel_direction.text_2": "潛行時放置時,漏斗會將物品置入容器中", + "create.ponder.funnel_direction.text_3": "使用扳手可以改變漏斗的存/取模式", + "create.ponder.funnel_direction.text_4": "對大多數朝向放置的漏斗都具有此特性", + "create.ponder.funnel_direction.text_5": "在傳送帶末端放置的漏斗會根據傳送帶的傳動方向存/取物品", + + "create.ponder.funnel_intro.header": "使用漏斗", + "create.ponder.funnel_intro.text_1": "用漏斗來存取物品欄內的物品,可謂又快又好", + + "create.ponder.funnel_redstone.header": "紅石訊號控制", + "create.ponder.funnel_redstone.text_1": "紅石訊號會使漏斗停止工作", + + "create.ponder.funnel_transfer.header": "直接運輸", + "create.ponder.funnel_transfer.text_1": "漏斗無法將物品傳輸到非開放式的物品欄中", + "create.ponder.funnel_transfer.text_2": "溜槽和智慧溜槽更適用於這樣的場景", + "create.ponder.funnel_transfer.text_3": "水平傳輸也是如此,也許傳送帶更方便快捷", + + "create.ponder.furnace_engine.header": "使用熔爐引擎生產動能", + "create.ponder.furnace_engine.text_1": "熔爐引擎會在與其相連熔爐工作時生產動能", + "create.ponder.furnace_engine.text_2": "如此產生的動能具有非常大的應力值", + "create.ponder.furnace_engine.text_3": "使用高爐會使得引擎的效率翻倍", + + "create.ponder.gantry_carriage.header": "使用起重機取物器", + "create.ponder.gantry_carriage.text_1": "起重機取物器可以被放置在起重機杆上,並且可以沿著起重機杆運動", + "create.ponder.gantry_carriage.text_2": "起重機可以移動其黏附的方塊", + + "create.ponder.gantry_cascaded.header": "串聯起重機", + "create.ponder.gantry_cascaded.text_1": "無需強力膠,取物器便可與起重機杆相連", + "create.ponder.gantry_cascaded.text_2": "即使是在移動的起重機杆上也是如此", + "create.ponder.gantry_cascaded.text_3": "因此,起重機系統可以串聯起來,如此可以影響到多軸向的運動", + + "create.ponder.gantry_direction.header": "起重機移動方向", + "create.ponder.gantry_direction.text_1": "起重機杆可以有相反的方向", + "create.ponder.gantry_direction.text_2": "取物器的移動方向取決於起重機杆的方向", + "create.ponder.gantry_direction.text_3": "......以及起重機杆的旋轉方向", + "create.ponder.gantry_direction.text_4": "在旋轉傳遞中,此規則同樣適用", + + "create.ponder.gantry_redstone.header": "起重機的力傳遞", + "create.ponder.gantry_redstone.text_1": "被紅石訊號啟動的起重機,將不會移動其上的取物器", + "create.ponder.gantry_redstone.text_2": "作為替代,杆上的動能會傳遞到取物器的輸出杆上", + + "create.ponder.gantry_shaft.header": "使用起重機杆", + "create.ponder.gantry_shaft.text_1": "起重機杆組成了起重機結構的基礎。與其相接的載物器可以沿著杆進行移動。", + "create.ponder.gantry_shaft.text_2": "起重機結構可以移動與其相接的方塊。", + + "create.ponder.gearbox.header": "使用十字齒輪箱傳遞動能", + "create.ponder.gearbox.text_1": "更改旋轉軸,很容易使得整個旋轉體系變得臃腫不堪", + "create.ponder.gearbox.text_2": "十字齒輪箱則是替代方案,它的體積更為小巧緊", + "create.ponder.gearbox.text_3": "側邊連接的傳動桿,旋轉方向與輸入端一致", + "create.ponder.gearbox.text_4": "直線連接的傳動桿,旋轉方向會被反轉", + + "create.ponder.gearshift.header": "使用反轉齒輪箱控制動能", + "create.ponder.gearshift.text_1": "反轉齒輪箱可以直線傳輸旋轉", + "create.ponder.gearshift.text_2": "通入紅石訊號後,輸出端的旋轉方向會被反轉", + + "create.ponder.hand_crank.header": "使用手搖把手產生動能", + "create.ponder.hand_crank.text_1": "玩家可以使用手搖把手來手動產生動能", + "create.ponder.hand_crank.text_2": "按住右鍵可以逆時針旋轉它", + "create.ponder.hand_crank.text_3": "它產生的轉速相對較高", + "create.ponder.hand_crank.text_4": "潛行長按右鍵可以順時針旋轉它", + + "create.ponder.large_cogwheel.header": "使用大齒輪傳遞動能", + "create.ponder.large_cogwheel.text_1": "大齒輪可以以特定的角度相互連接", + "create.ponder.large_cogwheel.text_2": "可以利用大齒輪變更旋轉軸向", + + "create.ponder.linear_chassis_attachment.header": "使用機殼底盤黏合方塊", + "create.ponder.linear_chassis_attachment.text_1": "它的開放面可以變為黏性面", + "create.ponder.linear_chassis_attachment.text_2": "再次點擊黏性面,可以將它的相反面也變得具有黏性", + "create.ponder.linear_chassis_attachment.text_3": "空手潛行右擊可以移除此面的黏性物", + "create.ponder.linear_chassis_attachment.text_4": "黏性面可以將此面前方的一長條方塊黏住", + "create.ponder.linear_chassis_attachment.text_5": "使用扳手可以精確控制底盤的影響範圍", + "create.ponder.linear_chassis_attachment.text_6": "按住 Ctrl 滑動滾輪,你可以一次性調節所有底盤的影響範圍", + "create.ponder.linear_chassis_attachment.text_7": "若想讓底盤的其他面也能黏方塊,你需要用到強力膠", + "create.ponder.linear_chassis_attachment.text_8": "利用這些機制,任何形狀的機制都可以像裝置那樣移動", + + "create.ponder.linear_chassis_group.header": "成組移動機殼底盤", + "create.ponder.linear_chassis_group.text_1": "相鄰的機殼底盤可以相互連接在一起", + "create.ponder.linear_chassis_group.text_2": "其中的一個底盤若被移動,其餘的底盤也會跟著移動", + "create.ponder.linear_chassis_group.text_3": "不同種類的底盤,或者是朝向不一致的底盤,將不會相連", + + "create.ponder.mechanical_arm.header": "設定動力臂", + "create.ponder.mechanical_arm.text_1": "你得在放置動力臂之前就設定好它的輸入以及輸出端", + "create.ponder.mechanical_arm.text_2": "手持動力臂右擊某個存儲空間,可以將其指定為目標", + "create.ponder.mechanical_arm.text_3": "再次右擊可以將其在輸入端(藍色)以及輸出端(橙色)之間切換", + "create.ponder.mechanical_arm.text_4": "左擊此組件可以移除選擇", + "create.ponder.mechanical_arm.text_5": "將動力臂放下來後,它會將此前選擇的方塊作為目標", + "create.ponder.mechanical_arm.text_6": "在有效範圍內,機械手臂可以有任意數量的輸出以及輸入端", + "create.ponder.mechanical_arm.text_7": "然而,並不是所有的存儲空間可以被直接互動", + "create.ponder.mechanical_arm.text_8": "在此情況下,漏斗和置物台可以解決此問題", + + "create.ponder.mechanical_arm_filtering.header": "過濾動力臂的輸出端", + "create.ponder.mechanical_arm_filtering.text_1": "輸入", + "create.ponder.mechanical_arm_filtering.text_2": "輸出", + "create.ponder.mechanical_arm_filtering.text_3": "有時,你會想著利用某種過濾限煞車力臂的目標", + "create.ponder.mechanical_arm_filtering.text_4": "動力臂自身並不提供任何過濾選項", + "create.ponder.mechanical_arm_filtering.text_5": "然而,若將黃銅漏斗作為目標,則漏斗的過濾槽則可以應用至動力臂上", + "create.ponder.mechanical_arm_filtering.text_6": "動力臂足夠智慧,它不會去拿取那些它無法分配的物品", + + "create.ponder.mechanical_arm_modes.header": "動力臂的分配模式", + "create.ponder.mechanical_arm_modes.text_1": "輸入", + "create.ponder.mechanical_arm_modes.text_2": "輸出", + "create.ponder.mechanical_arm_modes.text_3": "若動力臂必須在數個有效的輸出端之間作出選擇...", + "create.ponder.mechanical_arm_modes.text_4": "...它會依照自己的設定選擇特定的行為", + "create.ponder.mechanical_arm_modes.text_5": "手持扳手對其滑動滾輪,可以改變其設定", + "create.ponder.mechanical_arm_modes.text_6": "輪詢調度模式很好理解,即循環輸出至所有有效的輸出端", + "create.ponder.mechanical_arm_modes.text_7": "如果某個輸出端無法容納更多物品,則它會被跳過", + "create.ponder.mechanical_arm_modes.text_8": "強制輪詢調度不會跳過任何輸出端,動力臂會一直等待,直到輸出端有空位容納物品輸入", + "create.ponder.mechanical_arm_modes.text_9": "最近優先模式會使得動力臂先將物品輸出至更早被選擇的輸出端", + + "create.ponder.mechanical_arm_redstone.header": "利用紅石訊號控制動力臂", + "create.ponder.mechanical_arm_redstone.text_1": "通入紅石訊號後,動力臂會停止工作", + "create.ponder.mechanical_arm_redstone.text_2": "在停止工作前,它會完成目前正在進行的工作週期", + "create.ponder.mechanical_arm_redstone.text_3": "因此,通入單次負紅石脈衝可以精確控制動力臂,使其每次只進行單個週期的工作", + + "create.ponder.mechanical_bearing.header": "使用動力軸承移動結構", + "create.ponder.mechanical_bearing.text_1": "動力軸承會與其前方的方塊黏合在一起", + "create.ponder.mechanical_bearing.text_2": "接收到動能後,它會將這一黏合結構組裝為旋轉裝置", + + "create.ponder.mechanical_crafter.header": "設置動力合成器", + "create.ponder.mechanical_crafter.text_1": "動力合成器陣列可用於自動化任何合成配方的製作", + "create.ponder.mechanical_crafter.text_2": "使用扳手可以調控合成器的合成通路", + "create.ponder.mechanical_crafter.text_3": "所有的合成通路必須匯集到任意一側的一個出口,整套合成器方可算是設置正確", + "create.ponder.mechanical_crafter.text_4": "輸出產物會被放入位於出口的存儲空間中", + "create.ponder.mechanical_crafter.text_5": "動力合成器的運轉需要動能的供應", + "create.ponder.mechanical_crafter.text_6": "右擊合成器正面,可以手動放入物品", + "create.ponder.mechanical_crafter.text_7": "一旦合成通路上的所有合成槽位都有了物品,合成就會開始", + "create.ponder.mechanical_crafter.text_8": "而對於那些沒有完全占滿所有合成器槽位的配方,你可以通入紅石訊號強制開啟合成", + + "create.ponder.mechanical_crafter_connect.header": "為合成器連接物品欄", + "create.ponder.mechanical_crafter_connect.text_1": "合成器可以自動接受向其輸入的物品", + "create.ponder.mechanical_crafter_connect.text_2": "對其背面使用扳手,可以連接合成器", + "create.ponder.mechanical_crafter_connect.text_3": "所有相連的合成器可以訪問同一個位置的輸入", + + "create.ponder.mechanical_crafter_covers.header": "蓋住動力合成器的合成槽", + "create.ponder.mechanical_crafter_covers.text_1": "有些配方需要額外的合成器,來補足合成通路上的間隙", + "create.ponder.mechanical_crafter_covers.text_2": "使用合成槽蓋板,合成器會在合成進行時的行為就如同一個空的合成槽位", + "create.ponder.mechanical_crafter_covers.text_3": "被蓋住的合成器並不會阻斷共享輸入端的影響", + + "create.ponder.mechanical_drill.header": "使用機械鑽頭破壞方塊", + "create.ponder.mechanical_drill.text_1": "當向其通入動能後,機械鑽頭會破壞它面前的方塊", + "create.ponder.mechanical_drill.text_2": "它的挖掘速度取決於通入的動能轉速", + + "create.ponder.mechanical_drill_contraption.header": "在裝置中使用機械鑽頭", + "create.ponder.mechanical_drill_contraption.text_1": "在運動裝置中使用機械鑽頭時...", + "create.ponder.mechanical_drill_contraption.text_2": "...它會破壞掉它撞上的方塊", + + "create.ponder.mechanical_harvester.header": "在裝置中使用動力收割機", + "create.ponder.mechanical_harvester.text_1": "在運動裝置中使用動力收割機時...", + "create.ponder.mechanical_harvester.text_2": "它會採收其路徑上的作物,並重設這些作物的生長進度", + + "create.ponder.mechanical_mixer.header": "使用動力攪拌器處理物品", + "create.ponder.mechanical_mixer.text_1": "使用攪拌器和工作盆,你可以自動化某些合成配方", + "create.ponder.mechanical_mixer.text_2": "有效配方包括各種無序合成配方,以及一些額外的配方", + "create.ponder.mechanical_mixer.text_3": "一些配方可能需要使用烈焰人燃燒室提供熱量", + "create.ponder.mechanical_mixer.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", + + "create.ponder.mechanical_piston.header": "使用動力活塞移動結構", + "create.ponder.mechanical_piston.text_1": "動力活塞可以移動它前方的方塊", + "create.ponder.mechanical_piston.text_2": "移動速度和方向取決於通入活塞的動能", + "create.ponder.mechanical_piston.text_3": "黏性動力活塞可以將相接的方塊拉回來", + + "create.ponder.mechanical_piston_modes.header": "動力活塞的移動模式", + "create.ponder.mechanical_piston_modes.text_1": "一旦活塞停下,被移動的結構就會回退到方塊狀態", + "create.ponder.mechanical_piston_modes.text_2": "你也可以將其設定為從不方塊化,或者只在起始位置方塊化", + + "create.ponder.mechanical_plough.header": "在裝置中使用動力犁", + "create.ponder.mechanical_plough.text_1": "在運動裝置中使用動力犁時...", + "create.ponder.mechanical_plough.text_2": "...它會破壞掉那些不具有固體碰撞箱的方塊", + "create.ponder.mechanical_plough.text_3": "此外,動力犁可以耕地", + "create.ponder.mechanical_plough.text_4": "...它也可以在不傷害實體的情況下推動它們", + + "create.ponder.mechanical_press.header": "使用機械液壓機處理物品", + "create.ponder.mechanical_press.text_1": "機械液壓機可以處理位於其下方的物品", + "create.ponder.mechanical_press.text_2": "在其下方丟入物品,或者將物品放在置物台上,都算作有效的物品輸入", + "create.ponder.mechanical_press.text_3": "若物品被輸入時正位於傳送帶上...", + "create.ponder.mechanical_press.text_4": "輥軋機會使物品停下,然後自動處理這一物品", + + "create.ponder.mechanical_press_compacting.header": "使用機械液壓機壓縮物品", + "create.ponder.mechanical_press_compacting.text_1": "對放置於工作盆內的物品進行輥軋,可以將這些物品壓縮在一起", + "create.ponder.mechanical_press_compacting.text_2": "壓縮意指任何同種物品填滿了 2x2 或者 3x3 網格的配方,以及一些額外的配方", + "create.ponder.mechanical_press_compacting.text_3": "一些配方可能需要烈焰人燃燒室提供熱量", + "create.ponder.mechanical_press_compacting.text_4": "過濾槽可用於解決兩個配方相互衝突的情況", + + "create.ponder.mechanical_saw_breaker.header": "使用動力鋸伐木", + "create.ponder.mechanical_saw_breaker.text_1": "向其通入動能後,動力鋸可以直接砍伐掉它面前的樹木", + "create.ponder.mechanical_saw_breaker.text_2": "想要一次性砍掉整棵樹,鋸子必須破壞掉樹與地面連接的最後一個方塊", + + "create.ponder.mechanical_saw_contraption.header": "在裝置中使用動力鋸", + "create.ponder.mechanical_saw_contraption.text_1": "若在運動裝置中使用動力鋸...", + "create.ponder.mechanical_saw_contraption.text_2": "...它會將撞到它的樹木破壞掉", + + "create.ponder.mechanical_saw_processing.header": "使用動力鋸處理物品", + "create.ponder.mechanical_saw_processing.text_1": "面向朝上的動力鋸可以將物品處理為其變種", + "create.ponder.mechanical_saw_processing.text_2": "處理過後的物品的彈出方向始終與通入鋸中的旋轉轉向相反", + "create.ponder.mechanical_saw_processing.text_3": "鋸子可以", + "create.ponder.mechanical_saw_processing.text_4": "若輸入原料有多種可能產物,你可以用動力鋸上的過濾槽指定只產出某種產物", + "create.ponder.mechanical_saw_processing.text_5": "若沒有使用過濾槽,動力鋸會在各產物中按順序循環輸出", + + "create.ponder.millstone.header": "使用石磨處理物品", + "create.ponder.millstone.text_1": "石磨會對輸入的物品進行磨製", + "create.ponder.millstone.text_2": "在其側邊使用齒輪與其相耦合,方可為其通入動力", + "create.ponder.millstone.text_3": "頂部可以丟入或者塞入物品", + "create.ponder.millstone.text_4": "一段時間過後,右擊石磨可以拿出其中的產物", + "create.ponder.millstone.text_5": "產物的提取也是可以自動化的", + + "create.ponder.nixie_tube.header": "使用真空管顯示器", + "create.ponder.nixie_tube.text_1": "通入紅石訊號後,真空管顯示器會顯示出紅石訊號的強度", + "create.ponder.nixie_tube.text_2": "使用命名牌在鐵砧上為其命名,可以自訂它的顯示文本", + + "create.ponder.piston_pole.header": "活塞延長杆", + "create.ponder.piston_pole.text_1": "若無相接的延長杆,動力活塞無法移動其他方塊", + "create.ponder.piston_pole.text_2": "在其背面安裝的延長杆長度,決定了活塞的推動範圍", + + "create.ponder.portable_storage_interface.header": "裝置存儲交換", + "create.ponder.portable_storage_interface.text_1": "玩家無法與運動裝置內的存儲空間進行互動", + "create.ponder.portable_storage_interface.text_2": "這一組件可以在不停止裝置的情況下與裝置內的存儲空間進行互動", + "create.ponder.portable_storage_interface.text_3": "放置第二個介面時,記得要與裝置介面相隔 1 格或者 2 格的距離", + "create.ponder.portable_storage_interface.text_4": "當它們彼此經過時,它們會連接在一起", + "create.ponder.portable_storage_interface.text_5": "連接狀態下,固定側介面便會作為整個裝置的存儲空間代理", + "create.ponder.portable_storage_interface.text_6": "物品會被輸入到裝置內...", + "create.ponder.portable_storage_interface.text_7": "...或是從裝置中提取出來", + "create.ponder.portable_storage_interface.text_8": "物品交換完畢後,裝置仍然會停留在原地一小會,然後才會繼續前行", + + "create.ponder.portable_storage_interface_redstone.header": "紅石控制", + "create.ponder.portable_storage_interface_redstone.text_1": "通入紅石訊號可以阻止固定側介面的連接行為", + + "create.ponder.powered_latch.header": "使用閂鎖器控制訊號", + "create.ponder.powered_latch.text_1": "閂鎖器是一種可以用紅石訊號控制的拉杆", + "create.ponder.powered_latch.text_2": "後方輸入的訊號會將其設為開啟狀態", + "create.ponder.powered_latch.text_3": "側邊輸入的訊號會將其設為關閉狀態", + "create.ponder.powered_latch.text_4": "你也可以手動切換其狀態", + + "create.ponder.powered_toggle_latch.header": "使用T型正反器控制訊號", + "create.ponder.powered_toggle_latch.text_1": "T型正反器是一種可以用紅石訊號控制的拉杆", + "create.ponder.powered_toggle_latch.text_2": "後方訊號輸入可以改變它的狀態", + "create.ponder.powered_toggle_latch.text_3": "...開啟或者是關閉", + "create.ponder.powered_toggle_latch.text_4": "你也可以手動切換其狀態", + + "create.ponder.pulse_repeater.header": "使用脈衝中繼器控制訊號", + "create.ponder.pulse_repeater.text_1": "脈衝中繼器會將所有通入的紅石訊號縮減為一次脈衝", + + "create.ponder.radial_chassis.header": "使用旋轉底盤黏著方塊", + "create.ponder.radial_chassis.text_1": "同一行上的旋轉底盤會相互連接在一起", + "create.ponder.radial_chassis.text_2": "當其中的一個底盤被裝置帶動時,其餘的底盤也會被帶動", + "create.ponder.radial_chassis.text_3": "底盤的側邊可以變為黏性面", + "create.ponder.radial_chassis.text_4": "再次點擊黏性面,可以讓其所有面都變得帶黏性", + "create.ponder.radial_chassis.text_5": "空手潛行右擊可以移除其上的黏性物", + "create.ponder.radial_chassis.text_6": "若有物品與底盤的黏性面相接觸...", + "create.ponder.radial_chassis.text_7": "...底盤便會與同層且位於半徑內的所有可及方塊黏著在一起", + "create.ponder.radial_chassis.text_8": "使用扳手可以精確指定底盤的影響範圍", + "create.ponder.radial_chassis.text_9": "黏性面一側的不可及方塊不會被黏著", + + "create.ponder.redstone_contact.header": "接觸式紅石訊號發生器", + "create.ponder.redstone_contact.text_1": "當兩個接觸式紅石訊號發生器面對面時,它們會發出紅石訊號", + "create.ponder.redstone_contact.text_2": "並且,若有一方位於運動裝置上,此特性也能正常生效", + + "create.ponder.redstone_link.header": "使用無線紅石訊號機", + "create.ponder.redstone_link.text_1": "無線紅石訊號機可以無線傳輸紅石訊號", + "create.ponder.redstone_link.text_2": "潛行右擊可以改變其接收模式", + "create.ponder.redstone_link.text_3": "手持扳手右擊也可以", + "create.ponder.redstone_link.text_4": "接收端會發出由傳輸端發來的訊號,有效距離為 128 格", + "create.ponder.redstone_link.text_5": "在它們所帶的槽位中放上物品,可以為它們指定頻道", + "create.ponder.redstone_link.text_6": "只有頻道相互匹配的機方可互通", + + "create.ponder.rope_pulley.header": "使用繩索滑輪移動結構", + "create.ponder.rope_pulley.text_1": "繩索滑輪在接受動能時可以垂直移動方塊結構", + "create.ponder.rope_pulley.text_2": "移動的方向及速度取決於提供的轉速", + + "create.ponder.rope_pulley_attachment.header": "繩索滑輪與裝置一同運動", + "create.ponder.rope_pulley_attachment.text_1": "當繩索滑輪本身在裝置中被帶動時...", + "create.ponder.rope_pulley_attachment.text_2": "...它附著在滑輪上的結構會被滑輪拉著一同移動", + "create.ponder.rope_pulley_attachment.text_3": "注意,只有繩索滑輪停止工作時才能被移動", + + "create.ponder.rope_pulley_modes.header": "繩索滑輪的運動模式", + "create.ponder.rope_pulley_modes.text_1": "當繩索滑輪停止運動時,它所附屬的移動結構便會方塊化", + "create.ponder.rope_pulley_modes.text_2": "你可以調整整個結構永不方塊化,或者僅在結構的初始位置方塊化", + + "create.ponder.rotation_speed_controller.header": "使用轉速控制器", + "create.ponder.rotation_speed_controller.text_1": "轉速控制器將動能從其轉軸傳遞至它上方的大齒輪", + "create.ponder.rotation_speed_controller.text_2": "在其側面滾動滑鼠滾輪,可以調節輸出轉速", + + "create.ponder.sail.header": "使用風帆來組裝風車", + "create.ponder.sail.text_1": "風帆是製作風車的趁手材料", + "create.ponder.sail.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", + "create.ponder.sail.text_3": "手持染料右擊可對其染色", + "create.ponder.sail.text_4": "手持剪刀右擊可剪除帆布,使其變迴風帆框架", + + "create.ponder.sail_frame.header": "使用風帆框架來組裝風車", + "create.ponder.sail_frame.text_1": "風帆框架是製作風車的趁手材料", + "create.ponder.sail_frame.text_2": "無需強力膠等黏附手段,它們便可自行互相連結", + + "create.ponder.sequenced_gearshift.header": "使用可編程齒輪箱來控制轉速", + "create.ponder.sequenced_gearshift.text_1": "可編程齒輪箱能夠根據玩家設置的預設時序表來傳遞旋轉", + "create.ponder.sequenced_gearshift.text_2": "對其右擊可以打開設置面板", + "create.ponder.sequenced_gearshift.text_3": "接受紅石訊號時,它會開始執行其內部已設定好的時序指令表", + "create.ponder.sequenced_gearshift.text_4": "當完成時序指令表後,它會進入待機狀態,再次接受紅石訊號後,它才會再次執行時序指令表內容", + "create.ponder.sequenced_gearshift.text_5": "紅石比較器可以讀取目前時序指令表完成進度", + + "create.ponder.shaft.header": "使用傳動軸來傳送動能", + "create.ponder.shaft.text_1": "傳動軸可以直線傳送動能", + + "create.ponder.shaft_casing.header": "包裹傳動軸", + "create.ponder.shaft_casing.text_1": "黃銅及安山岩機殼可以用來裝飾傳動軸", + + "create.ponder.smart_chute.header": "使用智慧滑道來過濾物品", + "create.ponder.smart_chute.text_1": "智慧滑道是一種可以被控制的滑道", + "create.ponder.smart_chute.text_2": "當在其過濾槽內指定了物品後,溜槽只會傳輸這一指定標記的物品", + "create.ponder.smart_chute.text_3": "使用滑鼠滾輪可以指定被過濾的物品數量", + "create.ponder.smart_chute.text_4": "通入紅石訊號,智慧溜槽將會完全暫停工作", + + "create.ponder.speedometer.header": "使用速度計來監測轉速", + "create.ponder.speedometer.text_1": "速度計能顯示相接組件的轉速", + "create.ponder.speedometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", + "create.ponder.speedometer.text_3": "紅石比較器可以根據速度計的數值輸出不同強弱的紅石訊號", + + "create.ponder.stabilized_bearings.header": "裝置固定朝向", + "create.ponder.stabilized_bearings.text_1": "當動力軸承在結構被帶動時...", + "create.ponder.stabilized_bearings.text_2": "...它會確保它轉盤的垂直朝向不變", + "create.ponder.stabilized_bearings.text_3": "跟預設的一樣,動力軸承會黏著它前方的方塊", + "create.ponder.stabilized_bearings.text_4": "這種情況下,它所黏著的子結構的垂直朝向也不會改變", + + "create.ponder.sticker.header": "使用方塊黏著器來黏取方塊", + "create.ponder.sticker.text_1": "方塊黏著器是一個很棒的裝置,他受控於紅石訊號", + "create.ponder.sticker.text_2": "當接收到訊號時,他會黏起面前的一個方塊", + "create.ponder.sticker.text_3": "如果此時方塊黏著器被移動,被黏到的方塊會跟著移動", + "create.ponder.sticker.text_4": "再次接收到訊號後,黏著器會放下它面前的方塊", + + "create.ponder.stressometer.header": "使用動能錶來監測應力", + "create.ponder.stressometer.text_1": "動能錶能顯示目前動能網路內的應力訊息", + "create.ponder.stressometer.text_2": "當佩戴MR護目鏡時,可以看到儀表所顯示的更詳細的數據", + "create.ponder.stressometer.text_3": "紅石比較器可以根據動能錶的數值輸出不同強弱的紅石訊號", + + "create.ponder.super_glue.header": "使用強力膠來黏附方塊", + "create.ponder.super_glue.text_1": "強力膠可以在任意兩個方塊間使用", + "create.ponder.super_glue.text_2": "當被黏合的方塊被組裝為裝置時,他們會一起運動", + "create.ponder.super_glue.text_3": "當強力膠在副手時...", + "create.ponder.super_glue.text_4": "...新放置的方塊會自動被黏附在所放置方塊的面上", + "create.ponder.super_glue.text_5": "左擊可以清除強力膠", + + "create.ponder.valve_handle.header": "使用閥門手輪產生動能", + "create.ponder.valve_handle.text_1": "玩家可以手動使用閥門手輪來產生動能", + "create.ponder.valve_handle.text_2": "右擊可使它逆時針旋轉", + "create.ponder.valve_handle.text_3": "它的轉速慢而精確", + "create.ponder.valve_handle.text_4": "潛行右擊可使它順時針旋轉", + "create.ponder.valve_handle.text_5": "可以透過染色來美化閥門手輪", + + "create.ponder.water_wheel.header": "使用水車產生動能", + "create.ponder.water_wheel.text_1": "水車利用臨近的水流來進行應力發生", + "create.ponder.water_wheel.text_2": "水車接觸水流的麵越多,它的轉速越高", + "create.ponder.water_wheel.text_3": "水車葉片應逆著水流方向擺放", + "create.ponder.water_wheel.text_4": "如果順著水流擺放,它的效率則會降低", + + "create.ponder.weighted_ejector.header": "使用彈射置物台", + "create.ponder.weighted_ejector.text_1": "手持彈射置物台時,潛行時右擊可以設置彈射目標位置", + "create.ponder.weighted_ejector.text_10": "現在,只有等被放置的物品數量等於所設定數量時,彈射置物台才會彈射物品", + "create.ponder.weighted_ejector.text_11": "當其他實體站在彈射置物台上時會被直接彈射", + "create.ponder.weighted_ejector.text_2": "現在,放置下的彈射置物台會將物品彈射至目標位置", + "create.ponder.weighted_ejector.text_3": "限制範圍內的任意距離和高度均可作為有效目標地點", + "create.ponder.weighted_ejector.text_4": "但是,目標位置與置物台的連線,必須垂直於置物台的側面", + "create.ponder.weighted_ejector.text_5": "如果沒有設置有效目標位置,彈射置物台會直接將其前方一格設為默認目標位置", + "create.ponder.weighted_ejector.text_6": "提供動能可為其蓄力", + "create.ponder.weighted_ejector.text_7": "蓄力完畢後,放置在它上方的物品會被立刻彈射出去", + "create.ponder.weighted_ejector.text_8": "如果目標為容器,則彈射置物台會等待容器有位置後再彈射物品", + "create.ponder.weighted_ejector.text_9": "使用扳手可以調整彈射所要求的物品數量", + + "create.ponder.weighted_ejector_redstone.header": "使用紅石控制彈射置物台", + "create.ponder.weighted_ejector_redstone.text_1": "當被紅石充能時,彈射置物台停止工作", + "create.ponder.weighted_ejector_redstone.text_2": "此外,置物台彈射的瞬間可以被偵測器偵測", + + "create.ponder.weighted_ejector_tunnel.header": "使用彈射置物台來分流物品", + "create.ponder.weighted_ejector_tunnel.text_1": "與黃銅隧道搭配使用時,彈射置物台可以將物品以特定數量進行分流", + "create.ponder.weighted_ejector_tunnel.text_2": "首先,將黃銅隧道調整為“最近優先”模式,從而讓它優先側面輸出", + "create.ponder.weighted_ejector_tunnel.text_3": "置物台上所設置的物品數量則為被分流出去的物品數量", + "create.ponder.weighted_ejector_tunnel.text_4": "當所設置的物品數量被分流出去後...", + "create.ponder.weighted_ejector_tunnel.text_5": "...剩餘的物品則會繼續前進", + + "create.ponder.windmill_source.header": "使用風車軸承產生動能", + "create.ponder.windmill_source.text_1": "風車軸承會黏著它面前的方塊結構", + "create.ponder.windmill_source.text_2": "如果黏著的方塊結構包含足夠的風帆方塊即為風車", + "create.ponder.windmill_source.text_3": "右鍵啟動風車後,風車開始提供動能", + "create.ponder.windmill_source.text_4": "產生的動能將取決於所黏風帆方塊之數量", + "create.ponder.windmill_source.text_5": "使用扳手來調整其旋轉方向", + "create.ponder.windmill_source.text_6": "對風車軸承右鍵可使其停止方便你維修風車", + + "create.ponder.windmill_structure.header": "風車結構", + "create.ponder.windmill_structure.text_1": "任一包含至少8個風帆方塊的結構即為有效的風車", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/data/minecraft/tags/items/piglin_loved.json b/src/generated/resources/data/minecraft/tags/items/piglin_loved.json new file mode 100644 index 000000000..478bada69 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/piglin_loved.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "create:golden_sheet", + "create:crushed_gold_ore" + ] +} \ No newline at end of file From 975d898ac618ccc8c187b785d09678efb38f5f7c Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 28 May 2021 14:42:27 +0200 Subject: [PATCH 10/21] all the configs - make it easier for addon devs to hook into create's config ui - change the config command to allow for: - opening any mod's registered config - changing single values at a time - possibly solve incompatibility with CalemiUtils mod and placement helpers --- .../simibubi/create/events/ClientEvents.java | 6 +- .../foundation/command/ConfigCommand.java | 73 ++++++++- .../command/SConfigureConfigPacket.java | 58 ++++++- .../config/ui/BaseConfigScreen.java | 132 +++++++++++++--- .../config/ui/CConfigureConfigPacket.java | 41 +++-- .../foundation/config/ui/ConfigHelper.java | 142 ++++++++++++++++++ .../foundation/config/ui/ConfigScreen.java | 1 + .../config/ui/OpenConfigButton.java | 12 +- .../config/ui/SubMenuConfigScreen.java | 46 +++++- .../config/ui/entries/ValueEntry.java | 12 +- .../foundation/gui/ConfirmationScreen.java | 13 +- .../utility/placement/PlacementOffset.java | 8 +- 12 files changed, 468 insertions(+), 76 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 30db2de2a..cdfb70268 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -106,7 +106,7 @@ public class ClientEvents { AirCurrent.tickClientPlayerSounds(); return; } - + SoundScapes.tick(); AnimationTickHolder.tick(); @@ -339,8 +339,8 @@ public class ClientEvents { } public static void loadCompleted(FMLLoadCompleteEvent event) { - ModContainer createContainer = ModList.get().getModContainerById("create").orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted")); - createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (mc, previousScreen) -> new BaseConfigScreen(previousScreen)); + ModContainer createContainer = ModList.get().getModContainerById(Create.ID).orElseThrow(() -> new IllegalStateException("Create Mod Container missing after loadCompleted")); + createContainer.registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (mc, previousScreen) -> BaseConfigScreen.forCreate(previousScreen)); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java index 24a45110a..5115d9d6f 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigCommand.java @@ -1,14 +1,25 @@ package com.simibubi.create.foundation.command; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.config.ui.ConfigHelper; +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.config.ModConfig; import net.minecraftforge.fml.network.PacketDistributor; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.simibubi.create.foundation.networking.AllPackets; - +/** + * Examples: + * /create config client - to open Create's ConfigGui with the client config already selected + * /create config "botania:common" - to open Create's ConfigGui with Botania's common config already selected + * /create config "create:client.client.rainbowDebug" set false - to disable Create's rainbow debug for the sender + */ public class ConfigCommand { public static ArgumentBuilder register() { @@ -21,7 +32,59 @@ public class ConfigCommand { ); return Command.SINGLE_SUCCESS; - }); + }) + .then(Commands.argument("path", StringArgumentType.string()) + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().asPlayer(); + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> player), + new SConfigureConfigPacket(SConfigureConfigPacket.Actions.configScreen.name(), StringArgumentType.getString(ctx, "path")) + ); + + return Command.SINGLE_SUCCESS; + }) + .then(Commands.literal("set") + .requires(cs -> cs.hasPermissionLevel(2)) + .then(Commands.argument("value", StringArgumentType.string()) + .executes(ctx -> { + String path = StringArgumentType.getString(ctx, "path"); + String value = StringArgumentType.getString(ctx, "value"); + + + ConfigHelper.ConfigPath configPath; + try { + configPath = ConfigHelper.ConfigPath.parse(path); + } catch (IllegalArgumentException e) { + ctx.getSource().sendErrorMessage(new StringTextComponent(e.getMessage())); + return 0; + } + + if (configPath.getType() == ModConfig.Type.CLIENT) { + ServerPlayerEntity player = ctx.getSource().asPlayer(); + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> player), + new SConfigureConfigPacket("SET" + path, value) + ); + + return Command.SINGLE_SUCCESS; + } + + try { + ConfigHelper.setConfigValue(configPath, value); + ctx.getSource().sendFeedback(new StringTextComponent("Great Success!"), false); + return Command.SINGLE_SUCCESS; + } catch (ConfigHelper.InvalidValueException e) { + ctx.getSource().sendErrorMessage(new StringTextComponent("Config could not be set the the specified value!")); + return 0; + } catch (Exception e) { + ctx.getSource().sendErrorMessage(new StringTextComponent("Something went wrong while trying to set config value. Check the server logs for more information")); + Create.LOGGER.warn("Exception during server-side config value set:", e); + return 0; + } + }) + ) + ) + ); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java index d4e1a6115..55283402c 100644 --- a/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/SConfigureConfigPacket.java @@ -9,6 +9,8 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.ui.BaseConfigScreen; +import com.simibubi.create.foundation.config.ui.ConfigHelper; +import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.SimplePacketBase; import com.simibubi.create.foundation.ponder.PonderRegistry; @@ -30,6 +32,7 @@ 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.config.ModConfig; import net.minecraftforge.fml.network.NetworkEvent; public class SConfigureConfigPacket extends SimplePacketBase { @@ -57,6 +60,11 @@ public class SConfigureConfigPacket extends SimplePacketBase { public void handle(Supplier ctx) { ctx.get() .enqueueWork(() -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + if (option.startsWith("SET")) { + trySetConfig(option.substring(3), value); + return; + } + try { Actions.valueOf(option) .performAction(value); @@ -70,6 +78,36 @@ public class SConfigureConfigPacket extends SimplePacketBase { .setPacketHandled(true); } + private static void trySetConfig(String option, String value) { + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null) + return; + + ConfigHelper.ConfigPath configPath; + try { + configPath = ConfigHelper.ConfigPath.parse(option); + } catch (IllegalArgumentException e) { + player.sendStatusMessage(new StringTextComponent(e.getMessage()), false); + return; + } + + if (configPath.getType() != ModConfig.Type.CLIENT) { + Create.LOGGER.warn("Received type-mismatched config packet on client"); + return; + } + + try { + ConfigHelper.setConfigValue(configPath, value); + player.sendStatusMessage(new StringTextComponent("Great Success!"), false); + } catch (ConfigHelper.InvalidValueException e) { + player.sendStatusMessage(new StringTextComponent("Config could not be set the the specified value!"), false); + } catch (Exception e) { + player.sendStatusMessage(new StringTextComponent("Something went wrong while trying to set config value. Check the client logs for more information"), false); + Create.LOGGER.warn("Exception during client-side config value set:", e); + } + + } + public enum Actions { configScreen(() -> Actions::configScreen), rainbowDebug(() -> Actions::rainbowDebug), @@ -95,7 +133,25 @@ public class SConfigureConfigPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) private static void configScreen(String value) { - ScreenOpener.open(new BaseConfigScreen(null)); + if (value.equals("")) { + ScreenOpener.open(BaseConfigScreen.forCreate(null)); + return; + } + + ClientPlayerEntity player = Minecraft.getInstance().player; + ConfigHelper.ConfigPath configPath; + try { + configPath = ConfigHelper.ConfigPath.parse(value); + } catch (IllegalArgumentException e) { + player.sendStatusMessage(new StringTextComponent(e.getMessage()), false); + return; + } + + try { + ScreenOpener.open(SubMenuConfigScreen.find(configPath)); + } catch (Exception e) { + player.sendStatusMessage(new StringTextComponent("Unable to find the specified config"), false); + } } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java index 915abcb38..6507c2820 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/BaseConfigScreen.java @@ -1,6 +1,11 @@ package com.simibubi.create.foundation.config.ui; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import com.simibubi.create.Create; import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.gui.DelegatedStencilElement; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.TextStencilElement; import com.simibubi.create.foundation.gui.Theme; @@ -11,49 +16,134 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.fml.config.ModConfig; public class BaseConfigScreen extends ConfigScreen { + private static final DelegatedStencilElement.ElementRenderer DISABLED_RENDERER = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.i(Theme.Key.BUTTON_DISABLE, true), Theme.i(Theme.Key.BUTTON_DISABLE, false) | 0x40_000000); + + public static BaseConfigScreen forCreate(Screen parent) { + return new BaseConfigScreen(parent) + .withTitles("Client Settings", "World Generation Settings", "Gameplay Settings") + .withSpecs(AllConfigs.CLIENT.specification, AllConfigs.COMMON.specification, AllConfigs.SERVER.specification); + } + BoxWidget clientConfigWidget; BoxWidget commonConfigWidget; BoxWidget serverConfigWidget; - public BaseConfigScreen(Screen parent) { + ForgeConfigSpec clientSpec; + ForgeConfigSpec commonSpec; + ForgeConfigSpec serverSpec; + String clientTile = "CLIENT CONFIG"; + String commonTile = "COMMON CONFIG"; + String serverTile = "SERVER CONFIG"; + String modID = Create.ID; + + /** + * If you are a Create Addon dev and want to make use of the same GUI + * for your mod's config, use this Constructor to create a entry point + * + * @param parent the previously opened screen + * @param modID the modID of your addon/mod + */ + public BaseConfigScreen(Screen parent, @Nonnull String modID) { + this(parent); + this.modID = modID; + } + + private BaseConfigScreen(Screen parent) { super(parent); } + /** + * If you have static references to your Configs or ConfigSpecs (like Create does in {@link AllConfigs}), + * please use {@link #withSpecs(ForgeConfigSpec, ForgeConfigSpec, ForgeConfigSpec)} instead + */ + public BaseConfigScreen searchForSpecsInModContainer() { + try { + clientSpec = ConfigHelper.findConfigSpecFor(ModConfig.Type.CLIENT, this.modID); + } catch (Exception e) { + Create.LOGGER.warn("Unable to find ClientConfigSpec for mod: " + this.modID); + } + + try { + commonSpec = ConfigHelper.findConfigSpecFor(ModConfig.Type.COMMON, this.modID); + } catch (Exception e) { + Create.LOGGER.warn("Unable to find CommonConfigSpec for mod: " + this.modID, e); + } + + try { + serverSpec = ConfigHelper.findConfigSpecFor(ModConfig.Type.SERVER, this.modID); + } catch (Exception e) { + Create.LOGGER.warn("Unable to find ServerConfigSpec for mod: " + this.modID, e); + } + + return this; + } + + public BaseConfigScreen withSpecs(@Nullable ForgeConfigSpec client, @Nullable ForgeConfigSpec common, @Nullable ForgeConfigSpec server) { + clientSpec = client; + commonSpec = common; + serverSpec = server; + return this; + } + + public BaseConfigScreen withTitles(@Nullable String client, @Nullable String common, @Nullable String server) { + if (client != null) + clientTile = client; + + if (common != null) + commonTile = common; + + if (server != null) + serverTile = server; + + return this; + } + @Override protected void init() { widgets.clear(); super.init(); - TextStencilElement text = new TextStencilElement(client.fontRenderer, new StringTextComponent("Client Settings").formatted(TextFormatting.BOLD)).centered(true, true); - widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16) - .showingElement(text) - .withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, AllConfigs.CLIENT.specification))) - ); - text.withElementRenderer(BoxWidget.gradientFactory.apply(clientConfigWidget)); + TextStencilElement clientText = new TextStencilElement(client.fontRenderer, new StringTextComponent(clientTile).formatted(TextFormatting.BOLD)).centered(true, true); + widgets.add(clientConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 - 30, 200, 16).showingElement(clientText)); - TextStencilElement text2 = new TextStencilElement(client.fontRenderer, new StringTextComponent("World Generation Settings").formatted(TextFormatting.BOLD)).centered(true, true); - widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16) - .showingElement(text2) - .withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, AllConfigs.COMMON.specification))) - ); - text2.withElementRenderer(BoxWidget.gradientFactory.apply(commonConfigWidget)); + if (clientSpec != null) { + clientConfigWidget.withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.CLIENT, clientSpec))); + clientText.withElementRenderer(BoxWidget.gradientFactory.apply(clientConfigWidget)); + } else { + clientConfigWidget.active = false; + clientConfigWidget.updateColorsFromState(); + clientText.withElementRenderer(DISABLED_RENDERER); + } - TextStencilElement text3 = new TextStencilElement(client.fontRenderer, new StringTextComponent("Gameplay Settings").formatted(TextFormatting.BOLD)).centered(true, true); - widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16) - .showingElement(text3) - ); + TextStencilElement commonText = new TextStencilElement(client.fontRenderer, new StringTextComponent(commonTile).formatted(TextFormatting.BOLD)).centered(true, true); + widgets.add(commonConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15, 200, 16).showingElement(commonText)); - if (Minecraft.getInstance().world != null) { - serverConfigWidget.withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.SERVER, AllConfigs.SERVER.specification))); - text3.withElementRenderer(BoxWidget.gradientFactory.apply(serverConfigWidget)); + if (commonSpec != null) { + commonConfigWidget.withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.COMMON, commonSpec))); + commonText.withElementRenderer(BoxWidget.gradientFactory.apply(commonConfigWidget)); + } else { + commonConfigWidget.active = false; + commonConfigWidget.updateColorsFromState(); + commonText.withElementRenderer(DISABLED_RENDERER); + } + + TextStencilElement serverText = new TextStencilElement(client.fontRenderer, new StringTextComponent(serverTile).formatted(TextFormatting.BOLD)).centered(true, true); + widgets.add(serverConfigWidget = new BoxWidget(width / 2 - 100, height / 2 - 15 + 30, 200, 16).showingElement(serverText)); + + if (serverSpec != null && Minecraft.getInstance().world != null) { + serverConfigWidget.withCallback(() -> ScreenOpener.open(new SubMenuConfigScreen(this, ModConfig.Type.SERVER, serverSpec))); + serverText.withElementRenderer(BoxWidget.gradientFactory.apply(serverConfigWidget)); } else { serverConfigWidget.active = false; serverConfigWidget.updateColorsFromState(); - text3.withElementRenderer((ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, Theme.i(Theme.Key.BUTTON_DISABLE, true), Theme.i(Theme.Key.BUTTON_DISABLE, false) | 0x40_000000)); + serverText.withElementRenderer(DISABLED_RENDERER); } + + ConfigScreen.modID = this.modID; } } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java index c1a475d29..b472b0a70 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/CConfigureConfigPacket.java @@ -1,54 +1,65 @@ package com.simibubi.create.foundation.config.ui; +import java.util.Objects; import java.util.function.Supplier; -import com.simibubi.create.foundation.command.SConfigureConfigPacket; -import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.Create; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.network.PacketBuffer; import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.network.NetworkEvent; -import net.minecraftforge.fml.network.PacketDistributor; public class CConfigureConfigPacket extends SimplePacketBase { + private String modID; private String path; private String value; - public CConfigureConfigPacket(String path, T value) { + public CConfigureConfigPacket(String modID, String path, T value) { + this.modID = Objects.requireNonNull(modID); this.path = path; this.value = serialize(value); } public CConfigureConfigPacket(PacketBuffer buffer) { + this.modID = buffer.readString(32767); this.path = buffer.readString(32767); this.value = buffer.readString(32767); } @Override public void write(PacketBuffer buffer) { + buffer.writeString(modID); buffer.writeString(path); buffer.writeString(value); } @Override public void handle(Supplier context) { - ServerPlayerEntity sender = context.get().getSender(); - if (sender == null || !sender.hasPermissionLevel(2)) - return; + context.get().enqueueWork(() -> { + try { + ServerPlayerEntity sender = context.get().getSender(); + if (sender == null || !sender.hasPermissionLevel(2)) + return; - ForgeConfigSpec.ValueSpec valueSpec = AllConfigs.SERVER.specification.getRaw(path); - ForgeConfigSpec.ConfigValue configValue = AllConfigs.SERVER.specification.getValues().get(path); + ForgeConfigSpec spec = ConfigHelper.findConfigSpecFor(ModConfig.Type.SERVER, modID); + ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(path); + ForgeConfigSpec.ConfigValue configValue = spec.getValues().get(path); - T v = (T) deserialize(configValue.get(), value); - if (!valueSpec.test(v)) - return; + T v = (T) deserialize(configValue.get(), value); + if (!valueSpec.test(v)) + return; - configValue.set(v); + configValue.set(v); + } catch (Exception e) { + Create.LOGGER.warn("Unable to handle ConfigureConfig Packet. ", e); + } + }); + context.get().setPacketHandled(true); } public String serialize(T value) { @@ -66,7 +77,7 @@ public class CConfigureConfigPacket extends SimplePacketBase { throw new IllegalArgumentException("unknown type " + value + ": " + value.getClass().getSimpleName()); } - public Object deserialize(Object type, String sValue) { + public static Object deserialize(Object type, String sValue) { if (type instanceof Boolean) return Boolean.parseBoolean(sValue); if (type instanceof Enum) diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java new file mode 100644 index 000000000..57a52417f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigHelper.java @@ -0,0 +1,142 @@ +package com.simibubi.create.foundation.config.ui; + +import java.util.Arrays; +import java.util.EnumMap; +import java.util.List; +import java.util.Locale; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nonnull; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.config.AllConfigs; + +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.fml.ModContainer; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import net.minecraftforge.fml.config.ModConfig; + +public class ConfigHelper { + + private static final LoadingCache> configCache = CacheBuilder.newBuilder().expireAfterAccess(15, TimeUnit.SECONDS).build( + new CacheLoader>() { + @Override + public EnumMap load(@Nonnull String key) { + return findModConfigsUncached(key); + } + } + ); + + private static EnumMap findModConfigsUncached(String modID) { + ModContainer modContainer = ModList.get().getModContainerById(modID).orElseThrow(() -> new IllegalArgumentException("Unable to find ModContainer for id: " + modID)); + EnumMap configs = ObfuscationReflectionHelper.getPrivateValue(ModContainer.class, modContainer, "configs"); + return Objects.requireNonNull(configs); + } + + public static ForgeConfigSpec findConfigSpecFor(ModConfig.Type type, String modID) { + if (!modID.equals(Create.ID)) + return configCache.getUnchecked(modID).get(type).getSpec(); + + switch (type) { + case COMMON: + return AllConfigs.COMMON.specification; + case CLIENT: + return AllConfigs.CLIENT.specification; + case SERVER: + return AllConfigs.SERVER.specification; + } + + return null; + } + + //Directly set a value + public static void setConfigValue(ConfigPath path, String value) throws InvalidValueException { + ForgeConfigSpec spec = findConfigSpecFor(path.getType(), path.getModID()); + List pathList = Arrays.asList(path.getPath()); + ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(pathList); + ForgeConfigSpec.ConfigValue configValue = spec.getValues().get(pathList); + T v = (T) CConfigureConfigPacket.deserialize(configValue.get(), value); + if (!valueSpec.test(v)) + throw new InvalidValueException(); + + configValue.set(v); + } + + //Add a value to the current UI's changes list + public static void setValue(String path, ForgeConfigSpec.ConfigValue configValue, T value) { + if (value.equals(configValue.get())) { + ConfigScreen.changes.remove(path); + } else { + ConfigScreen.changes.put(path, value); + } + } + + //Get a value from the current UI's changes list or the config value, if its unchanged + public static T getValue(String path, ForgeConfigSpec.ConfigValue configValue) { + //noinspection unchecked + return (T) ConfigScreen.changes.getOrDefault(path, configValue.get()); + } + + public static class ConfigPath { + private String modID = Create.ID; + private ModConfig.Type type = ModConfig.Type.CLIENT; + private String[] path; + + public static ConfigPath parse(String string) { + ConfigPath cp = new ConfigPath(); + String p = string; + int index = string.indexOf(":"); + if (index >= 0) { + p = string.substring(index + 1); + if (index >= 1) { + cp.modID = string.substring(0, index); + } + } + String[] split = p.split("\\."); + try { + cp.type = ModConfig.Type.valueOf(split[0].toUpperCase(Locale.ROOT)); + } catch (Exception e) { + throw new IllegalArgumentException("path must start with either 'client.', 'common.' or 'server.'"); + } + + cp.path = new String[split.length - 1]; + System.arraycopy(split, 1, cp.path, 0, cp.path.length); + + return cp; + } + + public ConfigPath setID(String modID) { + this.modID = modID; + return this; + } + + public ConfigPath setType(ModConfig.Type type) { + this.type = type; + return this; + } + + public ConfigPath setPath(String[] path) { + this.path = path; + return this; + } + + public String getModID() { + return modID; + } + + public ModConfig.Type getType() { + return type; + } + + public String[] getPath() { + return path; + } + } + + public static class InvalidValueException extends Exception {} +} diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java index 98086a786..ecdcad3eb 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/ConfigScreen.java @@ -41,6 +41,7 @@ public abstract class ConfigScreen extends AbstractSimiScreen { public static final PhysicalFloat cogSpin = PhysicalFloat.create().withDrag(0.3).addForce(new Force.Static(.2f)); public static final BlockState cogwheelState = AllBlocks.LARGE_COGWHEEL.getDefaultState().with(CogWheelBlock.AXIS, Direction.Axis.Y); public static final Map changes = new HashMap<>(); + public static String modID = null; protected final Screen parent; public ConfigScreen(Screen parent) { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java b/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java index 07dd44942..52c571796 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/OpenConfigButton.java @@ -1,9 +1,11 @@ package com.simibubi.create.foundation.config.ui; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import com.mojang.blaze3d.matrix.MatrixStack; - import com.simibubi.create.AllItems; - import com.simibubi.create.foundation.config.AllConfigs; import net.minecraft.client.Minecraft; @@ -19,10 +21,6 @@ import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - public class OpenConfigButton extends Button { public static ItemStack icon = AllItems.GOGGLES.asStack(); @@ -38,7 +36,7 @@ public class OpenConfigButton extends Button { } public static void click(Button b) { - Minecraft.getInstance().displayGuiScreen(new BaseConfigScreen(Minecraft.getInstance().currentScreen)); + Minecraft.getInstance().displayGuiScreen(BaseConfigScreen.forCreate(Minecraft.getInstance().currentScreen)); } public static class SingleMenuRow { diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java index e27502281..a8adcdc1f 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/SubMenuConfigScreen.java @@ -1,6 +1,9 @@ package com.simibubi.create.foundation.config.ui; import java.awt.Color; +import java.util.List; +import java.util.Locale; +import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -9,6 +12,7 @@ import org.lwjgl.glfw.GLFW; import com.electronwill.nightconfig.core.AbstractConfig; import com.electronwill.nightconfig.core.UnmodifiableConfig; +import com.google.common.collect.Lists; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.config.ui.entries.BooleanEntry; import com.simibubi.create.foundation.config.ui.entries.EnumEntry; @@ -50,6 +54,37 @@ public class SubMenuConfigScreen extends ConfigScreen { protected int listWidth; protected String title; + public static SubMenuConfigScreen find(ConfigHelper.ConfigPath path) { + ForgeConfigSpec spec = ConfigHelper.findConfigSpecFor(path.getType(), path.getModID()); + UnmodifiableConfig values = spec.getValues(); + BaseConfigScreen base = new BaseConfigScreen(null, path.getModID()).searchForSpecsInModContainer(); + SubMenuConfigScreen screen = new SubMenuConfigScreen(base, "root", path.getType(), spec, values); + List remainingPath = Lists.newArrayList(path.getPath()); + + path: while (!remainingPath.isEmpty()) { + String next = remainingPath.remove(0); + for (Map.Entry entry : values.valueMap().entrySet()) { + String key = entry.getKey(); + Object obj = entry.getValue(); + if (!key.equalsIgnoreCase(next)) + continue; + + if (!(obj instanceof AbstractConfig)) { + //highlight entry + continue; + } + + values = (UnmodifiableConfig) obj; + screen = new SubMenuConfigScreen(screen, toHumanReadable(key), path.getType(), spec, values); + continue path; + } + + break; + } + + ConfigScreen.modID = path.getModID(); + return screen; + } public SubMenuConfigScreen(Screen parent, String title, ModConfig.Type type, ForgeConfigSpec configSpec, UnmodifiableConfig configGroup) { super(parent); @@ -81,7 +116,7 @@ public class SubMenuConfigScreen extends ConfigScreen { ForgeConfigSpec.ConfigValue configValue = values.get(path); configValue.set(value); if (type == ModConfig.Type.SERVER) { - AllPackets.channel.sendToServer(new CConfigureConfigPacket<>(path, value)); + AllPackets.channel.sendToServer(new CConfigureConfigPacket<>(ConfigScreen.modID, path, value)); } }); clearChanges(); @@ -92,11 +127,10 @@ public class SubMenuConfigScreen extends ConfigScreen { if (obj instanceof AbstractConfig) { resetConfig((UnmodifiableConfig) obj); } else if (obj instanceof ForgeConfigSpec.ConfigValue) { - ForgeConfigSpec.ConfigValue configValue = (ForgeConfigSpec.ConfigValue) obj; - ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(configValue.getPath()); + ForgeConfigSpec.ConfigValue configValue = (ForgeConfigSpec.ConfigValue) obj; + ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw((List) configValue.getPath()); - if (!configValue.get().equals(valueSpec.getDefault())) - changes.put(String.join(".", configValue.getPath()), valueSpec.getDefault()); + ConfigHelper.setValue(String.join(".", configValue.getPath()), configValue, valueSpec.getDefault()); } }); @@ -265,7 +299,7 @@ public class SubMenuConfigScreen extends ConfigScreen { super.renderWindow(ms, mouseX, mouseY, partialTicks); int x = width/2; - drawCenteredString(ms, client.fontRenderer, "Editing config: " + type.toString() + "@" + title, x, 15, Theme.i(Theme.Key.TEXT)); + drawCenteredString(ms, client.fontRenderer, "Editing config: " + ConfigScreen.modID + ":" + type.toString().toLowerCase(Locale.ROOT) + "@" + title, x, 15, Theme.i(Theme.Key.TEXT)); list.render(ms, mouseX, mouseY, partialTicks); } diff --git a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java index 6f6f89093..48d1d86a0 100644 --- a/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java +++ b/src/main/java/com/simibubi/create/foundation/config/ui/entries/ValueEntry.java @@ -11,6 +11,7 @@ import javax.annotation.Nonnull; import org.apache.commons.lang3.ArrayUtils; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.config.ui.ConfigHelper; import com.simibubi.create.foundation.config.ui.ConfigScreen; import com.simibubi.create.foundation.config.ui.ConfigScreenList; import com.simibubi.create.foundation.gui.AllIcons; @@ -115,20 +116,13 @@ public class ValueEntry extends ConfigScreenList.LabeledEntry { } public void setValue(@Nonnull T value) { - if (value.equals(this.value.get())) { - ConfigScreen.changes.remove(path); - onValueChange(value); - return; - } - - ConfigScreen.changes.put(path, value); + ConfigHelper.setValue(path, this.value, value); onValueChange(value); } @Nonnull public T getValue() { - //noinspection unchecked - return (T) ConfigScreen.changes.getOrDefault(path, this.value.get()); + return ConfigHelper.getValue(path, this.value); } protected boolean isCurrentValueChanged() { diff --git a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java b/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java index e7b5b48cf..b0cfe2ffa 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ConfirmationScreen.java @@ -99,6 +99,14 @@ public class ConfirmationScreen extends AbstractSimiScreen { textHeight = text.size() * (client.fontRenderer.FONT_HEIGHT + 1) + 4; textWidth = 300; + if (centered) { + x = width/2 - textWidth/2 - 2; + y = height/2 - textHeight/2 - 16; + } else { + x = Math.max(0, x - textWidth / 2); + y = Math.max(0, y -= textHeight); + } + if (x + textWidth > width) { x = width - textWidth; } @@ -107,11 +115,6 @@ public class ConfirmationScreen extends AbstractSimiScreen { y = height - textHeight - 30; } - if (centered) { - x = width/2 - textWidth/2 - 2; - y = height/2 - textHeight/2 - 16; - } - TextStencilElement confirmText = new TextStencilElement(client.fontRenderer, "Confirm").centered(true, true); confirm = new BoxWidget(x + 4, y + textHeight + 2 , textWidth/2 - 10, 20) .withCallback(() -> accept(true)); diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java index ee7fa842e..17fd6505c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementOffset.java @@ -102,12 +102,15 @@ public class PlacementOffset { return world.getBlockState(new BlockPos(pos)).getMaterial().isReplaceable(); } - + public ActionResultType placeInWorld(World world, BlockItem blockItem, PlayerEntity player, Hand hand, BlockRayTraceResult ray) { if (!isReplaceable(world)) return ActionResultType.PASS; + if (world.isRemote) + return ActionResultType.SUCCESS; + ItemUseContext context = new ItemUseContext(player, hand, ray); BlockPos newPos = new BlockPos(pos); @@ -135,9 +138,6 @@ public class PlacementOffset { player.addStat(Stats.ITEM_USED.get(blockItem)); - if (world.isRemote) - return ActionResultType.SUCCESS; - if (player instanceof ServerPlayerEntity) CriteriaTriggers.PLACED_BLOCK.trigger((ServerPlayerEntity) player, newPos, context.getItem()); From 0aaa09260b76c69da252ca96295b2c29534cdda3 Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Fri, 28 May 2021 14:42:47 -0400 Subject: [PATCH 11/21] Fix minecart coupling item dupe --- .../structureMovement/train/MinecartCouplingItem.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java index d421c8fb1..66986c18d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/train/MinecartCouplingItem.java @@ -4,6 +4,8 @@ import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; +import com.simibubi.create.foundation.utility.Iterate; + import net.minecraft.entity.Entity; import net.minecraft.entity.item.minecart.AbstractMinecartEntity; import net.minecraft.entity.player.PlayerEntity; @@ -78,6 +80,11 @@ public class MinecartCouplingItem extends Item { if (event.getWorld().isRemote) return true; + for (boolean forward : Iterate.trueAndFalse) { + if (controller.hasContraptionCoupling(forward)) + couplings--; + } + CouplingHandler.status(player, "removed"); controller.decouple(); if (!player.isCreative()) From 55abcde5d5d8816bdd9582a9b9b15300be1b8a84 Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Fri, 28 May 2021 23:27:44 -0400 Subject: [PATCH 12/21] Allow block breakers to work at center of bearing --- .../structureMovement/ControlledContraptionEntity.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java index 4d70938b2..dbdef7a30 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ControlledContraptionEntity.java @@ -34,6 +34,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { protected Axis rotationAxis; protected float prevAngle; protected float angle; + protected float angleDelta; public ControlledContraptionEntity(EntityType type, World world) { super(type, world); @@ -130,9 +131,10 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { public void setPositionAndRotationDirect(double x, double y, double z, float yw, float pt, int inc, boolean t) {} protected void tickContraption() { + angleDelta = angle - prevAngle; prevAngle = angle; tickActors(); - + if (controllerPos == null) return; if (!world.isBlockPresent(controllerPos)) @@ -171,7 +173,7 @@ public class ControlledContraptionEntity extends AbstractContraptionEntity { return false; if (!VecHelper.onSameAxis(blockInfo.pos, BlockPos.ZERO, facing.getAxis())) return false; - context.motion = Vector3d.of(facing.getDirectionVec()).scale(angle - prevAngle); + context.motion = Vector3d.of(facing.getDirectionVec()).scale(angleDelta / 360.0); context.relativeMotion = context.motion; int timer = context.data.getInt("StationaryTimer"); if (timer > 0) { From 9235aa93babcdbe1e4838af14ca391e4a7ef28ac Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Fri, 28 May 2021 23:10:12 -0700 Subject: [PATCH 13/21] JEI Fixes - Fix #1661: blasting-only recipes would not be shown under the bulk blasting category - Add ability to remove matching recipes by type while using the category builder - Fix fan catalyst items being italicized - Add and tweak some visibility modifiers --- build.gradle | 4 +- .../simibubi/create/compat/jei/CreateJEI.java | 167 +++++++++++------- .../jei/category/CreateRecipeCategory.java | 18 +- .../category/ProcessingViaFanCategory.java | 3 +- 4 files changed, 111 insertions(+), 81 deletions(-) diff --git a/build.gradle b/build.gradle index c1c180826..fb82fdcf8 100644 --- a/build.gradle +++ b/build.gradle @@ -130,8 +130,8 @@ dependencies { // i'll leave this here commented for easier testing //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") - // runtimeOnly fg.deobf("slimeknights.mantle:Mantle:1.16.3-1.6.40") - // runtimeOnly fg.deobf("slimeknights.tconstruct:TConstruct:1.16.3-3.0.1.24") + //runtimeOnly fg.deobf("slimeknights.mantle:Mantle:1.16.5-1.6.103") + //runtimeOnly fg.deobf("slimeknights.tconstruct:TConstruct:1.16.5-3.0.3.168") annotationProcessor 'org.spongepowered:mixin:0.8:processor' } 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 5d545b40f..7cbb79a56 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -1,8 +1,8 @@ package com.simibubi.create.compat.jei; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.function.Supplier; @@ -81,12 +81,12 @@ public class CreateJEI implements IModPlugin { } public IIngredientManager ingredientManager; - final List> ALL = new ArrayList<>(); - final CreateRecipeCategory + private final List> allCategories = new ArrayList<>(); + private final CreateRecipeCategory - milling = register("milling", MillingCategory::new).recipes(AllRecipeTypes.MILLING) - .catalyst(AllBlocks.MILLSTONE::get) - .build(), + 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) @@ -106,7 +106,9 @@ public class CreateJEI implements IModPlugin { .build(), blasting = register("fan_blasting", FanBlastingCategory::new) - .recipesExcluding(() -> IRecipeType.SMELTING, () -> IRecipeType.SMOKING) + .recipesExcluding(() -> IRecipeType.SMELTING, () -> IRecipeType.BLASTING) + .recipes(() -> IRecipeType.BLASTING) + .removeRecipes(() -> IRecipeType.SMOKING) .catalystStack(ProcessingViaFanCategory.getFan("fan_blasting")) .build(), @@ -213,20 +215,21 @@ public class CreateJEI implements IModPlugin { @Override public void registerCategories(IRecipeCategoryRegistration registration) { - ALL.forEach(registration::addRecipeCategories); + allCategories.forEach(registration::addRecipeCategories); } @Override public void registerRecipes(IRecipeRegistration registration) { ingredientManager = registration.getIngredientManager(); - ALL.forEach(c -> c.recipes.forEach(s -> registration.addRecipes(s.get(), c.getUid()))); + allCategories.forEach(c -> c.recipes.forEach(s -> registration.addRecipes(s.get(), c.getUid()))); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - ALL.forEach(c -> c.recipeCatalysts.forEach(s -> registration.addRecipeCatalyst(s.get(), c.getUid()))); + allCategories.forEach(c -> c.recipeCatalysts.forEach(s -> registration.addRecipeCatalyst(s.get(), c.getUid()))); } + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void registerGuiHandlers(IGuiHandlerRegistration registration) { SlotMover slotMover = new SlotMover(); @@ -239,98 +242,106 @@ public class CreateJEI implements IModPlugin { } private class CategoryBuilder> { - CreateRecipeCategory category; + private CreateRecipeCategory category; + private List>>> recipeListConsumers = new ArrayList<>(); private Predicate pred; - CategoryBuilder(String name, Supplier> category) { + public CategoryBuilder(String name, Supplier> category) { this.category = category.get(); this.category.setCategoryId(name); - this.pred = Predicates.alwaysTrue(); + 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) { + public CategoryBuilder recipes(AllRecipeTypes recipeTypeEntry) { return recipes(recipeTypeEntry::getType); } - CategoryBuilder recipes(Supplier> recipeType) { + public CategoryBuilder recipes(Supplier> recipeType) { return recipes(r -> r.getType() == recipeType.get()); } - CategoryBuilder recipes(ResourceLocation serializer) { + public CategoryBuilder recipes(ResourceLocation serializer) { return recipes(r -> r.getSerializer() .getRegistryName() .equals(serializer)); } - CategoryBuilder recipes(Predicate> pred) { + public CategoryBuilder recipes(Predicate> pred) { return recipeList(() -> findRecipes(pred)); } - CategoryBuilder recipes(Predicate> pred, Function, T> converter) { + public CategoryBuilder recipes(Predicate> pred, Function, T> converter) { return recipeList(() -> findRecipes(pred), converter); } - CategoryBuilder recipeList(Supplier>> list) { + public 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(); + public CategoryBuilder recipeList(Supplier>> list, Function, T> converter) { + recipeListConsumers.add(recipes -> { + List> toAdd = list.get(); if (converter != null) - return list.get() + toAdd = toAdd .stream() .map(converter) .collect(Collectors.toList()); - return list.get(); + recipes.addAll(toAdd); }); return this; } - CategoryBuilder recipesExcluding(Supplier> recipeType, + public 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()); + recipeListConsumers.add(recipes -> { + recipes.addAll(findRecipesByTypeExcluding(recipeType.get(), excluded.get())); }); return this; } - CategoryBuilder enableWhen(Function configValue) { - this.pred = c -> configValue.apply(c) + public CategoryBuilder removeRecipes(Supplier> recipeType) { + recipeListConsumers.add(recipes -> { + removeRecipesByType(recipes, recipeType.get()); + }); + return this; + } + + public CategoryBuilder catalyst(Supplier supplier) { + return catalystStack(() -> new ItemStack(supplier.get() + .asItem())); + } + + public CategoryBuilder catalystStack(Supplier supplier) { + category.recipeCatalysts.add(supplier); + return this; + } + + public CategoryBuilder enableWhen(Function configValue) { + pred = c -> configValue.apply(c) .get(); return this; } - CategoryBuilder enableWhenBool(Function configValue) { - this.pred = configValue::apply; + public CategoryBuilder enableWhenBool(Function configValue) { + pred = configValue::apply; return this; } - CreateRecipeCategory build() { - ALL.add(category); + public CreateRecipeCategory build() { + if (pred.test(AllConfigs.SERVER.recipes)) + category.recipes.add(() -> { + List> recipes = new ArrayList<>(); + for (Consumer>> consumer : recipeListConsumers) + consumer.accept(recipes); + return recipes; + }); + allCategories.add(category); return category; } } - static List> findRecipesByType(IRecipeType type) { - return findRecipes(r -> r.getType() == type); - } - - static List> findRecipes(Predicate> predicate) { + public static List> findRecipes(Predicate> predicate) { return Minecraft.getInstance().world.getRecipeManager() .getRecipes() .stream() @@ -338,24 +349,44 @@ public class CreateJEI implements IModPlugin { .collect(Collectors.toList()); } - 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; - } - return false; - }); + public static List> findRecipesByType(IRecipeType type) { + return findRecipes(recipe -> recipe.getType() == type); + } + + public static List> findRecipesByTypeExcluding(IRecipeType type, IRecipeType excludingType) { + List> byType = findRecipesByType(type); + removeRecipesByType(byType, excludingType); return byType; } + public static List> findRecipesByTypeExcluding(IRecipeType type, IRecipeType... excludingTypes) { + List> byType = findRecipesByType(type); + for (IRecipeType excludingType : excludingTypes) + removeRecipesByType(byType, excludingType); + return byType; + } + + public static void removeRecipesByType(List> recipes, IRecipeType type) { + List> byType = findRecipesByType(type); + recipes.removeIf(recipe -> { + for (IRecipe r : byType) + if (doInputsMatch(recipe, r)) + return true; + return false; + }); + } + + public static boolean doInputsMatch(IRecipe recipe1, IRecipe recipe2) { + ItemStack[] matchingStacks = recipe1.getIngredients() + .get(0) + .getMatchingStacks(); + if (matchingStacks.length == 0) + return true; + if (recipe2.getIngredients() + .get(0) + .test(matchingStacks[0])) + return true; + return false; + } + } 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 84543da40..55bfbdab2 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 @@ -31,13 +31,13 @@ import net.minecraftforge.fluids.FluidStack; public abstract class CreateRecipeCategory> implements IRecipeCategory { - public List> recipeCatalysts = new ArrayList<>(); - public List>>> recipes = new ArrayList<>(); - public ResourceLocation uid; + public final List>>> recipes = new ArrayList<>(); + public final List> recipeCatalysts = new ArrayList<>(); + protected ResourceLocation uid; protected String name; - private IDrawable icon; private IDrawable background; + private IDrawable icon; public CreateRecipeCategory(IDrawable icon, IDrawable background) { this.background = background; @@ -49,11 +49,6 @@ public abstract class CreateRecipeCategory> implements IRec this.name = name; } - @Override - public IDrawable getIcon() { - return icon; - } - @Override public ResourceLocation getUid() { return uid; @@ -70,6 +65,11 @@ public abstract class CreateRecipeCategory> implements IRec return background; } + @Override + public IDrawable getIcon() { + return icon; + } + protected static AllGuiTextures getRenderedSlot(IRecipe recipe, int index) { AllGuiTextures jeiSlot = AllGuiTextures.JEI_SLOT; if (!(recipe instanceof ProcessingRecipe)) 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 2f03d2056..69b2292d8 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 @@ -21,7 +21,6 @@ import mezz.jei.api.ingredients.IIngredients; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.math.vector.Vector3f; -import net.minecraft.util.text.TextFormatting; public abstract class ProcessingViaFanCategory> extends CreateRecipeCategory { @@ -41,7 +40,7 @@ public abstract class ProcessingViaFanCategory> extends Cre public static Supplier getFan(String name) { return () -> AllBlocks.ENCASED_FAN.asStack() - .setDisplayName(Lang.translate("recipe." + name + ".fan").formatted(TextFormatting.RESET)); + .setDisplayName(Lang.translate("recipe." + name + ".fan").styled(style -> style.withItalic(false))); } @Override From 51c0e347b88eda662e8976829a9da943c5c9168b Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Sat, 29 May 2021 15:17:24 -0400 Subject: [PATCH 14/21] Fix chest minecarts clearing their inventory when disassembled --- .../structureMovement/Contraption.java | 34 +++++++++++++++---- .../mounted/MountedContraption.java | 18 +++++----- 2 files changed, 37 insertions(+), 15 deletions(-) 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 32f9a2a34..9480d7e04 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 @@ -119,7 +119,7 @@ public abstract class Contraption { public Optional> simplifiedEntityColliders; public AbstractContraptionEntity entity; - public CombinedInvWrapper inventory; + public ContraptionInvWrapper inventory; public CombinedTankWrapper fluidInventory; public AxisAlignedBB bounds; public BlockPos anchor; @@ -252,7 +252,7 @@ public abstract class Contraption { .stream() .map(MountedStorage::getItemHandler) .collect(Collectors.toList()); - inventory = new CombinedInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); + inventory = new ContraptionInvWrapper(Arrays.copyOf(list.toArray(), list.size(), IItemHandlerModifiable[].class)); List fluidHandlers = fluidStorage.values() .stream() @@ -341,7 +341,7 @@ public abstract class Contraption { // Bearings potentially create stabilized sub-contraptions if (AllBlocks.MECHANICAL_BEARING.has(state)) moveBearing(pos, frontier, visited, state); - + // WM Bearings attach their structure when moved if (AllBlocks.WINDMILL_BEARING.has(state)) moveWindmillBearing(pos, frontier, visited, state); @@ -739,7 +739,7 @@ public abstract class Contraption { for (MountedFluidStorage mountedStorage : fluidStorage.values()) fluidHandlers[index++] = mountedStorage.getFluidHandler(); - inventory = new CombinedInvWrapper(handlers); + inventory = new ContraptionInvWrapper(handlers); fluidInventory = new CombinedTankWrapper(fluidHandlers); if (nbt.contains("BoundsFront")) @@ -1053,8 +1053,10 @@ public abstract class Contraption { BlockFlags.IS_MOVING | BlockFlags.DEFAULT, 512); } - for (int i = 0; i < inventory.getSlots(); i++) - inventory.setStackInSlot(i, ItemStack.EMPTY); + for (int i = 0; i < inventory.getSlots(); i++) { + if (!inventory.isSlotExternal(i)) + inventory.setStackInSlot(i, ItemStack.EMPTY); + } for (int i = 0; i < fluidInventory.getTanks(); i++) fluidInventory.drain(fluidInventory.getFluidInTank(i), FluidAction.EXECUTE); @@ -1261,4 +1263,24 @@ public abstract class Contraption { return pos.equals(te.getPos()); } } + + public static class ContraptionInvWrapper extends CombinedInvWrapper { + protected final boolean isExternal; + + public ContraptionInvWrapper(boolean isExternal, IItemHandlerModifiable... itemHandler) { + super(itemHandler); + this.isExternal = isExternal; + } + + public ContraptionInvWrapper(IItemHandlerModifiable... itemHandler) { + this(false, itemHandler); + } + + public boolean isSlotExternal(int slot) { + if (isExternal) + return true; + IItemHandlerModifiable handler = getHandlerFromIndex(getIndexForSlot(slot)); + return handler instanceof ContraptionInvWrapper && ((ContraptionInvWrapper) handler).isSlotExternal(slot); + } + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java index 97b75e778..fae052d36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MountedContraption.java @@ -53,7 +53,7 @@ public class MountedContraption extends Contraption { protected ContraptionType getType() { return ContraptionType.MOUNTED; } - + @Override public boolean assemble(World world, BlockPos pos) throws AssemblyException { BlockState state = world.getBlockState(pos); @@ -61,17 +61,17 @@ public class MountedContraption extends Contraption { return false; if (!searchMovedStructure(world, pos, null)) return false; - + Axis axis = state.get(RAIL_SHAPE) == RailShape.EAST_WEST ? Axis.X : Axis.Z; addBlock(pos, Pair.of(new BlockInfo(pos, AllBlocks.MINECART_ANCHOR.getDefaultState() .with(BlockStateProperties.HORIZONTAL_AXIS, axis), null), null)); - + if (blocks.size() == 1) return false; - + return true; } - + @Override protected boolean addToInitialFrontier(World world, BlockPos pos, Direction direction, Queue frontier) { frontier.clear(); @@ -149,18 +149,18 @@ public class MountedContraption extends Contraption { protected boolean customBlockRemoval(IWorld world, BlockPos pos, BlockState state) { return AllBlocks.MINECART_ANCHOR.has(state); } - + @Override public boolean canBeStabilized(Direction facing, BlockPos localPos) { return true; } - + @Override public void addExtraInventories(Entity cart) { if (!(cart instanceof IInventory)) return; - IItemHandlerModifiable handlerFromInv = new InvWrapper((IInventory) cart); - inventory = new CombinedInvWrapper(handlerFromInv, inventory); + IItemHandlerModifiable handlerFromInv = new ContraptionInvWrapper(true, new InvWrapper((IInventory) cart)); + inventory = new ContraptionInvWrapper(handlerFromInv, inventory); } @Override From c0133458604627c1cb4d627fbb56cc76fb3a4c58 Mon Sep 17 00:00:00 2001 From: PepperBell <44146161+PepperCode1@users.noreply.github.com> Date: Sat, 29 May 2021 16:31:36 -0700 Subject: [PATCH 15/21] Cobblestone drops and smelting - Make regular palette stone blocks drop their cobblestone variant instead of themselves (unless silk touch is used) - Add smelting recipes for cobblestone palette blocks - Rename PaletteBlockPatterns to PaletteBlockPattern - Move PatternNameType to PaletteBlockPattern - Rename some fields --- src/generated/resources/.cache/cache | 60 ++++++---- .../recipes/building_blocks/andesite.json | 32 +++++ .../recipes/building_blocks/diorite.json | 32 +++++ .../recipes/building_blocks/granite.json | 32 +++++ .../create.palettes/andesite_pillar.json | 4 +- .../recipes/create.palettes/dark_scoria.json | 32 +++++ .../create.palettes/dark_scoria_pillar.json | 4 +- .../create.palettes/diorite_pillar.json | 4 +- .../recipes/create.palettes/dolomite.json | 32 +++++ .../create.palettes/dolomite_pillar.json | 4 +- .../recipes/create.palettes/gabbro.json | 32 +++++ .../create.palettes/gabbro_pillar.json | 4 +- .../create.palettes/granite_pillar.json | 4 +- .../recipes/create.palettes/limestone.json | 32 +++++ .../create.palettes/limestone_pillar.json | 4 +- .../recipes/create.palettes/scoria.json | 32 +++++ .../create.palettes/scoria_pillar.json | 4 +- .../create.palettes/weathered_limestone.json | 32 +++++ .../weathered_limestone_pillar.json | 4 +- .../loot_tables/blocks/dark_scoria.json | 38 ++++-- .../create/loot_tables/blocks/dolomite.json | 38 ++++-- .../create/loot_tables/blocks/gabbro.json | 38 ++++-- .../create/loot_tables/blocks/limestone.json | 38 ++++-- .../create/loot_tables/blocks/scoria.json | 38 ++++-- .../blocks/weathered_limestone.json | 38 ++++-- .../data/create/recipes/andesite.json | 9 ++ .../data/create/recipes/dark_scoria.json | 9 ++ .../data/create/recipes/diorite.json | 9 ++ .../data/create/recipes/dolomite.json | 9 ++ .../resources/data/create/recipes/gabbro.json | 9 ++ .../data/create/recipes/granite.json | 9 ++ .../data/create/recipes/limestone.json | 9 ++ .../create/recipes/polished_dark_scoria.json | 6 +- .../create/recipes/polished_dolomite.json | 6 +- .../data/create/recipes/polished_gabbro.json | 6 +- .../create/recipes/polished_limestone.json | 6 +- .../data/create/recipes/polished_scoria.json | 6 +- .../recipes/polished_weathered_limestone.json | 6 +- .../resources/data/create/recipes/scoria.json | 9 ++ .../create/recipes/weathered_limestone.json | 9 ++ .../com/simibubi/create/AllSpriteShifts.java | 10 +- .../content/palettes/AllPaletteBlocks.java | 32 +++-- .../content/palettes/PaletteBlockPartial.java | 24 ++-- ...Patterns.java => PaletteBlockPattern.java} | 112 ++++++++++-------- .../palettes/PaletteStoneVariants.java | 26 ++-- .../palettes/PalettesVariantEntry.java | 10 +- .../content/palettes/PatternNameType.java | 5 - 47 files changed, 752 insertions(+), 196 deletions(-) create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/andesite.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/diorite.json create mode 100644 src/generated/resources/data/create/advancements/recipes/building_blocks/granite.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/limestone.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/scoria.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone.json create mode 100644 src/generated/resources/data/create/recipes/andesite.json create mode 100644 src/generated/resources/data/create/recipes/dark_scoria.json create mode 100644 src/generated/resources/data/create/recipes/diorite.json create mode 100644 src/generated/resources/data/create/recipes/dolomite.json create mode 100644 src/generated/resources/data/create/recipes/gabbro.json create mode 100644 src/generated/resources/data/create/recipes/granite.json create mode 100644 src/generated/resources/data/create/recipes/limestone.json create mode 100644 src/generated/resources/data/create/recipes/scoria.json create mode 100644 src/generated/resources/data/create/recipes/weathered_limestone.json rename src/main/java/com/simibubi/create/content/palettes/{PaletteBlockPatterns.java => PaletteBlockPattern.java} (70%) delete mode 100644 src/main/java/com/simibubi/create/content/palettes/PatternNameType.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e1e64b2e5..879b6bf41 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -1713,6 +1713,7 @@ c9c4060ed207226b69fada2d61e01a97d7077eae data/create/advancements/nixie_tube.jso 4b621e5bb48fbb120853ec02c05c915d86bd6dd8 data/create/advancements/pipe_spill.json 72025d8bf73ab8096c29f12d0c8d9a346f09cd64 data/create/advancements/polished_rose_quartz.json 62d29ec01eff5d21968636a0479361ecdc11ae30 data/create/advancements/press.json +f80479b50e248ee8d6d1abb7d08866cf711ac2b2 data/create/advancements/recipes/building_blocks/andesite.json 5012e9d559439d0d62d0b34c2e39de048e8c7699 data/create/advancements/recipes/building_blocks/blasting/aluminum_ingot_compat_silents_mechanisms.json 2e253226c408dffb9dfb828b846f70ebd1cfb16e data/create/advancements/recipes/building_blocks/blasting/ingot_aluminum_compat_immersiveengineering.json 3f022f89aeb5034f2292ca71daa9f311e8af40ff data/create/advancements/recipes/building_blocks/blasting/ingot_lead_compat_immersiveengineering.json @@ -1739,6 +1740,8 @@ a61045a27757950d96fee77768bfd96f935f98b2 data/create/advancements/recipes/buildi a75f1162ac89cd50a1ca8e525dd059fb359a6550 data/create/advancements/recipes/building_blocks/blasting/tin_ingot_compat_silents_mechanisms.json 230c3da350aa45524712d5dd28b84aa59b2883e9 data/create/advancements/recipes/building_blocks/blasting/tin_ingot_compat_thermal.json 38410d4b3bbbf33c1c8913735abd1b3d71fb3829 data/create/advancements/recipes/building_blocks/blasting/uranium_ingot_compat_silents_mechanisms.json +8850272a97541e331482531c52cc94197fe808be data/create/advancements/recipes/building_blocks/diorite.json +0abb698cabe5f71675773e5eeadeccb509f1cb90 data/create/advancements/recipes/building_blocks/granite.json 22067545c460d95831d9dddf361da9becac3396e data/create/advancements/recipes/building_blocks/smelting/aluminum_ingot_compat_silents_mechanisms.json e525d8eda8d0aac6791ae935ed4f3f75cc521460 data/create/advancements/recipes/building_blocks/smelting/glass_from_framed_glass.json 295c5a61d6f175a65d25e19cbd7ca90d3b4a93b2 data/create/advancements/recipes/building_blocks/smelting/glass_from_horizontal_framed_glass.json @@ -1976,7 +1979,7 @@ bfb3673a30db807aa298f2fd128ec863a65818af data/create/advancements/recipes/create 47cc716674e1741f4115b04a20ac4c4a5b2a6d8a data/create/advancements/recipes/create.palettes/andesite_cobblestone_stairs_from_andesite_cobblestone_stonecutting.json bd79e63c29d68fbf87ded63ac1eedba3d7287996 data/create/advancements/recipes/create.palettes/andesite_cobblestone_wall.json 0ed4c084f05b2bd4c134293ad3554d6e31a1d568 data/create/advancements/recipes/create.palettes/andesite_cobblestone_wall_from_andesite_cobblestone_stonecutting.json -a453d05704cadb3279318192aac87e623738cdaa data/create/advancements/recipes/create.palettes/andesite_pillar.json +cc8e078ccce06e9489d8b62d88b6a2e4d4ca2d79 data/create/advancements/recipes/create.palettes/andesite_pillar.json d6f31097aef040e12eb288ab755d459f55269a70 data/create/advancements/recipes/create.palettes/andesite_pillar_from_andesite_stonecutting.json f10a4369147cc5e36d3ab1b0008d29fd36ffc8f6 data/create/advancements/recipes/create.palettes/birch_window.json bfea45da3f8df1c63f6c7ff1b63ad7e08c1d44b0 data/create/advancements/recipes/create.palettes/birch_window_pane.json @@ -1991,6 +1994,7 @@ b4651c8202331483e82b28b04edc6cd97e62ad1d data/create/advancements/recipes/create b2813566e6715c2d377dd4ef461b012cae7eb190 data/create/advancements/recipes/create.palettes/crimson_window_pane.json 25991d5667252d551e02c4fbbfa27ebf4353d28d data/create/advancements/recipes/create.palettes/dark_oak_window.json 4819383b1a7885b4401fdc25955d2c51f75b6236 data/create/advancements/recipes/create.palettes/dark_oak_window_pane.json +02cd339174aaf2c14e14f886d90fbbcae91783b6 data/create/advancements/recipes/create.palettes/dark_scoria.json ebd6413d530325eef6fcf42a0ee0ac840c1f7366 data/create/advancements/recipes/create.palettes/dark_scoria_bricks_from_dark_scoria_stonecutting.json 030ce9b61b8af158cf54e7a9ab673ccb7251483f data/create/advancements/recipes/create.palettes/dark_scoria_bricks_slab.json ac44d03859cfd4c00ddcbd1dafbb9acc51d849d7 data/create/advancements/recipes/create.palettes/dark_scoria_bricks_slab_from_dark_scoria_bricks_stonecutting.json @@ -2005,7 +2009,7 @@ eef6f85b20fb997af1b0c2383a45100be2e0cd34 data/create/advancements/recipes/create 8d44f675237a92513678a77da7a1f329475a3453 data/create/advancements/recipes/create.palettes/dark_scoria_cobblestone_stairs_from_dark_scoria_cobblestone_stonecutting.json 702527e6735770a6fcc3ad446df39d3b1b80709e data/create/advancements/recipes/create.palettes/dark_scoria_cobblestone_wall.json ce069a666d223f733bfa1cc9ca5e3e5e27de1ebc data/create/advancements/recipes/create.palettes/dark_scoria_cobblestone_wall_from_dark_scoria_cobblestone_stonecutting.json -c5d7f1e79302d47ea02cb63b99b286b90ec0287b data/create/advancements/recipes/create.palettes/dark_scoria_pillar.json +64f9ba8df2fd2357ad397b75156a4af9c26fa91b data/create/advancements/recipes/create.palettes/dark_scoria_pillar.json f3d6314d272d84c456c5df512dcc555b7694ded2 data/create/advancements/recipes/create.palettes/dark_scoria_pillar_from_dark_scoria_stonecutting.json 83e3c29d5d651a6bc6fd9d5843d8d75f4cda2b77 data/create/advancements/recipes/create.palettes/diorite_bricks_from_diorite_stonecutting.json 4649497555ca4269b1f3859f0275ca1ff7c85377 data/create/advancements/recipes/create.palettes/diorite_bricks_slab.json @@ -2021,8 +2025,9 @@ f3d6314d272d84c456c5df512dcc555b7694ded2 data/create/advancements/recipes/create 600c57c4dc3a3741d5db7ec01340e1c6a01d54b4 data/create/advancements/recipes/create.palettes/diorite_cobblestone_stairs_from_diorite_cobblestone_stonecutting.json 8b4990d3657e23a86c3e71eba77370c56692c93b data/create/advancements/recipes/create.palettes/diorite_cobblestone_wall.json e741ca0e76875ee12beecd45db764444956d5342 data/create/advancements/recipes/create.palettes/diorite_cobblestone_wall_from_diorite_cobblestone_stonecutting.json -9edb9886a6b2792dc38d5d61a2be2b7a3fd28eeb data/create/advancements/recipes/create.palettes/diorite_pillar.json +08e8495b798d54366f132da060e93e94e23f6354 data/create/advancements/recipes/create.palettes/diorite_pillar.json 87d34b8ca3dc73a778ab94ef4d852f418112adb3 data/create/advancements/recipes/create.palettes/diorite_pillar_from_diorite_stonecutting.json +17135274809b7a0f38294d2e6412b787e985e4d5 data/create/advancements/recipes/create.palettes/dolomite.json dbf201ceafc310f5cc6624c81777d50348844285 data/create/advancements/recipes/create.palettes/dolomite_bricks_from_dolomite_stonecutting.json 6716447628cce96a1f520766d019f09380ec67e5 data/create/advancements/recipes/create.palettes/dolomite_bricks_slab.json 52ae39c6f63860fa5a60c1ae70ef00eca5b961c9 data/create/advancements/recipes/create.palettes/dolomite_bricks_slab_from_dolomite_bricks_stonecutting.json @@ -2037,7 +2042,7 @@ a8904096a05eeb7e746563e1a4b97b39173d1708 data/create/advancements/recipes/create 124c586970edc5c15079bec53c734a2beb670130 data/create/advancements/recipes/create.palettes/dolomite_cobblestone_stairs_from_dolomite_cobblestone_stonecutting.json 2e9f1556a11d4d7190233be3af64453396865da9 data/create/advancements/recipes/create.palettes/dolomite_cobblestone_wall.json 1a1e8764ba05f72ffd7e5872a8f2fc9cf2108308 data/create/advancements/recipes/create.palettes/dolomite_cobblestone_wall_from_dolomite_cobblestone_stonecutting.json -4652a46d4b6590b988d57d855def253ebeb380fe data/create/advancements/recipes/create.palettes/dolomite_pillar.json +4b56a0490151fbc66dee82546b9e271a5a85fa12 data/create/advancements/recipes/create.palettes/dolomite_pillar.json a8752ee9bf9afc665c5d940d251c1cf4a83a0ae9 data/create/advancements/recipes/create.palettes/dolomite_pillar_from_dolomite_stonecutting.json ea981a446d8cc22d6b7fb4667e86dc18a48a4720 data/create/advancements/recipes/create.palettes/fancy_andesite_bricks_from_andesite_stonecutting.json 44dc6bc5a7303129db2268a025f49dcb222597a7 data/create/advancements/recipes/create.palettes/fancy_andesite_bricks_slab.json @@ -2104,6 +2109,7 @@ d51bee4b276805ecf1a93a37ec6d610e75c0117e data/create/advancements/recipes/create 17e02efc06d935c094bde5bb73a5127bc98e4758 data/create/advancements/recipes/create.palettes/fancy_weathered_limestone_bricks_wall_from_fancy_weathered_limestone_bricks_stonecutting.json 05331b5f1701453ecdfd0b3e6429b22ec209ba67 data/create/advancements/recipes/create.palettes/framed_glass_from_glass_colorless_stonecutting.json 605476eaf4e964936c031732cfef534edfdd749a data/create/advancements/recipes/create.palettes/framed_glass_pane.json +1b17b217e487b958e35ab0ad509bb8caceebda40 data/create/advancements/recipes/create.palettes/gabbro.json b835dd583d670e2d7f6af4dd74e44f5817b03b21 data/create/advancements/recipes/create.palettes/gabbro_bricks_from_gabbro_stonecutting.json 2bfac04754aaf07423b330134984d887ae43f00a data/create/advancements/recipes/create.palettes/gabbro_bricks_slab.json f05bb35d52866abc7dae9c7f3f5fc85257760564 data/create/advancements/recipes/create.palettes/gabbro_bricks_slab_from_gabbro_bricks_stonecutting.json @@ -2118,7 +2124,7 @@ c90a07c41b2e034437c8a765de7b517f89383830 data/create/advancements/recipes/create f9d917def55875dcba621246f80dc83904be3d73 data/create/advancements/recipes/create.palettes/gabbro_cobblestone_stairs_from_gabbro_cobblestone_stonecutting.json b081b91a5e11e8ce9b2455b944eb554f5f2e419e data/create/advancements/recipes/create.palettes/gabbro_cobblestone_wall.json 093f372d84c557791cebcb286b3505f32c4dc7c0 data/create/advancements/recipes/create.palettes/gabbro_cobblestone_wall_from_gabbro_cobblestone_stonecutting.json -dacb04ebd8bc20c2a0689a9e75ea67c07e43c56b data/create/advancements/recipes/create.palettes/gabbro_pillar.json +4b0f4a396397a791d08fe422fb4cfb922554779c data/create/advancements/recipes/create.palettes/gabbro_pillar.json 35288551f5146ebbf8dbbe987928dd2a1bdc7ea8 data/create/advancements/recipes/create.palettes/gabbro_pillar_from_gabbro_stonecutting.json 6a9a8b37ec264084ce0481200225017739546025 data/create/advancements/recipes/create.palettes/granite_bricks_from_granite_stonecutting.json 2ac84cb0b8b629bdfd740a6613df2a7e45964bf2 data/create/advancements/recipes/create.palettes/granite_bricks_slab.json @@ -2134,7 +2140,7 @@ c39e86c111a2c76ef9cb7046d2b87262524b06b9 data/create/advancements/recipes/create 06d3f3150db99f808a5fd4141c0fc6235d979ce5 data/create/advancements/recipes/create.palettes/granite_cobblestone_stairs_from_granite_cobblestone_stonecutting.json 6bbc97d2ac655a532eaf345fca64431dbf8af27d data/create/advancements/recipes/create.palettes/granite_cobblestone_wall.json d6b622a2cf302d0c39e0d38d24b0a17e1461d13b data/create/advancements/recipes/create.palettes/granite_cobblestone_wall_from_granite_cobblestone_stonecutting.json -03c3a88e1a320afe9866a1c09ef34b46763c8ec1 data/create/advancements/recipes/create.palettes/granite_pillar.json +5b9fe440648ae9f37b5d079cfcd1d9a72afa74fa data/create/advancements/recipes/create.palettes/granite_pillar.json 97cc61b1b510849ebc0bf51cf2b8107a5c43fc17 data/create/advancements/recipes/create.palettes/granite_pillar_from_granite_stonecutting.json cbb40e82dba460ee126966a52f0164e740ac1f11 data/create/advancements/recipes/create.palettes/horizontal_framed_glass_from_glass_colorless_stonecutting.json 29e2e2aeca3800c8ba432be30d54d046a3991217 data/create/advancements/recipes/create.palettes/horizontal_framed_glass_pane.json @@ -2149,6 +2155,7 @@ cbb40e82dba460ee126966a52f0164e740ac1f11 data/create/advancements/recipes/create c0dd961f07e85a183af7b942ed0e4bfe8f775373 data/create/advancements/recipes/create.palettes/layered_limestone_from_limestone_stonecutting.json 5d06584a83074f8a8d1a52d93d13f2718bc99152 data/create/advancements/recipes/create.palettes/layered_scoria_from_scoria_stonecutting.json b09e64b4989ef08b7ea6b9011681c2fbf780d949 data/create/advancements/recipes/create.palettes/layered_weathered_limestone_from_weathered_limestone_stonecutting.json +519234f31ee8cacc0f916df40703ba171c6a90e5 data/create/advancements/recipes/create.palettes/limestone.json 52c1902f260173fe610a4a03294a51c4cea3b37b data/create/advancements/recipes/create.palettes/limestone_bricks_from_limestone_stonecutting.json e6eb6c433541b7c4e3e5b64f240618e6df67ed58 data/create/advancements/recipes/create.palettes/limestone_bricks_slab.json 72f0586690ca4413082b2cbecf7938ba6e4756b4 data/create/advancements/recipes/create.palettes/limestone_bricks_slab_from_limestone_bricks_stonecutting.json @@ -2163,7 +2170,7 @@ d7b36c7fcf429eea7c57f2ae967e73b8e18d0d58 data/create/advancements/recipes/create 749936c7c33273c1833154a1eb1e13604ece8565 data/create/advancements/recipes/create.palettes/limestone_cobblestone_stairs_from_limestone_cobblestone_stonecutting.json c0e3f97a6f807ea8147f58bf4ca002725d1877b6 data/create/advancements/recipes/create.palettes/limestone_cobblestone_wall.json a01c91b927f50d367c3bfcca5f370002a991d45a data/create/advancements/recipes/create.palettes/limestone_cobblestone_wall_from_limestone_cobblestone_stonecutting.json -8b1ef23c71f0088230dcdd12374494bfdf700409 data/create/advancements/recipes/create.palettes/limestone_pillar.json +acf08b6a32e3678d63443fdb97e7332e05eb61f6 data/create/advancements/recipes/create.palettes/limestone_pillar.json d040f53dfb09a29c39d534d3595e35d058fe5557 data/create/advancements/recipes/create.palettes/limestone_pillar_from_limestone_stonecutting.json 3ee8ab0478344042136058be6cf870289c096bdd data/create/advancements/recipes/create.palettes/mossy_andesite_from_andesite_stonecutting.json c427e2626e468abee6fb4de83bf76f2d3c051449 data/create/advancements/recipes/create.palettes/mossy_dark_scoria_from_dark_scoria_stonecutting.json @@ -2298,6 +2305,7 @@ e46847d02ab7bfb2bc1da1a4ad4b7b54a3a28559 data/create/advancements/recipes/create 75480d0c13a80d9edf93a0eff947e5165db011c1 data/create/advancements/recipes/create.palettes/polished_weathered_limestone_stairs_from_polished_weathered_limestone_stonecutting.json 7b4b27211174e774169132a50da7bfd63ff28b30 data/create/advancements/recipes/create.palettes/polished_weathered_limestone_wall.json 81a759d9b069faedee49107642d947ea1bf1ac6c data/create/advancements/recipes/create.palettes/polished_weathered_limestone_wall_from_polished_weathered_limestone_stonecutting.json +28c7dd5fb1594295f977eff41ac677aab9660831 data/create/advancements/recipes/create.palettes/scoria.json 874023eabafb85aefacc86f395c5d4ef0cc9cfac data/create/advancements/recipes/create.palettes/scoria_bricks_from_scoria_stonecutting.json a9969fd00f8cba428715d27a8ab6af6ba6473c8a data/create/advancements/recipes/create.palettes/scoria_bricks_slab.json 1d129bb8d359de50344dcb46f77899b0651d7817 data/create/advancements/recipes/create.palettes/scoria_bricks_slab_from_scoria_bricks_stonecutting.json @@ -2312,7 +2320,7 @@ dc5df4f4feddc24a7c78b25b6ed3e7ed458342f1 data/create/advancements/recipes/create b852a9a59499c113f387ac06fdb27d3d455f18e3 data/create/advancements/recipes/create.palettes/scoria_cobblestone_stairs_from_scoria_cobblestone_stonecutting.json a43d45efa0fb0d3eaace93c18d80a14d4dcddf38 data/create/advancements/recipes/create.palettes/scoria_cobblestone_wall.json e340721aa78f260c2666214aa149241a37de216e data/create/advancements/recipes/create.palettes/scoria_cobblestone_wall_from_scoria_cobblestone_stonecutting.json -53cc5b006a19158e04094308accb66a7c35d2b26 data/create/advancements/recipes/create.palettes/scoria_pillar.json +68fc67ead3fd31885b30a5cf3e71dd33fb040634 data/create/advancements/recipes/create.palettes/scoria_pillar.json 53712a9ae59976dece952bea7ecaf73b679448f0 data/create/advancements/recipes/create.palettes/scoria_pillar_from_scoria_stonecutting.json 6b148def2f8789f9ff1d41bb71ab3608438a7207 data/create/advancements/recipes/create.palettes/smelting/dolomite.json 070720cc271767b26ad51fa089b4cf2a64d309be data/create/advancements/recipes/create.palettes/smelting/gabbro.json @@ -2327,6 +2335,7 @@ d40c7ce6b79630ace624d17b92667286998d93bc data/create/advancements/recipes/create cd5ee73117872ee98434be1d24b4f271f7e94a48 data/create/advancements/recipes/create.palettes/vertical_framed_glass_pane.json f26d1a1ee183b1b19d018fbdefc70f0bf29b41d0 data/create/advancements/recipes/create.palettes/warped_window.json faf33c9c630eecab88bb969e3b9f7fd9e9f6ccf6 data/create/advancements/recipes/create.palettes/warped_window_pane.json +5b3447ec4802fb27f1ee9a3b1bbe1936fac48fb3 data/create/advancements/recipes/create.palettes/weathered_limestone.json ef0d351d13f7e9c633581b537c59bddc1fa4c3a4 data/create/advancements/recipes/create.palettes/weathered_limestone_bricks_from_weathered_limestone_stonecutting.json 1c931e15af3e5b5f78a0a62b8c159fdf9f0d7f3e data/create/advancements/recipes/create.palettes/weathered_limestone_bricks_slab.json bba639941526cc23570e328e0b5e2a5545667219 data/create/advancements/recipes/create.palettes/weathered_limestone_bricks_slab_from_weathered_limestone_bricks_stonecutting.json @@ -2341,7 +2350,7 @@ b77c5aecd0b6dd37a0c69431ab7a4a40fe0770eb data/create/advancements/recipes/create 8ea05c6cdb313ff395d1f21cfb40e2d939dadf20 data/create/advancements/recipes/create.palettes/weathered_limestone_cobblestone_stairs_from_weathered_limestone_cobblestone_stonecutting.json 4d838d8ceaf207a59554444d82b80c31807341bc data/create/advancements/recipes/create.palettes/weathered_limestone_cobblestone_wall.json e548127075559307b767b802f4809ed52eedd543 data/create/advancements/recipes/create.palettes/weathered_limestone_cobblestone_wall_from_weathered_limestone_cobblestone_stonecutting.json -23ba836640a4d543db6f1cb72cc86a6543fe2fbe data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json +efab7b7f3829998a91fc506e4be3b6345f5ca168 data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json 9790a16fd56e47cb5abbfad4062672303c224d9f data/create/advancements/recipes/create.palettes/weathered_limestone_pillar_from_weathered_limestone_stonecutting.json e00155bcd00f50750e2cc4d6aa30c2f2d6e62922 data/create/advancements/recipes/decorations/smelting/glass_pane_from_framed_glass_pane.json bf9131527df4ad259b5a509753ba66417d764da2 data/create/advancements/recipes/decorations/smelting/glass_pane_from_horizontal_framed_glass_pane.json @@ -2448,7 +2457,7 @@ d370ee874b5b6b98e9a8c368218fe61f644d956d data/create/loot_tables/blocks/cuckoo_c fe24fd296812fea3f838defa2ca6270523d9d48e data/create/loot_tables/blocks/cyan_valve_handle.json fd309e1d39dcbcb25c3361edecd8c9afa0f847d0 data/create/loot_tables/blocks/dark_oak_window.json 58e6307ba0efa65a0715662a391fe7dc6fba0c68 data/create/loot_tables/blocks/dark_oak_window_pane.json -7a40002e4c05f6456b52558b9ee9607cfc868a69 data/create/loot_tables/blocks/dark_scoria.json +6769787b0c7a8d2762bae1c4826275bde8647b4e data/create/loot_tables/blocks/dark_scoria.json 502160551afd210c68582a1dfd41a2df720f53a1 data/create/loot_tables/blocks/dark_scoria_bricks.json d37adba01cd1220e265dbdc025b3f8d01b992289 data/create/loot_tables/blocks/dark_scoria_bricks_slab.json 265bb133af68497d9b4ba4bd418a198506caa45b data/create/loot_tables/blocks/dark_scoria_bricks_stairs.json @@ -2469,7 +2478,7 @@ bdaba62199f7a65e1149b742aaaf0c23a1e149b0 data/create/loot_tables/blocks/diorite_ 5141eec8eebed0feec906618dd3474ea402fbf28 data/create/loot_tables/blocks/diorite_cobblestone_stairs.json f3c963cfd51069876140373f410e868706744e9b data/create/loot_tables/blocks/diorite_cobblestone_wall.json fdcf47cddebca81730ac122925b01daeddf9233d data/create/loot_tables/blocks/diorite_pillar.json -7aa075c7fbe97447422bfcb95afb3bbe3b26301c data/create/loot_tables/blocks/dolomite.json +0be81285de44699dabb2c1e046ae109b2e39a4e9 data/create/loot_tables/blocks/dolomite.json 7ecdbfa3ebfc6865833bafed06ed7cd6eef58345 data/create/loot_tables/blocks/dolomite_bricks.json ecc855c3ce298855038eb7b53137cab519bca55a data/create/loot_tables/blocks/dolomite_bricks_slab.json 699815e110c76bcb793efdfedcb8ac3a5b9b7131 data/create/loot_tables/blocks/dolomite_bricks_stairs.json @@ -2525,7 +2534,7 @@ f37526c092c645045c22674dea6c7b1ec503c9c3 data/create/loot_tables/blocks/flywheel ce0bb978b11935bc2d1218445f8ab18099af6b8a data/create/loot_tables/blocks/framed_glass.json 89bd90ecd7a1ce1f75bd873989cc58a84c8dcef9 data/create/loot_tables/blocks/framed_glass_pane.json 4063880eda871fe63a4eb549a19daecabce849e5 data/create/loot_tables/blocks/furnace_engine.json -1070cba1c0f46cf7ebe31089f35333f5eadda6e4 data/create/loot_tables/blocks/gabbro.json +88b3438e50322b731cdd8589e36a9ea497cfe56e data/create/loot_tables/blocks/gabbro.json 0356e003d8890d31b89d0ad98e32aae892da71f9 data/create/loot_tables/blocks/gabbro_bricks.json bd93e42ebca985b8aeeaf0ea5fb736d496183615 data/create/loot_tables/blocks/gabbro_bricks_slab.json e51893e1601c470da466b35b17251238e15d0361 data/create/loot_tables/blocks/gabbro_bricks_stairs.json @@ -2582,7 +2591,7 @@ b403848d3a4b4ad7a048e70c21e200e40d0c67e3 data/create/loot_tables/blocks/light_bl 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 -9d585f677a32a2336df5f17b5b389cdee867939f data/create/loot_tables/blocks/limestone.json +d476eed7b5f0c7438d2e517fc60cd23f19234056 data/create/loot_tables/blocks/limestone.json 57134f7d3d32fc1c48f2a20c4be84388587092bc data/create/loot_tables/blocks/limestone_bricks.json 1b59a36aa1a889c42d4b8b939f5eeee2967222d0 data/create/loot_tables/blocks/limestone_bricks_slab.json 41ed1d0750e8ddd7e7e75fd7e4cafde6346d1afe data/create/loot_tables/blocks/limestone_bricks_stairs.json @@ -2728,7 +2737,7 @@ aa6af37356d65105efab2503ffe75f778cfe873b data/create/loot_tables/blocks/rotation 30de11bec82606fead9d6bff7bba0232e97f1039 data/create/loot_tables/blocks/sail_frame.json 069701cb804b6522c18624a0d4f3f949ff8b0281 data/create/loot_tables/blocks/schematic_table.json a2b172dc749176d4df34729007019605fc6dd150 data/create/loot_tables/blocks/schematicannon.json -af1bbbb8236b4ab05a6a8edc6db960bc758cbdf3 data/create/loot_tables/blocks/scoria.json +5c1bd2b940fa04ab487155ca10c551dd9b0fbf37 data/create/loot_tables/blocks/scoria.json bb670ac5dd2fa4c743bc268cd0547926eb6cdb68 data/create/loot_tables/blocks/scoria_bricks.json a7217ea301a282d0ef52f2d8c06dd8683398408d data/create/loot_tables/blocks/scoria_bricks_slab.json 58a188f3ebfeb3d19323c3f8dfa3e020a7f6cdc4 data/create/loot_tables/blocks/scoria_bricks_stairs.json @@ -2760,7 +2769,7 @@ d0156602dd5f4a274c293df67e19374820c72890 data/create/loot_tables/blocks/vertical 1afc5ede08e72221e33910603fa7acd0b3c7a2ee data/create/loot_tables/blocks/warped_window.json f334fd2b9a92b0646674239e7e34e142fe2c5fad data/create/loot_tables/blocks/warped_window_pane.json 2883c63ceb1273009dbf91cb0693756cadf79a1a data/create/loot_tables/blocks/water_wheel.json -611d6195db52c074de484ec52d7ac9eb96b4ff10 data/create/loot_tables/blocks/weathered_limestone.json +6cbc693f915f409bc21c6084a4f75071bd660f7b data/create/loot_tables/blocks/weathered_limestone.json c1f379baad36a20fc767be094db10480a0378184 data/create/loot_tables/blocks/weathered_limestone_bricks.json 43be7e49b9a8a75077066aa824a0f784aa741683 data/create/loot_tables/blocks/weathered_limestone_bricks_slab.json c2a62f12680d04ed4f586c501bb026e367243dd2 data/create/loot_tables/blocks/weathered_limestone_bricks_stairs.json @@ -2783,6 +2792,7 @@ e3969f1c5966c4992b3280a06e1d6c5000c37df5 data/create/loot_tables/blocks/weighted 37248ca92d474e440b91c27e3c8e78e568328100 data/create/loot_tables/blocks/zinc_ore.json b65bac8bc2fbfd476040c1aab1c0588b8bd59ebe data/create/recipes/acacia_window.json 35b4da9c14da60584c32e959efc2223f64bb3ec2 data/create/recipes/acacia_window_pane.json +57fc55848415db3e9b74e2cc2f6dacfb1b13a6cc data/create/recipes/andesite.json 96bb0bceb7798c96d5cf9b9c24b8ef822080cb1e data/create/recipes/andesite_bricks_from_andesite_stonecutting.json 01867b07039615dc69bad1b9fd217a1d86e69062 data/create/recipes/andesite_bricks_slab.json 376ada0e08cc797c705c22ec35fe54baa5f24efe data/create/recipes/andesite_bricks_slab_from_andesite_bricks_stonecutting.json @@ -3103,6 +3113,7 @@ a022f2d541f04a9e2bed6b72af4e74703076fcbe data/create/recipes/cutting/warped_hyph 1bd01df5540df7db06afde28a3f9ebe4d25e4001 data/create/recipes/cutting/warped_stem.json f2c317e03ac4d42fb631e1625607061e10c480fe data/create/recipes/dark_oak_window.json d9dbae6e237eb38e53a619a0f1b339fca7c59b4d data/create/recipes/dark_oak_window_pane.json +2ff8ac7eaabef52dcb173d7af388c28307559aaa data/create/recipes/dark_scoria.json 55596a590962e3ddd40949917661f0bd94408274 data/create/recipes/dark_scoria_bricks_from_dark_scoria_stonecutting.json 2489fc29c47d3c9cb63f5f2f09dc79ea1ca1728e data/create/recipes/dark_scoria_bricks_slab.json 86f4d54ebcc5bc8786c72167395d8efee833744c data/create/recipes/dark_scoria_bricks_slab_from_dark_scoria_bricks_stonecutting.json @@ -3119,6 +3130,7 @@ f3a72b45daef00035ecb17b9cd7f8985a5f9e9ef data/create/recipes/dark_scoria_cobbles 0f2c14d40ed9013d45e331000ea03d39430f9d22 data/create/recipes/dark_scoria_cobblestone_wall_from_dark_scoria_cobblestone_stonecutting.json 31b7e65165cb0dbcd95362a81905b19fe4282cf3 data/create/recipes/dark_scoria_pillar.json 681f45f03b15dc1a8a72cf72042e725d3f0cc7ef data/create/recipes/dark_scoria_pillar_from_dark_scoria_stonecutting.json +0871ced2a434838e2db8f3df85af84b0cb4e40ad data/create/recipes/diorite.json 25c0fe29d1c2cedcaf21fac6cdfcce45dbf810bf data/create/recipes/diorite_bricks_from_diorite_stonecutting.json ff4a8687bdff339a10e0b813788bca272332abd9 data/create/recipes/diorite_bricks_slab.json 7c49a389f9222fdfd6653d9fbcb1ca05bf207aa8 data/create/recipes/diorite_bricks_slab_from_diorite_bricks_stonecutting.json @@ -3135,6 +3147,7 @@ f764471aab017775e0d7a6d43a9e36b186db3ac2 data/create/recipes/diorite_cobblestone d3628d5ce836d3b9072be3d4cf30416146cccad2 data/create/recipes/diorite_cobblestone_wall_from_diorite_cobblestone_stonecutting.json d69d767a77ae62f8e53342dffda4c627906439d7 data/create/recipes/diorite_pillar.json 3019172274fdfcc606ad0f5569db433913231c28 data/create/recipes/diorite_pillar_from_diorite_stonecutting.json +2f1bf27611c640ec454be0e73ed75f596a4f1add data/create/recipes/dolomite.json 6ee0f10522f4acfe554e4743fa2ba1d8297a12f2 data/create/recipes/dolomite_bricks_from_dolomite_stonecutting.json 88a9b8e89e67455a9c4f1c3dbff813a3c3bd1609 data/create/recipes/dolomite_bricks_slab.json 3adfb9924ada35d58275533425802b4829f058ac data/create/recipes/dolomite_bricks_slab_from_dolomite_bricks_stonecutting.json @@ -3230,6 +3243,7 @@ c83e77a9799b6ca34dd73aa76b56159f2103c48c data/create/recipes/filling/milk_bucket fb8e4378cd2240644a4b5c0d06e27ad772ec7695 data/create/recipes/filling/sweet_roll.json 5b8bbde7f8b270ab75fac18d6858f2fadbc0efa3 data/create/recipes/framed_glass_from_glass_colorless_stonecutting.json d697de0c9b706ca4e18da7a2d769e7e5fe8d769d data/create/recipes/framed_glass_pane.json +147e7a160b82c8128f8fa7c3c6e7f7d652b89a36 data/create/recipes/gabbro.json a0dae50faaa1b7142bb4309675e3084c68daa547 data/create/recipes/gabbro_bricks_from_gabbro_stonecutting.json a19f047fa8507e994eb026795c86bc10ff5c373b data/create/recipes/gabbro_bricks_slab.json 84d83643f7987864eca0e2ca7cda4330ad9f1f86 data/create/recipes/gabbro_bricks_slab_from_gabbro_bricks_stonecutting.json @@ -3246,6 +3260,7 @@ f7407fd04cfe7558d53c44cb33dfd8ff8a736ae3 data/create/recipes/gabbro_cobblestone_ 8171880f4374f9102949b85e9a17e0b313caf3a6 data/create/recipes/gabbro_cobblestone_wall_from_gabbro_cobblestone_stonecutting.json 6e52667c2f9ec62a95ba27676fdc07a8222f1746 data/create/recipes/gabbro_pillar.json da3743119130ef0946b05b21a84c2fe5926dccd5 data/create/recipes/gabbro_pillar_from_gabbro_stonecutting.json +dc21523e591068eb5df7b287c9eef7b773b7d5d0 data/create/recipes/granite.json 5664bad03fce4a4724e8fd21c9c02ca6ae900df9 data/create/recipes/granite_bricks_from_granite_stonecutting.json 1c5265828318670a11bd1e439b6a6005edb37487 data/create/recipes/granite_bricks_slab.json 0f460bda24ff799a9ef948933cfb50ef038739d4 data/create/recipes/granite_bricks_slab_from_granite_bricks_stonecutting.json @@ -3275,6 +3290,7 @@ b49c314e171f31a39f38aabad767d8d3be613602 data/create/recipes/layered_gabbro_from 9712031277020c39e8e643690a6a968c5e275a75 data/create/recipes/layered_limestone_from_limestone_stonecutting.json fdfbe941eb56a98c3d28639154b7bcd4dcc66dfa data/create/recipes/layered_scoria_from_scoria_stonecutting.json cc070e83594b20cf697aa5dbb8c4e09dbf576d00 data/create/recipes/layered_weathered_limestone_from_weathered_limestone_stonecutting.json +90253fc317a2551c50da7693df4a60e8543d2d64 data/create/recipes/limestone.json 3b43347da62a69c6e76e6a0261f840f46ff90038 data/create/recipes/limestone_bricks_from_limestone_stonecutting.json aed4b037af6921e9337213dc09a215ab7a18adde data/create/recipes/limestone_bricks_slab.json 7222e1f13c6aec69ea37c84b4aca3e2322ef00d2 data/create/recipes/limestone_bricks_slab_from_limestone_bricks_stonecutting.json @@ -3444,7 +3460,7 @@ f2a140cbaddefd387fd94f0ce94df763a585dd4f data/create/recipes/paved_weathered_lim 9f02f552173ae1c85750bb16aa6bbbfb87a5a7f1 data/create/recipes/paved_weathered_limestone_stairs_from_paved_weathered_limestone_stonecutting.json cc4a5a893b10ffdfcc10085323d89d34a1b8f122 data/create/recipes/paved_weathered_limestone_wall.json d996f6505433a74cd8bdab04c0e0bac1b9a2da16 data/create/recipes/paved_weathered_limestone_wall_from_paved_weathered_limestone_stonecutting.json -c83e29f260eee9844c85995d45bedef6100cb91d data/create/recipes/polished_dark_scoria.json +c32e1418b17011c8c423d44ee20f2b86e82e7626 data/create/recipes/polished_dark_scoria.json 753c85bfb84a5d31f9670478042321702a589dc8 data/create/recipes/polished_dark_scoria_from_dark_scoria_stonecutting.json d3c78c504672fec3316b206505c2cb5fc8daf822 data/create/recipes/polished_dark_scoria_slab.json bcc5a7325b7f7110e6b382e7ad60fc547222d3ad data/create/recipes/polished_dark_scoria_slab_from_polished_dark_scoria_stonecutting.json @@ -3452,7 +3468,7 @@ c7d7e5f39099a71482cdfbebe1ef2dfd508ae768 data/create/recipes/polished_dark_scori 364d77f01b380bbb0036810f6e0df09773ea8e1c data/create/recipes/polished_dark_scoria_stairs_from_polished_dark_scoria_stonecutting.json 396b6c97b5e7f608b293dee51be97717c3430bc4 data/create/recipes/polished_dark_scoria_wall.json 62b0769e0208831db822f6d2b986fff6aee60729 data/create/recipes/polished_dark_scoria_wall_from_polished_dark_scoria_stonecutting.json -53930b3b32b076c9786e5c61d8cc7fe70a47fed7 data/create/recipes/polished_dolomite.json +a1561acc26948db5cffc041d85b1d26204754caf data/create/recipes/polished_dolomite.json da91fd1ccaac64f7ef9737f3c773490d0c0b10d1 data/create/recipes/polished_dolomite_from_dolomite_stonecutting.json 75288e75b604eacfbc19cb51cb4d4759bdeaafa5 data/create/recipes/polished_dolomite_slab.json 9a89eaf5f00d8fb10297de61248f8d11dded8c4b data/create/recipes/polished_dolomite_slab_from_polished_dolomite_stonecutting.json @@ -3460,7 +3476,7 @@ da91fd1ccaac64f7ef9737f3c773490d0c0b10d1 data/create/recipes/polished_dolomite_f e2dce404e4bcde076615ed0d0cf6fab769d441d5 data/create/recipes/polished_dolomite_stairs_from_polished_dolomite_stonecutting.json 8f2f4643886d166609b198704dcadb5e87b6323e data/create/recipes/polished_dolomite_wall.json 3b5d553e408a8b6385932e2a8082fcb5bdead0d1 data/create/recipes/polished_dolomite_wall_from_polished_dolomite_stonecutting.json -d9d2b6f6f4c8223c4cfc6258ba9013463691d88c data/create/recipes/polished_gabbro.json +5873547a8561849a73c0d2cca3faba3e8b65b33d data/create/recipes/polished_gabbro.json ba3e1444b9d1804411cc9c7536c657806dc37c1d data/create/recipes/polished_gabbro_from_gabbro_stonecutting.json b7d29a29fde4868b4ceef1437e5d00975068bc58 data/create/recipes/polished_gabbro_slab.json f7a62c1edc74e54fc0c747f23d7da182d49ef7b6 data/create/recipes/polished_gabbro_slab_from_polished_gabbro_stonecutting.json @@ -3468,7 +3484,7 @@ f7a62c1edc74e54fc0c747f23d7da182d49ef7b6 data/create/recipes/polished_gabbro_sla 7df6fd466badaa3cef5e2ad0e78bbb3b6429805e data/create/recipes/polished_gabbro_stairs_from_polished_gabbro_stonecutting.json ec70334e13e05cff7e04e7dc6b23be273c235e50 data/create/recipes/polished_gabbro_wall.json 5176a8fe5a48592c7b487518a57c962c24e3e751 data/create/recipes/polished_gabbro_wall_from_polished_gabbro_stonecutting.json -bb7d651a6c79bd97390c7b1743c4fe58c9973c39 data/create/recipes/polished_limestone.json +59a01eb264c302fe455639bcafa4afb97de2379e data/create/recipes/polished_limestone.json 0e88c98c9ef0d15523b23b00f8afde71d9d8e3e9 data/create/recipes/polished_limestone_from_limestone_stonecutting.json 135fd40e291c7cfdc73c14496654008da9dd797d data/create/recipes/polished_limestone_slab.json 4ce225832ab45daf6b5bc013c6f8762fdbe9ff0f data/create/recipes/polished_limestone_slab_from_polished_limestone_stonecutting.json @@ -3476,7 +3492,7 @@ fee3d0ec8d4f27d82acd5d0e3a2a142900e18be3 data/create/recipes/polished_limestone_ 6780c8bd8747ebb6db7e0adfc486ce00e7e2cf26 data/create/recipes/polished_limestone_stairs_from_polished_limestone_stonecutting.json 44b1f3873fe8150abbacab10ff3cc2033a01b4a0 data/create/recipes/polished_limestone_wall.json d68a27e463d31ba5eed19181c0335824601b9e68 data/create/recipes/polished_limestone_wall_from_polished_limestone_stonecutting.json -300b9c979ac848fb6ae69eeb6e89c9e22056c562 data/create/recipes/polished_scoria.json +82b5b5fc1d2f789b48a48a7dc846aeb505b0c3c1 data/create/recipes/polished_scoria.json 9d6926822ea6f2bb38ba55204278fe82fd453d16 data/create/recipes/polished_scoria_from_scoria_stonecutting.json 814efd67d3f061d0c0ba104993c868e075a4fd3e data/create/recipes/polished_scoria_slab.json 8696f262927ae55ce72af1a34cae68fd6ccc4050 data/create/recipes/polished_scoria_slab_from_polished_scoria_stonecutting.json @@ -3484,7 +3500,7 @@ efe648aa4fd0f22faa78c016dbe2d083462e1ad6 data/create/recipes/polished_scoria_sta ba6dd9ad0c69b088c1a9e33000bd5b9bcedb0ca0 data/create/recipes/polished_scoria_stairs_from_polished_scoria_stonecutting.json 8319042a131a9dcabae016009b807b91c491f8d3 data/create/recipes/polished_scoria_wall.json bc9a83e7793768723031ff14269e43c83687b9f3 data/create/recipes/polished_scoria_wall_from_polished_scoria_stonecutting.json -31a0826653da3e752da8507a46b16dc17334693b data/create/recipes/polished_weathered_limestone.json +d9d188d55d9bb94bceaad8de3ccb02532b021576 data/create/recipes/polished_weathered_limestone.json 73b468de08f3e0542b7020129faff3a40b3fee67 data/create/recipes/polished_weathered_limestone_from_weathered_limestone_stonecutting.json c0924d72a856c3182b89996a6ceaffd56930c455 data/create/recipes/polished_weathered_limestone_slab.json 1f5503d22859a08eef824d33f6ed48335f66c423 data/create/recipes/polished_weathered_limestone_slab_from_polished_weathered_limestone_stonecutting.json @@ -3500,6 +3516,7 @@ a104ef6eb8872a40ea7b2ef67ae54cec943162f0 data/create/recipes/pressing/iron_ingot 654e274b07af172c22838d47e0974367c20101d4 data/create/recipes/pressing/path.json bd57ccc8eb4357b4a5af021db7b806b514cd2558 data/create/recipes/pressing/sugar_cane.json 141173778757d87e7f2e9466bdab6ff1263c8e98 data/create/recipes/sandpaper_polishing/rose_quartz.json +5ab9c8271a9e1d4a863940aeafd1f8816cb37a29 data/create/recipes/scoria.json d59c68621c78ff5d2c51be4440dea603480efed8 data/create/recipes/scoria_bricks_from_scoria_stonecutting.json a7a28cf77955c2b4ed3687205dd24162e461aa30 data/create/recipes/scoria_bricks_slab.json 0577ffde98e7a027b21c430cd71cdafdd3cee3a3 data/create/recipes/scoria_bricks_slab_from_scoria_bricks_stonecutting.json @@ -3630,6 +3647,7 @@ e2c1774577aeb0756fb1d092245d9d77e40ba5f8 data/create/recipes/splashing/yellow_co dc6093427210bd7034a0e2184f6a1630c7b33b3e data/create/recipes/vertical_framed_glass_pane.json 40ec72d571002206c276aec5de72459155e043ce data/create/recipes/warped_window.json 8f4b0a3cfb0073f1414bf18c0d4e5e751c4a9185 data/create/recipes/warped_window_pane.json +e483f41ab4e959bda4d88c23817913843d0fbef6 data/create/recipes/weathered_limestone.json f75f25d3259dd51c29bee6ada2a4540a7a2bbeab data/create/recipes/weathered_limestone_bricks_from_weathered_limestone_stonecutting.json f58ef5eb552fc7dcd89f30aa4231286ecef5e00a data/create/recipes/weathered_limestone_bricks_slab.json ca9b163b3aaa526d6c3b070c2a7e50a56a38c6f4 data/create/recipes/weathered_limestone_bricks_slab_from_weathered_limestone_bricks_stonecutting.json diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/andesite.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/andesite.json new file mode 100644 index 000000000..344f964cc --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/andesite.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:andesite" + ] + }, + "criteria": { + "has_andesite_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:andesite" + } + } + }, + "requirements": [ + [ + "has_andesite_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/diorite.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/diorite.json new file mode 100644 index 000000000..df09f4529 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/diorite.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:diorite" + ] + }, + "criteria": { + "has_diorite_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:diorite_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:diorite" + } + } + }, + "requirements": [ + [ + "has_diorite_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/building_blocks/granite.json b/src/generated/resources/data/create/advancements/recipes/building_blocks/granite.json new file mode 100644 index 000000000..f0a2adf3f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/building_blocks/granite.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:granite" + ] + }, + "criteria": { + "has_granite_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:granite_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:granite" + } + } + }, + "requirements": [ + [ + "has_granite_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/andesite_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/andesite_pillar.json index f8b57edb6..7c9df9388 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/andesite_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/andesite_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_andesite": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_andesite", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria.json new file mode 100644 index 000000000..48a14dd4b --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:dark_scoria" + ] + }, + "criteria": { + "has_dark_scoria_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:dark_scoria_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:dark_scoria" + } + } + }, + "requirements": [ + [ + "has_dark_scoria_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria_pillar.json index 351c3e02c..dc1bc8e5e 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/dark_scoria_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_dark_scoria": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_dark_scoria", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/diorite_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/diorite_pillar.json index fea456f6c..846e74a19 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/diorite_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/diorite_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_diorite": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_diorite", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite.json new file mode 100644 index 000000000..2ee623acf --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:dolomite" + ] + }, + "criteria": { + "has_dolomite_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:dolomite_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:dolomite" + } + } + }, + "requirements": [ + [ + "has_dolomite_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite_pillar.json index ec49ae69a..d82162c4d 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/dolomite_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_dolomite": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_dolomite", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro.json new file mode 100644 index 000000000..85c5c99b3 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:gabbro" + ] + }, + "criteria": { + "has_gabbro_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:gabbro_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:gabbro" + } + } + }, + "requirements": [ + [ + "has_gabbro_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro_pillar.json index f6ec9691f..d33f4e3f3 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/gabbro_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_gabbro": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_gabbro", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/granite_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/granite_pillar.json index 38443374f..884b1e38c 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/granite_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/granite_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_granite": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_granite", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone.json new file mode 100644 index 000000000..1b38ab26f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:limestone" + ] + }, + "criteria": { + "has_limestone_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:limestone_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:limestone" + } + } + }, + "requirements": [ + [ + "has_limestone_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone_pillar.json index 8150f5a59..2690c0cfc 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/limestone_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_limestone": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_limestone", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria.json new file mode 100644 index 000000000..fc94ffc6f --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:scoria" + ] + }, + "criteria": { + "has_scoria_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:scoria_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:scoria" + } + } + }, + "requirements": [ + [ + "has_scoria_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria_pillar.json index 7d8e33863..e21ba1a34 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/scoria_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_scoria": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_scoria", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone.json new file mode 100644 index 000000000..2b7672332 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:weathered_limestone" + ] + }, + "criteria": { + "has_weathered_limestone_cobblestone": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:weathered_limestone_cobblestone" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:weathered_limestone" + } + } + }, + "requirements": [ + [ + "has_weathered_limestone_cobblestone", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json b/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json index e9b129e93..6acc03c00 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json +++ b/src/generated/resources/data/create/advancements/recipes/create.palettes/weathered_limestone_pillar.json @@ -6,7 +6,7 @@ ] }, "criteria": { - "has_ingredient": { + "has_weathered_limestone": { "trigger": "minecraft:inventory_changed", "conditions": { "items": [ @@ -25,7 +25,7 @@ }, "requirements": [ [ - "has_ingredient", + "has_weathered_limestone", "has_the_recipe" ] ] diff --git a/src/generated/resources/data/create/loot_tables/blocks/dark_scoria.json b/src/generated/resources/data/create/loot_tables/blocks/dark_scoria.json index c26589bf5..912caa5f7 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/dark_scoria.json +++ b/src/generated/resources/data/create/loot_tables/blocks/dark_scoria.json @@ -5,13 +5,37 @@ "rolls": 1, "entries": [ { - "type": "minecraft:item", - "name": "create:dark_scoria" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "create:dark_scoria" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "name": "create:dark_scoria_cobblestone" + } + ] } ] } diff --git a/src/generated/resources/data/create/loot_tables/blocks/dolomite.json b/src/generated/resources/data/create/loot_tables/blocks/dolomite.json index d97bb3322..4085d60be 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/dolomite.json +++ b/src/generated/resources/data/create/loot_tables/blocks/dolomite.json @@ -5,13 +5,37 @@ "rolls": 1, "entries": [ { - "type": "minecraft:item", - "name": "create:dolomite" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "create:dolomite" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "name": "create:dolomite_cobblestone" + } + ] } ] } diff --git a/src/generated/resources/data/create/loot_tables/blocks/gabbro.json b/src/generated/resources/data/create/loot_tables/blocks/gabbro.json index 8446b845e..2f477a53e 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/gabbro.json +++ b/src/generated/resources/data/create/loot_tables/blocks/gabbro.json @@ -5,13 +5,37 @@ "rolls": 1, "entries": [ { - "type": "minecraft:item", - "name": "create:gabbro" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "create:gabbro" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "name": "create:gabbro_cobblestone" + } + ] } ] } diff --git a/src/generated/resources/data/create/loot_tables/blocks/limestone.json b/src/generated/resources/data/create/loot_tables/blocks/limestone.json index acec889d0..e5b513a61 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/limestone.json +++ b/src/generated/resources/data/create/loot_tables/blocks/limestone.json @@ -5,13 +5,37 @@ "rolls": 1, "entries": [ { - "type": "minecraft:item", - "name": "create:limestone" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "create:limestone" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "name": "create:limestone_cobblestone" + } + ] } ] } diff --git a/src/generated/resources/data/create/loot_tables/blocks/scoria.json b/src/generated/resources/data/create/loot_tables/blocks/scoria.json index 0025a35ae..a119016fa 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/scoria.json +++ b/src/generated/resources/data/create/loot_tables/blocks/scoria.json @@ -5,13 +5,37 @@ "rolls": 1, "entries": [ { - "type": "minecraft:item", - "name": "create:scoria" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "create:scoria" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "name": "create:scoria_cobblestone" + } + ] } ] } diff --git a/src/generated/resources/data/create/loot_tables/blocks/weathered_limestone.json b/src/generated/resources/data/create/loot_tables/blocks/weathered_limestone.json index 9a11fe4be..e2f779734 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/weathered_limestone.json +++ b/src/generated/resources/data/create/loot_tables/blocks/weathered_limestone.json @@ -5,13 +5,37 @@ "rolls": 1, "entries": [ { - "type": "minecraft:item", - "name": "create:weathered_limestone" - } - ], - "conditions": [ - { - "condition": "minecraft:survives_explosion" + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "create:weathered_limestone" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "name": "create:weathered_limestone_cobblestone" + } + ] } ] } diff --git a/src/generated/resources/data/create/recipes/andesite.json b/src/generated/resources/data/create/recipes/andesite.json new file mode 100644 index 000000000..1a8a89094 --- /dev/null +++ b/src/generated/resources/data/create/recipes/andesite.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:andesite_cobblestone" + }, + "result": "minecraft:andesite", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/dark_scoria.json b/src/generated/resources/data/create/recipes/dark_scoria.json new file mode 100644 index 000000000..e8677d0a9 --- /dev/null +++ b/src/generated/resources/data/create/recipes/dark_scoria.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:dark_scoria_cobblestone" + }, + "result": "create:dark_scoria", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/diorite.json b/src/generated/resources/data/create/recipes/diorite.json new file mode 100644 index 000000000..a9dc4b737 --- /dev/null +++ b/src/generated/resources/data/create/recipes/diorite.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:diorite_cobblestone" + }, + "result": "minecraft:diorite", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/dolomite.json b/src/generated/resources/data/create/recipes/dolomite.json new file mode 100644 index 000000000..c59ecebbb --- /dev/null +++ b/src/generated/resources/data/create/recipes/dolomite.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:dolomite_cobblestone" + }, + "result": "create:dolomite", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/gabbro.json b/src/generated/resources/data/create/recipes/gabbro.json new file mode 100644 index 000000000..6d05576cb --- /dev/null +++ b/src/generated/resources/data/create/recipes/gabbro.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:gabbro_cobblestone" + }, + "result": "create:gabbro", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/granite.json b/src/generated/resources/data/create/recipes/granite.json new file mode 100644 index 000000000..2a6e30e9b --- /dev/null +++ b/src/generated/resources/data/create/recipes/granite.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:granite_cobblestone" + }, + "result": "minecraft:granite", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/limestone.json b/src/generated/resources/data/create/recipes/limestone.json new file mode 100644 index 000000000..90c360ab1 --- /dev/null +++ b/src/generated/resources/data/create/recipes/limestone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:limestone_cobblestone" + }, + "result": "create:limestone", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/polished_dark_scoria.json b/src/generated/resources/data/create/recipes/polished_dark_scoria.json index 1dcca3f52..5a9cfcde0 100644 --- a/src/generated/resources/data/create/recipes/polished_dark_scoria.json +++ b/src/generated/resources/data/create/recipes/polished_dark_scoria.json @@ -1,11 +1,11 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XX", - "XX" + "##", + "##" ], "key": { - "X": { + "#": { "item": "create:dark_scoria" } }, diff --git a/src/generated/resources/data/create/recipes/polished_dolomite.json b/src/generated/resources/data/create/recipes/polished_dolomite.json index 16fbd2463..4fcd09891 100644 --- a/src/generated/resources/data/create/recipes/polished_dolomite.json +++ b/src/generated/resources/data/create/recipes/polished_dolomite.json @@ -1,11 +1,11 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XX", - "XX" + "##", + "##" ], "key": { - "X": { + "#": { "item": "create:dolomite" } }, diff --git a/src/generated/resources/data/create/recipes/polished_gabbro.json b/src/generated/resources/data/create/recipes/polished_gabbro.json index c9fb7b71a..5c9cfe964 100644 --- a/src/generated/resources/data/create/recipes/polished_gabbro.json +++ b/src/generated/resources/data/create/recipes/polished_gabbro.json @@ -1,11 +1,11 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XX", - "XX" + "##", + "##" ], "key": { - "X": { + "#": { "item": "create:gabbro" } }, diff --git a/src/generated/resources/data/create/recipes/polished_limestone.json b/src/generated/resources/data/create/recipes/polished_limestone.json index e07df319b..13556fd93 100644 --- a/src/generated/resources/data/create/recipes/polished_limestone.json +++ b/src/generated/resources/data/create/recipes/polished_limestone.json @@ -1,11 +1,11 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XX", - "XX" + "##", + "##" ], "key": { - "X": { + "#": { "item": "create:limestone" } }, diff --git a/src/generated/resources/data/create/recipes/polished_scoria.json b/src/generated/resources/data/create/recipes/polished_scoria.json index 796ad769a..4ccbf5c05 100644 --- a/src/generated/resources/data/create/recipes/polished_scoria.json +++ b/src/generated/resources/data/create/recipes/polished_scoria.json @@ -1,11 +1,11 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XX", - "XX" + "##", + "##" ], "key": { - "X": { + "#": { "item": "create:scoria" } }, diff --git a/src/generated/resources/data/create/recipes/polished_weathered_limestone.json b/src/generated/resources/data/create/recipes/polished_weathered_limestone.json index 3d29b1740..cd0a57df5 100644 --- a/src/generated/resources/data/create/recipes/polished_weathered_limestone.json +++ b/src/generated/resources/data/create/recipes/polished_weathered_limestone.json @@ -1,11 +1,11 @@ { "type": "minecraft:crafting_shaped", "pattern": [ - "XX", - "XX" + "##", + "##" ], "key": { - "X": { + "#": { "item": "create:weathered_limestone" } }, diff --git a/src/generated/resources/data/create/recipes/scoria.json b/src/generated/resources/data/create/recipes/scoria.json new file mode 100644 index 000000000..d63cf40bf --- /dev/null +++ b/src/generated/resources/data/create/recipes/scoria.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:scoria_cobblestone" + }, + "result": "create:scoria", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/weathered_limestone.json b/src/generated/resources/data/create/recipes/weathered_limestone.json new file mode 100644 index 000000000..93ce442c8 --- /dev/null +++ b/src/generated/resources/data/create/recipes/weathered_limestone.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "create:weathered_limestone_cobblestone" + }, + "result": "create:weathered_limestone", + "experience": 0.1, + "cookingtime": 200 +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 224d852a7..1eba9a59f 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -8,8 +8,8 @@ import static com.simibubi.create.foundation.block.connected.CTSpriteShifter.CTT import java.util.IdentityHashMap; import java.util.Map; -import com.simibubi.create.content.palettes.PaletteBlockPatterns; -import com.simibubi.create.content.palettes.PaletteBlockPatterns.CTs; +import com.simibubi.create.content.palettes.PaletteBlockPattern; +import com.simibubi.create.content.palettes.PaletteBlockPattern.CTs; import com.simibubi.create.content.palettes.PaletteStoneVariants; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.block.connected.CTSpriteShifter.CTType; @@ -23,7 +23,7 @@ import net.minecraft.item.DyeColor; public class AllSpriteShifts { static final Map WOODEN_WINDOWS = new IdentityHashMap<>(); - static final Map> PALETTE_VARIANT_PATTERNS = + static final Map> PALETTE_VARIANT_PATTERNS = new IdentityHashMap<>(); public static final Map DYED_BELTS = new IdentityHashMap<>(), @@ -69,7 +69,7 @@ public class AllSpriteShifts { return WOODEN_WINDOWS.get(woodType); } - public static CTSpriteShiftEntry getVariantPattern(PaletteStoneVariants variant, PaletteBlockPatterns.CTs texture) { + public static CTSpriteShiftEntry getVariantPattern(PaletteStoneVariants variant, PaletteBlockPattern.CTs texture) { return PALETTE_VARIANT_PATTERNS.get(variant) .get(texture); } @@ -85,7 +85,7 @@ public class AllSpriteShifts { IdentityHashMap map = new IdentityHashMap<>(); PALETTE_VARIANT_PATTERNS.put(paletteStoneVariants, map); - for (PaletteBlockPatterns.CTs texture : PaletteBlockPatterns.CTs.values()) { + for (PaletteBlockPattern.CTs texture : PaletteBlockPattern.CTs.values()) { String textureName = Lang.asId(texture.name()); String target = "palettes/" + variantName + "/" + textureName; map.put(texture, getCT(texture.type, target)); diff --git a/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java b/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java index b3042abf2..b60407fe8 100644 --- a/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java +++ b/src/main/java/com/simibubi/create/content/palettes/AllPaletteBlocks.java @@ -96,13 +96,13 @@ public class AllPaletteBlocks { // Vanilla stone variant patterns public static final PalettesVariantEntry GRANITE_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.GRANITE, PaletteBlockPatterns.vanillaRange, () -> Blocks.GRANITE); + new PalettesVariantEntry(PaletteStoneVariants.GRANITE, PaletteBlockPattern.VANILLA_RANGE, () -> Blocks.GRANITE); public static final PalettesVariantEntry DIORITE_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.DIORITE, PaletteBlockPatterns.vanillaRange, () -> Blocks.DIORITE); + new PalettesVariantEntry(PaletteStoneVariants.DIORITE, PaletteBlockPattern.VANILLA_RANGE, () -> Blocks.DIORITE); public static final PalettesVariantEntry ANDESITE_VARIANTS = new PalettesVariantEntry(PaletteStoneVariants.ANDESITE, - PaletteBlockPatterns.vanillaRange, () -> Blocks.ANDESITE); + PaletteBlockPattern.VANILLA_RANGE, () -> Blocks.ANDESITE); // Create stone variants @@ -115,37 +115,42 @@ public class AllPaletteBlocks { public static final BlockEntry LIMESTONE = REGISTRATE.baseBlock("limestone", Block::new, () -> Blocks.SANDSTONE, true) .tag(BlockTags.BASE_STONE_OVERWORLD) + .loot(cobblestoneLoot(PaletteStoneVariants.LIMESTONE)) .register(); public static final PalettesVariantEntry LIMESTONE_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.LIMESTONE, PaletteBlockPatterns.standardRange, LIMESTONE); + new PalettesVariantEntry(PaletteStoneVariants.LIMESTONE, PaletteBlockPattern.STANDARD_RANGE, LIMESTONE); public static final BlockEntry WEATHERED_LIMESTONE = REGISTRATE.baseBlock("weathered_limestone", Block::new, () -> Blocks.SANDSTONE, true) .tag(BlockTags.BASE_STONE_OVERWORLD) + .loot(cobblestoneLoot(PaletteStoneVariants.WEATHERED_LIMESTONE)) .register(); public static final PalettesVariantEntry WEATHERED_LIMESTONE_VARIANTS = new PalettesVariantEntry( - PaletteStoneVariants.WEATHERED_LIMESTONE, PaletteBlockPatterns.standardRange, WEATHERED_LIMESTONE); + PaletteStoneVariants.WEATHERED_LIMESTONE, PaletteBlockPattern.STANDARD_RANGE, WEATHERED_LIMESTONE); public static final BlockEntry DOLOMITE = REGISTRATE.baseBlock("dolomite", Block::new, () -> Blocks.QUARTZ_BLOCK, true) .tag(BlockTags.BASE_STONE_OVERWORLD) + .loot(cobblestoneLoot(PaletteStoneVariants.DOLOMITE)) .register(); public static final PalettesVariantEntry DOLOMITE_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.DOLOMITE, PaletteBlockPatterns.standardRange, DOLOMITE); + new PalettesVariantEntry(PaletteStoneVariants.DOLOMITE, PaletteBlockPattern.STANDARD_RANGE, DOLOMITE); public static final BlockEntry GABBRO = REGISTRATE.baseBlock("gabbro", Block::new, () -> Blocks.ANDESITE, true) .tag(BlockTags.BASE_STONE_OVERWORLD) + .loot(cobblestoneLoot(PaletteStoneVariants.GABBRO)) .register(); public static final PalettesVariantEntry GABBRO_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.GABBRO, PaletteBlockPatterns.standardRange, GABBRO); + new PalettesVariantEntry(PaletteStoneVariants.GABBRO, PaletteBlockPattern.STANDARD_RANGE, GABBRO); public static final BlockEntry SCORIA = REGISTRATE.baseBlock("scoria", Block::new, () -> Blocks.ANDESITE, true) + .loot(cobblestoneLoot(PaletteStoneVariants.SCORIA)) .register(); public static final BlockEntry NATURAL_SCORIA = REGISTRATE.block("natural_scoria", Block::new) @@ -158,18 +163,25 @@ public class AllPaletteBlocks { .register(); public static final PalettesVariantEntry SCORIA_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.SCORIA, PaletteBlockPatterns.standardRange, SCORIA); + new PalettesVariantEntry(PaletteStoneVariants.SCORIA, PaletteBlockPattern.STANDARD_RANGE, SCORIA); public static final BlockEntry DARK_SCORIA = REGISTRATE.baseBlock("dark_scoria", Block::new, () -> Blocks.ANDESITE, false) + .loot(cobblestoneLoot(PaletteStoneVariants.DARK_SCORIA)) .register(); public static final PalettesVariantEntry DARK_SCORIA_VARIANTS = - new PalettesVariantEntry(PaletteStoneVariants.DARK_SCORIA, PaletteBlockPatterns.standardRange, DARK_SCORIA); + new PalettesVariantEntry(PaletteStoneVariants.DARK_SCORIA, PaletteBlockPattern.STANDARD_RANGE, DARK_SCORIA); - public static void register() {} + private static NonNullBiConsumer cobblestoneLoot(PaletteStoneVariants variant) { + return (loot, block) -> loot.registerLootTable(block, RegistrateBlockLootTables.droppingWithSilkTouch(block, + variant.getVariants().registeredBlocks.get(0).get())); + } private static NonNullBiConsumer, RegistrateBlockstateProvider> palettesCubeAll() { return (c, p) -> BlockStateGen.cubeAll(c, p, "palettes/"); } + + public static void register() {} + } diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java index ba6ff24a4..9c79046af 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPartial.java @@ -34,8 +34,8 @@ public abstract class PaletteBlockPartial { public static final PaletteBlockPartial UNIQUE_SLAB = new Slab(true); public static final PaletteBlockPartial WALL = new Wall(); - public static final PaletteBlockPartial[] AllPartials = { STAIR, SLAB, WALL }; - public static final PaletteBlockPartial[] ForPolished = { STAIR, UNIQUE_SLAB, WALL }; + public static final PaletteBlockPartial[] ALL_PARTIALS = { STAIR, SLAB, WALL }; + public static final PaletteBlockPartial[] FOR_POLISHED = { STAIR, UNIQUE_SLAB, WALL }; private String name; @@ -43,7 +43,7 @@ public abstract class PaletteBlockPartial { this.name = name; } - public @NonnullType BlockBuilder create(String variantName, PaletteBlockPatterns pattern, + public @NonnullType BlockBuilder create(String variantName, PaletteBlockPattern pattern, Supplier block) { String patternName = pattern.createName(variantName); String blockName = patternName + "_" + this.name; @@ -57,19 +57,19 @@ public abstract class PaletteBlockPartial { .build(); } - protected ResourceLocation getMainTexture(String variantName, PaletteBlockPatterns pattern) { + protected ResourceLocation getMainTexture(String variantName, PaletteBlockPattern pattern) { return pattern.toLocation(variantName, pattern.getTextureForPartials()); } protected BlockBuilder transformBlock(BlockBuilder builder, - String variantName, PaletteBlockPatterns pattern) { + String variantName, PaletteBlockPattern pattern) { getBlockTags().forEach(builder::tag); return builder; } protected ItemBuilder> transformItem( ItemBuilder> builder, String variantName, - PaletteBlockPatterns pattern) { + PaletteBlockPattern pattern) { getItemTags().forEach(builder::tag); return builder; } @@ -84,7 +84,7 @@ public abstract class PaletteBlockPartial { RegistrateRecipeProvider p); protected abstract void generateBlockState(DataGenContext ctx, RegistrateBlockstateProvider prov, - String variantName, PaletteBlockPatterns pattern, Supplier block); + String variantName, PaletteBlockPattern pattern, Supplier block); private static class Stairs extends PaletteBlockPartial { @@ -100,7 +100,7 @@ public abstract class PaletteBlockPartial { @Override protected void generateBlockState(DataGenContext ctx, RegistrateBlockstateProvider prov, - String variantName, PaletteBlockPatterns pattern, Supplier block) { + String variantName, PaletteBlockPattern pattern, Supplier block) { prov.stairsBlock(ctx.get(), getMainTexture(variantName, pattern)); } @@ -140,7 +140,7 @@ public abstract class PaletteBlockPartial { @Override protected void generateBlockState(DataGenContext ctx, RegistrateBlockstateProvider prov, - String variantName, PaletteBlockPatterns pattern, Supplier block) { + String variantName, PaletteBlockPattern pattern, Supplier block) { String name = ctx.getName(); ResourceLocation mainTexture = getMainTexture(variantName, pattern); ResourceLocation sideTexture = @@ -185,7 +185,7 @@ public abstract class PaletteBlockPartial { @Override protected BlockBuilder transformBlock( BlockBuilder builder, - String variantName, PaletteBlockPatterns pattern) { + String variantName, PaletteBlockPattern pattern) { builder.loot((lt, block) -> lt.registerLootTable(block, RegistrateBlockLootTables.droppingSlab(block))); return super.transformBlock(builder, variantName, pattern); } @@ -206,14 +206,14 @@ public abstract class PaletteBlockPartial { @Override protected ItemBuilder> transformItem( ItemBuilder> builder, String variantName, - PaletteBlockPatterns pattern) { + PaletteBlockPattern pattern) { builder.model((c, p) -> p.wallInventory(c.getName(), getMainTexture(variantName, pattern))); return super.transformItem(builder, variantName, pattern); } @Override protected void generateBlockState(DataGenContext ctx, RegistrateBlockstateProvider prov, - String variantName, PaletteBlockPatterns pattern, Supplier block) { + String variantName, PaletteBlockPattern pattern, Supplier block) { prov.wallBlock(ctx.get(), pattern.createName(variantName), getMainTexture(variantName, pattern)); } diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java similarity index 70% rename from src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java rename to src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java index 4fa8d9b7d..16cdd6dfe 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPatterns.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteBlockPattern.java @@ -1,10 +1,10 @@ package com.simibubi.create.content.palettes; -import static com.simibubi.create.content.palettes.PaletteBlockPartial.AllPartials; -import static com.simibubi.create.content.palettes.PaletteBlockPartial.ForPolished; -import static com.simibubi.create.content.palettes.PatternNameType.Prefix; -import static com.simibubi.create.content.palettes.PatternNameType.Suffix; -import static com.simibubi.create.content.palettes.PatternNameType.Wrap; +import static com.simibubi.create.content.palettes.PaletteBlockPartial.ALL_PARTIALS; +import static com.simibubi.create.content.palettes.PaletteBlockPartial.FOR_POLISHED; +import static com.simibubi.create.content.palettes.PaletteBlockPattern.PatternNameType.PREFIX; +import static com.simibubi.create.content.palettes.PaletteBlockPattern.PatternNameType.SUFFIX; +import static com.simibubi.create.content.palettes.PaletteBlockPattern.PatternNameType.WRAP; import java.util.Optional; import java.util.function.Function; @@ -28,73 +28,83 @@ import net.minecraft.block.AbstractBlock.Properties; import net.minecraft.block.Block; import net.minecraft.block.RotatedPillarBlock; import net.minecraft.client.renderer.RenderType; +import net.minecraft.data.CookingRecipeBuilder; import net.minecraft.data.ShapedRecipeBuilder; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.model.generators.ModelFile; -public class PaletteBlockPatterns { +public class PaletteBlockPattern { - public static final PaletteBlockPatterns + public static final PaletteBlockPattern - COBBLESTONE = create("cobblestone", Suffix, AllPartials), + COBBLESTONE = create("cobblestone", SUFFIX, ALL_PARTIALS) + .addRecipes(v -> (c, p) -> { + DataIngredient ingredient = DataIngredient.items(c.get()); + Block result = v.getBaseBlock().get(); + CookingRecipeBuilder.smeltingRecipe(ingredient, result, 0.1f, 200) + .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) + .build(p, p.safeId(result)); + }), - POLISHED = create("polished", Prefix, ForPolished) - .addRecipes(v -> (c, - p) -> { + POLISHED = create("polished", PREFIX, FOR_POLISHED) + .addRecipes(v -> (c, p) -> { DataIngredient ingredient = DataIngredient.items(v.getBaseBlock().get()); - ShapedRecipeBuilder.shapedRecipe(c.get(), 4).key('X', ingredient) - .patternLine("XX").patternLine("XX") - .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)).build(p, p.safeId(c.get())); - } - ), + ShapedRecipeBuilder.shapedRecipe(c.get(), 4) + .key('#', ingredient) + .patternLine("##") + .patternLine("##") + .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) + .build(p, p.safeId(c.get())); + }), - BRICKS = create("bricks", Suffix, AllPartials), FANCY_BRICKS = create("fancy_bricks", Wrap, AllPartials), + BRICKS = create("bricks", SUFFIX, ALL_PARTIALS), FANCY_BRICKS = create("fancy_bricks", WRAP, ALL_PARTIALS), - PAVED = create("paved", Prefix, AllPartials).blockStateFactory(p -> p::paved) + PAVED = create("paved", PREFIX, ALL_PARTIALS).blockStateFactory(p -> p::paved) .block(PavedBlock::new) .textures("paved", "paved_borderless", "paved_top"), - LAYERED = create("layered", Prefix).blockStateFactory(p -> p::cubeColumn) + LAYERED = create("layered", PREFIX).blockStateFactory(p -> p::cubeColumn) .textures("layered", "polished") .connectedTextures(v -> new HorizontalCTBehaviour(ct(v, CTs.LAYERED), ct(v, CTs.POLISHED))), - CHISELED = create("chiseled", Prefix).blockStateFactory(p -> p::cubeColumn) + CHISELED = create("chiseled", PREFIX).blockStateFactory(p -> p::cubeColumn) .textures("chiseled", "chiseled_top"), - PILLAR = create("pillar", Suffix).blockStateFactory(p -> p::pillar) + PILLAR = create("pillar", SUFFIX).blockStateFactory(p -> p::pillar) .block(RotatedPillarBlock::new) .textures("pillar", "pillar_end") - .addRecipes(v -> (c, p) -> ShapedRecipeBuilder.shapedRecipe(c.get(), 2) - .key('#', v.getBaseBlock() - .get()) - .patternLine("#") - .patternLine("#") - .addCriterion("has_ingredient", p.hasItem(v.getBaseBlock() - .get())) - .build(p::accept)), + .addRecipes(v -> (c, p) -> { + DataIngredient ingredient = DataIngredient.items(v.getBaseBlock().get()); + ShapedRecipeBuilder.shapedRecipe(c.get(), 2) + .key('#', ingredient) + .patternLine("#") + .patternLine("#") + .addCriterion("has_" + p.safeName(ingredient), ingredient.getCritereon(p)) + .build(p, p.safeId(c.get())); + }), - MOSSY = create("mossy", Prefix).blockStateFactory(p -> p::cubeAllButMossy) + MOSSY = create("mossy", PREFIX).blockStateFactory(p -> p::cubeAllButMossy) .textures("bricks", "mossy") .useTranslucentLayer() .withFoliage(), - OVERGROWN = create("overgrown", Prefix).blockStateFactory(p -> p::cubeAllButMossy) + OVERGROWN = create("overgrown", PREFIX).blockStateFactory(p -> p::cubeAllButMossy) .textures("bricks", "overgrown") .useTranslucentLayer() .withFoliage() ; - public static final PaletteBlockPatterns[] vanillaRange = + public static final PaletteBlockPattern[] VANILLA_RANGE = { COBBLESTONE, BRICKS, FANCY_BRICKS, PILLAR, PAVED, LAYERED, MOSSY, OVERGROWN }; - public static final PaletteBlockPatterns[] standardRange = + public static final PaletteBlockPattern[] STANDARD_RANGE = { COBBLESTONE, POLISHED, BRICKS, FANCY_BRICKS, PILLAR, PAVED, LAYERED, CHISELED, MOSSY, OVERGROWN }; - static final String textureLocation = "block/palettes/%s/%s"; - static final String overlayLocation = "block/palettes/%s"; + static final String TEXTURE_LOCATION = "block/palettes/%s/%s"; + static final String OVERLAY_LOCATION = "block/palettes/%s"; private PatternNameType nameType; private String[] textures; @@ -111,9 +121,9 @@ public class PaletteBlockPatterns { @OnlyIn(Dist.CLIENT) private RenderType renderType; - private static PaletteBlockPatterns create(String name, PatternNameType nameType, + private static PaletteBlockPattern create(String name, PatternNameType nameType, PaletteBlockPartial... partials) { - PaletteBlockPatterns pattern = new PaletteBlockPatterns(); + PaletteBlockPattern pattern = new PaletteBlockPattern(); pattern.id = name; pattern.ctBehaviour = Optional.empty(); pattern.nameType = nameType; @@ -163,37 +173,37 @@ public class PaletteBlockPatterns { // Builder - private PaletteBlockPatterns blockStateFactory(IPatternBlockStateGenerator factory) { + private PaletteBlockPattern blockStateFactory(IPatternBlockStateGenerator factory) { blockStateGenerator = factory; return this; } - private PaletteBlockPatterns textures(String... textures) { + private PaletteBlockPattern textures(String... textures) { this.textures = textures; return this; } - private PaletteBlockPatterns block(NonNullFunction blockFactory) { + private PaletteBlockPattern block(NonNullFunction blockFactory) { this.blockFactory = blockFactory; return this; } - private PaletteBlockPatterns useTranslucentLayer() { + private PaletteBlockPattern useTranslucentLayer() { isTranslucent = true; return this; } - private PaletteBlockPatterns withFoliage() { + private PaletteBlockPattern withFoliage() { hasFoliage = true; return this; } - private PaletteBlockPatterns connectedTextures(Function factory) { + private PaletteBlockPattern connectedTextures(Function factory) { this.ctBehaviour = Optional.of(factory); return this; } - private PaletteBlockPatterns addRecipes( + private PaletteBlockPattern addRecipes( NonNullFunction, RegistrateRecipeProvider>> func) { this.additionalRecipes = func; return this; @@ -251,7 +261,7 @@ public class PaletteBlockPatterns { // Utility protected String createName(String variant) { - if (nameType == Wrap) { + if (nameType == WRAP) { String[] split = id.split("_"); if (split.length == 2) { String formatString = "%s_%s_%s"; @@ -259,15 +269,15 @@ public class PaletteBlockPatterns { } } String formatString = "%s_%s"; - return nameType == Suffix ? String.format(formatString, variant, id) : String.format(formatString, id, variant); + return nameType == SUFFIX ? String.format(formatString, variant, id) : String.format(formatString, id, variant); } protected ResourceLocation toLocation(String variant, String texture) { - return Create.asResource(String.format(textureLocation, variant, texture)); + return Create.asResource(String.format(TEXTURE_LOCATION, variant, texture)); } protected ResourceLocation toOverlayLocation(String texture) { - return Create.asResource(String.format(overlayLocation, texture)); + return Create.asResource(String.format(OVERLAY_LOCATION, texture)); } protected static CTSpriteShiftEntry ct(PaletteStoneVariants variant, CTs texture) { @@ -276,7 +286,7 @@ public class PaletteBlockPatterns { @FunctionalInterface static interface IPatternBlockStateGenerator - extends Function> { + extends Function> { } @FunctionalInterface @@ -284,6 +294,10 @@ public class PaletteBlockPatterns { extends NonNullBiConsumer, RegistrateBlockstateProvider> { } + enum PatternNameType { + PREFIX, SUFFIX, WRAP + } + // Textures with connectability, used by Spriteshifter public static enum CTs { diff --git a/src/main/java/com/simibubi/create/content/palettes/PaletteStoneVariants.java b/src/main/java/com/simibubi/create/content/palettes/PaletteStoneVariants.java index ac43b64e9..f15d019f3 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PaletteStoneVariants.java +++ b/src/main/java/com/simibubi/create/content/palettes/PaletteStoneVariants.java @@ -7,26 +7,32 @@ import net.minecraft.block.Blocks; public enum PaletteStoneVariants { - GRANITE(() -> () -> Blocks.GRANITE), - DIORITE(() -> () -> Blocks.DIORITE), - ANDESITE(() -> () -> Blocks.ANDESITE), - LIMESTONE(() -> AllPaletteBlocks.LIMESTONE), - WEATHERED_LIMESTONE(() -> AllPaletteBlocks.WEATHERED_LIMESTONE), - DOLOMITE(() -> AllPaletteBlocks.DOLOMITE), - GABBRO(() -> AllPaletteBlocks.GABBRO), - SCORIA(() -> AllPaletteBlocks.SCORIA), - DARK_SCORIA(() -> AllPaletteBlocks.DARK_SCORIA) + GRANITE(() -> () -> Blocks.GRANITE, () -> AllPaletteBlocks.GRANITE_VARIANTS), + DIORITE(() -> () -> Blocks.DIORITE, () -> AllPaletteBlocks.DIORITE_VARIANTS), + ANDESITE(() -> () -> Blocks.ANDESITE, () -> AllPaletteBlocks.ANDESITE_VARIANTS), + LIMESTONE(() -> AllPaletteBlocks.LIMESTONE, () -> AllPaletteBlocks.LIMESTONE_VARIANTS), + WEATHERED_LIMESTONE(() -> AllPaletteBlocks.WEATHERED_LIMESTONE, () -> AllPaletteBlocks.WEATHERED_LIMESTONE_VARIANTS), + DOLOMITE(() -> AllPaletteBlocks.DOLOMITE, () -> AllPaletteBlocks.DOLOMITE_VARIANTS), + GABBRO(() -> AllPaletteBlocks.GABBRO, () -> AllPaletteBlocks.GABBRO_VARIANTS), + SCORIA(() -> AllPaletteBlocks.SCORIA, () -> AllPaletteBlocks.SCORIA_VARIANTS), + DARK_SCORIA(() -> AllPaletteBlocks.DARK_SCORIA, () -> AllPaletteBlocks.DARK_SCORIA_VARIANTS) ; private Supplier> baseBlock; + private Supplier variants; - private PaletteStoneVariants(Supplier> baseBlock) { + private PaletteStoneVariants(Supplier> baseBlock, Supplier variants) { this.baseBlock = baseBlock; + this.variants = variants; } public Supplier getBaseBlock() { return baseBlock.get(); } + public PalettesVariantEntry getVariants() { + return variants.get(); + } + } diff --git a/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java b/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java index 794016d13..76ab74af3 100644 --- a/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java +++ b/src/main/java/com/simibubi/create/content/palettes/PalettesVariantEntry.java @@ -21,14 +21,13 @@ public class PalettesVariantEntry { public ImmutableList> registeredBlocks; public ImmutableList> registeredPartials; - public PalettesVariantEntry(PaletteStoneVariants variant, PaletteBlockPatterns[] patterns, + public PalettesVariantEntry(PaletteStoneVariants variant, PaletteBlockPattern[] patterns, NonNullSupplier initialProperties) { - String name = Lang.asId(variant.name()); ImmutableList.Builder> registeredBlocks = ImmutableList.builder(); ImmutableList.Builder> registeredPartials = ImmutableList.builder(); - for (PaletteBlockPatterns pattern : patterns) { + for (PaletteBlockPattern pattern : patterns) { CreateRegistrate registrate = Create.registrate(); BlockBuilder builder = registrate.block(pattern.createName(name), pattern.getBlockFactory()) @@ -39,7 +38,7 @@ public class PalettesVariantEntry { if (pattern.isTranslucent()) builder.addLayer(() -> RenderType::getTranslucent); - if (pattern == PaletteBlockPatterns.COBBLESTONE) + if (pattern == PaletteBlockPattern.COBBLESTONE) builder.item().tag(AllTags.AllItemTags.COBBLESTONE.tag); if (pattern.hasFoliage()) builder.onRegister(CreateRegistrate.blockColors(() -> AllColorHandlers::getGrassyBlock)); @@ -65,11 +64,10 @@ public class PalettesVariantEntry { for (PaletteBlockPartial partialBlock : pattern.getPartials()) registeredPartials.add(partialBlock.create(name, pattern, block) .register()); - } + this.registeredBlocks = registeredBlocks.build(); this.registeredPartials = registeredPartials.build(); - } } diff --git a/src/main/java/com/simibubi/create/content/palettes/PatternNameType.java b/src/main/java/com/simibubi/create/content/palettes/PatternNameType.java deleted file mode 100644 index 67c9cf1d5..000000000 --- a/src/main/java/com/simibubi/create/content/palettes/PatternNameType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.simibubi.create.content.palettes; - -enum PatternNameType { - Prefix, Suffix, Wrap -} \ No newline at end of file From 2bedc94bc6965fbfcd2ef4831005a49c363b9062 Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Sat, 29 May 2021 22:09:58 -0400 Subject: [PATCH 16/21] Fix schematic deployment crash caused by some Mekanism blocks --- .../worldWrappers/WrappedChunkProvider.java | 26 +++++- .../worldWrappers/chunk/EmptierChunk.java | 82 +++++++++++++++++++ 2 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java index 4bb1dfffa..43a4bbde7 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java @@ -1,20 +1,40 @@ package com.simibubi.create.foundation.utility.worldWrappers; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.function.Predicate; import java.util.stream.Stream; import javax.annotation.Nullable; +import com.simibubi.create.foundation.utility.worldWrappers.chunk.EmptierChunk; import com.simibubi.create.foundation.utility.worldWrappers.chunk.WrappedChunk; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Util; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.registry.Registry; import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeContainer; +import net.minecraft.world.biome.BiomeRegistry; import net.minecraft.world.chunk.AbstractChunkProvider; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkStatus; +import net.minecraft.world.chunk.EmptyChunk; import net.minecraft.world.chunk.IChunk; import net.minecraft.world.lighting.WorldLightManager; +import net.minecraft.world.server.ChunkHolder; public class WrappedChunkProvider extends AbstractChunkProvider { private PlacementSimulationWorld world; @@ -52,11 +72,11 @@ public class WrappedChunkProvider extends AbstractChunkProvider { return getChunk(x, z); } - public WrappedChunk getChunk(int x, int z) { + public IChunk getChunk(int x, int z) { long pos = ChunkPos.asLong(x, z); - + if (chunks == null) - return null; + return new EmptierChunk(); return chunks.computeIfAbsent(pos, $ -> new WrappedChunk(world, x, z)); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java new file mode 100644 index 000000000..dae7595f3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/chunk/EmptierChunk.java @@ -0,0 +1,82 @@ +package com.simibubi.create.foundation.utility.worldWrappers.chunk; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.lighting.WorldLightManager; +import net.minecraft.world.server.ChunkHolder; + +import javax.annotation.Nullable; + +import java.util.List; +import java.util.function.Predicate; + +public class EmptierChunk extends Chunk { + + public EmptierChunk() { + super(null, null, null); + } + + public BlockState getBlockState(BlockPos p_180495_1_) { + return Blocks.VOID_AIR.getDefaultState(); + } + + @Nullable + public BlockState setBlockState(BlockPos p_177436_1_, BlockState p_177436_2_, boolean p_177436_3_) { + return null; + } + + public FluidState getFluidState(BlockPos p_204610_1_) { + return Fluids.EMPTY.getDefaultState(); + } + + @Nullable + public WorldLightManager getWorldLightManager() { + return null; + } + + public int getLightValue(BlockPos p_217298_1_) { + return 0; + } + + public void addEntity(Entity p_76612_1_) { } + + public void removeEntity(Entity p_76622_1_) { } + + public void removeEntityAtIndex(Entity p_76608_1_, int p_76608_2_) { } + + @Nullable + public TileEntity getTileEntity(BlockPos p_177424_1_, Chunk.CreateEntityType p_177424_2_) { + return null; + } + + public void addTileEntity(TileEntity p_150813_1_) { } + + public void addTileEntity(BlockPos p_177426_1_, TileEntity p_177426_2_) { } + + public void removeTileEntity(BlockPos p_177425_1_) { } + + public void markDirty() { } + + public void getEntitiesWithinAABBForEntity(@Nullable Entity p_177414_1_, AxisAlignedBB p_177414_2_, List p_177414_3_, Predicate p_177414_4_) { } + + public void getEntitiesOfTypeWithinAABB(Class p_177430_1_, AxisAlignedBB p_177430_2_, List p_177430_3_, Predicate p_177430_4_) { } + + public boolean isEmpty() { + return true; + } + + public boolean isEmptyBetween(int p_76606_1_, int p_76606_2_) { + return true; + } + + public ChunkHolder.LocationType getLocationType() { + return ChunkHolder.LocationType.BORDER; + } +} From b890204f44f5bb969ba62d3b54d0a07c4fe77766 Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Sun, 30 May 2021 01:40:24 -0400 Subject: [PATCH 17/21] Fix schematic init crash caused by updating null ChunkSections --- .../worldWrappers/WrappedChunkProvider.java | 19 ------------------- .../utility/worldWrappers/WrappedWorld.java | 14 +++++++++++--- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java index 43a4bbde7..dbc75fcfd 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedChunkProvider.java @@ -1,10 +1,7 @@ package com.simibubi.create.foundation.utility.worldWrappers; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.function.Predicate; import java.util.stream.Stream; import javax.annotation.Nullable; @@ -12,29 +9,13 @@ import javax.annotation.Nullable; import com.simibubi.create.foundation.utility.worldWrappers.chunk.EmptierChunk; import com.simibubi.create.foundation.utility.worldWrappers.chunk.WrappedChunk; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Util; -import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.registry.Registry; import net.minecraft.world.IBlockReader; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.BiomeContainer; -import net.minecraft.world.biome.BiomeRegistry; import net.minecraft.world.chunk.AbstractChunkProvider; -import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkStatus; -import net.minecraft.world.chunk.EmptyChunk; import net.minecraft.world.chunk.IChunk; import net.minecraft.world.lighting.WorldLightManager; -import net.minecraft.world.server.ChunkHolder; public class WrappedChunkProvider extends AbstractChunkProvider { private PlacementSimulationWorld world; diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java index a5984048c..7d14d0061 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java @@ -21,11 +21,14 @@ import net.minecraft.util.Direction; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.SectionPos; import net.minecraft.util.registry.DynamicRegistries; import net.minecraft.world.ITickList; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.AbstractChunkProvider; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.lighting.WorldLightManager; import net.minecraft.world.storage.ISpawnWorldInfo; import net.minecraft.world.storage.MapData; @@ -51,12 +54,12 @@ public class WrappedWorld extends World { public World getWorld() { return world; } - + @Override public WorldLightManager getLightingProvider() { return world.getLightingProvider(); } - + @Override public BlockState getBlockState(@Nullable BlockPos pos) { return world.getBlockState(pos); @@ -84,7 +87,12 @@ public class WrappedWorld extends World { @Override public void notifyBlockUpdate(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.notifyBlockUpdate(pos, oldState, newState, flags); + Chunk chunk = world.getChunkProvider().getWorldChunk(pos.getX() >> 4, pos.getZ() >> 4); + if (chunk != null) { + ChunkSection chunksection = chunk.getSections()[SectionPos.toChunk(pos.getY())]; + if (chunksection != null) + world.notifyBlockUpdate(pos, oldState, newState, flags); + } } @Override From a633bc47befdbfcd0302cb0f8b867f1b00019503 Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Sun, 30 May 2021 14:36:06 -0400 Subject: [PATCH 18/21] Actually, we should prevent all updates caused by SchematicWorld --- .../simibubi/create/content/schematics/SchematicWorld.java | 4 ++++ .../foundation/utility/worldWrappers/WrappedWorld.java | 7 +------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java index f839edd24..58df85ed1 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java @@ -202,6 +202,9 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { return true; } + @Override + public void notifyBlockUpdate(BlockPos pos, BlockState oldState, BlockState newState, int flags) { } + @Override public ITickList getPendingBlockTicks() { return EmptyTickList.get(); @@ -233,4 +236,5 @@ public class SchematicWorld extends WrappedWorld implements IServerWorld { } throw new IllegalStateException("Cannot use IServerWorld#getWorld in a client environment"); } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java index 7d14d0061..7f65c17e3 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/WrappedWorld.java @@ -87,12 +87,7 @@ public class WrappedWorld extends World { @Override public void notifyBlockUpdate(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - Chunk chunk = world.getChunkProvider().getWorldChunk(pos.getX() >> 4, pos.getZ() >> 4); - if (chunk != null) { - ChunkSection chunksection = chunk.getSections()[SectionPos.toChunk(pos.getY())]; - if (chunksection != null) - world.notifyBlockUpdate(pos, oldState, newState, flags); - } + world.notifyBlockUpdate(pos, oldState, newState, flags); } @Override From a9ced3fea27cc98b0b1991dbca8504df039abc72 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 31 May 2021 20:48:22 +0200 Subject: [PATCH 19/21] SoundScapes, Part IV - Fixed diving helmet activating when wielder is only partially submerged in water - Fixed diving helmet activating for players in creative mode - Added sounds for the Mechanical Saw - Added clicking sounds for the Linked Controller - Gantry contraptions now make contraption noises - Soundscapes now lower their volume based on the distance between listener and center of noise --- src/generated/resources/.cache/cache | 30 ++++----- .../resources/assets/create/lang/en_us.json | 25 +++++--- .../assets/create/lang/unfinished/de_de.json | 27 ++++---- .../assets/create/lang/unfinished/es_es.json | 27 ++++---- .../assets/create/lang/unfinished/es_mx.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/pl_pl.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 ++++---- .../assets/create/lang/unfinished/zh_tw.json | 27 ++++---- .../resources/assets/create/sounds.json | 45 +++++++++++++ .../java/com/simibubi/create/AllItems.java | 12 ++-- .../com/simibubi/create/AllSoundEvents.java | 35 ++++++++-- .../contraptions/base/KineticTileEntity.java | 7 +- .../components/saw/SawTileEntity.java | 64 +++++++++++++++++-- .../AbstractContraptionEntity.java | 2 + .../gantry/GantryCarriageTileEntity.java | 2 + .../curiosities/armor/DivingHelmetItem.java | 6 +- .../item/LinkedControllerClientHandler.java | 6 +- .../create/foundation/sound/SoundScape.java | 10 ++- .../create/foundation/sound/SoundScapes.java | 20 +++--- 26 files changed, 412 insertions(+), 203 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 879b6bf41..abbcb5506 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -408,20 +408,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e9c463e0cf56ed28ee26a33debeae3ecc2e941d2 assets/create/lang/en_ud.json -a9a31be19fc2e109967e68b63746dee766b8b4d1 assets/create/lang/en_us.json -916eb5e579f283b81f100098bf168203d75db5c5 assets/create/lang/unfinished/de_de.json -fc1a5dc58cb00012cd311f909de3cd6085664994 assets/create/lang/unfinished/es_es.json -7716f8e2a1cc161778e627f6c1f527356cfd34f9 assets/create/lang/unfinished/es_mx.json -2e032434706937780312c8c9a72ec0e0a8f1a8e6 assets/create/lang/unfinished/fr_fr.json -011b39c4217c2d5da59d0c8f4fd3c5f272a91c3e assets/create/lang/unfinished/it_it.json -dd04db4e469ece034e9edde1d182d40ece3c917f assets/create/lang/unfinished/ja_jp.json -a46af574991af844c58a7fe75b4c2b0ac888b4e0 assets/create/lang/unfinished/ko_kr.json -1ee72b0c9ac509ffcd17b19d17ab1f4b3506c9ce assets/create/lang/unfinished/nl_nl.json -c80b1e4310942e34b46f3cfed724e104782f1c65 assets/create/lang/unfinished/pl_pl.json -73030bf3d5aace5c3e991c6bf265322bba42286f assets/create/lang/unfinished/pt_br.json -73b1927e1d32e4229caa96e8d1bc25d39fb51377 assets/create/lang/unfinished/ru_ru.json -aa3f0b918d948795e10878c3d42dbd4c39f71795 assets/create/lang/unfinished/zh_cn.json -f6aef786fdc291201f388c661fb9ff2d0b936ba2 assets/create/lang/unfinished/zh_tw.json +dceb2a935135d2ef502cdcba7c9d58f64062513f assets/create/lang/en_us.json +eb40acb99f3c7af50b840f3c2058d7a7bdd5cff7 assets/create/lang/unfinished/de_de.json +bcbfd3a6768daf265a1c01a424e985a3fdec6504 assets/create/lang/unfinished/es_es.json +50dec8a7eb983ac4d29f3eeba3273dbaeca26902 assets/create/lang/unfinished/es_mx.json +cc723673107651024f3fc0e43690ac467ff729b2 assets/create/lang/unfinished/fr_fr.json +99452bacb5d80715ea0a52106b7e2734a32c55d4 assets/create/lang/unfinished/it_it.json +f3058ea623666a43029af307f632197c8ff8dcab assets/create/lang/unfinished/ja_jp.json +d756b02573d6a3a3b73bd03ec69fe760825e1606 assets/create/lang/unfinished/ko_kr.json +281712735ab6437a417dde63c855e18eb19493a0 assets/create/lang/unfinished/nl_nl.json +24056aefb7ff79a2127c194fe2918ab9e745d6b5 assets/create/lang/unfinished/pl_pl.json +0f9c83a9f70d809d8f66c0438529b169b92ffdb1 assets/create/lang/unfinished/pt_br.json +ff35273842d3190aa361f2a8ca7edae80f97864d assets/create/lang/unfinished/ru_ru.json +139a31cfd09d4aaca33d118d28de735ba72f4f0d assets/create/lang/unfinished/zh_cn.json +19bfa8f57e8b395a2cfd98039f44301a61c1f73c assets/create/lang/unfinished/zh_tw.json 487a511a01b2a4531fb672f917922312db78f958 assets/create/models/block/acacia_window.json b48060cba1a382f373a05bf0039054053eccf076 assets/create/models/block/acacia_window_pane_noside.json 3066db1bf03cffa1a9c7fbacf47ae586632f4eb3 assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1652,7 +1652,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 866fbb0ce2878a73e0440d1caf6534c8bd7c384f assets/create/models/item/zinc_ingot.json a80fb25a0b655e76be986b5b49fcb0f03461a1ab assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json -096382a4c025b5ffdde9c496ee9da0d5345fbe17 assets/create/sounds.json +6490fa0587db770cf7c794b47f3bcd2b691f4226 assets/create/sounds.json 0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 5386c44f9..7dc66e503 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1142,28 +1142,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "Cogwheels rumble", - "create.subtitle.slime_added": "Slime squishes", + "create.subtitle.saw_idle": "Mechanical Saw turns", "create.subtitle.contraption_disassemble": "Contraption stops", - "create.subtitle.wrench_rotate": "Wrench used", "create.subtitle.mixing": "Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "Mechanical Press bonks", "create.subtitle.worldshaper_place": "Worldshaper zaps", - "create.subtitle.deployer_polish": "Deployer applies polish", "create.subtitle.depot_slide": "Item slides", - "create.subtitle.deny": "Declining boop", + "create.subtitle.saw_activate_stone": "Mechanical Saw activates", "create.subtitle.blaze_munch": "Blaze Burner munches", - "create.subtitle.schematicannon_launch_block": "Schematicannon fires", "create.subtitle.funnel_flap": "Funnel Flaps", - "create.subtitle.copper_armor_equip": "Diving equipment clinks", "create.subtitle.schematicannon_finish": "Schematicannon dings", "create.subtitle.scroll_value": "Scroll-input clicks", + "create.subtitle.crafter_craft": "Crafter crafts", + "create.subtitle.saw_process": "Mechanical Saw processes", + "create.subtitle.cranking": "Hand Crank turns", + "create.subtitle.wrench_remove": "Component breaks", + "create.subtitle.cogs": "Cogwheels rumble", + "create.subtitle.slime_added": "Slime squishes", + "create.subtitle.wrench_rotate": "Wrench used", + "create.subtitle.saw_activate_wood": "Mechanical Saw activates", + "create.subtitle.deployer_polish": "Deployer applies polish", + "create.subtitle.deny": "Declining boop", + "create.subtitle.controller_click": "Controller clicks", + "create.subtitle.schematicannon_launch_block": "Schematicannon fires", + "create.subtitle.copper_armor_equip": "Diving equipment clinks", "create.subtitle.mechanical_press_activation": "Mechanical Press clangs", "create.subtitle.contraption_assemble": "Contraption moves", - "create.subtitle.crafter_craft": "Crafter crafts", - "create.subtitle.cranking": "Hand Crank turns", "create.subtitle.crafter_click": "Crafter clicks", - "create.subtitle.wrench_remove": "Component breaks", "create.subtitle.depot_plop": "Item lands", "create.subtitle.confirm": "Affirmative ding", 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 35b456937..e9eca8365 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: 948", + "_": "Missing Localizations: 953", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "Schleim matscht", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Lohe kaut glücklich", - "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "Bauplankanone endet", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "Schleim matscht", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "Bauplankanone schießt", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "Mechanische Presse wird aktiviert", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 0d801148c..fd3961305 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 649", + "_": "Missing Localizations: 654", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Blaze mastica felizmente", - "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "Acabados de Schematicannon", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "Slime aplastado", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "Disparos de Schematicannon", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "La Prensa Mecánica se activa", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 6919bdae1..ed8f9dfdb 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1272", + "_": "Missing Localizations: 1277", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 f6b6cc6a8..bb199c9dd 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: 1200", + "_": "Missing Localizations: 1205", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "Fin de schémacanon", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "Bruit de slime", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "Tir de schémacanon", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "Activation de la presse mechanique", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 687d7ca8b..6c80f9860 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: 666", + "_": "Missing Localizations: 671", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Il blaze lo gusta felicemente", - "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "Finiture cannoneschematico", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "Slime schiacciato", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "Tiri del cannoneschematico", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "Pressa meccanica attiva", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 57dc32780..4e2783d3f 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: 30", + "_": "Missing Localizations: 35", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "歯車がゴロゴロと鳴る", - "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "からくりが止まる", - "create.subtitle.wrench_rotate": "レンチを使う", "create.subtitle.mixing": "混ぜる音", "create.subtitle.mechanical_press_activation_belt": "メカニカルプレスがボンと鳴る", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "アイテムが滑る", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "ブレイズの咀嚼音", - "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", "create.subtitle.funnel_flap": "ファンネルがはためく", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "概略図砲が作業を終える", "create.subtitle.scroll_value": "スクロールのカチカチ音", + "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "ハンドクランクが回る", + "create.subtitle.wrench_remove": "機械を壊す", + "create.subtitle.cogs": "歯車がゴロゴロと鳴る", + "create.subtitle.slime_added": "スライムがぐしゃっとつぶれる", + "create.subtitle.wrench_rotate": "レンチを使う", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "概略図砲が発射する", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "メカニカルプレスがガーンと鳴る", "create.subtitle.contraption_assemble": "からくりが動く", - "create.subtitle.crafter_craft": "メカニカルクラフターがクラフトする", - "create.subtitle.cranking": "ハンドクランクが回る", "create.subtitle.crafter_click": "メカニカルクラフターのカチカチ音", - "create.subtitle.wrench_remove": "機械を壊す", "create.subtitle.depot_plop": "デプロイヤーにアイテムが入れられる", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 2b0032b45..4c28e0a5f 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: 719", + "_": "Missing Localizations: 724", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "블레이즈가 행복하게 섭취함", - "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "청사진 대포가 끝남", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "슬라임이 철퍽거림", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "청사진 대포가 발포함", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "압착기가 가동됨", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 a6cd4e26d..cf7c6b7f9 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: 1583", + "_": "Missing Localizations: 1588", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", diff --git a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json index c6cda6c14..409334069 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pl_pl.json +++ b/src/generated/resources/assets/create/lang/unfinished/pl_pl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 6", + "_": "Missing Localizations: 11", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "Koła zębate terkoczą", - "create.subtitle.slime_added": "Szlam plaska", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "Maszyna staje", - "create.subtitle.wrench_rotate": "Klucz skrzypi", "create.subtitle.mixing": "Dźwięki mieszania", "create.subtitle.mechanical_press_activation_belt": "Mechaniczna prasa stuka", "create.subtitle.worldshaper_place": "Kształter strzela", - "create.subtitle.deployer_polish": "Aplikator poleruje", "create.subtitle.depot_slide": "Przedmiot ślizga się", - "create.subtitle.deny": "Dźwięk odmowy", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Płomyk szczęśliwie przeżuwa", - "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", "create.subtitle.funnel_flap": "Lejek trzepocze", - "create.subtitle.copper_armor_equip": "Sprzęt do nurkowania pobrzękuje", "create.subtitle.schematicannon_finish": "Schematoarmata skończyła", "create.subtitle.scroll_value": "Kliknięcie", + "create.subtitle.crafter_craft": "Mechaniczny stół rzemieślniczy konstruuje", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "Ręczna korba obraca się", + "create.subtitle.wrench_remove": "Komponent niszczy się", + "create.subtitle.cogs": "Koła zębate terkoczą", + "create.subtitle.slime_added": "Szlam plaska", + "create.subtitle.wrench_rotate": "Klucz skrzypi", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "Aplikator poleruje", + "create.subtitle.deny": "Dźwięk odmowy", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "Schematoarmata strzela", + "create.subtitle.copper_armor_equip": "Sprzęt do nurkowania pobrzękuje", "create.subtitle.mechanical_press_activation": "Mechaniczna prasa się uruchamia", "create.subtitle.contraption_assemble": "Maszyna przesuwa się", - "create.subtitle.crafter_craft": "Mechaniczny stół rzemieślniczy konstruuje", - "create.subtitle.cranking": "Ręczna korba obraca się", "create.subtitle.crafter_click": "Mechaniczny stół rzemieślniczy stuka", - "create.subtitle.wrench_remove": "Komponent niszczy się", "create.subtitle.depot_plop": "Przedmiot ląduje", "create.subtitle.confirm": "Dźwięk potwierdzenia", 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 dc42dec85..3f00b608d 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: 1635", + "_": "Missing Localizations: 1640", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "UNLOCALIZED: Blaze Burner munches", - "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "UNLOCALIZED: Schematicannon dings", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "UNLOCALIZED: Slime squishes", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "UNLOCALIZED: Schematicannon fires", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "UNLOCALIZED: Mechanical Press clangs", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 994185e4e..ea60579ad 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: 563", + "_": "Missing Localizations: 568", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "Всполох радостно жуёт", - "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "Схематичная пушка закончила работу", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "Намазывание слизи", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "Выстрелы схематичной пушки", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "Механический пресс активирован", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", 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 2e733b1b0..afa6e0de7 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: 49", + "_": "Missing Localizations: 54", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "UNLOCALIZED: Mechanical Press bonks", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "烈焰人:咀嚼", - "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "蓝图加农炮:叮", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "粘液:挤碎声", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "蓝图加农炮:发射", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "辊压机:工作中", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 137dc29d9..2c4a92d15 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 42", + "_": "Missing Localizations: 47", "_": "->------------------------] Game Elements [------------------------<-", @@ -1143,28 +1143,33 @@ "_": "->------------------------] Subtitles [------------------------<-", - "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", - "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.saw_idle": "UNLOCALIZED: Mechanical Saw turns", "create.subtitle.contraption_disassemble": "UNLOCALIZED: Contraption stops", - "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", "create.subtitle.mixing": "UNLOCALIZED: Mixing Noises", "create.subtitle.mechanical_press_activation_belt": "液壓機工作", "create.subtitle.worldshaper_place": "UNLOCALIZED: Worldshaper zaps", - "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", "create.subtitle.depot_slide": "UNLOCALIZED: Item slides", - "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.saw_activate_stone": "UNLOCALIZED: Mechanical Saw activates", "create.subtitle.blaze_munch": "烈焰使者開心地吃著", - "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", "create.subtitle.funnel_flap": "UNLOCALIZED: Funnel Flaps", - "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.schematicannon_finish": "藍圖大炮完成任務", "create.subtitle.scroll_value": "UNLOCALIZED: Scroll-input clicks", + "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", + "create.subtitle.saw_process": "UNLOCALIZED: Mechanical Saw processes", + "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", + "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", + "create.subtitle.cogs": "UNLOCALIZED: Cogwheels rumble", + "create.subtitle.slime_added": "黏液擠壓", + "create.subtitle.wrench_rotate": "UNLOCALIZED: Wrench used", + "create.subtitle.saw_activate_wood": "UNLOCALIZED: Mechanical Saw activates", + "create.subtitle.deployer_polish": "UNLOCALIZED: Deployer applies polish", + "create.subtitle.deny": "UNLOCALIZED: Declining boop", + "create.subtitle.controller_click": "UNLOCALIZED: Controller clicks", + "create.subtitle.schematicannon_launch_block": "藍圖大炮發射", + "create.subtitle.copper_armor_equip": "UNLOCALIZED: Diving equipment clinks", "create.subtitle.mechanical_press_activation": "液壓機工作", "create.subtitle.contraption_assemble": "UNLOCALIZED: Contraption moves", - "create.subtitle.crafter_craft": "UNLOCALIZED: Crafter crafts", - "create.subtitle.cranking": "UNLOCALIZED: Hand Crank turns", "create.subtitle.crafter_click": "UNLOCALIZED: Crafter clicks", - "create.subtitle.wrench_remove": "UNLOCALIZED: Component breaks", "create.subtitle.depot_plop": "UNLOCALIZED: Item lands", "create.subtitle.confirm": "UNLOCALIZED: Affirmative ding", diff --git a/src/generated/resources/assets/create/sounds.json b/src/generated/resources/assets/create/sounds.json index 61a42d76f..1052dd3a7 100644 --- a/src/generated/resources/assets/create/sounds.json +++ b/src/generated/resources/assets/create/sounds.json @@ -49,6 +49,15 @@ ], "subtitle": "create.subtitle.contraption_disassemble" }, + "controller_click": { + "sounds": [ + { + "name": "minecraft:entity.item_frame.add_item", + "type": "event" + } + ], + "subtitle": "create.subtitle.controller_click" + }, "copper_armor_equip": { "sounds": [ { @@ -205,6 +214,42 @@ } ] }, + "saw_activate_stone": { + "sounds": [ + { + "name": "minecraft:ui.stonecutter.take_result", + "type": "event" + } + ], + "subtitle": "create.subtitle.saw_activate_stone" + }, + "saw_activate_wood": { + "sounds": [ + { + "name": "minecraft:entity.boat.paddle_land", + "type": "event" + } + ], + "subtitle": "create.subtitle.saw_activate_wood" + }, + "saw_idle": { + "sounds": [ + { + "name": "minecraft:entity.boat.paddle_land", + "type": "event" + } + ], + "subtitle": "create.subtitle.saw_idle" + }, + "saw_process": { + "sounds": [ + { + "name": "minecraft:block.sand.place", + "type": "event" + } + ], + "subtitle": "create.subtitle.saw_process" + }, "schematicannon_finish": { "sounds": [ { diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 527a82549..0de68e70a 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -217,6 +217,12 @@ public class AllItems { .model(AssetLookup.itemModelWithPartials()) .register(); + public static final ItemEntry LINKED_CONTROLLER = + REGISTRATE.item("linked_controller", LinkedControllerItem::new) + .transform(CreateRegistrate.customRenderedItem(() -> LinkedControllerModel::new)) + .model(AssetLookup.itemModelWithPartials()) + .register(); + public static final ItemEntry WAND_OF_SYMMETRY = REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new) .transform(CreateRegistrate.customRenderedItem(() -> SymmetryWandModel::new)) @@ -230,12 +236,6 @@ public class AllItems { .lang("Creative Worldshaper") .model(AssetLookup.itemModelWithPartials()) .register(); - - public static final ItemEntry LINKED_CONTROLLER = - REGISTRATE.item("linked_controller", LinkedControllerItem::new) - .transform(CreateRegistrate.customRenderedItem(() -> LinkedControllerModel::new)) - .model(AssetLookup.itemModelWithPartials()) - .register(); public static final ItemEntry MINECART_CONTRAPTION = REGISTRATE.item("minecart_contraption", MinecartContraptionItem::rideable) diff --git a/src/main/java/com/simibubi/create/AllSoundEvents.java b/src/main/java/com/simibubi/create/AllSoundEvents.java index bec9744d2..dc2b0f0c0 100644 --- a/src/main/java/com/simibubi/create/AllSoundEvents.java +++ b/src/main/java/com/simibubi/create/AllSoundEvents.java @@ -152,12 +152,37 @@ public class AllSoundEvents { .playExisting(SoundEvents.ITEM_ARMOR_EQUIP_GOLD, 1f, 1f) .category(SoundCategory.PLAYERS) .build(), - + AUTO_POLISH = create("deployer_polish").subtitle("Deployer applies polish") .playExisting(SoundEvents.UI_STONECUTTER_TAKE_RESULT, 1f, 1f) .category(SoundCategory.BLOCKS) .build(), + CONTROLLER_CLICK = create("controller_click").subtitle("Controller clicks") + .playExisting(SoundEvents.ENTITY_ITEM_FRAME_ADD_ITEM, .35f, 1f) + .category(SoundCategory.BLOCKS) + .build(), + + SAW_ACTIVATE_WOOD = create("saw_activate_wood").subtitle("Mechanical Saw activates") + .playExisting(SoundEvents.ENTITY_BOAT_PADDLE_LAND, .75f, 1.5f) + .category(SoundCategory.BLOCKS) + .build(), + + SAW_ACTIVATE_STONE = create("saw_activate_stone").subtitle("Mechanical Saw activates") + .playExisting(SoundEvents.UI_STONECUTTER_TAKE_RESULT, .125f, 1.25f) + .category(SoundCategory.BLOCKS) + .build(), + + SAW_PROCESS = create("saw_process").subtitle("Mechanical Saw processes") + .playExisting(SoundEvents.BLOCK_SAND_PLACE, .075f, .75f) + .category(SoundCategory.BLOCKS) + .build(), + + SAW_IDLE = create("saw_idle").subtitle("Mechanical Saw turns") + .playExisting(SoundEvents.ENTITY_BOAT_PADDLE_LAND) + .category(SoundCategory.BLOCKS) + .build(), + BLAZE_MUNCH = create("blaze_munch").subtitle("Blaze Burner munches") .playExisting(SoundEvents.ENTITY_GENERIC_EAT, .5f, 1f) .category(SoundCategory.BLOCKS) @@ -172,7 +197,7 @@ public class AllSoundEvents { for (SoundEntry entry : entries.values()) entry.register(registry); } - + public static void prepare() { for (SoundEntry entry : entries.values()) entry.prepare(); @@ -363,7 +388,7 @@ public class AllSoundEvents { this.wrappedEvents = wrappedEvents; compiledEvents = Lists.newArrayList(); } - + @Override public void prepare() { for (int i = 0; i < wrappedEvents.size(); i++) { @@ -376,7 +401,7 @@ public class AllSoundEvents { @Override public void register(IForgeRegistry registry) { - for (Pair> pair : compiledEvents) + for (Pair> pair : compiledEvents) registry.register(pair.getFirst()); } @@ -435,7 +460,7 @@ public class AllSoundEvents { public CustomSoundEntry(String id, String subtitle, SoundCategory category) { super(id, subtitle, category); } - + @Override public void prepare() { ResourceLocation location = getLocation(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index a6c5e5d6c..385c12815 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -21,6 +21,7 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.sound.SoundScapes; +import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Lang; @@ -575,14 +576,14 @@ public abstract class KineticTileEntity extends SmartTileEntity float componentSpeed = Math.abs(getSpeed()); if (componentSpeed == 0) return; - float pitch = MathHelper.clamp((componentSpeed / 256f) + .45f, .5f, 1.25f); + float pitch = MathHelper.clamp((componentSpeed / 256f) + .45f, .85f, 1f); if (isNoisy()) - SoundScapes.playGeneralKineticAmbience(pos, pitch); + SoundScapes.play(AmbienceGroup.KINETIC, pos, pitch); Block block = getBlockState().getBlock(); if (ICogWheel.isSmallCog(block) || ICogWheel.isLargeCog(block) || block instanceof GearboxBlock) - SoundScapes.playCogwheelAmbience(pos, pitch); + SoundScapes.play(AmbienceGroup.COG, pos, pitch); } protected boolean isNoisy() { 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 f7eca3cc1..0275db066 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 @@ -10,14 +10,18 @@ import java.util.stream.Collectors; import javax.annotation.ParametersAreNonnullByDefault; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.components.actors.BlockBreakingKineticTileEntity; import com.simibubi.create.content.contraptions.processing.ProcessingInventory; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.sound.SoundScapes; +import com.simibubi.create.foundation.sound.SoundScapes.AmbienceGroup; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; +import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.TreeCutter; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.recipe.RecipeConditions; @@ -31,10 +35,12 @@ import net.minecraft.block.CactusBlock; import net.minecraft.block.ChorusPlantBlock; import net.minecraft.block.KelpBlock; import net.minecraft.block.KelpTopBlock; +import net.minecraft.block.SoundType; import net.minecraft.block.StemGrownBlock; import net.minecraft.block.SugarCaneBlock; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipeType; @@ -53,6 +59,8 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.registry.Registry; +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.items.CapabilityItemHandler; @@ -70,6 +78,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { private int recipeIndex; private final LazyOptional invProvider; private FilteringBehaviour filtering; + private boolean processingStarted; public SawTileEntity(TileEntityType type) { super(type); @@ -77,6 +86,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { inventory.remainingTime = -1; recipeIndex = 0; invProvider = LazyOptional.of(() -> inventory); + processingStarted = false; } @Override @@ -92,6 +102,11 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { compound.put("Inventory", inventory.serializeNBT()); compound.putInt("RecipeIndex", recipeIndex); super.write(compound, clientPacket); + + if (!clientPacket || !processingStarted) + return; + processingStarted = false; + NBTHelper.putMarker(compound, "ProcessingStarted"); } @Override @@ -99,6 +114,40 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { super.fromTag(state, compound, clientPacket); inventory.deserializeNBT(compound.getCompound("Inventory")); recipeIndex = compound.getInt("RecipeIndex"); + if (compound.contains("ProcessingStarted")) + processingStarted = true; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void tickAudio() { + super.tickAudio(); + if (getSpeed() == 0) + return; + + SoundScapes.play(AmbienceGroup.SAW, pos, 1); + + ItemStack stackInSlot = inventory.getStackInSlot(0); + if (stackInSlot.isEmpty()) + return; + + boolean isWood = false; + Item item = stackInSlot.getItem(); + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + isWood = block.getSoundType(block.getDefaultState(), world, pos, null) == SoundType.WOOD; + } + + if (processingStarted) { + processingStarted = false; + if (!isWood) + AllSoundEvents.SAW_ACTIVATE_STONE.playAt(world, pos, 1, 1, true); + else + AllSoundEvents.SAW_ACTIVATE_WOOD.playAt(world, pos, 1, 1, true); + return; + } + + AllSoundEvents.SAW_PROCESS.playAt(world, pos, 1, 1, true); } @Override @@ -123,9 +172,6 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { if (inventory.remainingTime > 0) spawnParticles(inventory.getStackInSlot(0)); - if (world.isRemote && !isVirtual()) - return; - if (inventory.remainingTime < 20 && !inventory.appliedRecipe) { applyRecipe(); inventory.appliedRecipe = true; @@ -320,7 +366,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { List> recipes = getRecipes(); boolean valid = !recipes.isEmpty(); - int time = 100; + processingStarted = true; + int time = 50; if (recipes.isEmpty()) { inventory.remainingTime = inventory.recipeDuration = 10; @@ -367,14 +414,16 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { @Override public void onBlockBroken(BlockState stateToBreak) { super.onBlockBroken(stateToBreak); - TreeCutter.findTree(world, breakingPos).destroyBlocks(world, null, this::dropItemFromCutTree); + TreeCutter.findTree(world, breakingPos) + .destroyBlocks(world, null, this::dropItemFromCutTree); } public void dropItemFromCutTree(BlockPos pos, ItemStack stack) { float distance = (float) Math.sqrt(pos.distanceSq(breakingPos)); Vector3d dropPos = VecHelper.getCenterOf(pos); ItemEntity entity = new ItemEntity(world, dropPos.x, dropPos.y, dropPos.z, stack); - entity.setMotion(Vector3d.of(breakingPos.subtract(this.pos)).scale(distance / 20f)); + entity.setMotion(Vector3d.of(breakingPos.subtract(this.pos)) + .scale(distance / 20f)); world.addEntity(entity); } @@ -385,7 +434,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { } public static boolean isSawable(BlockState stateToBreak) { - if (stateToBreak.isIn(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(stateToBreak) || stateToBreak.isIn(BlockTags.LEAVES)) + if (stateToBreak.isIn(BlockTags.LOGS) || AllTags.AllBlockTags.SLIMY_LOGS.matches(stateToBreak) + || stateToBreak.isIn(BlockTags.LEAVES)) return true; Block block = stateToBreak.getBlock(); if (block instanceof BambooBlock) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index 5102326e8..8aef2ab4f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -15,6 +15,7 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllMovementBehaviours; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.actors.SeatEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; @@ -467,6 +468,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit removePassengers(); moveCollidedEntitiesOnDisassembly(transform); + AllSoundEvents.CONTRAPTION_DISASSEMBLE.playOnServer(world, getBlockPos()); } private void moveCollidedEntitiesOnDisassembly(StructureTransform transform) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java index 055db9ed8..9f69a4be5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ga import static net.minecraft.state.properties.BlockStateProperties.FACING; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider; @@ -107,6 +108,7 @@ public class GantryCarriageTileEntity extends KineticTileEntity implements IDisp GantryContraptionEntity.create(world, contraption, shaftOrientation); BlockPos anchor = pos; movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); world.addEntity(movedContraption); } diff --git a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java index 4eed417c6..6562b9416 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/armor/DivingHelmetItem.java @@ -3,11 +3,13 @@ package com.simibubi.create.content.curiosities.armor; import com.simibubi.create.AllItems; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Effects; +import net.minecraft.tags.FluidTags; import net.minecraft.world.World; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -34,7 +36,9 @@ public class DivingHelmetItem extends CopperArmorItem { if (!AllItems.DIVING_HELMET.get() .isWornBy(entity)) return; - if (!entity.isInWater()) + if (!entity.areEyesInFluid(FluidTags.WATER)) + return; + if (entity instanceof PlayerEntity && ((PlayerEntity) entity).isCreative()) return; ItemStack backtank = ItemStack.EMPTY; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java index d37eb293a..d3d983e78 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/LinkedControllerClientHandler.java @@ -10,6 +10,7 @@ import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllItems; +import com.simibubi.create.AllSoundEvents; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.goggles.GoggleOverlayRenderer.TooltipScreen; import com.simibubi.create.foundation.item.TooltipHelper; @@ -137,13 +138,16 @@ public class LinkedControllerClientHandler { if (MODE == Mode.ACTIVE) { // Released Keys - if (!releasedKeys.isEmpty()) + if (!releasedKeys.isEmpty()) { AllPackets.channel.sendToServer(new LinkedControllerInputPacket(releasedKeys, false)); + AllSoundEvents.CONTROLLER_CLICK.playAt(player.world, player.getBlockPos(), 1f, .5f, true); + } // Newly Pressed Keys if (!newKeys.isEmpty()) { AllPackets.channel.sendToServer(new LinkedControllerInputPacket(newKeys, true)); packetCooldown = PACKET_RATE; + AllSoundEvents.CONTROLLER_CLICK.playAt(player.world, player.getBlockPos(), 1f, .75f, true); } // Keepalive Pressed Keys diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java index 6fc31afe0..96ea0b8d9 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScape.java @@ -9,6 +9,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; +import net.minecraft.entity.Entity; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; @@ -80,9 +81,16 @@ class SoundScape { } public float getVolume() { + Entity renderViewEntity = Minecraft.getInstance().renderViewEntity; + float distanceMultiplier = 0; + if (renderViewEntity != null) { + double distanceTo = renderViewEntity.getPositionVec() + .distanceTo(getMeanPos()); + distanceMultiplier = (float) MathHelper.lerp(distanceTo / SoundScapes.MAX_AMBIENT_SOURCE_DISTANCE, 2, 0); + } int soundCount = SoundScapes.getSoundCount(group, pitchGroup); float argMax = (float) SoundScapes.SOUND_VOLUME_ARG_MAX; - return MathHelper.clamp(soundCount / (argMax * 10f), 0.075f, .15f); + return MathHelper.clamp(soundCount / (argMax * 10f), 0.025f, .15f) * distanceMultiplier; } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java index 163e6d2e9..6c78d965a 100644 --- a/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java +++ b/src/main/java/com/simibubi/create/foundation/sound/SoundScapes.java @@ -25,9 +25,12 @@ public class SoundScapes { static final int UPDATE_INTERVAL = 5; static final int SOUND_VOLUME_ARG_MAX = 15; - enum AmbienceGroup { + public enum AmbienceGroup { - KINETIC(SoundScapes::kinetic), COG(SoundScapes::cogwheel) + KINETIC(SoundScapes::kinetic), + COG(SoundScapes::cogwheel), + + SAW((p, g) -> new SoundScape(p, g).repeating(AllSoundEvents.SAW_IDLE.getMainEvent(), 1f, .95f, 1)) ; @@ -48,7 +51,7 @@ public class SoundScapes { } private static SoundScape cogwheel(float pitch, AmbienceGroup group) { - return new SoundScape(pitch, group).continuous(AllSoundEvents.COGS.getMainEvent(), 3, 1); + return new SoundScape(pitch, group).continuous(AllSoundEvents.COGS.getMainEvent(), 1.5f, 1); } enum PitchGroup { @@ -58,14 +61,9 @@ public class SoundScapes { private static Map>> counter = new IdentityHashMap<>(); private static Map, SoundScape> activeSounds = new HashMap<>(); - public static void playGeneralKineticAmbience(BlockPos pos, float pitch) { + public static void play(AmbienceGroup group, BlockPos pos, float pitch) { if (!outOfRange(pos)) - addSound(AmbienceGroup.KINETIC, pos, pitch); - } - - public static void playCogwheelAmbience(BlockPos pos, float pitch) { - if (!outOfRange(pos)) - addSound(AmbienceGroup.COG, pos, pitch); + addSound(group, pos, pitch); } public static void tick() { @@ -93,7 +91,7 @@ public class SoundScapes { .forEach(Set::clear)); } - public static void addSound(AmbienceGroup group, BlockPos pos, float pitch) { + private static void addSound(AmbienceGroup group, BlockPos pos, float pitch) { PitchGroup groupFromPitch = getGroupFromPitch(pitch); Set set = counter.computeIfAbsent(group, ag -> new IdentityHashMap<>()) .computeIfAbsent(groupFromPitch, pg -> new HashSet<>()); From 53ba59c0828f446a6ce0305c74dd38fe12773e97 Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Mon, 31 May 2021 15:42:12 -0400 Subject: [PATCH 20/21] Improve stability of sequenced gearshift (esp. for rotations) (#1695) --- .../contraptions/base/KineticTileEntity.java | 4 ++ .../bearing/MechanicalBearingTileEntity.java | 12 +++--- .../piston/LinearActuatorTileEntity.java | 2 +- .../piston/MechanicalPistonTileEntity.java | 4 +- .../fluids/actors/HosePulleyTileEntity.java | 2 +- .../advanced/GantryShaftTileEntity.java | 2 +- .../advanced/sequencer/Instruction.java | 40 +++++++++++++++---- .../SequencedGearshiftTileEntity.java | 11 ++++- 8 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 385c12815..a0fe6a992 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -477,6 +477,10 @@ public abstract class KineticTileEntity extends SmartTileEntity return d.getAxisDirection() == AxisDirection.POSITIVE ? axisSpeed : -axisSpeed; } + public static float convertToLinear(float speed) { return speed / 512f; } + + public static float convertToAngular(float speed) { return speed * 3 / 10f; } + public boolean isOverStressed() { return overStressed; } 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 d7ed6958b..5c27c6576 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.AllSoundEvents; import com.simibubi.create.content.contraptions.base.GeneratingKineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; import com.simibubi.create.content.contraptions.components.structureMovement.ControlledContraptionEntity; @@ -80,7 +81,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity super.fromTag(state, compound, clientPacket); return; } - + float angleBefore = angle; running = compound.getBoolean("Running"); angle = compound.getFloat("Angle"); @@ -108,7 +109,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity public void onSpeedChanged(float prevSpeed) { super.onSpeedChanged(prevSpeed); assembleNextTick = true; - + if (movedContraption != null && Math.signum(prevSpeed) != Math.signum(getSpeed()) && prevSpeed != 0) { movedContraption.getContraption() .stop(world); @@ -116,7 +117,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity } public float getAngularSpeed() { - float speed = (isWindmill() ? getGeneratedSpeed() : getSpeed()) * 3 / 10f; + float speed = convertToAngular(isWindmill() ? getGeneratedSpeed() : getSpeed()); if (getSpeed() == 0) speed = 0; if (world.isRemote) { @@ -169,7 +170,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ()); movedContraption.setRotationAxis(direction.getAxis()); world.addEntity(movedContraption); - + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); running = true; @@ -216,14 +217,13 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity movedContraption.getContraption() .stop(world); disassemble(); + return; } - return; } else { if (speed == 0 && !isWindmill()) return; assemble(); } - return; } if (!running) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java index 300f17aab..35dfac048 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/LinearActuatorTileEntity.java @@ -270,7 +270,7 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity } public float getMovementSpeed() { - float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f) + clientOffsetDiff / 2f; + float movementSpeed = MathHelper.clamp(convertToLinear(getSpeed()), -.49f, .49f) + clientOffsetDiff / 2f; if (world.isRemote) movementSpeed *= ServerSpeedProvider.get(); return movementSpeed; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index bad9651ef..8297c9b20 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -84,7 +84,7 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { applyContraptionPosition(); forceMove = true; world.addEntity(movedContraption); - + AllSoundEvents.CONTRAPTION_ASSEMBLE.playOnServer(world, pos); } @@ -118,7 +118,7 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { @Override public float getMovementSpeed() { - float movementSpeed = MathHelper.clamp(getSpeed() / 512f, -.49f, .49f); + float movementSpeed = MathHelper.clamp(convertToLinear(getSpeed()), -.49f, .49f); if (world.isRemote) movementSpeed *= ServerSpeedProvider.get(); Direction pistonDirection = getBlockState().get(BlockStateProperties.FACING); 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 index 7871b9e10..574b76f83 100644 --- 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 @@ -175,7 +175,7 @@ public class HosePulleyTileEntity extends KineticTileEntity { } public float getMovementSpeed() { - float movementSpeed = getSpeed() / 512f; + float movementSpeed = convertToLinear(getSpeed()); if (world.isRemote) movementSpeed *= ServerSpeedProvider.get(); return movementSpeed; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java index 2f9fe658a..4cd68bcbf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -99,7 +99,7 @@ public class GantryShaftTileEntity extends KineticTileEntity { BlockState blockState = getBlockState(); if (!AllBlocks.GANTRY_SHAFT.has(blockState)) return 0; - return MathHelper.clamp(-getSpeed() / 512f, -.49f, .49f); + return MathHelper.clamp(convertToLinear(-getSpeed()), -.49f, .49f); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java index 2bf09acea..2ffbcae4d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/Instruction.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.relays.advanced.sequencer; import java.util.Vector; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.nbt.CompoundNBT; @@ -23,23 +24,27 @@ public class Instruction { this.value = value; } - int getDuration(float initialProgress, float speed) { - int offset = speed > 0 && speedModifier.value < 0 ? 1 : 2; + int getDuration(float currentProgress, float speed) { speed *= speedModifier.value; speed = Math.abs(speed); - double degreesPerTick = (speed * 360) / 60 / 20; - double metersPerTick = speed / 512; + double target = value - currentProgress; + switch (instruction) { case TURN_ANGLE: - return (int) ((1 - initialProgress) * value / degreesPerTick + 1); + double degreesPerTick = KineticTileEntity.convertToAngular(speed); + int ticks = (int) (target / degreesPerTick); + double degreesErr = target - degreesPerTick*ticks; + return ticks + (degreesPerTick > 2*degreesErr ? 0 : 1); case TURN_DISTANCE: - return (int) ((1 - initialProgress) * value / metersPerTick + offset); + double metersPerTick = KineticTileEntity.convertToLinear(speed); + int offset = speed > 0 && speedModifier.value < 0 ? 1 : 2; + return (int) (target / metersPerTick + offset); case DELAY: - return (int) ((1 - initialProgress) * value + 1); + return (int) target; case AWAIT: return -1; @@ -52,6 +57,27 @@ public class Instruction { return 0; } + float getTickProgress(float speed) { + switch(instruction) { + + case TURN_ANGLE: + return KineticTileEntity.convertToAngular(speed); + + case TURN_DISTANCE: + return KineticTileEntity.convertToLinear(speed); + + case DELAY: + return 1; + + case AWAIT: + case END: + default: + break; + + } + return 0; + } + int getSpeedModifier() { switch (instruction) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index 42b961a98..cbd004810 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -15,6 +15,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { Vector instructions; int currentInstruction; int currentInstructionDuration; + float currentInstructionProgress; int timer; boolean poweredPreviously; @@ -23,6 +24,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { instructions = Instruction.createDefault(); currentInstruction = -1; currentInstructionDuration = -1; + currentInstructionProgress = 0; timer = 0; poweredPreviously = false; } @@ -39,6 +41,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { return; if (timer < currentInstructionDuration) { timer++; + currentInstructionProgress += getInstruction(currentInstruction).getTickProgress(speed); return; } run(currentInstruction + 1); @@ -59,8 +62,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { run(-1); // Update instruction time with regards to new speed - float initialProgress = timer / (float) currentInstructionDuration; - currentInstructionDuration = instruction.getDuration(initialProgress, getTheoreticalSpeed()); + currentInstructionDuration = instruction.getDuration(currentInstructionProgress, getTheoreticalSpeed()); timer = 0; } @@ -109,6 +111,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { detachKinetics(); currentInstruction = -1; currentInstructionDuration = -1; + currentInstructionProgress = 0; timer = 0; if (!world.isBlockPowered(pos)) world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, 0), 3); @@ -119,7 +122,9 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { detachKinetics(); currentInstructionDuration = instruction.getDuration(0, getTheoreticalSpeed()); + System.out.println("Dur.: " + currentInstructionDuration); currentInstruction = instructionIndex; + currentInstructionProgress = 0; timer = 0; world.setBlockState(pos, getBlockState().with(SequencedGearshiftBlock.STATE, instructionIndex + 1), 3); } @@ -133,6 +138,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { public void write(CompoundNBT compound, boolean clientPacket) { compound.putInt("InstructionIndex", currentInstruction); compound.putInt("InstructionDuration", currentInstructionDuration); + compound.putFloat("InstructionProgress", currentInstructionProgress); compound.putInt("Timer", timer); compound.putBoolean("PrevPowered", poweredPreviously); compound.put("Instructions", Instruction.serializeAll(instructions)); @@ -143,6 +149,7 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { currentInstruction = compound.getInt("InstructionIndex"); currentInstructionDuration = compound.getInt("InstructionDuration"); + currentInstructionProgress = compound.getFloat("InstructionProgress"); poweredPreviously = compound.getBoolean("PrevPowered"); timer = compound.getInt("Timer"); instructions = Instruction.deserializeAll(compound.getList("Instructions", NBT.TAG_COMPOUND)); From 8fe3901c980a4fa2b47bc274ef883b4238808b15 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 31 May 2021 22:48:45 +0200 Subject: [PATCH 21/21] Remove leftover debug call --- .../relays/advanced/sequencer/SequencedGearshiftTileEntity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java index cbd004810..c65896513 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/sequencer/SequencedGearshiftTileEntity.java @@ -122,7 +122,6 @@ public class SequencedGearshiftTileEntity extends SplitShaftTileEntity { detachKinetics(); currentInstructionDuration = instruction.getDuration(0, getTheoreticalSpeed()); - System.out.println("Dur.: " + currentInstructionDuration); currentInstruction = instructionIndex; currentInstructionProgress = 0; timer = 0;